Version_1

Dependencies:   LSM9DS0 mbed

Committer:
noname001
Date:
Mon Sep 05 02:02:19 2016 +0000
Revision:
1:235bfa26c5c1
Parent:
0:0b8d14ed499f
Version_2 (Date:2016-09-05)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
noname001 1:235bfa26c5c1 1 // 導入需要之header檔
noname001 1:235bfa26c5c1 2 //#include <p30f4011.h>
noname001 0:0b8d14ed499f 3 #include "mbed.h"
noname001 0:0b8d14ed499f 4 #include <math.h>
noname001 0:0b8d14ed499f 5 #include "LSM9DS0.h"
noname001 0:0b8d14ed499f 6
noname001 0:0b8d14ed499f 7
noname001 1:235bfa26c5c1 8 Ticker timer1; // 2 ms
noname001 1:235bfa26c5c1 9 Serial uart_1(D10,D2); // TX : D10 RX : D2 // serial 1
noname001 1:235bfa26c5c1 10 LSM9DS0 sensor(SPI_MODE, D7, D6); // SPI_CS1 : D7 , SPI_CS2 : D6
noname001 1:235bfa26c5c1 11 AnalogIn adc_switch(A0);
noname001 0:0b8d14ed499f 12 // uart data
noname001 0:0b8d14ed499f 13 int display[6] = {0,0,0,0,0,0};
noname001 1:235bfa26c5c1 14 char num[14]={254,255,0,0,0,0,0,0,0,0,0,0,0,0}; // char num[0] , num[1] : 2 start byte
noname001 0:0b8d14ed499f 15
noname001 1:235bfa26c5c1 16 // 等待sensor上電
noname001 0:0b8d14ed499f 17 int tcount = 0;
noname001 0:0b8d14ed499f 18 int init_flag = 0;
noname001 0:0b8d14ed499f 19
noname001 1:235bfa26c5c1 20 int flag_d_1;
noname001 1:235bfa26c5c1 21 int flag_d_2;
noname001 1:235bfa26c5c1 22 int flag_d_3;
noname001 1:235bfa26c5c1 23 int flag_d_4;
noname001 1:235bfa26c5c1 24 int flag_d_5;
noname001 1:235bfa26c5c1 25 int flag_d_6;
noname001 0:0b8d14ed499f 26 int i;
noname001 0:0b8d14ed499f 27 int j;
noname001 0:0b8d14ed499f 28 int k;
noname001 1:235bfa26c5c1 29 int z;
noname001 1:235bfa26c5c1 30 float T = 0.002;
noname001 0:0b8d14ed499f 31 // sensor gain , 由實驗測得
noname001 1:235bfa26c5c1 32 //#define Gyro_gain_x 0.001223735681818
noname001 1:235bfa26c5c1 33 #define Gyro_gain_x 0.001223735681818f
noname001 1:235bfa26c5c1 34 #define Gyro_gain_y 0.001223735681818f
noname001 1:235bfa26c5c1 35 #define Gyro_gain_z 0.001223735681818f
noname001 1:235bfa26c5c1 36 #define Acce_gainx -0.002386188420346f // -9.81 / ( 3264.287 - (-846.872) )
noname001 0:0b8d14ed499f 37 //#define Acce_gainy -0.002372964173321 // -9.81 / ( 3508 - (-626.07) )
noname001 1:235bfa26c5c1 38 #define Acce_gainy -0.002512964173321f
noname001 1:235bfa26c5c1 39 #define Acce_gainz -0.002381154075718f // -9.81 / ( 4413.257 - (293.406) )
noname001 0:0b8d14ed499f 40
noname001 0:0b8d14ed499f 41 // 宣告從sensor讀到的值要存入處理的變數
noname001 1:235bfa26c5c1 42 int16_t Gyro_axis_data[3]; // X, Y, Z axis
noname001 0:0b8d14ed499f 43 float Gyro_axis_data_f[3];
noname001 0:0b8d14ed499f 44 float Gyro_axis_data_f_old[3];
noname001 0:0b8d14ed499f 45 float Gyro_scale[3]; // scale = (data - zero) * gain
noname001 1:235bfa26c5c1 46 float Gyro_axis_zero[3] = {0,-8,8};
noname001 0:0b8d14ed499f 47
noname001 1:235bfa26c5c1 48 int16_t Acce_axis_data[3]; // X, Y, Z axis
noname001 0:0b8d14ed499f 49 float Acce_axis_data_f[3];
noname001 0:0b8d14ed499f 50 float Acce_axis_data_f_old[3];
noname001 0:0b8d14ed499f 51 float Acce_scale[3]; // scale = (data - zero) * gain
noname001 0:0b8d14ed499f 52 //float Acce_axis_zero[3] = {-846.872,-626.07,293.406};
noname001 1:235bfa26c5c1 53 float Acce_axis_zero[3] = {-907,-658,225};
noname001 0:0b8d14ed499f 54
noname001 0:0b8d14ed499f 55 // final sensor output value
noname001 0:0b8d14ed499f 56 float axm = 0; // Acce_scale
noname001 0:0b8d14ed499f 57 float aym = 0; // Acce_scale
noname001 0:0b8d14ed499f 58 float azm = 0; // Acce_scale
noname001 0:0b8d14ed499f 59
noname001 0:0b8d14ed499f 60 float u1 = 0; // Gyro_scale
noname001 0:0b8d14ed499f 61 float u2 = 0; // Gyro_scale
noname001 0:0b8d14ed499f 62 float u3 = 0; // Gyro_scale
noname001 0:0b8d14ed499f 63
noname001 1:235bfa26c5c1 64 // counter for gyro bias //improve
noname001 0:0b8d14ed499f 65 int gyro_count = 0;
noname001 0:0b8d14ed499f 66 int gyro_flag = 0;
noname001 0:0b8d14ed499f 67 float gyro_init_1[10] = {0,0,0,0,0,0,0,0,0,0};
noname001 0:0b8d14ed499f 68 float gyro_init_2[10] = {0,0,0,0,0,0,0,0,0,0};
noname001 0:0b8d14ed499f 69 float gyro_init_3[10] = {0,0,0,0,0,0,0,0,0,0};
noname001 0:0b8d14ed499f 70 int index_count = 0;
noname001 0:0b8d14ed499f 71 float gyro_sum_1 = 0;
noname001 0:0b8d14ed499f 72 float gyro_sum_2 = 0;
noname001 0:0b8d14ed499f 73 float gyro_sum_3 = 0;
noname001 0:0b8d14ed499f 74
noname001 0:0b8d14ed499f 75 // new defined direction
noname001 1:235bfa26c5c1 76 float ax = 0;
noname001 1:235bfa26c5c1 77 float ay = 0;
noname001 0:0b8d14ed499f 78 float az = 0;
noname001 0:0b8d14ed499f 79
noname001 1:235bfa26c5c1 80 float w1 = 0;
noname001 1:235bfa26c5c1 81 float w2 = 0;
noname001 0:0b8d14ed499f 82 float w3 = 0;
noname001 0:0b8d14ed499f 83
noname001 1:235bfa26c5c1 84 float w1_d = 0;
noname001 1:235bfa26c5c1 85 float w2_d = 0;
noname001 0:0b8d14ed499f 86 float w3_d = 0;
noname001 0:0b8d14ed499f 87
noname001 1:235bfa26c5c1 88 //read weight
noname001 1:235bfa26c5c1 89 //char uart_read = 0;
noname001 0:0b8d14ed499f 90
noname001 0:0b8d14ed499f 91 // 速度 , 向心加速度
noname001 0:0b8d14ed499f 92 int rotationspeed = 0;
noname001 0:0b8d14ed499f 93 float omega = 0;
noname001 0:0b8d14ed499f 94 float v = 0;
noname001 0:0b8d14ed499f 95 float v_f = 0;
noname001 0:0b8d14ed499f 96 float v_f_old = 0;
noname001 0:0b8d14ed499f 97 float acy_hat = 0;
noname001 0:0b8d14ed499f 98 float acy_hat_f = 0;
noname001 0:0b8d14ed499f 99 float acy_hat_f_old = 0;
noname001 0:0b8d14ed499f 100
noname001 0:0b8d14ed499f 101 // estimated state variables
noname001 0:0b8d14ed499f 102 float gs1_hat = 0;
noname001 0:0b8d14ed499f 103 float gs1_hat_old = 0;
noname001 0:0b8d14ed499f 104
noname001 0:0b8d14ed499f 105 float gs2_hat = 0;
noname001 0:0b8d14ed499f 106 float gs2_hat_old = 0;
noname001 0:0b8d14ed499f 107
noname001 0:0b8d14ed499f 108 float gs3_hat = 0;
noname001 0:0b8d14ed499f 109 float gs3_hat_old = 0;
noname001 0:0b8d14ed499f 110
noname001 0:0b8d14ed499f 111 float alpf_hat = 0;
noname001 0:0b8d14ed499f 112 float alpf_hat_old = 0;
noname001 0:0b8d14ed499f 113
noname001 0:0b8d14ed499f 114 float v_hat = 0;
noname001 0:0b8d14ed499f 115 float v_hat_old = 0;
noname001 0:0b8d14ed499f 116
noname001 0:0b8d14ed499f 117 // La , Lb
noname001 0:0b8d14ed499f 118 #define pi 3.14
noname001 0:0b8d14ed499f 119 float a = 1.1304; // alpha
noname001 0:0b8d14ed499f 120 float p = 1.1304; // La (0.18 Hz)
noname001 0:0b8d14ed499f 121
noname001 0:0b8d14ed499f 122 // butterworth filter
noname001 0:0b8d14ed499f 123 float b = -0.5652; // Lb (0.18 Hz)
noname001 0:0b8d14ed499f 124 float c = -1.2778;
noname001 0:0b8d14ed499f 125 float d = -0.5652;
noname001 0:0b8d14ed499f 126 float e = -1.2778;
noname001 0:0b8d14ed499f 127 float f = -0.5000;
noname001 0:0b8d14ed499f 128 float g = -1.1304;
noname001 0:0b8d14ed499f 129
noname001 0:0b8d14ed499f 130 // angle
noname001 0:0b8d14ed499f 131 float psi = 0; // pitch angle
noname001 0:0b8d14ed499f 132 float psi_deg = 0;
noname001 0:0b8d14ed499f 133 float theta = 0; // roll angle
noname001 0:0b8d14ed499f 134 float theta_deg = 0;
noname001 0:0b8d14ed499f 135
noname001 0:0b8d14ed499f 136 // normalized variables
noname001 1:235bfa26c5c1 137 float n = 0;
noname001 0:0b8d14ed499f 138 float gs1_hat_n = 0;
noname001 0:0b8d14ed499f 139 float gs2_hat_n = 0;
noname001 0:0b8d14ed499f 140 float gs3_hat_n = 0;
noname001 0:0b8d14ed499f 141
noname001 0:0b8d14ed499f 142 int can_receive_1 = 0;
noname001 0:0b8d14ed499f 143 int can_receive_2 = 0;
noname001 0:0b8d14ed499f 144 int can_receive_3 = 0;
noname001 0:0b8d14ed499f 145
noname001 0:0b8d14ed499f 146 // correction
noname001 0:0b8d14ed499f 147 float psi_c = 0;
noname001 0:0b8d14ed499f 148 float psi_m = 0;
noname001 0:0b8d14ed499f 149 float psi_d = 0;
noname001 0:0b8d14ed499f 150 float alpf_v = 0;
noname001 0:0b8d14ed499f 151 float alpf_c = 0;
noname001 0:0b8d14ed499f 152 float alpf_d = 0;
noname001 0:0b8d14ed499f 153
noname001 0:0b8d14ed499f 154 int current_command = 0;
noname001 0:0b8d14ed499f 155 float Ki = -1.211; // motor constant
noname001 0:0b8d14ed499f 156 float R = 0.33; // wheel radius
noname001 0:0b8d14ed499f 157 float Df = 12; // damping force
noname001 0:0b8d14ed499f 158 int compensationrate = 0;
noname001 0:0b8d14ed499f 159 int Mb = 25; // bicycle mass
noname001 0:0b8d14ed499f 160 int M = 95; // total mass (25+70)
noname001 1:235bfa26c5c1 161 int adc = 0;
noname001 0:0b8d14ed499f 162 int buttom_buf = 0;
noname001 0:0b8d14ed499f 163 int buttom_buf_old = 0;
noname001 0:0b8d14ed499f 164 // 開關安全措施
noname001 0:0b8d14ed499f 165 int b_count = 0;
noname001 0:0b8d14ed499f 166 int b_init_flag = 0;
noname001 0:0b8d14ed499f 167 int b_flag = 0;
noname001 0:0b8d14ed499f 168 int open_flag = 0;
noname001 0:0b8d14ed499f 169 int protect_flag = 0;
noname001 0:0b8d14ed499f 170
noname001 1:235bfa26c5c1 171
noname001 1:235bfa26c5c1 172 // 函式宣告
noname001 0:0b8d14ed499f 173 void init_uart(void);
noname001 0:0b8d14ed499f 174 void separate(void);
noname001 0:0b8d14ed499f 175 void init_Sensors(void);
noname001 1:235bfa26c5c1 176 void init_TIMER();
noname001 1:235bfa26c5c1 177 void timer1_interrupt(void); // void _ISR _T1Interrupt(void);
noname001 0:0b8d14ed499f 178 void read_sensor(void);
noname001 1:235bfa26c5c1 179
noname001 1:235bfa26c5c1 180 //unsigned char SPI_operation(unsigned char data_send);
noname001 1:235bfa26c5c1 181 //void sensorG_setup(void);
noname001 1:235bfa26c5c1 182 //void sensorXM_setup(void);
noname001 1:235bfa26c5c1 183 //void sensorG_read_3axis(void);
noname001 1:235bfa26c5c1 184 //void sensorXM_read_3axis(void);
noname001 1:235bfa26c5c1 185 //void init_ADC(void);
noname001 1:235bfa26c5c1 186 //void _ISR _U2RXInterrupt(void);
noname001 1:235bfa26c5c1 187 //void init_IO(void);
noname001 1:235bfa26c5c1 188 // void init_spi(void);
noname001 1:235bfa26c5c1 189
noname001 0:0b8d14ed499f 190 float lpf(float input,float output_old,float frequency);
noname001 0:0b8d14ed499f 191 float sinr(float input);
noname001 0:0b8d14ed499f 192 float cosr(float input);
noname001 0:0b8d14ed499f 193 float arcsin(float input);
noname001 0:0b8d14ed499f 194 float arccos(float input);
noname001 0:0b8d14ed499f 195 float arctan(float input);
noname001 0:0b8d14ed499f 196
noname001 0:0b8d14ed499f 197
noname001 0:0b8d14ed499f 198
noname001 1:235bfa26c5c1 199 // Main routine
noname001 1:235bfa26c5c1 200 int main(void)
noname001 1:235bfa26c5c1 201 {
noname001 0:0b8d14ed499f 202 //init_IO();
noname001 1:235bfa26c5c1 203 //init_spi();
noname001 1:235bfa26c5c1 204 //init_ADC();
noname001 1:235bfa26c5c1 205 init_TIMER();
noname001 0:0b8d14ed499f 206 init_uart();
noname001 1:235bfa26c5c1 207
noname001 1:235bfa26c5c1 208 while(1) // 永久迴圈
noname001 1:235bfa26c5c1 209 {
noname001 1:235bfa26c5c1 210
noname001 1:235bfa26c5c1 211 }
noname001 1:235bfa26c5c1 212
noname001 1:235bfa26c5c1 213 } // End of main()
noname001 0:0b8d14ed499f 214
noname001 1:235bfa26c5c1 215 /*
noname001 1:235bfa26c5c1 216 void init_IO(void)
noname001 1:235bfa26c5c1 217 {
noname001 1:235bfa26c5c1 218 // 1為數位,0為類比
noname001 1:235bfa26c5c1 219 ADPCFG = 0xffff;
noname001 1:235bfa26c5c1 220
noname001 1:235bfa26c5c1 221 //LED
noname001 1:235bfa26c5c1 222 TRISDbits.TRISD1 = 0; // 定義I/O腳位輸入輸出 0:output 1:input
noname001 1:235bfa26c5c1 223 TRISDbits.TRISD2 = 0;
noname001 1:235bfa26c5c1 224 TRISDbits.TRISD3 = 0;
noname001 1:235bfa26c5c1 225 LATDbits.LATD1 = 1; // 1:dark 0:light
noname001 1:235bfa26c5c1 226 LATDbits.LATD2 = 1;
noname001 1:235bfa26c5c1 227 LATDbits.LATD3 = 1;
noname001 1:235bfa26c5c1 228
noname001 1:235bfa26c5c1 229 //SPI CS
noname001 1:235bfa26c5c1 230 TRISBbits.TRISB4 = 0; // CSXM
noname001 1:235bfa26c5c1 231 TRISBbits.TRISB5 = 0; // CSG
noname001 1:235bfa26c5c1 232 LATBbits.LATB4 = 1;
noname001 1:235bfa26c5c1 233 LATBbits.LATB5 = 1;
noname001 1:235bfa26c5c1 234
noname001 1:235bfa26c5c1 235 //ADC
noname001 1:235bfa26c5c1 236 ADPCFGbits.PCFG6 = 1; // AN6 = digital
noname001 1:235bfa26c5c1 237 TRISBbits.TRISB6 = 1; // input 讀取電壓
noname001 1:235bfa26c5c1 238 }
noname001 1:235bfa26c5c1 239 */
noname001 0:0b8d14ed499f 240
noname001 1:235bfa26c5c1 241 void init_TIMER(){
noname001 1:235bfa26c5c1 242 i = 0;
noname001 1:235bfa26c5c1 243 timer1.attach_us(&timer1_interrupt, 2000.0); // 2 ms
noname001 0:0b8d14ed499f 244 }
noname001 0:0b8d14ed499f 245
noname001 0:0b8d14ed499f 246
noname001 1:235bfa26c5c1 247 //void _ISR1 _T1Interrupt(void) // 500Hz
noname001 1:235bfa26c5c1 248 void timer1_interrupt(void)
noname001 0:0b8d14ed499f 249 {
noname001 1:235bfa26c5c1 250 //LATDbits.LATD3 = 1;
noname001 1:235bfa26c5c1 251
noname001 1:235bfa26c5c1 252 if(init_flag == 0) //用timer代替 數超過300次 開始讀植
noname001 1:235bfa26c5c1 253 {
noname001 1:235bfa26c5c1 254 tcount = tcount + 1;
noname001 1:235bfa26c5c1 255
noname001 1:235bfa26c5c1 256 if(tcount >= 300)
noname001 1:235bfa26c5c1 257 {
noname001 1:235bfa26c5c1 258 init_Sensors(); // 讓sensor完全上電後再初始化sensor
noname001 1:235bfa26c5c1 259 tcount = 0;
noname001 1:235bfa26c5c1 260 init_flag = 1;
noname001 1:235bfa26c5c1 261 }
noname001 1:235bfa26c5c1 262 }
noname001 1:235bfa26c5c1 263
noname001 1:235bfa26c5c1 264 else
noname001 1:235bfa26c5c1 265 {
noname001 1:235bfa26c5c1 266 read_sensor();
noname001 1:235bfa26c5c1 267
noname001 1:235bfa26c5c1 268 // gyro filter
noname001 1:235bfa26c5c1 269 Gyro_axis_data_f[0] = lpf(Gyro_axis_data[0],Gyro_axis_data_f_old[0],18);
noname001 1:235bfa26c5c1 270 Gyro_axis_data_f_old[0] = Gyro_axis_data_f[0];
noname001 1:235bfa26c5c1 271 Gyro_axis_data_f[1] = lpf(Gyro_axis_data[1],Gyro_axis_data_f_old[1],18);
noname001 1:235bfa26c5c1 272 Gyro_axis_data_f_old[1] = Gyro_axis_data_f[1];
noname001 1:235bfa26c5c1 273 Gyro_axis_data_f[2] = lpf(Gyro_axis_data[2],Gyro_axis_data_f_old[2],18);
noname001 1:235bfa26c5c1 274 Gyro_axis_data_f_old[2] = Gyro_axis_data_f[2];
noname001 1:235bfa26c5c1 275
noname001 1:235bfa26c5c1 276 // gyro bias average
noname001 1:235bfa26c5c1 277 if(gyro_flag == 0)
noname001 1:235bfa26c5c1 278 {
noname001 1:235bfa26c5c1 279 gyro_count = gyro_count + 1;
noname001 1:235bfa26c5c1 280
noname001 1:235bfa26c5c1 281 if(gyro_count == 500)
noname001 1:235bfa26c5c1 282 {
noname001 1:235bfa26c5c1 283 gyro_init_1[index_count] = Gyro_axis_data_f[0];
noname001 1:235bfa26c5c1 284 gyro_init_2[index_count] = Gyro_axis_data_f[1];
noname001 1:235bfa26c5c1 285 gyro_init_3[index_count] = Gyro_axis_data_f[2];
noname001 1:235bfa26c5c1 286 index_count++;
noname001 1:235bfa26c5c1 287 }
noname001 1:235bfa26c5c1 288 else if(gyro_count == 505)
noname001 1:235bfa26c5c1 289 {
noname001 1:235bfa26c5c1 290 gyro_init_1[index_count] = Gyro_axis_data_f[0];
noname001 1:235bfa26c5c1 291 gyro_init_2[index_count] = Gyro_axis_data_f[1];
noname001 1:235bfa26c5c1 292 gyro_init_3[index_count] = Gyro_axis_data_f[2];
noname001 1:235bfa26c5c1 293 index_count++;
noname001 1:235bfa26c5c1 294 }
noname001 1:235bfa26c5c1 295 else if(gyro_count == 510)
noname001 1:235bfa26c5c1 296 {
noname001 1:235bfa26c5c1 297 gyro_init_1[index_count] = Gyro_axis_data_f[0];
noname001 1:235bfa26c5c1 298 gyro_init_2[index_count] = Gyro_axis_data_f[1];
noname001 1:235bfa26c5c1 299 gyro_init_3[index_count] = Gyro_axis_data_f[2];
noname001 1:235bfa26c5c1 300 index_count++;
noname001 1:235bfa26c5c1 301 }
noname001 1:235bfa26c5c1 302 else if(gyro_count == 520)
noname001 1:235bfa26c5c1 303 {
noname001 1:235bfa26c5c1 304 gyro_init_1[index_count] = Gyro_axis_data_f[0];
noname001 1:235bfa26c5c1 305 gyro_init_2[index_count] = Gyro_axis_data_f[1];
noname001 1:235bfa26c5c1 306 gyro_init_3[index_count] = Gyro_axis_data_f[2];
noname001 1:235bfa26c5c1 307 index_count++;
noname001 1:235bfa26c5c1 308 }
noname001 1:235bfa26c5c1 309 else if(gyro_count == 530)
noname001 1:235bfa26c5c1 310 {
noname001 1:235bfa26c5c1 311 gyro_init_1[index_count] = Gyro_axis_data_f[0];
noname001 1:235bfa26c5c1 312 gyro_init_2[index_count] = Gyro_axis_data_f[1];
noname001 1:235bfa26c5c1 313 gyro_init_3[index_count] = Gyro_axis_data_f[2];
noname001 1:235bfa26c5c1 314 index_count++;
noname001 1:235bfa26c5c1 315 }
noname001 1:235bfa26c5c1 316 else if(gyro_count == 550)
noname001 1:235bfa26c5c1 317 {
noname001 1:235bfa26c5c1 318 gyro_init_1[index_count] = Gyro_axis_data_f[0];
noname001 1:235bfa26c5c1 319 gyro_init_2[index_count] = Gyro_axis_data_f[1];
noname001 1:235bfa26c5c1 320 gyro_init_3[index_count] = Gyro_axis_data_f[2];
noname001 1:235bfa26c5c1 321 index_count++;
noname001 1:235bfa26c5c1 322 }
noname001 1:235bfa26c5c1 323 else if(gyro_count == 560)
noname001 1:235bfa26c5c1 324 {
noname001 1:235bfa26c5c1 325 gyro_init_1[index_count] = Gyro_axis_data_f[0];
noname001 1:235bfa26c5c1 326 gyro_init_2[index_count] = Gyro_axis_data_f[1];
noname001 1:235bfa26c5c1 327 gyro_init_3[index_count] = Gyro_axis_data_f[2];
noname001 1:235bfa26c5c1 328 index_count++;
noname001 1:235bfa26c5c1 329 }
noname001 1:235bfa26c5c1 330 else if(gyro_count == 570)
noname001 1:235bfa26c5c1 331 {
noname001 1:235bfa26c5c1 332 gyro_init_1[index_count] = Gyro_axis_data_f[0];
noname001 1:235bfa26c5c1 333 gyro_init_2[index_count] = Gyro_axis_data_f[1];
noname001 1:235bfa26c5c1 334 gyro_init_3[index_count] = Gyro_axis_data_f[2];
noname001 1:235bfa26c5c1 335 index_count++;
noname001 1:235bfa26c5c1 336 }
noname001 1:235bfa26c5c1 337 else if(gyro_count == 580)
noname001 1:235bfa26c5c1 338 {
noname001 1:235bfa26c5c1 339 gyro_init_1[index_count] = Gyro_axis_data_f[0];
noname001 1:235bfa26c5c1 340 gyro_init_2[index_count] = Gyro_axis_data_f[1];
noname001 1:235bfa26c5c1 341 gyro_init_3[index_count] = Gyro_axis_data_f[2];
noname001 1:235bfa26c5c1 342 index_count++;
noname001 1:235bfa26c5c1 343 }
noname001 1:235bfa26c5c1 344 else if(gyro_count >= 590)
noname001 1:235bfa26c5c1 345 {
noname001 1:235bfa26c5c1 346 gyro_init_1[index_count] = Gyro_axis_data_f[0];
noname001 1:235bfa26c5c1 347 gyro_init_2[index_count] = Gyro_axis_data_f[1];
noname001 1:235bfa26c5c1 348 gyro_init_3[index_count] = Gyro_axis_data_f[2];
noname001 1:235bfa26c5c1 349 z = 0;
noname001 1:235bfa26c5c1 350 for(z=0 ; z<10 ; z++)
noname001 1:235bfa26c5c1 351 {
noname001 1:235bfa26c5c1 352 gyro_sum_1 = gyro_sum_1 + gyro_init_1[z];
noname001 1:235bfa26c5c1 353 gyro_sum_2 = gyro_sum_2 + gyro_init_2[z];
noname001 1:235bfa26c5c1 354 gyro_sum_3 = gyro_sum_3 + gyro_init_3[z];
noname001 1:235bfa26c5c1 355 }
noname001 1:235bfa26c5c1 356
noname001 1:235bfa26c5c1 357 Gyro_axis_zero[0] = gyro_sum_1 / 10;
noname001 1:235bfa26c5c1 358 Gyro_axis_zero[1] = gyro_sum_2 / 10;
noname001 1:235bfa26c5c1 359 Gyro_axis_zero[2] = gyro_sum_3 / 10;
noname001 1:235bfa26c5c1 360 index_count = 0;
noname001 1:235bfa26c5c1 361 gyro_count = 0;
noname001 1:235bfa26c5c1 362 gyro_flag = 1;
noname001 1:235bfa26c5c1 363 }
noname001 1:235bfa26c5c1 364 }
noname001 1:235bfa26c5c1 365 //831 2:20
noname001 1:235bfa26c5c1 366 // acce filter
noname001 1:235bfa26c5c1 367 Acce_axis_data_f[0] = lpf(Acce_axis_data[0],Acce_axis_data_f_old[0],18);
noname001 1:235bfa26c5c1 368 Acce_axis_data_f_old[0] = Acce_axis_data_f[0];
noname001 1:235bfa26c5c1 369 Acce_axis_data_f[1] = lpf(Acce_axis_data[1],Acce_axis_data_f_old[1],18);
noname001 1:235bfa26c5c1 370 Acce_axis_data_f_old[1] = Acce_axis_data_f[1];
noname001 1:235bfa26c5c1 371 Acce_axis_data_f[2] = lpf(Acce_axis_data[2],Acce_axis_data_f_old[2],18);
noname001 1:235bfa26c5c1 372 Acce_axis_data_f_old[2] = Acce_axis_data_f[2];
noname001 1:235bfa26c5c1 373
noname001 1:235bfa26c5c1 374 Gyro_scale[0] = (Gyro_axis_data_f[0]-Gyro_axis_zero[0])*Gyro_gain_x; //88888
noname001 1:235bfa26c5c1 375 Gyro_scale[1] = (Gyro_axis_data_f[1]-Gyro_axis_zero[1])*Gyro_gain_y;
noname001 1:235bfa26c5c1 376 Gyro_scale[2] = (Gyro_axis_data_f[2]-Gyro_axis_zero[2])*Gyro_gain_z;
noname001 1:235bfa26c5c1 377
noname001 1:235bfa26c5c1 378 Acce_scale[0] = ((Acce_axis_data_f[0]-Acce_axis_zero[0]))*Acce_gainx;
noname001 1:235bfa26c5c1 379 Acce_scale[1] = ((Acce_axis_data_f[1]-Acce_axis_zero[1]))*Acce_gainy;
noname001 1:235bfa26c5c1 380 Acce_scale[2] = ((Acce_axis_data_f[2]-Acce_axis_zero[2]))*Acce_gainz;
noname001 1:235bfa26c5c1 381
noname001 1:235bfa26c5c1 382 // final 6 axis data
noname001 1:235bfa26c5c1 383 axm = Acce_scale[0];
noname001 1:235bfa26c5c1 384 aym = Acce_scale[1];
noname001 1:235bfa26c5c1 385 azm = Acce_scale[2];
noname001 1:235bfa26c5c1 386
noname001 1:235bfa26c5c1 387 u1 = Gyro_scale[0];
noname001 1:235bfa26c5c1 388 u2 = Gyro_scale[1];
noname001 1:235bfa26c5c1 389 u3 = Gyro_scale[2];
noname001 1:235bfa26c5c1 390
noname001 1:235bfa26c5c1 391 // new defined direction
noname001 1:235bfa26c5c1 392 ax = -aym;
noname001 1:235bfa26c5c1 393 ay = axm;
noname001 1:235bfa26c5c1 394 az = azm;
noname001 1:235bfa26c5c1 395
noname001 1:235bfa26c5c1 396 w1 = -u2;
noname001 1:235bfa26c5c1 397 w2 = u1;
noname001 1:235bfa26c5c1 398 w3 = u3;
noname001 1:235bfa26c5c1 399
noname001 1:235bfa26c5c1 400 // w deadzone
noname001 1:235bfa26c5c1 401 flag_d_1 = 0;
noname001 1:235bfa26c5c1 402 flag_d_2 = 0;
noname001 1:235bfa26c5c1 403 flag_d_1 = w1 <= 0.015f;
noname001 1:235bfa26c5c1 404 flag_d_2 = w1 >= -0.015f;
noname001 1:235bfa26c5c1 405 if((flag_d_1 + flag_d_2) == 2)
noname001 1:235bfa26c5c1 406 w1_d = 0;
noname001 1:235bfa26c5c1 407 else
noname001 1:235bfa26c5c1 408 w1_d = w1;
noname001 1:235bfa26c5c1 409
noname001 1:235bfa26c5c1 410 flag_d_3 = 0;
noname001 1:235bfa26c5c1 411 flag_d_4 = 0;
noname001 1:235bfa26c5c1 412 flag_d_3 = w2 <= 0.015f;
noname001 1:235bfa26c5c1 413 flag_d_4 = w2 >= -0.015f;
noname001 1:235bfa26c5c1 414 if((flag_d_3 + flag_d_4) == 2)
noname001 1:235bfa26c5c1 415 w2_d = 0;
noname001 1:235bfa26c5c1 416 else
noname001 1:235bfa26c5c1 417 w2_d = w2;
noname001 1:235bfa26c5c1 418
noname001 1:235bfa26c5c1 419 flag_d_5 = 0;
noname001 1:235bfa26c5c1 420 flag_d_6 = 0;
noname001 1:235bfa26c5c1 421 flag_d_5 = w3 <= 0.015f;
noname001 1:235bfa26c5c1 422 flag_d_6 = w3 >= -0.015f;
noname001 1:235bfa26c5c1 423 if((flag_d_5 + flag_d_6) == 2)
noname001 1:235bfa26c5c1 424 w3_d = 0;
noname001 1:235bfa26c5c1 425 else
noname001 1:235bfa26c5c1 426 w3_d = w3;
noname001 1:235bfa26c5c1 427 }
noname001 1:235bfa26c5c1 428
noname001 1:235bfa26c5c1 429 // velocity filter
noname001 1:235bfa26c5c1 430 v_f = lpf(v,v_f_old,18);
noname001 1:235bfa26c5c1 431 v_f_old = v_f;
noname001 1:235bfa26c5c1 432
noname001 1:235bfa26c5c1 433 // 離心加速度
noname001 1:235bfa26c5c1 434 acy_hat = 1.4f*v_f*w1_d; // 1.2
noname001 1:235bfa26c5c1 435 acy_hat_f = lpf(acy_hat,acy_hat_f_old,18);
noname001 1:235bfa26c5c1 436 acy_hat_f_old = acy_hat_f;
noname001 1:235bfa26c5c1 437
noname001 1:235bfa26c5c1 438 // sensor fusion by backward Euler method
noname001 1:235bfa26c5c1 439 gs1_hat = (gs1_hat_old + T*(-w2_d*alpf_hat + p*ax - w3_d*(acy_hat_f-ay) - w2_d*az)) / (1+p*T);
noname001 1:235bfa26c5c1 440 gs1_hat_old = gs1_hat;
noname001 1:235bfa26c5c1 441
noname001 1:235bfa26c5c1 442 gs2_hat = (gs2_hat_old + T*(w1_d*alpf_hat - w3_d*ax - p*(acy_hat_f-ay) + w1_d*az)) / (1+p*T);
noname001 1:235bfa26c5c1 443 gs2_hat_old = gs2_hat;
noname001 1:235bfa26c5c1 444
noname001 1:235bfa26c5c1 445 gs3_hat = (gs3_hat_old + T*(-b*alpf_hat + c*v_hat + w2_d*ax + w1_d*(acy_hat_f-ay) - b*az - c*v_f)) / (1-b*T);
noname001 1:235bfa26c5c1 446 gs3_hat_old = gs3_hat;
noname001 1:235bfa26c5c1 447
noname001 1:235bfa26c5c1 448 alpf_hat = (alpf_hat_old + T*((a+d)*gs3_hat + e*v_hat - (a+d)*az - e*v_f)) / (1+(a+d)*T);
noname001 1:235bfa26c5c1 449 alpf_hat_old = alpf_hat;
noname001 1:235bfa26c5c1 450
noname001 1:235bfa26c5c1 451 v_hat = (v_hat_old + T*((1+f)*gs3_hat - f*alpf_hat - (1+f)*az - g*v_f)) / (1-g*T);
noname001 1:235bfa26c5c1 452 v_hat_old = v_hat;
noname001 1:235bfa26c5c1 453
noname001 1:235bfa26c5c1 454 /*
noname001 1:235bfa26c5c1 455 // 離心加速度
noname001 1:235bfa26c5c1 456 acy_hat = 1.2*v_f*w1;
noname001 1:235bfa26c5c1 457 acy_hat_f = lpf(acy_hat,acy_hat_f_old,18);
noname001 1:235bfa26c5c1 458 acy_hat_f_old = acy_hat_f;
noname001 1:235bfa26c5c1 459
noname001 1:235bfa26c5c1 460 // sensor fusion by backward Euler method
noname001 1:235bfa26c5c1 461 gs1_hat = (gs1_hat_old + T*(-w2*alpf_hat + p*ax - w3*(acy_hat_f-ay) - w2*az)) / (1+p*T);
noname001 1:235bfa26c5c1 462 gs1_hat_old = gs1_hat;
noname001 1:235bfa26c5c1 463
noname001 1:235bfa26c5c1 464 gs2_hat = (gs2_hat_old + T*(w1*alpf_hat - w3*ax - p*(acy_hat_f-ay) + w1*az)) / (1+p*T);
noname001 1:235bfa26c5c1 465 gs2_hat_old = gs2_hat;
noname001 1:235bfa26c5c1 466
noname001 1:235bfa26c5c1 467 gs3_hat = (gs3_hat_old + T*(-b*alpf_hat + c*v_hat + w2*ax + w1*(acy_hat_f-ay) - b*az - c*v_f)) / (1-b*T);
noname001 1:235bfa26c5c1 468 gs3_hat_old = gs3_hat;
noname001 1:235bfa26c5c1 469
noname001 1:235bfa26c5c1 470 alpf_hat = (alpf_hat_old + T*((a+d)*gs3_hat + e*v_hat - (a+d)*az - e*v_f)) / (1+(a+d)*T);
noname001 1:235bfa26c5c1 471 alpf_hat_old = alpf_hat;
noname001 1:235bfa26c5c1 472
noname001 1:235bfa26c5c1 473 v_hat = (v_hat_old + T*((1+f)*gs3_hat - f*alpf_hat - (1+f)*az - g*v_f)) / (1-g*T);
noname001 1:235bfa26c5c1 474 v_hat_old = v_hat;
noname001 1:235bfa26c5c1 475 */
noname001 1:235bfa26c5c1 476
noname001 1:235bfa26c5c1 477 // normalize gs1_hat , gs2_hat , gs3_hat to find pitch angle and roll angle
noname001 1:235bfa26c5c1 478 n = sqrt(gs1_hat*gs1_hat + gs2_hat*gs2_hat + gs3_hat*gs3_hat);
noname001 1:235bfa26c5c1 479
noname001 1:235bfa26c5c1 480 gs1_hat_n = (gs1_hat / n) * 9.81f;
noname001 1:235bfa26c5c1 481 gs2_hat_n = (gs2_hat / n) * 9.81f;
noname001 1:235bfa26c5c1 482 gs3_hat_n = (gs3_hat / n) * 9.81f;
noname001 1:235bfa26c5c1 483
noname001 1:235bfa26c5c1 484 psi = arcsin(-gs3_hat_n / 9.81f);
noname001 1:235bfa26c5c1 485 //theta = atan(-gs2_hat_n / gs1_hat_n);
noname001 1:235bfa26c5c1 486
noname001 1:235bfa26c5c1 487 // psi correction
noname001 1:235bfa26c5c1 488 psi_m = psi - (0); // after correction
noname001 1:235bfa26c5c1 489 psi_deg = 57.3f * psi_m;
noname001 1:235bfa26c5c1 490
noname001 1:235bfa26c5c1 491 // psi deadzone
noname001 1:235bfa26c5c1 492 flag_d_1 = 0;
noname001 1:235bfa26c5c1 493 flag_d_2 = 0;
noname001 1:235bfa26c5c1 494 flag_d_1 = psi_deg < 2.5f; // 在平地時 flag_d_1 = 1
noname001 1:235bfa26c5c1 495 flag_d_2 = psi_deg > -3; // 在平地時 flag_d_2 = 1
noname001 1:235bfa26c5c1 496
noname001 1:235bfa26c5c1 497 if((flag_d_1 + flag_d_2) == 2) // 在平地時 flag_d_1 + flag_d_2 = 2
noname001 1:235bfa26c5c1 498 psi_d = 0;
noname001 1:235bfa26c5c1 499 else
noname001 1:235bfa26c5c1 500 psi_d = psi_m;
noname001 0:0b8d14ed499f 501
noname001 1:235bfa26c5c1 502 // 去除負加速度
noname001 1:235bfa26c5c1 503 if(alpf_hat < 0)
noname001 1:235bfa26c5c1 504 alpf_c = 0;
noname001 1:235bfa26c5c1 505 else
noname001 1:235bfa26c5c1 506 alpf_c = alpf_hat;
noname001 1:235bfa26c5c1 507
noname001 1:235bfa26c5c1 508 // 速度為負時不考慮加速度
noname001 1:235bfa26c5c1 509 if(v_f < 0)
noname001 1:235bfa26c5c1 510 alpf_v = 0;
noname001 1:235bfa26c5c1 511 else
noname001 1:235bfa26c5c1 512 alpf_v = alpf_c;
noname001 1:235bfa26c5c1 513
noname001 1:235bfa26c5c1 514 // 加速度 deadzone
noname001 1:235bfa26c5c1 515 if(alpf_v <= 0.1f)
noname001 1:235bfa26c5c1 516 alpf_d = 0;
noname001 1:235bfa26c5c1 517 else
noname001 1:235bfa26c5c1 518 alpf_d = alpf_v;
noname001 1:235bfa26c5c1 519
noname001 1:235bfa26c5c1 520 // 改button //improve //設定一個開關
noname001 1:235bfa26c5c1 521 /*
noname001 1:235bfa26c5c1 522 // buttom filter
noname001 1:235bfa26c5c1 523 buttom_buf = lpf(ADCBUF0,buttom_buf_old,30);
noname001 1:235bfa26c5c1 524 buttom_buf_old = buttom_buf;
noname001 1:235bfa26c5c1 525
noname001 1:235bfa26c5c1 526 // button control compensationrate
noname001 1:235bfa26c5c1 527 if(buttom_buf >= 450)
noname001 1:235bfa26c5c1 528 compensationrate = 1;
noname001 1:235bfa26c5c1 529 else
noname001 1:235bfa26c5c1 530 compensationrate = 0;
noname001 1:235bfa26c5c1 531 */
noname001 1:235bfa26c5c1 532
noname001 1:235bfa26c5c1 533 if(adc_switch.read() > 0.6f)
noname001 1:235bfa26c5c1 534 {
noname001 1:235bfa26c5c1 535 buttom_buf=1;
noname001 1:235bfa26c5c1 536 compensationrate = 1;
noname001 1:235bfa26c5c1 537 }
noname001 1:235bfa26c5c1 538 else
noname001 1:235bfa26c5c1 539 {
noname001 1:235bfa26c5c1 540 buttom_buf=0;
noname001 1:235bfa26c5c1 541 compensationrate = 0;
noname001 1:235bfa26c5c1 542 }
noname001 1:235bfa26c5c1 543
noname001 1:235bfa26c5c1 544 // 電流命令 (T = k*i)
noname001 1:235bfa26c5c1 545 current_command = compensationrate * (Mb*alpf_d*1.1f + M*9.81f*sinr(psi_d)*1.35f + Df) * (R/Ki);
noname001 1:235bfa26c5c1 546
noname001 1:235bfa26c5c1 547 // 電流命令上下限
noname001 1:235bfa26c5c1 548 if(current_command >= 15)
noname001 1:235bfa26c5c1 549 current_command = 15;
noname001 1:235bfa26c5c1 550 else if(current_command <= -25)
noname001 1:235bfa26c5c1 551 current_command = -25;
noname001 1:235bfa26c5c1 552 //831 412
noname001 1:235bfa26c5c1 553 // 開關安全措施
noname001 1:235bfa26c5c1 554 b_count = b_count + 1;
noname001 1:235bfa26c5c1 555
noname001 1:235bfa26c5c1 556 if(b_count >= 1500) // wait for buttom ADC buffer ready
noname001 1:235bfa26c5c1 557 {
noname001 1:235bfa26c5c1 558 b_init_flag = 1;
noname001 1:235bfa26c5c1 559 b_count = 0;
noname001 1:235bfa26c5c1 560 }
noname001 1:235bfa26c5c1 561
noname001 1:235bfa26c5c1 562 if(b_init_flag == 0)
noname001 1:235bfa26c5c1 563 open_flag = 1;
noname001 1:235bfa26c5c1 564 else if(b_init_flag == 1)
noname001 1:235bfa26c5c1 565 {
noname001 1:235bfa26c5c1 566 if(compensationrate == 1 && open_flag == 1) // 初始 open_flag = 1
noname001 1:235bfa26c5c1 567 protect_flag = 1;
noname001 1:235bfa26c5c1 568
noname001 1:235bfa26c5c1 569 if(compensationrate == 0) // 初始 open_flag = 1 , 等 compensationrate = 0 時才將 open_flag = 0
noname001 1:235bfa26c5c1 570 {
noname001 1:235bfa26c5c1 571 protect_flag = 0; // 初始 compensationrate = 0 時才將 protect_flag = 0
noname001 1:235bfa26c5c1 572 open_flag = 0;
noname001 1:235bfa26c5c1 573 b_flag = 0;
noname001 1:235bfa26c5c1 574 }
noname001 1:235bfa26c5c1 575 // 要先有初始 compensationrate = 0 才能先將 protect_flag == 0 && open_flag == 0 成立
noname001 1:235bfa26c5c1 576 // 之後由 compensationrate = 0 轉變成 compensationrate = 1 時才將 b_flag = 1(開始送命令)
noname001 1:235bfa26c5c1 577 if(compensationrate == 1 && protect_flag == 0 && open_flag == 0)
noname001 1:235bfa26c5c1 578 {
noname001 1:235bfa26c5c1 579 b_flag = 1;
noname001 1:235bfa26c5c1 580 }
noname001 1:235bfa26c5c1 581 }
noname001 1:235bfa26c5c1 582
noname001 1:235bfa26c5c1 583 // 改CAN
noname001 1:235bfa26c5c1 584 // can 傳資料到大板子
noname001 1:235bfa26c5c1 585 //C1TX0DLCbits.DLC = 8;
noname001 1:235bfa26c5c1 586 /*
noname001 1:235bfa26c5c1 587 if(b_flag == 1)
noname001 1:235bfa26c5c1 588 {
noname001 1:235bfa26c5c1 589 C1TX0B1 = current_command;
noname001 1:235bfa26c5c1 590 C1TX0B2 = compensationrate;
noname001 1:235bfa26c5c1 591 C1TX0B3 = 300;
noname001 1:235bfa26c5c1 592 }
noname001 1:235bfa26c5c1 593 else if(b_flag == 0)
noname001 1:235bfa26c5c1 594 {
noname001 1:235bfa26c5c1 595 C1TX0B1 = 0;
noname001 1:235bfa26c5c1 596 C1TX0B2 = 0;
noname001 1:235bfa26c5c1 597 C1TX0B3 = 300;
noname001 1:235bfa26c5c1 598 }
noname001 1:235bfa26c5c1 599 */
noname001 1:235bfa26c5c1 600 //C1TX0CONbits.TXREQ = 1;
noname001 1:235bfa26c5c1 601
noname001 1:235bfa26c5c1 602 // uart傳送資料
noname001 1:235bfa26c5c1 603
noname001 1:235bfa26c5c1 604 display[0] = 100*psi_deg;
noname001 1:235bfa26c5c1 605 display[1] = 100*gs2_hat;
noname001 1:235bfa26c5c1 606 display[2] = 100*gs3_hat;
noname001 1:235bfa26c5c1 607 display[3] = buttom_buf;
noname001 1:235bfa26c5c1 608 display[4] = current_command;
noname001 1:235bfa26c5c1 609 display[5] = rotationspeed;
noname001 1:235bfa26c5c1 610
noname001 1:235bfa26c5c1 611
noname001 0:0b8d14ed499f 612 separate();
noname001 1:235bfa26c5c1 613
noname001 0:0b8d14ed499f 614 j = 0;
noname001 0:0b8d14ed499f 615 k = 1;
noname001 1:235bfa26c5c1 616 while(k)
noname001 1:235bfa26c5c1 617 {
noname001 1:235bfa26c5c1 618 if(uart_1.writeable())
noname001 1:235bfa26c5c1 619 {
noname001 0:0b8d14ed499f 620 uart_1.putc(num[i]);
noname001 0:0b8d14ed499f 621 i++;
noname001 0:0b8d14ed499f 622 j++;
noname001 0:0b8d14ed499f 623 }
noname001 0:0b8d14ed499f 624
noname001 1:235bfa26c5c1 625 if(j>1) // send 2 bytes
noname001 1:235bfa26c5c1 626 {
noname001 0:0b8d14ed499f 627 k = 0;
noname001 0:0b8d14ed499f 628 j = 0;
noname001 0:0b8d14ed499f 629 }
noname001 0:0b8d14ed499f 630 }
noname001 0:0b8d14ed499f 631
noname001 0:0b8d14ed499f 632 if(i>13)
noname001 0:0b8d14ed499f 633 i = 0;
noname001 1:235bfa26c5c1 634
noname001 1:235bfa26c5c1 635 //LATDbits.LATD3 = 0;
noname001 1:235bfa26c5c1 636
noname001 1:235bfa26c5c1 637 //IFS0bits.T1IF = 0; // 重置中斷旗標
noname001 0:0b8d14ed499f 638 }
noname001 1:235bfa26c5c1 639
noname001 1:235bfa26c5c1 640 void init_uart()
noname001 1:235bfa26c5c1 641 {
noname001 1:235bfa26c5c1 642 uart_1.baud(115200); // 設定baudrate
noname001 1:235bfa26c5c1 643 }
noname001 1:235bfa26c5c1 644
noname001 1:235bfa26c5c1 645 void separate(void)
noname001 1:235bfa26c5c1 646 {
noname001 1:235bfa26c5c1 647 num[2] = display[0] >> 8; // HSB(8bit)資料存入陣列
noname001 1:235bfa26c5c1 648 num[3] = display[0] & 0x00ff; // LSB(8bit)資料存入陣列
noname001 1:235bfa26c5c1 649 num[4] = display[1] >> 8;
noname001 1:235bfa26c5c1 650 num[5] = display[1] & 0x00ff;
noname001 1:235bfa26c5c1 651 num[6] = display[2] >> 8;
noname001 1:235bfa26c5c1 652 num[7] = display[2] & 0x00ff;
noname001 1:235bfa26c5c1 653 num[8] = display[3] >> 8;
noname001 1:235bfa26c5c1 654 num[9] = display[3] & 0x00ff;
noname001 1:235bfa26c5c1 655 num[10] = display[4] >> 8;
noname001 1:235bfa26c5c1 656 num[11] = display[4] & 0x00ff;
noname001 1:235bfa26c5c1 657 num[12] = display[5] >> 8;
noname001 1:235bfa26c5c1 658 num[13] = display[5] & 0x00ff;
noname001 1:235bfa26c5c1 659 }
noname001 1:235bfa26c5c1 660
noname001 1:235bfa26c5c1 661 /*
noname001 1:235bfa26c5c1 662 void init_spi(void)
noname001 1:235bfa26c5c1 663 {
noname001 1:235bfa26c5c1 664 SPI1STATbits.SPISIDL = 1; // Stop in Idle Mode bit
noname001 1:235bfa26c5c1 665 SPI1CONbits.FRMEN = 0; // Framed SPI support disabled
noname001 1:235bfa26c5c1 666 SPI1CONbits.DISSDO = 0; // SDO1 pin is controlled by the module
noname001 1:235bfa26c5c1 667 SPI1CONbits.MODE16 = 0; // Communication is byte-wide (8 bits)
noname001 1:235bfa26c5c1 668 SPI1CONbits.SMP = 0; // Input data sampled at middle of data output time
noname001 1:235bfa26c5c1 669 SPI1CONbits.CKE = 0; // Serial output data changes on transition from Idle clock state to active clock state
noname001 1:235bfa26c5c1 670 SPI1CONbits.CKP = 1; // Idle state for clock is a high level; active state is a low level
noname001 1:235bfa26c5c1 671 SPI1CONbits.SSEN = 0; // Slave Select Unable
noname001 1:235bfa26c5c1 672 SPI1CONbits.MSTEN = 1; // Master mode
noname001 1:235bfa26c5c1 673 // Fsck = Fcy / (Secondary Prescale * Primary Prescale)
noname001 1:235bfa26c5c1 674 SPI1CONbits.SPRE = 0b111; // Secondary Prescale (Master Mode) bits , 111 = Secondary prescale 1:1
noname001 1:235bfa26c5c1 675 SPI1CONbits.PPRE = 0b01; // Primary Prescale (Master Mode) bits , 01 = Primary prescale 16:1
noname001 1:235bfa26c5c1 676
noname001 1:235bfa26c5c1 677 // SPI enable 最後才能打開
noname001 1:235bfa26c5c1 678 SPI1STATbits.SPIEN = 1; // Enables module and configures SCK1, SDO1, SDI1 and SS1 as serial port pins
noname001 1:235bfa26c5c1 679 }
noname001 1:235bfa26c5c1 680 */
noname001 1:235bfa26c5c1 681
noname001 1:235bfa26c5c1 682 void init_Sensors(void)
noname001 1:235bfa26c5c1 683 {
noname001 1:235bfa26c5c1 684 sensor.begin();
noname001 1:235bfa26c5c1 685 // sensor.begin() setting :
noname001 1:235bfa26c5c1 686 // uint16_t begin(gyro_scale gScl = G_SCALE_2000DPS,
noname001 1:235bfa26c5c1 687 // accel_scale aScl = A_SCALE_8G,
noname001 1:235bfa26c5c1 688 // mag_scale mScl = M_SCALE_8GS,
noname001 1:235bfa26c5c1 689 // gyro_odr gODR = G_ODR_760_BW_100,
noname001 1:235bfa26c5c1 690 // accel_odr aODR = A_ODR_800,
noname001 1:235bfa26c5c1 691 // mag_odr mODR = M_ODR_100);
noname001 1:235bfa26c5c1 692
noname001 1:235bfa26c5c1 693 //sensor_CSXM = 1;
noname001 1:235bfa26c5c1 694 //sensor_CSG = 1;
noname001 1:235bfa26c5c1 695 //Gyro_axis_data[0] = 0; // X
noname001 1:235bfa26c5c1 696 //Gyro_axis_data[1] = 0; // Y
noname001 1:235bfa26c5c1 697 //Gyro_axis_data[2] = 0; // Z
noname001 1:235bfa26c5c1 698 //Acce_axis_data[0] = 0;
noname001 1:235bfa26c5c1 699 //Acce_axis_data[1] = 0;
noname001 1:235bfa26c5c1 700 //Acce_axis_data[2] = 0;
noname001 1:235bfa26c5c1 701 //sensorG_setup();
noname001 1:235bfa26c5c1 702 //sensorXM_setup();
noname001 1:235bfa26c5c1 703 }
noname001 1:235bfa26c5c1 704 /*
noname001 1:235bfa26c5c1 705 void init_sensor(void)
noname001 1:235bfa26c5c1 706 {
noname001 1:235bfa26c5c1 707 sensor.begin();
noname001 1:235bfa26c5c1 708 // sensor.begin() setting :
noname001 1:235bfa26c5c1 709 // uint16_t begin(gyro_scale gScl = G_SCALE_2000DPS,
noname001 1:235bfa26c5c1 710 // accel_scale aScl = A_SCALE_8G,
noname001 1:235bfa26c5c1 711 // mag_scale mScl = M_SCALE_8GS,
noname001 1:235bfa26c5c1 712 // gyro_odr gODR = G_ODR_760_BW_100,
noname001 1:235bfa26c5c1 713 // accel_odr aODR = A_ODR_800,
noname001 1:235bfa26c5c1 714 // mag_odr mODR = M_ODR_100);
noname001 1:235bfa26c5c1 715 }
noname001 1:235bfa26c5c1 716 */
noname001 1:235bfa26c5c1 717 /*
noname001 1:235bfa26c5c1 718 unsigned char SPI_operation(unsigned char data_send) // 具有 write 跟 read 兩種功能
noname001 1:235bfa26c5c1 719 {
noname001 1:235bfa26c5c1 720 static unsigned char data_recived = 0;
noname001 1:235bfa26c5c1 721
noname001 1:235bfa26c5c1 722 while(SPI1STATbits.SPITBF==1); // wait for SPI1STATbits.SPITBF = 0 (transmit start , SPI1TXB is empty)
noname001 1:235bfa26c5c1 723 SPI1BUF = data_send; // write SPI
noname001 1:235bfa26c5c1 724
noname001 1:235bfa26c5c1 725 while(SPI1STATbits.SPIRBF==0); // wait for SPI1STATbits.SPIRBF = 1 (receive complete , SPI1RXB is full)
noname001 1:235bfa26c5c1 726 data_recived = SPI1BUF; // read SPI
noname001 1:235bfa26c5c1 727
noname001 1:235bfa26c5c1 728 return data_recived;
noname001 1:235bfa26c5c1 729 }
noname001 1:235bfa26c5c1 730 */
noname001 1:235bfa26c5c1 731 /*
noname001 1:235bfa26c5c1 732 void sensorG_setup(void)
noname001 1:235bfa26c5c1 733 {
noname001 1:235bfa26c5c1 734 static unsigned char sensorG_data_write;
noname001 1:235bfa26c5c1 735 static unsigned char sensorG_data_read;
noname001 1:235bfa26c5c1 736
noname001 1:235bfa26c5c1 737 // 設定暫存器的值
noname001 1:235bfa26c5c1 738 sensorG_CTRL_REG1 = 0b11111111; // ODR = 760Hz , BW = 100Hz
noname001 1:235bfa26c5c1 739 // Power-down mode is normal mode , XYZ enable
noname001 1:235bfa26c5c1 740 sensorG_CTRL_REG2 = 0b00001001; // High-pass filter mode is normal mode
noname001 1:235bfa26c5c1 741 // High-pass filter cutoff frequency = 0.09Hz
noname001 1:235bfa26c5c1 742 sensorG_CTRL_REG3 = 0b00000000; // no use , all 0
noname001 1:235bfa26c5c1 743 sensorG_CTRL_REG4 = 0b00110000; // 2000dps
noname001 1:235bfa26c5c1 744 sensorG_CTRL_REG5 = 0b00000000; // no use , all 0
noname001 1:235bfa26c5c1 745
noname001 1:235bfa26c5c1 746 // 設定暫存器的位址
noname001 1:235bfa26c5c1 747 // write mode (第8個bit = 0)
noname001 1:235bfa26c5c1 748 // auto increase address (第7個bit = 1)
noname001 1:235bfa26c5c1 749 sensorG_data_write = 0x20; // sensor_G_CTRL address
noname001 1:235bfa26c5c1 750 sensorG_data_write = (sensorG_data_write & 0b00111111) | 0b01000000;
noname001 1:235bfa26c5c1 751 // mask first two bits : sensorG_CTRL_REG1_address & 0b00111111 , 把最前面兩個bit清0 , 其他bit保留不動
noname001 1:235bfa26c5c1 752 // write first two bits : (...) | 0b01000000 把最前面兩個bit寫成01 , 其他bit保留不動
noname001 1:235bfa26c5c1 753
noname001 1:235bfa26c5c1 754 // open
noname001 1:235bfa26c5c1 755 sensor_CSG = 0;
noname001 1:235bfa26c5c1 756
noname001 1:235bfa26c5c1 757 // CS打開後 , 會先寫暫存器的位址 , 再寫暫存器的值
noname001 1:235bfa26c5c1 758 // 寫入暫存器的位址後就完成write mode和auto increase address的功能
noname001 1:235bfa26c5c1 759 // 接下來就會依序遞增暫存器的位址並做寫入的動作
noname001 1:235bfa26c5c1 760 // start to write register address
noname001 1:235bfa26c5c1 761 sensorG_data_read = SPI_operation(sensorG_data_write);
noname001 1:235bfa26c5c1 762
noname001 1:235bfa26c5c1 763 // start to set register value
noname001 1:235bfa26c5c1 764 sensorG_data_read = SPI_operation(sensorG_CTRL_REG1);
noname001 1:235bfa26c5c1 765 sensorG_data_read = SPI_operation(sensorG_CTRL_REG2);
noname001 1:235bfa26c5c1 766 sensorG_data_read = SPI_operation(sensorG_CTRL_REG3);
noname001 1:235bfa26c5c1 767 sensorG_data_read = SPI_operation(sensorG_CTRL_REG4);
noname001 1:235bfa26c5c1 768 sensorG_data_read = SPI_operation(sensorG_CTRL_REG5);
noname001 1:235bfa26c5c1 769
noname001 1:235bfa26c5c1 770 // close
noname001 1:235bfa26c5c1 771 sensor_CSG = 1;
noname001 1:235bfa26c5c1 772 }
noname001 1:235bfa26c5c1 773 */
noname001 1:235bfa26c5c1 774 /*
noname001 1:235bfa26c5c1 775 void sensorXM_setup(void)
noname001 1:235bfa26c5c1 776 {
noname001 1:235bfa26c5c1 777 static unsigned char sensorXM_data_write;
noname001 1:235bfa26c5c1 778 static unsigned char sensorXM_data_read;
noname001 1:235bfa26c5c1 779
noname001 1:235bfa26c5c1 780 // 設定暫存器的值
noname001 1:235bfa26c5c1 781 sensorXM_CTRL_REG0 = 0b00000000; // no use , all 0
noname001 1:235bfa26c5c1 782 sensorXM_CTRL_REG1 = 0b10010111; // ODR = 800Hz , XYZ enable
noname001 1:235bfa26c5c1 783 sensorXM_CTRL_REG2 = 0b11011000; // anti-alias filter BW = 50Hz
noname001 1:235bfa26c5c1 784 // acceleration full scale = +-8 g
noname001 1:235bfa26c5c1 785 sensorXM_CTRL_REG3 = 0b00000000; // no use , all 0
noname001 1:235bfa26c5c1 786 sensorXM_CTRL_REG4 = 0b00000000; // no use , all 0
noname001 1:235bfa26c5c1 787 sensorXM_CTRL_REG5 = 0b01110100; // magnetic resolution is high resolution
noname001 1:235bfa26c5c1 788 // Power mode selection = 100Hz
noname001 1:235bfa26c5c1 789 sensorXM_CTRL_REG6 = 0b01000000; // Magnetic full scale = +-8 gauss
noname001 1:235bfa26c5c1 790 sensorXM_CTRL_REG7 = 0b00000000; // no use , all 0
noname001 1:235bfa26c5c1 791
noname001 1:235bfa26c5c1 792 // 設定暫存器的位址
noname001 1:235bfa26c5c1 793 // write mode (第8個bit = 0)
noname001 1:235bfa26c5c1 794 // auto increase address (第7個bit = 1)
noname001 1:235bfa26c5c1 795 sensorXM_data_write = 0x1F; // sensor_XM_CTRL address
noname001 1:235bfa26c5c1 796 sensorXM_data_write = (sensorXM_data_write & 0b00111111) | 0b01000000;
noname001 1:235bfa26c5c1 797 // mask first two bits , write first two bits
noname001 1:235bfa26c5c1 798
noname001 1:235bfa26c5c1 799 // open
noname001 1:235bfa26c5c1 800 sensor_CSXM = 0;
noname001 1:235bfa26c5c1 801
noname001 1:235bfa26c5c1 802 // start to write register address
noname001 1:235bfa26c5c1 803 sensorXM_data_read = SPI_operation(sensorXM_data_write);
noname001 1:235bfa26c5c1 804
noname001 1:235bfa26c5c1 805 // start to set register value
noname001 1:235bfa26c5c1 806 sensorXM_data_read = SPI_operation(sensorXM_CTRL_REG0);
noname001 1:235bfa26c5c1 807 sensorXM_data_read = SPI_operation(sensorXM_CTRL_REG1);
noname001 1:235bfa26c5c1 808 sensorXM_data_read = SPI_operation(sensorXM_CTRL_REG2);
noname001 1:235bfa26c5c1 809 sensorXM_data_read = SPI_operation(sensorXM_CTRL_REG3);
noname001 1:235bfa26c5c1 810 sensorXM_data_read = SPI_operation(sensorXM_CTRL_REG4);
noname001 1:235bfa26c5c1 811 sensorXM_data_read = SPI_operation(sensorXM_CTRL_REG5);
noname001 1:235bfa26c5c1 812 sensorXM_data_read = SPI_operation(sensorXM_CTRL_REG6);
noname001 1:235bfa26c5c1 813 sensorXM_data_read = SPI_operation(sensorXM_CTRL_REG7);
noname001 1:235bfa26c5c1 814
noname001 1:235bfa26c5c1 815 // close
noname001 1:235bfa26c5c1 816 sensor_CSXM = 1;
noname001 1:235bfa26c5c1 817 }
noname001 1:235bfa26c5c1 818 */
noname001 1:235bfa26c5c1 819
noname001 1:235bfa26c5c1 820 /*
noname001 1:235bfa26c5c1 821 void sensorG_read_3axis(void)
noname001 1:235bfa26c5c1 822 {
noname001 1:235bfa26c5c1 823 static unsigned char sensorG_data_write;
noname001 1:235bfa26c5c1 824 static int sensorG_data_read[6];
noname001 1:235bfa26c5c1 825
noname001 1:235bfa26c5c1 826 // 設定暫存器的位址
noname001 1:235bfa26c5c1 827 // read mode (第8個bit = 1)
noname001 1:235bfa26c5c1 828 // auto increase address (第7個bit = 1)
noname001 1:235bfa26c5c1 829 sensorG_data_write = 0x28; // gyroscope's address
noname001 1:235bfa26c5c1 830 sensorG_data_write = (sensorG_data_write & 0b00111111) | 0b11000000;
noname001 1:235bfa26c5c1 831 // mask first two bits , write first two bits
noname001 1:235bfa26c5c1 832 // 因為暫存器位址只有6個bit , 所以用mask和write來設定read mode , auto increase address
noname001 1:235bfa26c5c1 833 // 不會改變到暫存器位址的值
noname001 1:235bfa26c5c1 834
noname001 1:235bfa26c5c1 835 // open
noname001 1:235bfa26c5c1 836 sensor_CSG = 0;
noname001 1:235bfa26c5c1 837
noname001 1:235bfa26c5c1 838 // CS打開後 , 會先寫暫存器的位址 , 再寫暫存器的值
noname001 1:235bfa26c5c1 839 // 寫入暫存器的位址後就完成read mode和auto increase address的功能
noname001 1:235bfa26c5c1 840 // 接下來就會依序遞增暫存器的位址並做讀取的動作
noname001 1:235bfa26c5c1 841 // start to write register address
noname001 1:235bfa26c5c1 842 sensorG_data_read[0] = (int)SPI_operation(sensorG_data_write);
noname001 1:235bfa26c5c1 843
noname001 1:235bfa26c5c1 844 // start to read register value
noname001 1:235bfa26c5c1 845 // gyroscope output
noname001 1:235bfa26c5c1 846 // 因為這邊的SPI函數是用來讀值 , 而SPI函數是把寫和讀功能寫在一起的函數
noname001 1:235bfa26c5c1 847 // 所以寫入的值就任意設成0x00 , 反正寫入的值不重要
noname001 1:235bfa26c5c1 848 sensorG_data_read[0] = (int)SPI_operation(0x00); // XL
noname001 1:235bfa26c5c1 849 sensorG_data_read[1] = (int)SPI_operation(0x00); // XH
noname001 1:235bfa26c5c1 850 sensorG_data_read[2] = (int)SPI_operation(0x00); // YL
noname001 1:235bfa26c5c1 851 sensorG_data_read[3] = (int)SPI_operation(0x00); // YH
noname001 1:235bfa26c5c1 852 sensorG_data_read[4] = (int)SPI_operation(0x00); // ZL
noname001 1:235bfa26c5c1 853 sensorG_data_read[5] = (int)SPI_operation(0x00); // ZH
noname001 1:235bfa26c5c1 854
noname001 1:235bfa26c5c1 855 // close
noname001 1:235bfa26c5c1 856 sensor_CSG = 1;
noname001 1:235bfa26c5c1 857
noname001 1:235bfa26c5c1 858 // data reconstruction
noname001 1:235bfa26c5c1 859 Gyro_axis_data[0] = (sensorG_data_read[1]<<8) | sensorG_data_read[0]; // X
noname001 1:235bfa26c5c1 860 Gyro_axis_data[1] = (sensorG_data_read[3]<<8) | sensorG_data_read[2]; // Y
noname001 1:235bfa26c5c1 861 Gyro_axis_data[2] = (sensorG_data_read[5]<<8) | sensorG_data_read[4]; // Z
noname001 1:235bfa26c5c1 862 }
noname001 1:235bfa26c5c1 863 */
noname001 1:235bfa26c5c1 864 /*
noname001 1:235bfa26c5c1 865 void sensorXM_read_3axis(void)
noname001 1:235bfa26c5c1 866 {
noname001 1:235bfa26c5c1 867 static unsigned char sensorXM_data_write;
noname001 1:235bfa26c5c1 868 static int sensorXM_data_read[6];
noname001 1:235bfa26c5c1 869
noname001 1:235bfa26c5c1 870 // 設定暫存器的位址
noname001 1:235bfa26c5c1 871 // read mode (第8個bit = 1)
noname001 1:235bfa26c5c1 872 // auto increase address (第7個bit = 1)
noname001 1:235bfa26c5c1 873 sensorXM_data_write = 0x28; // accelerometer's address
noname001 1:235bfa26c5c1 874 sensorXM_data_write = (sensorXM_data_write & 0b00111111) | 0b11000000;
noname001 1:235bfa26c5c1 875 // mask first two bits , write first two bits
noname001 1:235bfa26c5c1 876
noname001 1:235bfa26c5c1 877 // open
noname001 1:235bfa26c5c1 878 sensor_CSXM = 0;
noname001 1:235bfa26c5c1 879
noname001 1:235bfa26c5c1 880 // start to write register address
noname001 1:235bfa26c5c1 881 sensorXM_data_read[0] = (int)SPI_operation(sensorXM_data_write);
noname001 1:235bfa26c5c1 882
noname001 1:235bfa26c5c1 883 // start to read register value
noname001 1:235bfa26c5c1 884 // accelerometer output
noname001 1:235bfa26c5c1 885 sensorXM_data_read[0] = (int)SPI_operation(0x00); // XL
noname001 1:235bfa26c5c1 886 sensorXM_data_read[1] = (int)SPI_operation(0x00); // XH
noname001 1:235bfa26c5c1 887 sensorXM_data_read[2] = (int)SPI_operation(0x00); // YL
noname001 1:235bfa26c5c1 888 sensorXM_data_read[3] = (int)SPI_operation(0x00); // YH
noname001 1:235bfa26c5c1 889 sensorXM_data_read[4] = (int)SPI_operation(0x00); // ZL
noname001 1:235bfa26c5c1 890 sensorXM_data_read[5] = (int)SPI_operation(0x00); // ZH
noname001 1:235bfa26c5c1 891
noname001 1:235bfa26c5c1 892 // close
noname001 1:235bfa26c5c1 893 sensor_CSXM = 1;
noname001 1:235bfa26c5c1 894
noname001 1:235bfa26c5c1 895 // data reconstruction
noname001 1:235bfa26c5c1 896 Acce_axis_data[0] = (sensorXM_data_read[1]<<8) | sensorXM_data_read[0]; // X
noname001 1:235bfa26c5c1 897 Acce_axis_data[1] = (sensorXM_data_read[3]<<8) | sensorXM_data_read[2]; // Y
noname001 1:235bfa26c5c1 898 Acce_axis_data[2] = (sensorXM_data_read[5]<<8) | sensorXM_data_read[4]; // Z
noname001 1:235bfa26c5c1 899 }
noname001 1:235bfa26c5c1 900 */
noname001 1:235bfa26c5c1 901 /*
noname001 1:235bfa26c5c1 902 void init_can(void)
noname001 1:235bfa26c5c1 903 {
noname001 1:235bfa26c5c1 904 CAN1SetOperationMode( CAN_IDLE_CON & CAN_MASTERCLOCK_1 &
noname001 1:235bfa26c5c1 905 CAN_REQ_OPERMODE_CONFIG );
noname001 1:235bfa26c5c1 906
noname001 1:235bfa26c5c1 907 while ( C1CTRLbits.OPMODE <= 3 );
noname001 1:235bfa26c5c1 908
noname001 1:235bfa26c5c1 909 CAN1Initialize( CAN_SYNC_JUMP_WIDTH4 & CAN_BAUD_PRE_SCALE(2),
noname001 1:235bfa26c5c1 910 CAN_WAKEUP_BY_FILTER_DIS &
noname001 1:235bfa26c5c1 911 CAN_PHASE_SEG2_TQ(3) &
noname001 1:235bfa26c5c1 912 CAN_PHASE_SEG1_TQ(3) &
noname001 1:235bfa26c5c1 913 CAN_PROPAGATIONTIME_SEG_TQ(3) &
noname001 1:235bfa26c5c1 914 CAN_SEG2_TIME_LIMIT_SET & CAN_SAMPLE3TIMES ) ;
noname001 1:235bfa26c5c1 915
noname001 1:235bfa26c5c1 916 CAN1SetFilter ( (char) 0 , CAN_FILTER_SID( 0x200 ) & CAN_RX_EID_DIS ,
noname001 1:235bfa26c5c1 917 CAN_FILTER_EID( 0x00 ) );
noname001 1:235bfa26c5c1 918
noname001 1:235bfa26c5c1 919
noname001 1:235bfa26c5c1 920 CAN1SetMask ( (char)0 , CAN_MASK_SID ( 0xFFF ) & CAN_MATCH_FILTER_TYPE ,
noname001 1:235bfa26c5c1 921 CAN_MASK_EID( 0x00) );
noname001 1:235bfa26c5c1 922
noname001 1:235bfa26c5c1 923
noname001 1:235bfa26c5c1 924 CAN1SetTXMode( (char) 0 , CAN_TX_STOP_REQ & CAN_TX_PRIORITY_HIGH );
noname001 1:235bfa26c5c1 925 CAN1SetRXMode( (char) 0 , CAN_RXFUL_CLEAR & CAN_BUF0_DBLBUFFER_DIS );
noname001 1:235bfa26c5c1 926 CAN1SetOperationMode( CAN_IDLE_CON & CAN_CAPTURE_DIS & CAN_MASTERCLOCK_1 &
noname001 1:235bfa26c5c1 927 CAN_REQ_OPERMODE_NOR );
noname001 1:235bfa26c5c1 928 C1INTEbits.RX0IE = 1;
noname001 1:235bfa26c5c1 929 C1INTEbits.RX1IE = 1;
noname001 1:235bfa26c5c1 930 IEC1bits.C1IE = 1;
noname001 1:235bfa26c5c1 931
noname001 1:235bfa26c5c1 932 C1TX0SID = 0x0000;
noname001 1:235bfa26c5c1 933 C1TX0EID = 0x0000;
noname001 1:235bfa26c5c1 934 C1RX0SID = 0x0000;
noname001 1:235bfa26c5c1 935 C1RXF0SID = 0x0010;
noname001 1:235bfa26c5c1 936 }
noname001 1:235bfa26c5c1 937 */
noname001 1:235bfa26c5c1 938 /*
noname001 1:235bfa26c5c1 939 void _ISR _C1Interrupt(void)
noname001 1:235bfa26c5c1 940 {
noname001 1:235bfa26c5c1 941 // 讀取大板子傳來的資料
noname001 1:235bfa26c5c1 942 if (C1RX0CONbits.RXFUL == 1)
noname001 1:235bfa26c5c1 943 {
noname001 1:235bfa26c5c1 944 rotationspeed = C1RX0B1;
noname001 1:235bfa26c5c1 945 omega = (float)rotationspeed * 0.4553 * 0.75; // 2pi * (10/138) (rad/s)
noname001 1:235bfa26c5c1 946 v = 0.33 * omega; // v = r*w (m/s)
noname001 1:235bfa26c5c1 947
noname001 1:235bfa26c5c1 948 C1RX0CONbits.RXFUL = 0;
noname001 1:235bfa26c5c1 949 }
noname001 1:235bfa26c5c1 950
noname001 1:235bfa26c5c1 951 C1INTFbits.RX0IF = 0;
noname001 1:235bfa26c5c1 952
noname001 1:235bfa26c5c1 953 IFS1bits.C1IF = 0;
noname001 1:235bfa26c5c1 954 }
noname001 1:235bfa26c5c1 955 */
noname001 1:235bfa26c5c1 956 /*
noname001 1:235bfa26c5c1 957 void init_ADC(void)
noname001 1:235bfa26c5c1 958 {
noname001 1:235bfa26c5c1 959 ADCON1bits.SSRC = 7; // Internal counter ends sampling and starts conversion (auto convert)
noname001 1:235bfa26c5c1 960 ADCON1bits.ASAM = 1; // Sampling begins immediately after last conversion completes
noname001 1:235bfa26c5c1 961 ADCON2bits.VCFG = 0; // A/D VREFH : AVDD(power) , A/D VREFL : AVSS(ground)
noname001 1:235bfa26c5c1 962 ADCON2bits.CHPS = 0; // 00 = Converts CH0
noname001 1:235bfa26c5c1 963 ADCON3bits.ADRC = 1; // A/D internal RC clock
noname001 1:235bfa26c5c1 964 ADCON3bits.SAMC = 16; // 16*TAD
noname001 1:235bfa26c5c1 965 ADCON3bits.ADCS = 11; // (TCY/2)*(ADCS<5:0>+1)=6*TCY , where ADCS<5:0>=11
noname001 1:235bfa26c5c1 966
noname001 1:235bfa26c5c1 967 ADCHS = 0x0006;; // Connect RB6/AN6 as CH0 input
noname001 1:235bfa26c5c1 968 ADPCFGbits.PCFG6 = 0; // 0 = Analog input pin in Analog mode ; 1: Digital mode
noname001 1:235bfa26c5c1 969
noname001 1:235bfa26c5c1 970 ADCON1bits.ADON = 1;
noname001 1:235bfa26c5c1 971 // 1 = A/D converter module is operating; 0 = A/D converter is off
noname001 1:235bfa26c5c1 972 }
noname001 1:235bfa26c5c1 973 */
noname001 1:235bfa26c5c1 974
noname001 1:235bfa26c5c1 975 float lpf(float input,float output_old,float frequency)
noname001 1:235bfa26c5c1 976 {
noname001 1:235bfa26c5c1 977 float output = 0;
noname001 1:235bfa26c5c1 978
noname001 1:235bfa26c5c1 979 output = (output_old + frequency*T*input) / (1+frequency*T);
noname001 1:235bfa26c5c1 980
noname001 1:235bfa26c5c1 981 return output;
noname001 1:235bfa26c5c1 982 }
noname001 1:235bfa26c5c1 983
noname001 1:235bfa26c5c1 984
noname001 1:235bfa26c5c1 985 float sinr(float input)
noname001 1:235bfa26c5c1 986 {
noname001 1:235bfa26c5c1 987 float output = 0;
noname001 1:235bfa26c5c1 988
noname001 1:235bfa26c5c1 989 output = input - input * input * input / 6;
noname001 1:235bfa26c5c1 990 return output;
noname001 1:235bfa26c5c1 991 }
noname001 1:235bfa26c5c1 992
noname001 1:235bfa26c5c1 993
noname001 1:235bfa26c5c1 994 float cosr(float input)
noname001 1:235bfa26c5c1 995 {
noname001 1:235bfa26c5c1 996 float output = 0;
noname001 1:235bfa26c5c1 997
noname001 1:235bfa26c5c1 998 output = 1 - input * input / 2;
noname001 1:235bfa26c5c1 999 return output;
noname001 1:235bfa26c5c1 1000 }
noname001 1:235bfa26c5c1 1001
noname001 1:235bfa26c5c1 1002
noname001 1:235bfa26c5c1 1003 float arcsin(float input)
noname001 1:235bfa26c5c1 1004 {
noname001 1:235bfa26c5c1 1005 float output = 0;
noname001 1:235bfa26c5c1 1006
noname001 1:235bfa26c5c1 1007 output = input + input * input * input / 6;
noname001 1:235bfa26c5c1 1008 return output;
noname001 1:235bfa26c5c1 1009 }
noname001 1:235bfa26c5c1 1010
noname001 1:235bfa26c5c1 1011
noname001 1:235bfa26c5c1 1012 float arccos(float input)
noname001 1:235bfa26c5c1 1013 {
noname001 1:235bfa26c5c1 1014 float output = 0;
noname001 1:235bfa26c5c1 1015
noname001 1:235bfa26c5c1 1016 output = (3.14 / 2) - arcsin(input);
noname001 1:235bfa26c5c1 1017 return output;
noname001 1:235bfa26c5c1 1018 }
noname001 1:235bfa26c5c1 1019
noname001 1:235bfa26c5c1 1020
noname001 1:235bfa26c5c1 1021 float arctan(float input)
noname001 1:235bfa26c5c1 1022 {
noname001 1:235bfa26c5c1 1023 float output = 0;
noname001 1:235bfa26c5c1 1024
noname001 1:235bfa26c5c1 1025 output = input - input * input * input / 3;
noname001 1:235bfa26c5c1 1026 return output;
noname001 1:235bfa26c5c1 1027 }
noname001 1:235bfa26c5c1 1028
noname001 1:235bfa26c5c1 1029 /*
noname001 1:235bfa26c5c1 1030 void _ISR _U2RXInterrupt(void)
noname001 1:235bfa26c5c1 1031 {
noname001 1:235bfa26c5c1 1032 // 更改體重值
noname001 1:235bfa26c5c1 1033 uart_read = U2RXREG;
noname001 1:235bfa26c5c1 1034
noname001 1:235bfa26c5c1 1035 switch(uart_read)
noname001 1:235bfa26c5c1 1036 {
noname001 1:235bfa26c5c1 1037 case 'q':
noname001 1:235bfa26c5c1 1038 M = 45 + 25; // 人:45kg , 車:25kg
noname001 1:235bfa26c5c1 1039 break;
noname001 1:235bfa26c5c1 1040
noname001 1:235bfa26c5c1 1041 case 'w':
noname001 1:235bfa26c5c1 1042 M = 50 + 25;
noname001 1:235bfa26c5c1 1043 break;
noname001 1:235bfa26c5c1 1044
noname001 1:235bfa26c5c1 1045 case 'e':
noname001 1:235bfa26c5c1 1046 M = 55 + 25;
noname001 1:235bfa26c5c1 1047 break;
noname001 1:235bfa26c5c1 1048
noname001 1:235bfa26c5c1 1049 case 'a':
noname001 1:235bfa26c5c1 1050 M = 60 + 25;
noname001 1:235bfa26c5c1 1051 break;
noname001 1:235bfa26c5c1 1052
noname001 1:235bfa26c5c1 1053 case 's':
noname001 1:235bfa26c5c1 1054 M = 65 + 25;
noname001 1:235bfa26c5c1 1055 break;
noname001 1:235bfa26c5c1 1056
noname001 1:235bfa26c5c1 1057 case 'd':
noname001 1:235bfa26c5c1 1058 M = 70 + 25;
noname001 1:235bfa26c5c1 1059 break;
noname001 1:235bfa26c5c1 1060
noname001 1:235bfa26c5c1 1061 case 'z':
noname001 1:235bfa26c5c1 1062 M = 75 + 25;
noname001 1:235bfa26c5c1 1063 break;
noname001 1:235bfa26c5c1 1064
noname001 1:235bfa26c5c1 1065 case 'x':
noname001 1:235bfa26c5c1 1066 M = 80 + 25;
noname001 1:235bfa26c5c1 1067 break;
noname001 1:235bfa26c5c1 1068
noname001 1:235bfa26c5c1 1069 case 'c':
noname001 1:235bfa26c5c1 1070 M = 0;
noname001 1:235bfa26c5c1 1071 break;
noname001 1:235bfa26c5c1 1072 }
noname001 1:235bfa26c5c1 1073
noname001 1:235bfa26c5c1 1074 IFS1bits.U2RXIF = 0;
noname001 1:235bfa26c5c1 1075 }
noname001 1:235bfa26c5c1 1076 */
noname001 0:0b8d14ed499f 1077 void read_sensor(void)
noname001 0:0b8d14ed499f 1078 {
noname001 0:0b8d14ed499f 1079 // sensor raw data
noname001 0:0b8d14ed499f 1080 Gyro_axis_data[0] = sensor.readRawGyroX();
noname001 0:0b8d14ed499f 1081 Gyro_axis_data[1] = sensor.readRawGyroY();
noname001 0:0b8d14ed499f 1082 Gyro_axis_data[2] = sensor.readRawGyroZ();
noname001 0:0b8d14ed499f 1083
noname001 0:0b8d14ed499f 1084 Acce_axis_data[0] = sensor.readRawAccelX();
noname001 0:0b8d14ed499f 1085 Acce_axis_data[1] = sensor.readRawAccelY();
noname001 0:0b8d14ed499f 1086 Acce_axis_data[2] = sensor.readRawAccelZ();
noname001 0:0b8d14ed499f 1087
noname001 1:235bfa26c5c1 1088 // Magn_axis_data[0] = sensor.readRawMagX();
noname001 1:235bfa26c5c1 1089 // Magn_axis_data[1] = sensor.readRawMagY();
noname001 1:235bfa26c5c1 1090 // Magn_axis_data[2] = sensor.readRawMagZ();
noname001 0:0b8d14ed499f 1091 }