Developers_of_anti_slip_compensator / Mbed 2 deprecated WIPV

Dependencies:   CURRENT_CONTROL IIR LSM9DS0 MEDIAN_FILTER PID QEI RF24 SENSOR_FUSION mbed

Committer:
adam_z
Date:
Wed Jun 01 12:26:41 2016 +0000
Revision:
7:f33a935eb77a
Parent:
6:5bd08053e95c
Child:
8:9f4c10787775
Receiving message  from photons via bluetooth conducted! ; direction of slip acceleration...checked!;

Who changed what in which revision?

UserRevisionLine numberNew contents of line
adam_z 0:150bb4605023 1 #include "mbed.h"
adam_z 0:150bb4605023 2 #include "PID.h"
adam_z 0:150bb4605023 3 #include "LSM9DS0.h"
adam_z 0:150bb4605023 4 #include "QEI.h"
adam_z 4:a2d38818c4e7 5 #include "CURRENT_CONTROL.h"
adam_z 4:a2d38818c4e7 6 #include "SENSOR_FUSION.h"
adam_z 0:150bb4605023 7
adam_z 0:150bb4605023 8 #define Ts 0.001
adam_z 2:53a942d1b1e5 9 #define pi 3.14159
adam_z 0:150bb4605023 10
adam_z 0:150bb4605023 11 LSM9DS0 sensor(SPI_MODE, D9, D6);
adam_z 0:150bb4605023 12 Serial pc(SERIAL_TX, SERIAL_RX);
adam_z 6:5bd08053e95c 13 Serial blueTooth(D10, D2);
adam_z 7:f33a935eb77a 14 Serial LeftSerial(PC_12, PD_2);
adam_z 7:f33a935eb77a 15 Serial RightSerial(PC_10, PC_11);
adam_z 7:f33a935eb77a 16
adam_z 7:f33a935eb77a 17 DigitalOut debugLed_l(A4);
adam_z 7:f33a935eb77a 18 DigitalOut debugLed_r(A5);
adam_z 0:150bb4605023 19
adam_z 0:150bb4605023 20 Ticker WIPVTimer;
adam_z 0:150bb4605023 21 void WIPVTimerInterrupt();
adam_z 4:a2d38818c4e7 22 float saturation(float input, float limit_H, float limit_L);
adam_z 5:842372be775c 23 void SensorAcquisition(float * data, float samplingTime);
adam_z 7:f33a935eb77a 24
adam_z 7:f33a935eb77a 25 void bluetoothRx();
adam_z 7:f33a935eb77a 26 void RXIrqLeft();
adam_z 7:f33a935eb77a 27 void RXIrqRight();
adam_z 0:150bb4605023 28
adam_z 5:842372be775c 29 //MOTOR L == MOTOR 1; MOTOR R = MOTOR 2
adam_z 5:842372be775c 30 CURRENT_CONTROL motorCur_L(PC_3, D8, A3,CURRENT_CONTROL::PWM2,400, 900.0,0.0,Ts);
adam_z 5:842372be775c 31 CURRENT_CONTROL motorCur_R(PC_2, D7, D11,CURRENT_CONTROL::PWM1,400, 900.0,0.0,Ts);
adam_z 1:ddc39900f9b8 32
adam_z 6:5bd08053e95c 33 QEI wheel_L(D13, D12, NC, 280, 200, Ts, QEI::X4_ENCODING);
adam_z 6:5bd08053e95c 34 QEI wheel_R(A1, A2, NC, 280, 200, Ts, QEI::X4_ENCODING);
adam_z 5:842372be775c 35
adam_z 2:53a942d1b1e5 36
adam_z 4:a2d38818c4e7 37 PID balancingPD(20,0.00,0.0,Ts);
adam_z 6:5bd08053e95c 38 LPF sensorFilter1(Ts);
adam_z 6:5bd08053e95c 39 LPF sensorFilter2(Ts);
adam_z 6:5bd08053e95c 40 LPF sensorFilter3(Ts);
adam_z 6:5bd08053e95c 41 LPF sensorFilter4(Ts);
adam_z 2:53a942d1b1e5 42
adam_z 4:a2d38818c4e7 43
adam_z 4:a2d38818c4e7 44
adam_z 5:842372be775c 45
adam_z 4:a2d38818c4e7 46
adam_z 4:a2d38818c4e7 47 int tim_counter = 0;
adam_z 2:53a942d1b1e5 48 float tim = 0.0;
adam_z 4:a2d38818c4e7 49 float amp = 0.3;
adam_z 4:a2d38818c4e7 50 float omega = 6.0;
adam_z 4:a2d38818c4e7 51 float curCmd_L =0.0, curCmd_R =0.0;
adam_z 2:53a942d1b1e5 52
adam_z 0:150bb4605023 53
adam_z 6:5bd08053e95c 54
adam_z 6:5bd08053e95c 55 float state[4] = {0.0, 0.0, 0.0, 0.0};
adam_z 6:5bd08053e95c 56 float ref[4] = {0.0, 0.0, 0.0, 0.0};
adam_z 6:5bd08053e95c 57
adam_z 6:5bd08053e95c 58 float torque_L = 0.0, torque_R = 0.0;
adam_z 6:5bd08053e95c 59 float KL[4] = {-0.7057 , -0.0733 , -0.0085 , -0.0300};
adam_z 6:5bd08053e95c 60 float KR[4] = {-0.7057 , -0.0733 , -0.0300 , -0.0085};
adam_z 6:5bd08053e95c 61
adam_z 6:5bd08053e95c 62 float Km_L = 1.050*0.163;
adam_z 6:5bd08053e95c 63 float Km_R = 1.187*0.137;
adam_z 6:5bd08053e95c 64
adam_z 6:5bd08053e95c 65 float yawRate = 0.0;
adam_z 6:5bd08053e95c 66
adam_z 6:5bd08053e95c 67 float velocityCmd[2] = {0.0, 0.0};
adam_z 6:5bd08053e95c 68 unsigned int accelerateFlag = 0;
adam_z 6:5bd08053e95c 69
adam_z 7:f33a935eb77a 70
adam_z 7:f33a935eb77a 71 uint8_t cLast_l = 0x00, cLast_r = 0x00;
adam_z 7:f33a935eb77a 72 bool headerCaptured_l = 0, headerCaptured_r = 0;
adam_z 7:f33a935eb77a 73 uint8_t fromPhoton_l[2] = {0,0}, fromPhoton_r[2] = {0,0};
adam_z 7:f33a935eb77a 74 float slipAcceleration_L = 0.1, slipAcceleration_R = 0.1, slipAcceleration_L_f, slipAcceleration_R_f;
adam_z 7:f33a935eb77a 75 int i_l, i_r;
adam_z 7:f33a935eb77a 76
adam_z 0:150bb4605023 77 int main()
adam_z 0:150bb4605023 78 {
adam_z 2:53a942d1b1e5 79
adam_z 7:f33a935eb77a 80 pc.baud(230400);
adam_z 6:5bd08053e95c 81 blueTooth.baud(230400);
adam_z 7:f33a935eb77a 82 LeftSerial.baud(230400); //uart commu with photon left
adam_z 7:f33a935eb77a 83 RightSerial.baud(230400); //uart commu with photon right
adam_z 7:f33a935eb77a 84
adam_z 0:150bb4605023 85 if( sensor.begin() != 0 ) {
adam_z 0:150bb4605023 86 pc.printf("Problem starting the sensor with CS @ Pin D6.\r\n");
adam_z 0:150bb4605023 87 } else {
adam_z 0:150bb4605023 88 pc.printf("Sensor with CS @ Pin D9&D6 started.\r\n");
adam_z 0:150bb4605023 89 }
adam_z 0:150bb4605023 90 sensor.setGyroOffset(38,-24,-106);
adam_z 0:150bb4605023 91 sensor.setAccelOffset(-793,-511,300);
adam_z 2:53a942d1b1e5 92
adam_z 6:5bd08053e95c 93 motorCur_L.SetParams(3.3*8/0.6, Km_L, 0.04348);
adam_z 6:5bd08053e95c 94 motorCur_R.SetParams(3.3*8/0.6, Km_R, 0.04348);
adam_z 2:53a942d1b1e5 95
adam_z 0:150bb4605023 96 WIPVTimer.attach_us(WIPVTimerInterrupt, 1000.0);
adam_z 7:f33a935eb77a 97 blueTooth.attach(&bluetoothRx, Serial::RxIrq);
adam_z 7:f33a935eb77a 98 LeftSerial.attach(&RXIrqLeft, Serial::RxIrq);
adam_z 7:f33a935eb77a 99 RightSerial.attach(&RXIrqRight, Serial::RxIrq);
adam_z 7:f33a935eb77a 100
adam_z 2:53a942d1b1e5 101 while(true) {
adam_z 4:a2d38818c4e7 102 //pc.printf("%5.4f\t", 10*pitch_angle);
adam_z 4:a2d38818c4e7 103 //pc.printf("%5.3f\n", 10*sensor.pitch*3.14159/180);
adam_z 4:a2d38818c4e7 104 //pc.printf("%5.3f\r\n", 10*curCmd_L);
adam_z 6:5bd08053e95c 105
adam_z 6:5bd08053e95c 106
adam_z 7:f33a935eb77a 107 pc.printf("%5.4f\t", slipAcceleration_L_f);
adam_z 7:f33a935eb77a 108 pc.printf("%5.4f\r\n", slipAcceleration_R_f);
adam_z 7:f33a935eb77a 109
adam_z 7:f33a935eb77a 110 // pc.putc(fromPhoton_l[0]);
adam_z 7:f33a935eb77a 111 // pc.putc(fromPhoton_l[1]);
adam_z 7:f33a935eb77a 112 // pc.putc(fromPhoton_r[0]);
adam_z 7:f33a935eb77a 113 // pc.putc(fromPhoton_r[1]);
adam_z 6:5bd08053e95c 114
adam_z 2:53a942d1b1e5 115 }
adam_z 0:150bb4605023 116 }
adam_z 0:150bb4605023 117
adam_z 0:150bb4605023 118
adam_z 0:150bb4605023 119 void WIPVTimerInterrupt()
adam_z 0:150bb4605023 120 {
adam_z 2:53a942d1b1e5 121 if(tim_counter <100)tim_counter++;
adam_z 2:53a942d1b1e5 122 else if (tim_counter >= 100 && tim_counter <=109) {
adam_z 4:a2d38818c4e7 123 motorCur_L.currentOffset += motorCur_L.currentAnalogIn.read();
adam_z 4:a2d38818c4e7 124 motorCur_R.currentOffset += motorCur_R.currentAnalogIn.read();
adam_z 2:53a942d1b1e5 125 tim_counter++;
adam_z 2:53a942d1b1e5 126 if(tim_counter == 110) {
adam_z 4:a2d38818c4e7 127 motorCur_L.currentOffset = motorCur_L.currentOffset/10;
adam_z 4:a2d38818c4e7 128 motorCur_R.currentOffset = motorCur_R.currentOffset/10;
adam_z 2:53a942d1b1e5 129 }
adam_z 2:53a942d1b1e5 130
adam_z 2:53a942d1b1e5 131 } else {
adam_z 2:53a942d1b1e5 132
adam_z 0:150bb4605023 133 /*
adam_z 0:150bb4605023 134 int16_t data_array[6];
adam_z 2:53a942d1b1e5 135
adam_z 0:150bb4605023 136 data_array[0] = sensor.readRawAccelX();
adam_z 0:150bb4605023 137 data_array[1] = sensor.readRawAccelY();
adam_z 0:150bb4605023 138 data_array[2] = sensor.readRawAccelZ();
adam_z 0:150bb4605023 139 data_array[3] = sensor.readRawGyroX();
adam_z 0:150bb4605023 140 data_array[4] = sensor.readRawGyroY();
adam_z 0:150bb4605023 141 data_array[5] = sensor.readRawGyroZ();
adam_z 2:53a942d1b1e5 142
adam_z 0:150bb4605023 143 pc.printf("%d, ", data_array[0]);
adam_z 0:150bb4605023 144 pc.printf("%d, ", data_array[1]);
adam_z 0:150bb4605023 145 pc.printf("%d, ", data_array[2]);
adam_z 0:150bb4605023 146 pc.printf("%d, ", data_array[3]);
adam_z 0:150bb4605023 147 pc.printf("%d, ", data_array[4]);
adam_z 0:150bb4605023 148 pc.printf("%d;\r\n ", data_array[5]);
adam_z 0:150bb4605023 149 */
adam_z 2:53a942d1b1e5 150
adam_z 2:53a942d1b1e5 151
adam_z 5:842372be775c 152 float data_array[6];//Gs and deg/s
adam_z 0:150bb4605023 153 data_array[0] = sensor.readFloatAccelX();
adam_z 0:150bb4605023 154 data_array[1] = sensor.readFloatAccelY();
adam_z 0:150bb4605023 155 data_array[2] = sensor.readFloatAccelZ();
adam_z 0:150bb4605023 156 data_array[3] = sensor.readFloatGyroX();
adam_z 0:150bb4605023 157 data_array[4] = sensor.readFloatGyroY();
adam_z 0:150bb4605023 158 data_array[5] = sensor.readFloatGyroZ();
adam_z 4:a2d38818c4e7 159 sensor.complementaryFilter(data_array,Ts);
adam_z 4:a2d38818c4e7 160 //SensorAcquisition(data_array, Ts);
adam_z 6:5bd08053e95c 161
adam_z 6:5bd08053e95c 162 //===============wheel speed calculation============//
adam_z 2:53a942d1b1e5 163 wheel_L.Calculate();
adam_z 2:53a942d1b1e5 164 wheel_R.Calculate();
adam_z 6:5bd08053e95c 165
adam_z 6:5bd08053e95c 166 /////////////Balancing Control/////////////////////////
adam_z 6:5bd08053e95c 167 //SI dimension
adam_z 6:5bd08053e95c 168 state[0] = sensor.pitch*3.14159/180.0;
adam_z 6:5bd08053e95c 169 state[1] = sensorFilter1.filter(data_array[5]*3.14159/180.0, 10.0);
adam_z 6:5bd08053e95c 170 state[2] = sensorFilter2.filter(wheel_L.getAngularSpeed(),60.0);
adam_z 6:5bd08053e95c 171 state[3] = -sensorFilter3.filter(wheel_R.getAngularSpeed(),60.0);
adam_z 6:5bd08053e95c 172
adam_z 6:5bd08053e95c 173 if(accelerateFlag == 1) {
adam_z 6:5bd08053e95c 174 if(velocityCmd[0]>=7 || velocityCmd[1]>=7)accelerateFlag = 0;
adam_z 6:5bd08053e95c 175 else {
adam_z 6:5bd08053e95c 176 velocityCmd[0] += 0.004;
adam_z 6:5bd08053e95c 177 velocityCmd[1] += 0.004;
adam_z 6:5bd08053e95c 178 }
adam_z 6:5bd08053e95c 179 }
adam_z 6:5bd08053e95c 180
adam_z 6:5bd08053e95c 181 ref[2] = velocityCmd[0];
adam_z 6:5bd08053e95c 182 ref[3] = velocityCmd[1];
adam_z 6:5bd08053e95c 183
adam_z 7:f33a935eb77a 184 yawRate = sensorFilter4.filter(data_array[4],20);
adam_z 6:5bd08053e95c 185
adam_z 6:5bd08053e95c 186
adam_z 6:5bd08053e95c 187 torque_L = (KL[0]*(state[0] - ref[0])+KL[1]*(state[1] - ref[1])+KL[2]*(state[2] - ref[2])+KL[3]*(state[3]-ref[3]));
adam_z 6:5bd08053e95c 188 torque_R = -(KR[0]*(state[0] - ref[0])+KR[1]*(state[1] - ref[1])+KR[2]*(state[2] - ref[2])+KR[3]*(state[3]-ref[3]));
adam_z 7:f33a935eb77a 189 //=========================Anti slip control=============================//
adam_z 7:f33a935eb77a 190 slipAcceleration_L_f = (1 - 10*2*3.141593*Ts)*slipAcceleration_L_f + 10*2*3.141593*Ts*slipAcceleration_L;
adam_z 7:f33a935eb77a 191 slipAcceleration_R_f = (1 - 10*2*3.141593*Ts)*slipAcceleration_R_f + 10*2*3.141593*Ts*slipAcceleration_R;
adam_z 6:5bd08053e95c 192
adam_z 7:f33a935eb77a 193 //motorCur_L.Control(saturation(torque_L/Km_L + 0.008*yawRate,1.2,-1.2), state[2]);
adam_z 7:f33a935eb77a 194 // motorCur_R.Control(saturation(torque_R/Km_R + 0.008*yawRate,1.2,-1.2), -state[3]);
adam_z 6:5bd08053e95c 195
adam_z 7:f33a935eb77a 196
adam_z 6:5bd08053e95c 197 /* //PD Balancing Control
adam_z 6:5bd08053e95c 198 balancingPD.Compute(0.0, sensor.pitch*3.14159/180);
adam_z 6:5bd08053e95c 199 curCmd_R = sensorFilter.filter(saturation(0.5*( -balancingPD.output + 0.002*data_array[5]),1.0, -1.0),10);
adam_z 6:5bd08053e95c 200 //======================current control=========================//
adam_z 6:5bd08053e95c 201 tim += Ts;
adam_z 6:5bd08053e95c 202 if(tim >= 4*pi/omega)tim = 0.0;
adam_z 6:5bd08053e95c 203 //curCmd_R = amp*sin(omega*tim); //current command
adam_z 6:5bd08053e95c 204 //curCmd_L = 0.8;
adam_z 6:5bd08053e95c 205
adam_z 6:5bd08053e95c 206 motorCur_R.SetPWMDuty(0.75);
adam_z 6:5bd08053e95c 207
adam_z 6:5bd08053e95c 208 motorCur_L.Control(-curCmd_R + 0.002*data_array[4], wheel_L.getAngularSpeed());
adam_z 6:5bd08053e95c 209 motorCur_R.Control(curCmd_R + 0.002*data_array[4], wheel_R.getAngularSpeed());
adam_z 6:5bd08053e95c 210 */
adam_z 6:5bd08053e95c 211
adam_z 2:53a942d1b1e5 212 }
adam_z 2:53a942d1b1e5 213
adam_z 2:53a942d1b1e5 214
adam_z 4:a2d38818c4e7 215 }
adam_z 4:a2d38818c4e7 216
adam_z 4:a2d38818c4e7 217
adam_z 7:f33a935eb77a 218 void bluetoothRx()
adam_z 6:5bd08053e95c 219 {
adam_z 6:5bd08053e95c 220 while(blueTooth.readable()) {
adam_z 6:5bd08053e95c 221 char charRx = blueTooth.getc();
adam_z 6:5bd08053e95c 222 switch(charRx) {
adam_z 6:5bd08053e95c 223 case 'w'://forward
adam_z 6:5bd08053e95c 224 velocityCmd[0] = 2.5;
adam_z 6:5bd08053e95c 225 velocityCmd[1] = 2.5;
adam_z 6:5bd08053e95c 226 accelerateFlag = 0;
adam_z 6:5bd08053e95c 227 break;
adam_z 6:5bd08053e95c 228 case 's'://backward
adam_z 6:5bd08053e95c 229 velocityCmd[0] = -3.0;
adam_z 6:5bd08053e95c 230 velocityCmd[1] = -3.0;
adam_z 6:5bd08053e95c 231 accelerateFlag = 0;
adam_z 6:5bd08053e95c 232 break;
adam_z 6:5bd08053e95c 233 case 'a'://turn left
adam_z 6:5bd08053e95c 234 velocityCmd[0] = -4.0;
adam_z 6:5bd08053e95c 235 velocityCmd[1] = 4.0;
adam_z 6:5bd08053e95c 236 accelerateFlag = 0;
adam_z 6:5bd08053e95c 237 break;
adam_z 6:5bd08053e95c 238 case 'd'://turn right
adam_z 6:5bd08053e95c 239 velocityCmd[0] = 4.0;
adam_z 6:5bd08053e95c 240 velocityCmd[1] = -4.0;
adam_z 6:5bd08053e95c 241 accelerateFlag = 0;
adam_z 6:5bd08053e95c 242 break;
adam_z 6:5bd08053e95c 243 case 'x'://stop
adam_z 6:5bd08053e95c 244 velocityCmd[0] = 0.0;
adam_z 6:5bd08053e95c 245 velocityCmd[1] = 0.0;
adam_z 6:5bd08053e95c 246 accelerateFlag = 0;
adam_z 6:5bd08053e95c 247 break;
adam_z 7:f33a935eb77a 248
adam_z 6:5bd08053e95c 249 case 'q'://accelerate
adam_z 6:5bd08053e95c 250 accelerateFlag = 1;
adam_z 6:5bd08053e95c 251 break;
adam_z 6:5bd08053e95c 252 }
adam_z 6:5bd08053e95c 253 }
adam_z 6:5bd08053e95c 254 }
adam_z 6:5bd08053e95c 255
adam_z 7:f33a935eb77a 256 void RXIrqLeft()
adam_z 7:f33a935eb77a 257 {
adam_z 7:f33a935eb77a 258 // slipAcceleration_L += 0.1;
adam_z 7:f33a935eb77a 259 while(!LeftSerial.readable());
adam_z 7:f33a935eb77a 260 uint8_t c = LeftSerial.getc();
adam_z 7:f33a935eb77a 261 if(!headerCaptured_l & cLast_l == 0xAA & c == 0x55) {
adam_z 7:f33a935eb77a 262 headerCaptured_l = 1;
adam_z 7:f33a935eb77a 263 i_l = 0;
adam_z 7:f33a935eb77a 264 debugLed_l = 1;
adam_z 7:f33a935eb77a 265 } else if(headerCaptured_l) {
adam_z 7:f33a935eb77a 266 if(c == 0xAA | c == 0x55 ) {
adam_z 7:f33a935eb77a 267 headerCaptured_l = 0;
adam_z 7:f33a935eb77a 268 i_l = 0;
adam_z 7:f33a935eb77a 269 debugLed_l = 0;
adam_z 7:f33a935eb77a 270 }
adam_z 7:f33a935eb77a 271 else {
adam_z 7:f33a935eb77a 272 fromPhoton_l[i_l] = c;
adam_z 7:f33a935eb77a 273 i_l++;
adam_z 7:f33a935eb77a 274 if(i_l == 2) {
adam_z 7:f33a935eb77a 275 headerCaptured_l = 0;
adam_z 7:f33a935eb77a 276 debugLed_l = 0;
adam_z 7:f33a935eb77a 277 slipAcceleration_L = -(float)((int16_t)(fromPhoton_l[0]*256+fromPhoton_l[1]))/100.0;
adam_z 7:f33a935eb77a 278
adam_z 7:f33a935eb77a 279 }
adam_z 7:f33a935eb77a 280 }
adam_z 7:f33a935eb77a 281 }
adam_z 7:f33a935eb77a 282 cLast_l = c;
adam_z 7:f33a935eb77a 283
adam_z 7:f33a935eb77a 284 }
adam_z 7:f33a935eb77a 285
adam_z 7:f33a935eb77a 286 void RXIrqRight()
adam_z 7:f33a935eb77a 287 {
adam_z 7:f33a935eb77a 288 // slipAcceleration_L += 0.1;
adam_z 7:f33a935eb77a 289 while(!RightSerial.readable());
adam_z 7:f33a935eb77a 290 uint8_t c = RightSerial.getc();
adam_z 7:f33a935eb77a 291 if(!headerCaptured_r & cLast_r == 0xAA & c == 0x55) {
adam_z 7:f33a935eb77a 292 headerCaptured_r = 1;
adam_z 7:f33a935eb77a 293 i_r = 0;
adam_z 7:f33a935eb77a 294 debugLed_r = 1;
adam_z 7:f33a935eb77a 295 } else if(headerCaptured_r) {
adam_z 7:f33a935eb77a 296 if(c == 0xAA | c == 0x55 ) {
adam_z 7:f33a935eb77a 297 headerCaptured_r = 0;
adam_z 7:f33a935eb77a 298 i_r = 0;
adam_z 7:f33a935eb77a 299 debugLed_r = 0;
adam_z 7:f33a935eb77a 300 }
adam_z 7:f33a935eb77a 301 else {
adam_z 7:f33a935eb77a 302 fromPhoton_r[i_r] = c;
adam_z 7:f33a935eb77a 303 i_r++;
adam_z 7:f33a935eb77a 304 if(i_r == 2) {
adam_z 7:f33a935eb77a 305 headerCaptured_r = 0;
adam_z 7:f33a935eb77a 306 debugLed_r = 0;
adam_z 7:f33a935eb77a 307 slipAcceleration_R = (float)((int16_t)(fromPhoton_r[0]*256+fromPhoton_r[1]))/100.0;
adam_z 7:f33a935eb77a 308 }
adam_z 7:f33a935eb77a 309 }
adam_z 7:f33a935eb77a 310 }
adam_z 7:f33a935eb77a 311 cLast_r = c;
adam_z 7:f33a935eb77a 312
adam_z 7:f33a935eb77a 313 }
adam_z 7:f33a935eb77a 314
adam_z 6:5bd08053e95c 315
adam_z 6:5bd08053e95c 316
adam_z 4:a2d38818c4e7 317 float saturation(float input, float limit_H, float limit_L)
adam_z 4:a2d38818c4e7 318 {
adam_z 4:a2d38818c4e7 319 float output;
adam_z 4:a2d38818c4e7 320 if(input >= limit_H)output = limit_H;
adam_z 4:a2d38818c4e7 321 else if (input <= limit_L)output = limit_L;
adam_z 4:a2d38818c4e7 322 else output = input;
adam_z 4:a2d38818c4e7 323 return output;
adam_z 4:a2d38818c4e7 324 }
adam_z 4:a2d38818c4e7 325
adam_z 4:a2d38818c4e7 326
adam_z 4:a2d38818c4e7 327 void SensorAcquisition(float * data, float samplingTime)
adam_z 6:5bd08053e95c 328 {
adam_z 4:a2d38818c4e7 329
adam_z 6:5bd08053e95c 330 axm = data[0]*(-1)*9.81;//accelerometer dimension from g to m/s^2
adam_z 6:5bd08053e95c 331 aym = data[1]*(-1)*9.81;
adam_z 6:5bd08053e95c 332 azm = data[2]*(-1)*9.81;
adam_z 6:5bd08053e95c 333 u1 = data[0]*3.14159/180; //gyroscope :deg/s to rad/s
adam_z 6:5bd08053e95c 334 u2 = data[1]*3.14159/180;
adam_z 6:5bd08053e95c 335 u3 = data[2]*3.14159/180;
adam_z 6:5bd08053e95c 336
adam_z 6:5bd08053e95c 337
adam_z 6:5bd08053e95c 338 if(conv_init <= 3) {
adam_z 4:a2d38818c4e7 339 axm_f_old = axm;
adam_z 4:a2d38818c4e7 340 aym_f_old = aym;
adam_z 4:a2d38818c4e7 341 azm_f_old = azm;
adam_z 6:5bd08053e95c 342
adam_z 4:a2d38818c4e7 343 conv_init++;
adam_z 6:5bd08053e95c 344 } else {
adam_z 6:5bd08053e95c 345 pitch_fusion(axm, aym,azm,u3,u2,20, samplingTime);
adam_z 6:5bd08053e95c 346 roll_fusion(axm, aym,azm,u3,u1,20, samplingTime);
adam_z 6:5bd08053e95c 347 x3_hat_estimat(axm,aym,azm,u2,u1,20, samplingTime);
adam_z 6:5bd08053e95c 348 }
adam_z 6:5bd08053e95c 349
adam_z 4:a2d38818c4e7 350 }
adam_z 4:a2d38818c4e7 351