Control of motors
Dependencies: MODSERIAL QEI mbed
main.cpp
- Committer:
- rubenlucas
- Date:
- 2018-10-01
- Revision:
- 7:34f941f8587d
- Parent:
- 4:f324aa81d7bd
- Child:
- 8:10d6f6ad03c8
File content as of revision 7:34f941f8587d:
#include "mbed.h" #include "QEI.h" #include "MODSERIAL.h" #include "math.h" MODSERIAL pc(USBTX,USBRX); Ticker TickerReadPots; Ticker TickerGetCounts; QEI Encoder1(D10,D11,NC,32); QEI Encoder1(D12,D13,NC,32); InterruptIn PrintCounts(SW2); DigitalOut DirectionPin1(D4); DigitalOut DirectionPin2(D7); PwmOut PwmPin1(D5); PwmOut PwmPin2(D6); AnalogIn potmeter1(A1); AnalogIn potmeter2(A0); volatile float Duty1; volatile float Duty2; volatile float MotorSignal1; volatile float MotorSignal2; volatile int counts1; volatile int counts2; // function for reading potentiometers and set to dutycycle void ReadPots(void) { Duty1 = potmeter1.read(); // read value potentiometer 1 Duty2 = potmeter2.read(); // read value potentiometer 2 MotorSignal1 = 2*Duty1 - 1; //scaling potmeter to motor control signal [0 - 1] --> [(-1) - 1] MotorSignal2 = 1 - 2*Duty2; } // printing counts to pc void GetCounts(void) { counts1 = Encoder1.getPulses(); counts2 = Encoder2.getPulses(); Encoder1.reset(); Encoder2.reset(); } void Print() { pc.printf("Number counts per second: motor1 = %i , motor2 = %i \r\n",counts1,counts2); } int main() { pc.baud(115200); pc.printf("Hello World!\r\n"); PwmPin1.period_us(60); // 16.66667 kHz (default period is too slow!) TickerReadPots.attach(&ReadPots,0.05); // every 50 milli seconds. TickerGetCounts.attach(&GetCounts,1); //Print amount of counts every second PrintCounts.fall(&Print); while (true) { // motor 1 DirectionPin1 = MotorSignal1 > 0.0f; //either true or false, CW or CCW PwmPin1 = fabs(MotorSignal1); //pwm duty cycle can only be positive, floating point absolute value // motor 2 DirectionPin2 = MotorSignal2 > 0.0f; PwmPin2 = fabs(MotorSignal2); wait(0.01); //Do while loop a hundred times per second. } }