motor controller with P velocity control
Dependencies: HIDScope PID QEI mbed EMG
Fork of PID_VelocityExample by
main.cpp
- Committer:
- ewoud
- Date:
- 2015-10-05
- Revision:
- 8:55ca92c0e39d
- Parent:
- 7:e14e28d8cae3
- Child:
- 9:07189a75e979
File content as of revision 8:55ca92c0e39d:
//****************************************************************************/ // Includes //****************************************************************************/ #include "PID.h" #include "QEI.h" #include "HIDScope.h" // Require the HIDScope library //****************************************************************************/ // Defines //****************************************************************************/ #define RATE 0.01 #define Kc 0.35 #define Ti 0.15 #define Td 0.0 //****************************************************************************/ // Globals //****************************************************************************/ Serial pc(USBTX, USBRX); HIDScope scope(3); // Instantize a 2-channel HIDScope object Ticker scopeTimer; // Instantize the timer for sending data to the PC //-------- // Motors //-------- //Left motor. PwmOut leftMotor(D5); DigitalOut leftBrake(D3); DigitalOut leftDirection(D4); QEI leftQei(D12, D13, NC, 624); PID leftController(Kc, Ti, Td, RATE); AnalogIn pot1(A0); AnalogIn pot2(A1); //-------- // Timers //-------- Timer endTimer; //-------------------- // Working variables. //-------------------- volatile int leftPulses = 0; volatile int leftPrevPulses = 0; volatile float leftPwmDuty = 1.0; volatile float leftPwmDutyPrev = 1.0; volatile float leftPwmDutyChange; volatile float leftVelocity = 0.0; float request; float request_pos; float request_neg; int main() { //Initialization of motor leftMotor.period_us(50); leftMotor = 1.0; leftBrake = 0.0; leftDirection = 1; //Initialization of PID controller leftController.setInputLimits(-1.0, 1.0); leftController.setOutputLimits(-1.0, 1.0); leftController.setBias(0.0); leftController.setMode(AUTO_MODE); endTimer.start(); //Run for 100 seconds. while (endTimer.read() < 100){ // 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); // Velocity calculation leftPulses = leftQei.getPulses(); leftVelocity = ((float)(leftPulses - leftPrevPulses))/ (30000.0* RATE); leftPrevPulses = leftPulses; // PID control leftController.setProcessValue(leftVelocity); leftPwmDuty = leftController.compute(); if (leftPwmDuty < 0){ leftDirection = 0; leftMotor = -leftPwmDuty; } else { leftDirection = 1; leftMotor = leftPwmDuty; } // User feadback scope.set(0, request); scope.set(1, leftPwmDuty); scope.set(2, leftVelocity); scope.send(); pc.printf("pot2: %f, request: %f, lefVelocity: %f, output: %f \n\r",pot2.read(),request,leftVelocity,leftPwmDuty); wait(RATE); } //Stop motors. leftMotor = 0; //Close results file. //fclose(fp); }