Using HIDScope for P(I)D controller
Dependencies: FastPWM HIDScope MODSERIAL QEI biquadFilter mbed
Fork of PES_tutorial_5 by
Diff: main.cpp
- Revision:
- 14:29236a33b5e4
- Parent:
- 13:0b51846cf9e3
- Child:
- 15:c2cfab737a4c
diff -r 0b51846cf9e3 -r 29236a33b5e4 main.cpp --- a/main.cpp Tue Oct 16 09:06:44 2018 +0000 +++ b/main.cpp Fri Oct 19 09:02:56 2018 +0000 @@ -13,12 +13,13 @@ //Tickers Ticker MeasureControl; -/*Ticker MakeMotorRotate;*/ +Ticker print; +/*Ticker MakeMotorRotate;*/ //Waar zal deze ticker voor dienen? //Global variables volatile double measuredPosition = 0.0; volatile double referencePosition = 0.0; -volatile double motorValue = 0.0; +volatile double motorValue= 0.01; volatile double Kp = 0.0; //------------------------------------------------------------------------------ @@ -27,23 +28,23 @@ double GetReferencePosition() { double potMeterIn = potMeter1.read(); - referencePosition = 4.0*3.14*potMeterIn - 2.0*3.14 ; // Reference value y, scaled to -2 to 2 revolutions (or 0 to 100 pi) + referencePosition = 4.0*3.14*potMeterIn - 2.0*3.14 ; // Reference value y, scaled to -2 to 2 revolutions (or 0 to 100 pi) WAAROM? return referencePosition; } double GetMeasuredPosition() { double counts = Encoder.getPulses(); - measuredPosition = ( counts / 4.0 * 64.0) * 6.28; // Rotational position in radians + measuredPosition = ( counts / (8400)) * 6.28; // Rotational position in radians return measuredPosition; } -double FeedbackControl(double Error) -{ +double FeedbackControl(double Error) +{ double Kp = 20.0*potMeter2.read(); // Scale 0 to 20 - // Proportional part: + // Proportional part: double u_k = Kp * Error; - // Sum all parts and return it + // Sum all parts and return it return u_k; //motorValue } @@ -53,7 +54,7 @@ // bits for motor 1. Positive value makes motor rotating // clockwise. motorValues outside range are truncated to // within range - if (motorValue >=0) + if (motorValue >=0) { motor1DirectionPin=1; } @@ -61,7 +62,7 @@ { motor1DirectionPin=0; } - if (fabs(motorValue)>1) + if (fabs(motorValue)>1) { motor1MagnitudePin = 1; } @@ -71,18 +72,25 @@ } } //----------------------------------------------------------------------------- -// Ticker +// Tickers void MeasureAndControl(void) { - // This function determines the desired velocity, measures the + // This function determines the desired velocity, measures the // actual velocity, and controls the motor with // a simple Feedback controller. Call this from a Ticker. - double referencePosition = GetReferencePosition(); - double measuredPosition = GetMeasuredPosition(); - double motorValue = FeedbackControl(referencePosition - measuredPosition); + referencePosition = GetReferencePosition(); + measuredPosition = GetMeasuredPosition(); + motorValue = FeedbackControl(referencePosition - measuredPosition); SetMotor1(motorValue); } +void printen() +{ + pc.baud (115200); + pc.printf("Referenceposition %f \r\n", referencePosition); + pc.printf("Measured position %f \r\n", measuredPosition); + pc.printf("Motorvalue %f \r\n", motorValue); +} //----------------------------------------------------------------------------- int main() { @@ -90,7 +98,7 @@ pc.baud(115200); motor1MagnitudePin.period_us(60.0); // 60 microseconds PWM period: 16.7 kHz. MeasureControl.attach(MeasureAndControl, 0.01); - /*MakeMotorRotate.attach(SetMotor1, 0.01);*/ + print.attach(printen, 3); //Other initializations