Joao Luiz Almeida de Souza Ramos / Mbed 2 deprecated furutacontroller

Dependencies:   QEI mbed-rtos mbed

Committer:
jaoramos
Date:
Mon Dec 02 02:04:30 2013 +0000
Revision:
2:011e6115c77a
Parent:
1:5c05e0d08e61
Child:
3:967aee5fed5b
added current filter

Who changed what in which revision?

UserRevisionLine numberNew contents of line
jaoramos 0:9f2b0ea63eac 1 #include "mbed.h"
jaoramos 0:9f2b0ea63eac 2 #include "rtos.h"
jaoramos 0:9f2b0ea63eac 3 #include "QEI.h"
jaoramos 2:011e6115c77a 4 #include <fstream>
jaoramos 2:011e6115c77a 5 #include <iomanip>
jaoramos 1:5c05e0d08e61 6
jaoramos 1:5c05e0d08e61 7 #define MOTOR_PPR 1200
jaoramos 1:5c05e0d08e61 8 #define ENCODER_PPR 1024
jaoramos 1:5c05e0d08e61 9
jaoramos 1:5c05e0d08e61 10 #define QUADRATURE_TYPE 2
jaoramos 1:5c05e0d08e61 11 #define OUR_PI 3.141592653589793
jaoramos 1:5c05e0d08e61 12 #define DATA_COLS 6
jaoramos 1:5c05e0d08e61 13 #define NR_SAMPLES 1500
jaoramos 1:5c05e0d08e61 14 #define buffer_size 3500
jaoramos 1:5c05e0d08e61 15 #define MAX_VOLTAGE 3.3
jaoramos 1:5c05e0d08e61 16 #define VOLTS_PER_AMP 0.14
jaoramos 1:5c05e0d08e61 17
jaoramos 0:9f2b0ea63eac 18
jaoramos 0:9f2b0ea63eac 19 Serial pc(USBTX, USBRX);
jaoramos 0:9f2b0ea63eac 20
jaoramos 1:5c05e0d08e61 21 QEI encoder(p29, p30, NC, ENCODER_PPR);
jaoramos 1:5c05e0d08e61 22 QEI motor(p25, p26, NC, MOTOR_PPR);
jaoramos 0:9f2b0ea63eac 23 Timer T;
jaoramos 0:9f2b0ea63eac 24
jaoramos 1:5c05e0d08e61 25 //Curent Measurement
jaoramos 1:5c05e0d08e61 26 AnalogIn aIn(p16); //pin 15 set as analog input. Pins 15-20 can be used as analog inputs.
jaoramos 1:5c05e0d08e61 27
jaoramos 2:011e6115c77a 28 //Motor direction and PWM
jaoramos 2:011e6115c77a 29 DigitalOut dOut1(p5);
jaoramos 2:011e6115c77a 30 DigitalOut dOut2(p7);
jaoramos 2:011e6115c77a 31 PwmOut pwmOut(p21);
jaoramos 1:5c05e0d08e61 32
jaoramos 0:9f2b0ea63eac 33 // open a file for data logger
jaoramos 0:9f2b0ea63eac 34 LocalFileSystem local("local");
jaoramos 1:5c05e0d08e61 35 //const int buffer_size = DATA_COLS * NR_SAMPLES;
jaoramos 1:5c05e0d08e61 36 float theta1, theta2, dtheta1, dtheta2;
jaoramos 1:5c05e0d08e61 37 float mCurrent = 0.0;
jaoramos 1:5c05e0d08e61 38 //int pulses0 = 0;
jaoramos 1:5c05e0d08e61 39 //int deltaPulses;
jaoramos 0:9f2b0ea63eac 40 float t0 = 0.0;
jaoramos 1:5c05e0d08e61 41 float t = 0.0, dt;
jaoramos 1:5c05e0d08e61 42
jaoramos 1:5c05e0d08e61 43 float encoder_conv = 2*OUR_PI/(float(ENCODER_PPR)*float(QUADRATURE_TYPE));
jaoramos 1:5c05e0d08e61 44 float motor_conv = 2*OUR_PI/(float(MOTOR_PPR)*float(QUADRATURE_TYPE));
jaoramos 1:5c05e0d08e61 45
jaoramos 0:9f2b0ea63eac 46 float* buffer;
jaoramos 2:011e6115c77a 47 float lambda1 = 30, lambda2 = 30, lambda3 = 15;
jaoramos 0:9f2b0ea63eac 48 int index;
jaoramos 0:9f2b0ea63eac 49
jaoramos 0:9f2b0ea63eac 50 void saving(void const *args) {
jaoramos 0:9f2b0ea63eac 51 index = 0;
jaoramos 0:9f2b0ea63eac 52 while (true) {
jaoramos 1:5c05e0d08e61 53 buffer[index] = theta1;
jaoramos 1:5c05e0d08e61 54 buffer[index+1] = theta2;
jaoramos 1:5c05e0d08e61 55 buffer[index+2] = dtheta1;
jaoramos 1:5c05e0d08e61 56 buffer[index+3] = dtheta2;
jaoramos 1:5c05e0d08e61 57 buffer[index+4] = mCurrent;
jaoramos 1:5c05e0d08e61 58 buffer[index+5] = t;
jaoramos 1:5c05e0d08e61 59
jaoramos 1:5c05e0d08e61 60 index = index+DATA_COLS;
jaoramos 1:5c05e0d08e61 61 Thread::wait(20);
jaoramos 0:9f2b0ea63eac 62 }
jaoramos 0:9f2b0ea63eac 63 }
jaoramos 0:9f2b0ea63eac 64
jaoramos 0:9f2b0ea63eac 65 void computing(void const *args) {
jaoramos 2:011e6115c77a 66 float z1 = 0.0, z2 = 0.0, dz1 = 0.0, dz2 = 0.0, z3 = 0.0, dz3 = 0.0;
jaoramos 2:011e6115c77a 67 float freq = 1.0, dutyCycle;
jaoramos 1:5c05e0d08e61 68 int pulsesPend, pulsesMot;
jaoramos 0:9f2b0ea63eac 69 while (true) {
jaoramos 0:9f2b0ea63eac 70 t = T.read();
jaoramos 1:5c05e0d08e61 71
jaoramos 2:011e6115c77a 72 //set pwm
jaoramos 2:011e6115c77a 73 dutyCycle = (sin(freq*t));
jaoramos 2:011e6115c77a 74 dutyCycle = dutyCycle*dutyCycle;
jaoramos 2:011e6115c77a 75 //pc.printf("Duty%f\n\r",dutyCycle);
jaoramos 2:011e6115c77a 76 pwmOut.write(dutyCycle);
jaoramos 2:011e6115c77a 77
jaoramos 2:011e6115c77a 78 //read current
jaoramos 1:5c05e0d08e61 79 mCurrent = aIn.read()*MAX_VOLTAGE/VOLTS_PER_AMP;
jaoramos 1:5c05e0d08e61 80 pulsesPend = -encoder.getPulses();
jaoramos 1:5c05e0d08e61 81 pulsesMot = motor.getPulses();
jaoramos 1:5c05e0d08e61 82
jaoramos 1:5c05e0d08e61 83 dt = t - t0; //time difference
jaoramos 1:5c05e0d08e61 84 theta2 = float(pulsesPend)*encoder_conv;
jaoramos 1:5c05e0d08e61 85 theta1 = float(pulsesMot)*motor_conv;
jaoramos 0:9f2b0ea63eac 86
jaoramos 1:5c05e0d08e61 87 //calculate dtheta1
jaoramos 2:011e6115c77a 88 dz1 = - lambda1 * z1 + lambda1 * theta1;
jaoramos 1:5c05e0d08e61 89 z1 = z1 + dz1 * dt;
jaoramos 1:5c05e0d08e61 90 dtheta1 = dz1;
jaoramos 0:9f2b0ea63eac 91
jaoramos 1:5c05e0d08e61 92 //calculate dtheta2
jaoramos 2:011e6115c77a 93 dz2 = - lambda2 * z2 + lambda2 * theta2;
jaoramos 1:5c05e0d08e61 94 z2 = z2 + dz2 * dt;
jaoramos 1:5c05e0d08e61 95 dtheta2 = dz2;
jaoramos 2:011e6115c77a 96
jaoramos 2:011e6115c77a 97 //filter current
jaoramos 2:011e6115c77a 98 dz3 = -lambda3 * z3 + lambda3 * mCurrent;
jaoramos 2:011e6115c77a 99 z3 = z3 + dz3 * dt;
jaoramos 2:011e6115c77a 100 mCurrent = z3;
jaoramos 2:011e6115c77a 101
jaoramos 0:9f2b0ea63eac 102 t0 = t;
jaoramos 0:9f2b0ea63eac 103 Thread::wait(1);
jaoramos 0:9f2b0ea63eac 104 }
jaoramos 0:9f2b0ea63eac 105 }
jaoramos 0:9f2b0ea63eac 106
jaoramos 0:9f2b0ea63eac 107 void saveToFile ()
jaoramos 0:9f2b0ea63eac 108 {
jaoramos 0:9f2b0ea63eac 109 FILE *fp = fopen("/local/data.csv", "w");
jaoramos 0:9f2b0ea63eac 110 if (!fp) {
jaoramos 0:9f2b0ea63eac 111 fprintf(stderr, "File could not be openend \n\r");
jaoramos 0:9f2b0ea63eac 112 exit(1);
jaoramos 0:9f2b0ea63eac 113 }
jaoramos 0:9f2b0ea63eac 114
jaoramos 0:9f2b0ea63eac 115 wait(2.0);
jaoramos 0:9f2b0ea63eac 116
jaoramos 1:5c05e0d08e61 117 for (int i=0; i < index; i=i+DATA_COLS)
jaoramos 1:5c05e0d08e61 118 {
jaoramos 1:5c05e0d08e61 119 for (int j = 0; j< DATA_COLS; j++)
jaoramos 1:5c05e0d08e61 120 {
jaoramos 1:5c05e0d08e61 121 fprintf(fp,"%f,", buffer[i+j]);
jaoramos 1:5c05e0d08e61 122 }
jaoramos 1:5c05e0d08e61 123 fprintf(fp,"\n");
jaoramos 0:9f2b0ea63eac 124 }
jaoramos 0:9f2b0ea63eac 125 pc.printf("closing file\n\r");
jaoramos 0:9f2b0ea63eac 126 fclose(fp);
jaoramos 0:9f2b0ea63eac 127 wait(2.0);;
jaoramos 0:9f2b0ea63eac 128 }
jaoramos 0:9f2b0ea63eac 129
jaoramos 0:9f2b0ea63eac 130 int main() {
jaoramos 0:9f2b0ea63eac 131 //allocate memory for the buffer
jaoramos 1:5c05e0d08e61 132 pc.printf("creating buffer!\r\n");
jaoramos 1:5c05e0d08e61 133 buffer = new float[buffer_size];
jaoramos 1:5c05e0d08e61 134 pc.printf("done creating buffer!\r\n");
jaoramos 0:9f2b0ea63eac 135 T.start();
jaoramos 0:9f2b0ea63eac 136 Thread thrd2(computing,NULL,osPriorityRealtime);
jaoramos 0:9f2b0ea63eac 137 Thread thrd3(saving,NULL,osPriorityNormal);
jaoramos 0:9f2b0ea63eac 138
jaoramos 2:011e6115c77a 139 //Run forward
jaoramos 2:011e6115c77a 140 pwmOut.period(0.0001);
jaoramos 2:011e6115c77a 141 dOut1=1;
jaoramos 2:011e6115c77a 142 dOut2=0;
jaoramos 2:011e6115c77a 143
jaoramos 2:011e6115c77a 144
jaoramos 0:9f2b0ea63eac 145 pc.printf("Start!\r\n");
jaoramos 0:9f2b0ea63eac 146 pc.printf("Time: %f\r\n", t);
jaoramos 0:9f2b0ea63eac 147 while (t < 10.0)
jaoramos 0:9f2b0ea63eac 148 {
jaoramos 0:9f2b0ea63eac 149 pc.printf("Time: %f\r\n", t);
jaoramos 0:9f2b0ea63eac 150 Thread::wait(1000);
jaoramos 0:9f2b0ea63eac 151 }
jaoramos 2:011e6115c77a 152 pc.printf("Done at Index: %d\r\n",index);
jaoramos 2:011e6115c77a 153 pwmOut.write(0.0);
jaoramos 0:9f2b0ea63eac 154 thrd2.terminate();
jaoramos 0:9f2b0ea63eac 155 thrd3.terminate();
jaoramos 0:9f2b0ea63eac 156 saveToFile();
jaoramos 0:9f2b0ea63eac 157 }