PD Control for KL05Z

Dependencies:   QEI mbed

Committer:
benkatz
Date:
Tue Sep 03 03:59:03 2013 +0000
Revision:
3:f169c357a44d
Parent:
2:f84a70291ac8
Child:
4:d52e31c73e50

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
benkatz 0:259b726d0807 1 #include "mbed.h"
benkatz 0:259b726d0807 2 #include "QEI.h" //QEI is a quadrature encoder library
benkatz 0:259b726d0807 3 #define pi 3.14159265358979323846
benkatz 0:259b726d0807 4
benkatz 0:259b726d0807 5
benkatz 0:259b726d0807 6 //create a new quadrature encoder object
benkatz 0:259b726d0807 7 QEI encoder(p25, p26, NC, 1200, QEI::X4_ENCODING); //(encoder channel 1 pin, encoder channel 2 pin, index (n/a here), counts per revolution, mode (X4, X2))
benkatz 0:259b726d0807 8
benkatz 3:f169c357a44d 9 //Ticker SampleFrequency;
benkatz 0:259b726d0807 10
benkatz 0:259b726d0807 11 //Values that will be used for the PID controller
benkatz 0:259b726d0807 12
benkatz 0:259b726d0807 13 int steps_per_rev = 1200; //Encoder CPR * gear ratio
benkatz 0:259b726d0807 14 float position = 0;
benkatz 0:259b726d0807 15 float error = 0;
benkatz 0:259b726d0807 16 float old_error = 0;
benkatz 0:259b726d0807 17 float goal_position = 0;
benkatz 3:f169c357a44d 18 float p_gain = 1;
benkatz 0:259b726d0807 19 float d_gain = 0;
benkatz 3:f169c357a44d 20 float sample_period = .01;
benkatz 0:259b726d0807 21 float command = 0;
benkatz 0:259b726d0807 22
benkatz 3:f169c357a44d 23
benkatz 3:f169c357a44d 24 PwmOut Motor[2] = {p21, p22}; //h-bridge pwm pins
benkatz 3:f169c357a44d 25 DigitalOut dir1[2] = {p29, p15}; //h-bridge direction 1 pins
benkatz 3:f169c357a44d 26 DigitalOut dir2[2] = {p30, p16};
benkatz 0:259b726d0807 27 //
benkatz 0:259b726d0807 28
benkatz 0:259b726d0807 29 float pulsesToRadians(float pulses) //Encoder steps to revolutions of output shaft in radians
benkatz 0:259b726d0807 30 {
benkatz 0:259b726d0807 31 return ((pulses/steps_per_rev)*(2*pi));
benkatz 0:259b726d0807 32 }
benkatz 0:259b726d0807 33
benkatz 3:f169c357a44d 34 void signal_to_hbridge( float signal, int motor) //Input of -1 means full reverse, 1 means full forward
benkatz 3:f169c357a44d 35 { //An input of magnitude > 1 gets reduced to 1 (or -1) by the pwm.write function
benkatz 3:f169c357a44d 36 if (signal < 0) {
benkatz 3:f169c357a44d 37 dir1[motor].write(0);
benkatz 3:f169c357a44d 38 dir2[motor].write(1);
benkatz 3:f169c357a44d 39 Motor[motor].write(signal * -1);
benkatz 3:f169c357a44d 40 }
benkatz 3:f169c357a44d 41 else if (signal > 0) {
benkatz 3:f169c357a44d 42 dir1[motor].write(1);
benkatz 3:f169c357a44d 43 dir2[motor].write(0);
benkatz 3:f169c357a44d 44 Motor[motor].write(signal);
benkatz 3:f169c357a44d 45 }
benkatz 3:f169c357a44d 46 else {
benkatz 3:f169c357a44d 47 dir1[motor].write(0);
benkatz 3:f169c357a44d 48 dir2[motor].write(0);
benkatz 3:f169c357a44d 49 }
benkatz 3:f169c357a44d 50 }
benkatz 3:f169c357a44d 51 float updateCommand(void){
benkatz 0:259b726d0807 52
benkatz 0:259b726d0807 53 position = pulsesToRadians(encoder.getPulses()); //use the getPulses functin to read encoder position, convert value to radians
benkatz 0:259b726d0807 54 old_error = error;
benkatz 2:f84a70291ac8 55 error = position - goal_position;
benkatz 3:f169c357a44d 56 return p_gain*error + d_gain*(error-old_error)/sample_period; //modify the command based on position feedback
benkatz 0:259b726d0807 57
benkatz 0:259b726d0807 58 }
benkatz 0:259b726d0807 59
benkatz 2:f84a70291ac8 60
benkatz 0:259b726d0807 61
benkatz 0:259b726d0807 62
benkatz 0:259b726d0807 63
benkatz 0:259b726d0807 64 int main() {
benkatz 3:f169c357a44d 65 Timer timer;
benkatz 3:f169c357a44d 66 timer.start();
benkatz 3:f169c357a44d 67 Motor[0].period(.00005);
benkatz 3:f169c357a44d 68 Motor[1].period(.00005);
benkatz 3:f169c357a44d 69 //SampleFrequency.attach(&updateCommand, sample_period); //Encoder will be sampled at 2.5 kHz
benkatz 3:f169c357a44d 70 while(1) {
benkatz 0:259b726d0807 71
benkatz 3:f169c357a44d 72 if (timer.read() > .0004){
benkatz 3:f169c357a44d 73 command = updateCommand();
benkatz 3:f169c357a44d 74 timer.reset();
benkatz 3:f169c357a44d 75
benkatz 3:f169c357a44d 76 }
benkatz 3:f169c357a44d 77 signal_to_hbridge(command, 0);
benkatz 3:f169c357a44d 78
benkatz 3:f169c357a44d 79 }
benkatz 0:259b726d0807 80 }
benkatz 3:f169c357a44d 81