code of robot bike

Dependencies:   SDFileSystem mbed

Fork of Robot_Bicycle by Chris LU

Committer:
YCTung
Date:
Sun Jul 10 09:41:33 2016 +0000
Revision:
7:b8413464d111
Parent:
6:bd469c945e41
Child:
8:79ca11e0129d
print data to SD

Who changed what in which revision?

UserRevisionLine numberNew contents of line
YCTung 0:830ddddc129f 1 #include "mbed.h"
YCTung 6:bd469c945e41 2 #include "SDFileSystem.h"
YCTung 0:830ddddc129f 3
YCTung 0:830ddddc129f 4 #include "RobotServo.h"
YCTung 0:830ddddc129f 5 #include "SensorFusion.h"
YCTung 0:830ddddc129f 6 #include "SPI_9dSensor.h"
YCTung 0:830ddddc129f 7 #include "RobotBicycleConst.h"
YCTung 3:197b748a397a 8 #include "ZTC.h"
YCTung 3:197b748a397a 9 //************************************************//
YCTung 3:197b748a397a 10 //**************** Wiring Map ********************//
YCTung 3:197b748a397a 11 //CK3 PC_10 | PC_11 MI3||re PC_9 | PC_8 rw
YCTung 3:197b748a397a 12 //MO3 PC_12 | PD_2 || |-----------------|
YCTung 3:197b748a397a 13 // 3.3V | E5V ||rs |PB_8 D15 | PC_6 |TX6
YCTung 3:197b748a397a 14 // BOOT0 | GND ||ra |PB_9 D14 | PC_5 |
YCTung 3:197b748a397a 15 // |---------------| || |AVDD | U5V |
YCTung 3:197b748a397a 16 // |NC | NC | || |GND | NC |
YCTung 3:197b748a397a 17 // |NC | IOREF | ||rk |PA_5 D13 | PA_12|RX6
YCTung 3:197b748a397a 18 // |PA_13 | NRST | || |PA_6 D12 | PA_11| rl
YCTung 3:197b748a397a 19 // |PA_14 | 3.3V | || |PA_7 D11 | PB_12|
YCTung 3:197b748a397a 20 // |PA_15 | 5.0V | ||rb |PB_6 D10 | NC |
YCTung 3:197b748a397a 21 // |GND | GND | || |PC_7 D9 | GND |
YCTung 3:197b748a397a 22 // |PB_7 | GND | ||lb |PA_9 D8 | PB_2 |CSG
YCTung 3:197b748a397a 23 // |PC_13 | VIN | || |-----------------|
YCTung 3:197b748a397a 24 // |---------------| || |-----------------|
YCTung 3:197b748a397a 25 // PC_14 | NC ||ll |PA_8 D7 | PB_1 |CSX
YCTung 3:197b748a397a 26 // |---------------| ||lk |PB_10 D6 | PB_15|MO2
YCTung 3:197b748a397a 27 // |PC_15 | PA_0 A0| ||la |PB_4 D5 | PB_14|MI2
YCTung 3:197b748a397a 28 // |PH_0 | PA_1 A1| ||ls |PB_5 D4 | PB_13|CK2
YCTung 3:197b748a397a 29 // |PH_1 | PA_4 A2| ||le |PB_3 D3 | AGND |
YCTung 3:197b748a397a 30 // |VBAT | PB_0 A3| ||lw |PA_10 D2 | PC_4 |
YCTung 4:b0967990e390 31 //out|PC_2 | PC_1 A4| ||TX2|PA_2 D1 | NC |
YCTung 4:b0967990e390 32 //out|PC_3 | PC_0 A5|IR ||RX2|PA_3 D0 | NC |
YCTung 3:197b748a397a 33 // |---------------| || |-----------------|
YCTung 3:197b748a397a 34 //************************************************//
YCTung 0:830ddddc129f 35
YCTung 3:197b748a397a 36 #define IR_FILT_CONST 1.0f * 2.0f * 3.14159f / 250.0f
YCTung 3:197b748a397a 37
YCTung 3:197b748a397a 38 #define CNT2ZTCm 250
YCTung 3:197b748a397a 39 #define CNT2ZTCh 5
YCTung 3:197b748a397a 40 #define CNT2STRT 1250
YCTung 3:197b748a397a 41
YCTung 0:830ddddc129f 42 AnalogIn analog_value(A5);//When using the ADC module, those pins connected to AnalogIn can't be used to output.
YCTung 0:830ddddc129f 43
YCTung 0:830ddddc129f 44 Ticker timer1;
YCTung 0:830ddddc129f 45 Ticker timer2;
YCTung 2:ec30613f2b2b 46 Timeout timeout;
YCTung 0:830ddddc129f 47
YCTung 4:b0967990e390 48 DigitalOut pin_pc2(PC_2);
YCTung 4:b0967990e390 49 DigitalOut pin_pc3(PC_3);
YCTung 4:b0967990e390 50
YCTung 2:ec30613f2b2b 51 Serial BT(PC_6, PA_12);
YCTung 2:ec30613f2b2b 52
YCTung 6:bd469c945e41 53 SDFileSystem SD_card(PC_12, PC_11, PC_10, PD_2, "sd"); //mosi, miso, sck, cs, name
YCTung 0:830ddddc129f 54
YCTung 3:197b748a397a 55 //**** Variables from Arduino ****//
YCTung 3:197b748a397a 56 int counter = 0;
YCTung 3:197b748a397a 57 int i = 0;
YCTung 3:197b748a397a 58 int8_t c = FIRST_POS;
YCTung 3:197b748a397a 59 bool s = 0;
YCTung 3:197b748a397a 60 int fusion_init = 0;
YCTung 3:197b748a397a 61 int state_count = 0;
YCTung 3:197b748a397a 62 uint8_t state_change = 0;
YCTung 3:197b748a397a 63 uint16_t brake_count = 0;
YCTung 3:197b748a397a 64 float V_meas = 0;
YCTung 3:197b748a397a 65 float L_inver = 0;
YCTung 3:197b748a397a 66 bool toggle = 0;
YCTung 3:197b748a397a 67 //********************************//
YCTung 3:197b748a397a 68
YCTung 3:197b748a397a 69 //***** Variables from RasPi *****//
YCTung 3:197b748a397a 70 char BTCharR = 0;
YCTung 3:197b748a397a 71
YCTung 3:197b748a397a 72 float Vx = 0.0;
YCTung 3:197b748a397a 73 float Vx_old = 0.0;
YCTung 3:197b748a397a 74
YCTung 7:b8413464d111 75 unsigned char fall_down = 0;
YCTung 3:197b748a397a 76 unsigned char pedal_state = 0;
YCTung 3:197b748a397a 77 unsigned char sys_state = S_S;
YCTung 3:197b748a397a 78 unsigned int count2ztc_h = 0;
YCTung 3:197b748a397a 79 unsigned int count2ztc_m = 0;
YCTung 3:197b748a397a 80 unsigned int count2straight = 0;
YCTung 3:197b748a397a 81 unsigned int count_isr = 0;
YCTung 3:197b748a397a 82 float T_total = 0.0;
YCTung 7:b8413464d111 83
YCTung 7:b8413464d111 84 FILE *dataPtr;
YCTung 3:197b748a397a 85 //********************************//
YCTung 3:197b748a397a 86
YCTung 2:ec30613f2b2b 87 bool resetting = 0;
YCTung 0:830ddddc129f 88
YCTung 0:830ddddc129f 89 void timer1_interrupt(void);
YCTung 0:830ddddc129f 90 void timer2_interrupt(void);
YCTung 7:b8413464d111 91 void fprintf_data(unsigned char mode);
YCTung 2:ec30613f2b2b 92 void reset_offset(void);
YCTung 5:2290732b2782 93 void ready_to_go(void);
YCTung 2:ec30613f2b2b 94 void attimeout(void);
YCTung 0:830ddddc129f 95
YCTung 0:830ddddc129f 96 int main() {
YCTung 4:b0967990e390 97 pin_pc2 = pin_pc3 = 0;
YCTung 4:b0967990e390 98
YCTung 0:830ddddc129f 99 setupServo();
YCTung 4:b0967990e390 100 pc.baud(115200);
YCTung 4:b0967990e390 101 setup_spi_sensor();
YCTung 2:ec30613f2b2b 102 init_Sensors();
YCTung 5:2290732b2782 103
YCTung 2:ec30613f2b2b 104 BT.baud(115200);
YCTung 2:ec30613f2b2b 105
YCTung 2:ec30613f2b2b 106 reset_offset();
YCTung 0:830ddddc129f 107
YCTung 0:830ddddc129f 108 timer1.attach_us(&timer1_interrupt, 4000);//4.0ms interrupt period (250 Hz)
YCTung 0:830ddddc129f 109 timer2.attach_us(&timer2_interrupt, 4098);//4.098ms interrupt period (244 Hz)
YCTung 0:830ddddc129f 110
YCTung 7:b8413464d111 111 mkdir("/sd/20160710", 0777);
YCTung 7:b8413464d111 112 dataPtr = fopen("/sd/20160710/data.dat", "w");
YCTung 7:b8413464d111 113 if(dataPtr == NULL) {
YCTung 7:b8413464d111 114 error("Could not open file for write\r\n");
YCTung 7:b8413464d111 115 interrupt = 1;
YCTung 7:b8413464d111 116 }
YCTung 7:b8413464d111 117 fprintf_data(0);
YCTung 7:b8413464d111 118 fclose(dataPtr);
YCTung 2:ec30613f2b2b 119 pc.printf("System ready.\r\n");
YCTung 2:ec30613f2b2b 120
YCTung 3:197b748a397a 121 reset_pos();
YCTung 3:197b748a397a 122 lookuptable_steering(HANDLE_START);
YCTung 4:b0967990e390 123 // lookuptable_steering(0);
YCTung 0:830ddddc129f 124
YCTung 3:197b748a397a 125 while(!interrupt)
YCTung 3:197b748a397a 126 {
YCTung 3:197b748a397a 127 if(BT.readable())
YCTung 3:197b748a397a 128 {
YCTung 3:197b748a397a 129 BTCharR = BT.getc();
YCTung 3:197b748a397a 130 switch(BTCharR)
YCTung 3:197b748a397a 131 {
YCTung 6:bd469c945e41 132 case 's': //reset_offset();
YCTung 5:2290732b2782 133 ready_to_go();
YCTung 5:2290732b2782 134 pc.printf("go\r\n");
YCTung 3:197b748a397a 135 pedal_state = 1; sys_state = L_PD; gamma_ref = 0.0;
YCTung 7:b8413464d111 136 dataPtr = fopen("/sd/20160710/data.dat", "a");
YCTung 7:b8413464d111 137 if(dataPtr == NULL) {
YCTung 7:b8413464d111 138 error("Could not open file for write\r\n");
YCTung 7:b8413464d111 139 interrupt = 1;
YCTung 7:b8413464d111 140 break;
YCTung 7:b8413464d111 141 }
YCTung 3:197b748a397a 142 s = 1; break; ///start
YCTung 5:2290732b2782 143 case 'a': pc.printf("stop\r\n");
YCTung 5:2290732b2782 144 pedal_state = 0; sys_state = S_S; Vx = 0.0; Vx_old = 0.0; gamma_ref = 0.0; count2ztc_h = 0; count2ztc_m = 0;
YCTung 7:b8413464d111 145 s = 0; state_count = 0;
YCTung 7:b8413464d111 146 fclose(dataPtr); break; ///stop
YCTung 3:197b748a397a 147 // case 'm': pedal_state = 2; sys_state = M_PD; gamma_ref = 0.0; if(count2ztc_m >= CNT2ZTCm){sys_state = M_ZTC;} break;
YCTung 3:197b748a397a 148 // case 'h': pedal_state = 3; sys_state = H_PD; gamma_ref = 0.0; if(count2ztc_h >= CNT2ZTCh){sys_state = H_ZTC;} break;
YCTung 3:197b748a397a 149 case 'l': gamma_ref = DLT_GAMMA_REF; roll_ref = 0.0; count2straight = 0; break; ///left
YCTung 3:197b748a397a 150 case 'r': gamma_ref = -DLT_GAMMA_REF; roll_ref = 0.0; count2straight = 0; break; ///right
YCTung 3:197b748a397a 151 case 'f': gamma_ref = 0.0; roll_ref = 0.0; break; ///forward
YCTung 3:197b748a397a 152 case 'c': gamma_ref = 0.0; reset_offset(); break; ///clear
YCTung 3:197b748a397a 153 default: break;
YCTung 3:197b748a397a 154 }
YCTung 3:197b748a397a 155 BTCharR = 0;
YCTung 3:197b748a397a 156 }
YCTung 3:197b748a397a 157
YCTung 4:b0967990e390 158 sensorG_read_3axis();
YCTung 4:b0967990e390 159 sensorX_read_3axis();
YCTung 4:b0967990e390 160
YCTung 4:b0967990e390 161 get_9axis_scale();
YCTung 4:b0967990e390 162 get_9axis_data(pedal_state);
YCTung 4:b0967990e390 163
YCTung 3:197b748a397a 164 L_inver = 0.0063f * V_meas - 0.005769f;
YCTung 0:830ddddc129f 165 }
YCTung 0:830ddddc129f 166 }
YCTung 0:830ddddc129f 167
YCTung 0:830ddddc129f 168 void timer1_interrupt(void)
YCTung 0:830ddddc129f 169 {
YCTung 4:b0967990e390 170 // pin_pc2 = !pin_pc2;
YCTung 3:197b748a397a 171 V_meas = (analog_value.read() * 3.3f) * IR_FILT_CONST + V_meas * (1.0f - IR_FILT_CONST);
YCTung 4:b0967990e390 172
YCTung 4:b0967990e390 173 // pc.printf("%d\t%d\t%d\r\n", filted_sensor_data(INDEX_ACCE_X, 1.8), filted_sensor_data(INDEX_ACCE_Y, 1.8), filted_sensor_data(INDEX_ACCE_Z, 1.8));
YCTung 4:b0967990e390 174
YCTung 4:b0967990e390 175 roll_fusion(axm,aym,azm,u3,u1,1);
YCTung 4:b0967990e390 176 x1_hat_estimat(axm,aym,azm,u3,u2,Alpha);
YCTung 4:b0967990e390 177 m_x1_hat(mx,my,mz,u3,u2,Alpha);
YCTung 4:b0967990e390 178 m_x2_hat(mx,my,mz,u3,u1,Alpha);
YCTung 4:b0967990e390 179
YCTung 4:b0967990e390 180 if(cosroll != 0)
YCTung 4:b0967990e390 181 {
YCTung 7:b8413464d111 182 if(roll_angle >= 0.1745f || roll_angle <= -0.1745f)fall_down = 1;
YCTung 7:b8413464d111 183 else fall_down = 0;
YCTung 7:b8413464d111 184
YCTung 4:b0967990e390 185 droll_angle = lpf(u1, droll_angle_old, 62.8);
YCTung 4:b0967990e390 186 droll_angle_old = droll_angle;
YCTung 4:b0967990e390 187 dyaw_angle = lpf(u3/cosroll, dyaw_angle_old, 3.1416);
YCTung 4:b0967990e390 188 dyaw_angle_old = dyaw_angle;
YCTung 4:b0967990e390 189 // m_yaw_fusion();
YCTung 4:b0967990e390 190
YCTung 4:b0967990e390 191 ///cut off
YCTung 4:b0967990e390 192 if(m_sinyaw <= -1.0f)m_sinyaw = -1.0f;
YCTung 4:b0967990e390 193 else if(m_sinyaw >= 1.0f)m_sinyaw = 1.0f;
YCTung 4:b0967990e390 194 else ;
YCTung 4:b0967990e390 195 if(m_cosyaw <= -1.0f)m_cosyaw = -1.0f;
YCTung 4:b0967990e390 196 else if(m_cosyaw >= 1.0f)m_cosyaw = 1.0f;
YCTung 4:b0967990e390 197 else ;
YCTung 4:b0967990e390 198
YCTung 4:b0967990e390 199 ///Controller
YCTung 4:b0967990e390 200 if(sys_state == L_PD)
YCTung 4:b0967990e390 201 {
YCTung 4:b0967990e390 202 calc_PD(K_l, 0.0);
YCTung 4:b0967990e390 203 calc_Gamma(u,15,b_h);
YCTung 4:b0967990e390 204 gamma_rad = gamma_rad + L_PD_OFFSET;
YCTung 4:b0967990e390 205
YCTung 4:b0967990e390 206 dphi_hat = 0.0;
YCTung 4:b0967990e390 207 phi_hat = 0.0;
YCTung 4:b0967990e390 208 yaw_angle = yaw_angle_old + dyaw_angle * sample_time;
YCTung 4:b0967990e390 209 yaw_angle_old = yaw_angle;
YCTung 4:b0967990e390 210 }
YCTung 4:b0967990e390 211 else if(sys_state == M_PD)
YCTung 4:b0967990e390 212 {
YCTung 4:b0967990e390 213 calc_PD(K_m, 0.0);
YCTung 4:b0967990e390 214 calc_Gamma(u,15,b_h);
YCTung 4:b0967990e390 215
YCTung 4:b0967990e390 216 dphi_hat = 0.0;
YCTung 4:b0967990e390 217 phi_hat = 0.0;
YCTung 4:b0967990e390 218 yaw_angle = yaw_angle_old + dyaw_angle * sample_time;
YCTung 4:b0967990e390 219 yaw_angle_old = yaw_angle;
YCTung 4:b0967990e390 220
YCTung 4:b0967990e390 221 count2ztc_m++;
YCTung 4:b0967990e390 222 if(count2ztc_m >= CNT2ZTCm){sys_state = M_ZTC;}
YCTung 4:b0967990e390 223 }
YCTung 4:b0967990e390 224 else if(sys_state == M_ZTC)
YCTung 4:b0967990e390 225 {
YCTung 4:b0967990e390 226 if(count2straight < CNT2STRT){count2straight++;}
YCTung 4:b0967990e390 227 else{gamma_ref = 0.0; roll_ref = 0.0;}
YCTung 4:b0967990e390 228 calc_PD(K_m, phi_hat);
YCTung 4:b0967990e390 229 calc_Phi(K_mphi);
YCTung 4:b0967990e390 230 calc_Gamma(u,15,b_h);
YCTung 4:b0967990e390 231
YCTung 4:b0967990e390 232 yaw_angle = yaw_angle_old + dyaw_angle * sample_time;
YCTung 4:b0967990e390 233 yaw_angle_old = yaw_angle;
YCTung 4:b0967990e390 234 }
YCTung 4:b0967990e390 235 else if(sys_state == H_PD)
YCTung 4:b0967990e390 236 {
YCTung 4:b0967990e390 237 calc_PD(K_h,0.0);
YCTung 4:b0967990e390 238 calc_Gamma(u,15,b_h);
YCTung 4:b0967990e390 239
YCTung 4:b0967990e390 240 dphi_hat = 0.0;
YCTung 4:b0967990e390 241 phi_hat = 0.0;
YCTung 4:b0967990e390 242 yaw_angle = yaw_angle_old + dyaw_angle * sample_time;
YCTung 4:b0967990e390 243 yaw_angle_old = yaw_angle;
YCTung 4:b0967990e390 244
YCTung 4:b0967990e390 245 // count2ztc_h++;
YCTung 4:b0967990e390 246 if(count2ztc_h >= CNT2ZTCh){sys_state = H_ZTC;}
YCTung 4:b0967990e390 247 }
YCTung 4:b0967990e390 248 else if(sys_state == H_ZTC)
YCTung 4:b0967990e390 249 {
YCTung 4:b0967990e390 250 if(count2straight < CNT2STRT){count2straight++;}
YCTung 4:b0967990e390 251 else{gamma_ref = 0.0; roll_ref = 0.0;}
YCTung 4:b0967990e390 252 calc_PD(K_h, phi_hat);
YCTung 4:b0967990e390 253 calc_Phi(K_hphi);
YCTung 4:b0967990e390 254 calc_Gamma(u,15,b_h);
YCTung 4:b0967990e390 255
YCTung 4:b0967990e390 256 yaw_angle = yaw_angle_old + dyaw_angle * sample_time;
YCTung 4:b0967990e390 257 yaw_angle_old = yaw_angle;
YCTung 4:b0967990e390 258 }
YCTung 4:b0967990e390 259 else
YCTung 4:b0967990e390 260 {
YCTung 4:b0967990e390 261 u = 0.0;
YCTung 5:2290732b2782 262 // calc_PD(K_l, 0.0);
YCTung 4:b0967990e390 263 calc_Gamma(u,15,b_h);
YCTung 4:b0967990e390 264 dphi_hat = 0.0;
YCTung 4:b0967990e390 265 phi_hat = 0.0;
YCTung 4:b0967990e390 266 yaw_angle = 0.0;
YCTung 4:b0967990e390 267 yaw_angle_old = 0.0;
YCTung 4:b0967990e390 268 }
YCTung 4:b0967990e390 269
YCTung 4:b0967990e390 270 ///Anti-Windup
YCTung 4:b0967990e390 271 anti_wdup();
YCTung 4:b0967990e390 272
YCTung 4:b0967990e390 273 // calc_Gamma(u,15,b_h);
YCTung 4:b0967990e390 274 if(gamma_rad > 0.349f)gamma_rad = 0.349f;
YCTung 4:b0967990e390 275 else if(gamma_rad < -0.349f)gamma_rad = -0.349f;
YCTung 4:b0967990e390 276 else ;
YCTung 4:b0967990e390 277 // printf("%d Roll:%9.6f dRoll:%9.6f u:%9.6f phi_hat:%9.6f gamma:%9.6f\r\n", sys_state, roll_angle, droll_angle, u, phi_hat, gamma_rad);
YCTung 4:b0967990e390 278
YCTung 4:b0967990e390 279 ///Show results or Send datas
YCTung 4:b0967990e390 280 gamma_degree = (short int)(gamma_rad*114.59f);
YCTung 4:b0967990e390 281 if(gamma_degree > 40)gamma_degree = 40;
YCTung 4:b0967990e390 282 else if(gamma_degree < -40)gamma_degree = -40;
YCTung 4:b0967990e390 283 else ;
YCTung 4:b0967990e390 284
YCTung 4:b0967990e390 285 ///Steering
YCTung 4:b0967990e390 286 if(s == 1)
YCTung 4:b0967990e390 287 {
YCTung 4:b0967990e390 288 if(state_count > COUN2_HANDLE_START)
YCTung 4:b0967990e390 289 {
YCTung 4:b0967990e390 290 lookuptable_steering( gamma_degree );
YCTung 4:b0967990e390 291 }
YCTung 4:b0967990e390 292 else
YCTung 4:b0967990e390 293 {
YCTung 4:b0967990e390 294 lookuptable_steering( gamma_degree + HANDLE_START_BAL);
YCTung 4:b0967990e390 295 }
YCTung 4:b0967990e390 296 }
YCTung 4:b0967990e390 297 else
YCTung 4:b0967990e390 298 {
YCTung 4:b0967990e390 299 if(c == FIRST_POS)
YCTung 4:b0967990e390 300 {
YCTung 4:b0967990e390 301 if(state_change > 0)
YCTung 4:b0967990e390 302 {
YCTung 4:b0967990e390 303 lookuptable_steering(HANDLE_STOP);
YCTung 4:b0967990e390 304 }
YCTung 4:b0967990e390 305 else
YCTung 4:b0967990e390 306 {
YCTung 5:2290732b2782 307 if(!resetting)
YCTung 5:2290732b2782 308 {
YCTung 5:2290732b2782 309 lookuptable_steering(HANDLE_START);
YCTung 5:2290732b2782 310 // lookuptable_steering(HANDLE_STRAIGHT);
YCTung 5:2290732b2782 311 // lookuptable_steering( gamma_degree );
YCTung 5:2290732b2782 312 }
YCTung 5:2290732b2782 313 else ;
YCTung 4:b0967990e390 314 }
YCTung 4:b0967990e390 315 }
YCTung 4:b0967990e390 316 else lookuptable_steering( gamma_degree + HANDLE_START_BAL);
YCTung 4:b0967990e390 317 }
YCTung 4:b0967990e390 318
YCTung 4:b0967990e390 319 ///print file
YCTung 4:b0967990e390 320 if(sys_state >= 1)
YCTung 4:b0967990e390 321 {
YCTung 4:b0967990e390 322 count_isr++;
YCTung 4:b0967990e390 323 T_total = (float)sample_time*count_isr;
YCTung 4:b0967990e390 324
YCTung 4:b0967990e390 325 ///Integrate Ax to get Vx
YCTung 4:b0967990e390 326 Vx = Vx_old - axm_f*sample_time;
YCTung 4:b0967990e390 327 Vx_old = Vx;
YCTung 4:b0967990e390 328 // if(Vx >= v_low && sys_state < M_PD){pedal_state = 2; sys_state = M_PD; gamma_ref = 0.0;}
YCTung 4:b0967990e390 329
YCTung 7:b8413464d111 330 fprintf_data(1);
YCTung 4:b0967990e390 331 }
YCTung 4:b0967990e390 332 }
YCTung 4:b0967990e390 333 else
YCTung 4:b0967990e390 334 {
YCTung 4:b0967990e390 335 roll_fusion(0,0,0,0,0,1);
YCTung 4:b0967990e390 336 gamma_degree = 0;
YCTung 4:b0967990e390 337 }
YCTung 0:830ddddc129f 338 }
YCTung 0:830ddddc129f 339
YCTung 0:830ddddc129f 340 void timer2_interrupt(void)
YCTung 0:830ddddc129f 341 {
YCTung 4:b0967990e390 342 // pin_pc3 = !pin_pc3;
YCTung 3:197b748a397a 343 if(s == 1) // bluetooth start
YCTung 3:197b748a397a 344 {
YCTung 3:197b748a397a 345 i ++;
YCTung 3:197b748a397a 346 if(i == Z_PEDAL_DIVIDER && state_change == 0) //start
YCTung 3:197b748a397a 347 {
YCTung 3:197b748a397a 348 i = 0;
YCTung 3:197b748a397a 349 lookuptable_pedaling(c);
YCTung 3:197b748a397a 350 c++;
YCTung 3:197b748a397a 351 if(c == (FIRST_POS + TOT_STOP_POS)){c = FIRST_POS + TOT_STOP_POS + TOT_STOP_POS - 1;}
YCTung 3:197b748a397a 352 else if(c >= TOT_FOOT_POS){c = 0;}
YCTung 3:197b748a397a 353 state_count++;
YCTung 3:197b748a397a 354 }
YCTung 3:197b748a397a 355 else if(i == L_PEDAL_DIVIDER && state_change == 1) //low_v
YCTung 3:197b748a397a 356 {
YCTung 3:197b748a397a 357 i = 0;
YCTung 3:197b748a397a 358 lookuptable_pedaling(c);
YCTung 3:197b748a397a 359 c++;
YCTung 3:197b748a397a 360 if(c == FIRST_POS){c = FIRST_POS + TOT_STOP_POS;}
YCTung 3:197b748a397a 361 else if(c >= TOT_FOOT_POS){c = 0;}
YCTung 3:197b748a397a 362 state_count++;
YCTung 3:197b748a397a 363 }
YCTung 3:197b748a397a 364 else if(i == M_PEDAL_DIVIDER && state_change == 2) //mid_v
YCTung 3:197b748a397a 365 {
YCTung 3:197b748a397a 366 i = 0;
YCTung 3:197b748a397a 367 lookuptable_pedaling(c);
YCTung 3:197b748a397a 368 c++;
YCTung 3:197b748a397a 369 if(c == FIRST_POS){c = FIRST_POS + TOT_STOP_POS;}
YCTung 3:197b748a397a 370 else if(c >= TOT_FOOT_POS){c = 0;}
YCTung 3:197b748a397a 371 state_count++;
YCTung 3:197b748a397a 372 }
YCTung 3:197b748a397a 373 else if(i == M_PEDAL_DIVIDER && state_change == 3) //high_v
YCTung 3:197b748a397a 374 {
YCTung 3:197b748a397a 375 i = 0;
YCTung 3:197b748a397a 376 lookuptable_pedaling(c);
YCTung 3:197b748a397a 377 c++;
YCTung 3:197b748a397a 378 if(c == FIRST_POS){c = FIRST_POS + TOT_STOP_POS;}
YCTung 3:197b748a397a 379 else if(c >= TOT_FOOT_POS){c = 0;}
YCTung 3:197b748a397a 380 }
YCTung 3:197b748a397a 381
YCTung 3:197b748a397a 382 if(state_count == COUN2_LOW_V)
YCTung 3:197b748a397a 383 {
YCTung 3:197b748a397a 384 state_change = 1;
YCTung 3:197b748a397a 385 }
YCTung 3:197b748a397a 386 else if(state_count == COUN2_MID_V)
YCTung 3:197b748a397a 387 {
YCTung 3:197b748a397a 388 state_change = 2;
YCTung 3:197b748a397a 389 }
YCTung 3:197b748a397a 390 else if(state_count == COUN2_HIGH_V)
YCTung 3:197b748a397a 391 {
YCTung 3:197b748a397a 392 if(state_change == 2)
YCTung 3:197b748a397a 393 {
YCTung 5:2290732b2782 394 pc.printf("m\r\n");
YCTung 5:2290732b2782 395 // BT.printf("m\r\n");
YCTung 3:197b748a397a 396 pedal_state = 2;
YCTung 3:197b748a397a 397 sys_state = M_PD;
YCTung 3:197b748a397a 398 gamma_ref = 0.0;
YCTung 3:197b748a397a 399 if(count2ztc_m >= CNT2ZTCm)
YCTung 3:197b748a397a 400 {
YCTung 3:197b748a397a 401 sys_state = M_ZTC;
YCTung 3:197b748a397a 402 }
YCTung 3:197b748a397a 403 }
YCTung 3:197b748a397a 404 state_change = 3;
YCTung 3:197b748a397a 405 }
YCTung 3:197b748a397a 406 }
YCTung 3:197b748a397a 407 else //s is 0
YCTung 3:197b748a397a 408 {
YCTung 3:197b748a397a 409 if(c == FIRST_POS)
YCTung 3:197b748a397a 410 {
YCTung 3:197b748a397a 411 if(state_change > 0)
YCTung 3:197b748a397a 412 {
YCTung 3:197b748a397a 413 stop_pos();
YCTung 3:197b748a397a 414 brake_count++;
YCTung 3:197b748a397a 415 if(brake_count >= 3*244)
YCTung 3:197b748a397a 416 {
YCTung 3:197b748a397a 417 state_change = 0;
YCTung 3:197b748a397a 418 brake_count = 0;
YCTung 3:197b748a397a 419 }
YCTung 3:197b748a397a 420 }
YCTung 3:197b748a397a 421 else
YCTung 3:197b748a397a 422 {
YCTung 5:2290732b2782 423 reset_pos();
YCTung 3:197b748a397a 424 }
YCTung 3:197b748a397a 425 }
YCTung 3:197b748a397a 426 else
YCTung 3:197b748a397a 427 {
YCTung 3:197b748a397a 428 i++;
YCTung 3:197b748a397a 429 if(i == M_PEDAL_DIVIDER)
YCTung 3:197b748a397a 430 {
YCTung 3:197b748a397a 431 i = 0;
YCTung 3:197b748a397a 432 lookuptable_pedaling(c);
YCTung 3:197b748a397a 433 c++;
YCTung 3:197b748a397a 434 if(c > FIRST_POS && c < (FIRST_POS + TOT_STOP_POS)){c = FIRST_POS;}
YCTung 3:197b748a397a 435 else if(c >= TOT_FOOT_POS){c = 0;}
YCTung 3:197b748a397a 436 }
YCTung 3:197b748a397a 437 }
YCTung 3:197b748a397a 438 }
YCTung 2:ec30613f2b2b 439 }
YCTung 2:ec30613f2b2b 440
YCTung 7:b8413464d111 441 void fprintf_data(unsigned char mode)
YCTung 7:b8413464d111 442 {
YCTung 7:b8413464d111 443 if(mode == 0)
YCTung 7:b8413464d111 444 {
YCTung 7:b8413464d111 445 fprintf(dataPtr, "(not weighted)\nK_l: %f, %f\nK_m: %f, %f\nK_phi: %f, %f, %f\n", K_l[0], K_l[1], K_m[0], K_m[1], K_mphi[0], K_mphi[1], K_mphi[2]);
YCTung 7:b8413464d111 446 fprintf(dataPtr, "Gyro offset: %d %d %d\n", Gyro_axis_zero[0], Gyro_axis_zero[1], Gyro_axis_zero[2]);
YCTung 7:b8413464d111 447 fprintf(dataPtr, "Acce offset: %d %d %d\n", Acce_axis_zero[0], Acce_axis_zero[1], Acce_axis_zero[2]);
YCTung 7:b8413464d111 448 fprintf(dataPtr, "Magn offset: %d %d %d\n", Magn_axis_zero[0], Magn_axis_zero[1], Magn_axis_zero[2]);
YCTung 7:b8413464d111 449 fprintf(dataPtr, "sys_state\t");
YCTung 7:b8413464d111 450 fprintf(dataPtr, "time\t");
YCTung 7:b8413464d111 451 fprintf(dataPtr, "fall\t");
YCTung 7:b8413464d111 452 fprintf(dataPtr, "Roll\t");
YCTung 7:b8413464d111 453 // fprintf(dataPtr, "dRoll\t");
YCTung 7:b8413464d111 454 // fprintf(dataPtr, "dPhi_hat\t");
YCTung 7:b8413464d111 455 fprintf(dataPtr, "Phi_hat\t");
YCTung 7:b8413464d111 456 // fprintf(dataPtr, "dYaw\t");
YCTung 7:b8413464d111 457 fprintf(dataPtr, "Yaw\t");
YCTung 7:b8413464d111 458 // fprintf(dataPtr, "Pedal_step\t");
YCTung 7:b8413464d111 459 // fprintf(dataPtr, "Ctrl_out\t");
YCTung 7:b8413464d111 460 fprintf(dataPtr, "Gamma_ref\t");
YCTung 7:b8413464d111 461 fprintf(dataPtr, "Gamma_rad\t");
YCTung 7:b8413464d111 462 fprintf(dataPtr, "Speed-X\n");
YCTung 7:b8413464d111 463 }
YCTung 7:b8413464d111 464 else
YCTung 7:b8413464d111 465 {
YCTung 7:b8413464d111 466 fprintf(dataPtr, "%d\t", sys_state);
YCTung 7:b8413464d111 467 fprintf(dataPtr, "%f\t", T_total);
YCTung 7:b8413464d111 468 fprintf(dataPtr, "%d\t", fall_down);
YCTung 7:b8413464d111 469 fprintf(dataPtr, "%f\t", roll_angle);
YCTung 7:b8413464d111 470 // fprintf(dataPtr, "%f\t", droll_angle);
YCTung 7:b8413464d111 471 // fprintf(dataPtr, "%f\t", dphi_hat);
YCTung 7:b8413464d111 472 fprintf(dataPtr, "%f\t", phi_hat);
YCTung 7:b8413464d111 473 // fprintf(dataPtr, "%f\t", dyaw_angle);
YCTung 7:b8413464d111 474 fprintf(dataPtr, "%f\t", yaw_angle);
YCTung 7:b8413464d111 475 // fprintf(dataPtr, "%d\t", pedal_step);
YCTung 7:b8413464d111 476 // fprintf(dataPtr, "%f\t", u);
YCTung 7:b8413464d111 477 fprintf(dataPtr, "%f\t", gamma_ref);
YCTung 7:b8413464d111 478 fprintf(dataPtr, "%f\t", gamma_rad);
YCTung 7:b8413464d111 479 fprintf(dataPtr, "%f\n", Vx);
YCTung 7:b8413464d111 480 }
YCTung 7:b8413464d111 481 }
YCTung 7:b8413464d111 482
YCTung 2:ec30613f2b2b 483 void reset_offset(void)
YCTung 2:ec30613f2b2b 484 {
YCTung 2:ec30613f2b2b 485 pc.printf("Reseting gyro and accel-X offset...\r\n");
YCTung 2:ec30613f2b2b 486 resetting = 1;
YCTung 2:ec30613f2b2b 487 timeout.attach(&attimeout, 2.0f);
YCTung 2:ec30613f2b2b 488 while(resetting)
YCTung 2:ec30613f2b2b 489 {
YCTung 2:ec30613f2b2b 490 reset_gyro_offset();
YCTung 2:ec30613f2b2b 491 reset_acceX_offset();
YCTung 2:ec30613f2b2b 492 }
YCTung 2:ec30613f2b2b 493 timeout.detach();
YCTung 2:ec30613f2b2b 494 pc.printf("Done reseting.\r\n");
YCTung 2:ec30613f2b2b 495 // pc.printf("%d\r\n", Acce_axis_zero[0]);
YCTung 2:ec30613f2b2b 496 }
YCTung 2:ec30613f2b2b 497
YCTung 5:2290732b2782 498 void ready_to_go(void)
YCTung 5:2290732b2782 499 {
YCTung 5:2290732b2782 500 resetting = 1;
YCTung 5:2290732b2782 501 lookuptable_pedaling(FIRST_POS);
YCTung 5:2290732b2782 502 lookuptable_steering(HANDLE_STRAIGHT);
YCTung 5:2290732b2782 503 timeout.attach(&attimeout, 1.0f);
YCTung 5:2290732b2782 504 while(resetting)
YCTung 5:2290732b2782 505 {
YCTung 5:2290732b2782 506 wait_ms(100);
YCTung 5:2290732b2782 507 }
YCTung 5:2290732b2782 508 timeout.detach();
YCTung 5:2290732b2782 509 }
YCTung 5:2290732b2782 510
YCTung 2:ec30613f2b2b 511 void attimeout(void)
YCTung 2:ec30613f2b2b 512 {
YCTung 2:ec30613f2b2b 513 resetting = 0;
YCTung 5:2290732b2782 514 }
YCTung 5:2290732b2782 515 //void attimeout2(void)
YCTung 5:2290732b2782 516 //{
YCTung 5:2290732b2782 517 // preparing = 0;
YCTung 5:2290732b2782 518 //}