motor controller with P velocity control
Dependencies: HIDScope PID QEI mbed EMG
Fork of PID_VelocityExample by
main.cpp
- Committer:
- ewoud
- Date:
- 2015-10-06
- Revision:
- 13:40141b362092
- Parent:
- 12:d7bb475bb82d
- Child:
- 14:102a2b4f5c86
- Child:
- 20:8064435d21da
File content as of revision 13:40141b362092:
//****************************************************************************/ // Includes #include "PID.h" #include "QEI.h" #include "HIDScope.h" #include "inits.h" // all globals, pin and variable initialization void setGoFlag(){ if (goFlag==true){ // flag is already set true: code too slow or frequency too high } goFlag=true; } void systemStart(){ systemOn=true; } void systemStop(){ systemOn=false; leftMotor=0; rightMotor=0; } int main() { // initialize (defined in inits.h) initMotors(); initPIDs(); motorControlTicker.attach(&setGoFlag, RATE); startButton.rise(&systemStart); stopButton.rise(&systemStop); endTimer.start(); //Run for 100 seconds. while (endTimer.read() < 100){ if (goFlag==true && systemOn==true){ // get 'emg' signal request_pos = pot1.read(); request_neg = pot2.read(); // determine if forward or backward signal is stronger and set reference if (request_pos > request_neg){ request = request_pos; } else { request = -request_neg; } leftController.setSetPoint(request); rightController.setSetPoint(request); // ******************* // Velocity calculation // left leftPulses = leftQei.getPulses(); leftVelocity = ((float)(leftPulses - leftPrevPulses))/ RATE; leftVelocity = leftVelocity/30000; // scale to 0 - 1, max velocity = 30000 leftPrevPulses = leftPulses; // right rightPulses = rightQei.getPulses(); rightVelocity = ((float)(rightPulses - rightPrevPulses))/ RATE; rightVelocity = rightVelocity/30000; // scale to 0 - 1, max velocity = 30000 rightPrevPulses = rightPulses; // *********** // PID control // left leftController.setProcessValue(leftVelocity); leftPwmDuty = leftController.compute(); if (leftPwmDuty < 0){ leftDirection = 0; leftMotor = -leftPwmDuty; } else { leftDirection = 1; leftMotor = leftPwmDuty; } // right rightController.setProcessValue(rightVelocity); rightPwmDuty = rightController.compute(); if (rightPwmDuty < 0){ rightDirection = 0; rightMotor = -rightPwmDuty; } else { rightDirection = 1; rightMotor = rightPwmDuty; } // User feedback scope.set(0, request); scope.set(1, rightPwmDuty); scope.set(2, rightVelocity); scope.send(); pc.printf("pot2: %f, request: %f, lefVelocity: %f, output: %f \n\r",pot2.read(),request,leftVelocity,leftPwmDuty); goFlag=false; } } //Stop motors. leftMotor = 0; rightMotor = 0; }