daiki hiraoka
/
EMG
筋電センサプログラム
筋電
main.cpp@13:94ce8bd0c0e1, 2018-01-04 (annotated)
- Committer:
- dhpt
- Date:
- Thu Jan 04 06:30:00 2018 +0000
- Revision:
- 13:94ce8bd0c0e1
- Parent:
- 12:cbf6f5bbfbe6
???????????????; ????read?3.3????
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dhpt | 12:cbf6f5bbfbe6 | 1 | /* memo |
dhpt | 12:cbf6f5bbfbe6 | 2 | * サンプリング1msでは筋電位には遅い? |
dhpt | 12:cbf6f5bbfbe6 | 3 | * FFTの1kHz以上は取れなくなる |
dhpt | 12:cbf6f5bbfbe6 | 4 | * 1kHzだとオシロでFFT見た時ぎりぎり |
dhpt | 12:cbf6f5bbfbe6 | 5 | */ |
dhpt | 13:94ce8bd0c0e1 | 6 | /*** Include ***/ |
dhpt | 0:42ab58db8182 | 7 | #include "mbed.h" |
dhpt | 0:42ab58db8182 | 8 | #include "rtos.h" |
dhpt | 3:5d91bfe4a79d | 9 | #include "FilterTest.h" |
dhpt | 0:42ab58db8182 | 10 | |
dhpt | 0:42ab58db8182 | 11 | #include "typedef.h" |
dhpt | 0:42ab58db8182 | 12 | |
dhpt | 0:42ab58db8182 | 13 | /*** Define ***/ |
dhpt | 0:42ab58db8182 | 14 | #define ON (1) |
dhpt | 0:42ab58db8182 | 15 | #define OFF (0) |
dhpt | 0:42ab58db8182 | 16 | |
dhpt | 5:b2b19d2626c1 | 17 | #define SAMPLING_RATE (0.001) /* A/D sampling rate (1kHz) */ |
dhpt | 8:19d636daf453 | 18 | #define MAINCYCLE 1000 /* [us] */ |
dhpt | 0:42ab58db8182 | 19 | |
dhpt | 3:5d91bfe4a79d | 20 | #define INT16_MAX (32767) |
dhpt | 3:5d91bfe4a79d | 21 | #define INT16_MIN (-32768) |
dhpt | 4:a15ebde0a175 | 22 | /* |
dhpt | 1:91d6b2ee7a2e | 23 | #define DEBUG |
dhpt | 7:7ba672b401ca | 24 | #define TESTCOM |
dhpt | 4:a15ebde0a175 | 25 | */ |
dhpt | 13:94ce8bd0c0e1 | 26 | union u64_dataType_g { |
dhpt | 2:9a7f77850970 | 27 | double DData; |
dhpt | 13:94ce8bd0c0e1 | 28 | char CData[8]; |
dhpt | 2:9a7f77850970 | 29 | }; |
dhpt | 2:9a7f77850970 | 30 | |
dhpt | 13:94ce8bd0c0e1 | 31 | union u32_dataType_g { |
dhpt | 8:19d636daf453 | 32 | float DData; |
dhpt | 13:94ce8bd0c0e1 | 33 | char CData[4]; |
dhpt | 8:19d636daf453 | 34 | }; |
dhpt | 2:9a7f77850970 | 35 | |
dhpt | 0:42ab58db8182 | 36 | /*** Global Variable ***/ |
dhpt | 1:91d6b2ee7a2e | 37 | DigitalOut myled1(LED1); /* 起動確認用 */ |
dhpt | 1:91d6b2ee7a2e | 38 | DigitalOut myled2(LED2); /* 割り込み確認用 */ |
dhpt | 1:91d6b2ee7a2e | 39 | DigitalOut myled3(LED3); /* 休止状態確認用 */ |
dhpt | 3:5d91bfe4a79d | 40 | AnalogOut aout(p18); /* デバッグ用 */ |
dhpt | 0:42ab58db8182 | 41 | Ticker sampling; /* Interval timer for A/D sampling */ |
dhpt | 0:42ab58db8182 | 42 | AnalogIn wave_in(p20); /* Waveform input */ |
dhpt | 0:42ab58db8182 | 43 | Serial pc(USBTX, USBRX); /* tx, rx */ |
dhpt | 0:42ab58db8182 | 44 | Timer timer; |
dhpt | 3:5d91bfe4a79d | 45 | FilterTest filter; |
dhpt | 0:42ab58db8182 | 46 | |
dhpt | 0:42ab58db8182 | 47 | UINT32 g_sendFlg; |
dhpt | 1:91d6b2ee7a2e | 48 | FLT32 g_wave; |
dhpt | 1:91d6b2ee7a2e | 49 | |
dhpt | 1:91d6b2ee7a2e | 50 | UINT32 g_adCnt; |
dhpt | 1:91d6b2ee7a2e | 51 | |
dhpt | 2:9a7f77850970 | 52 | /* 変数定義 */ |
dhpt | 2:9a7f77850970 | 53 | uint32_t Fdiv; |
dhpt | 13:94ce8bd0c0e1 | 54 | double InputData = 0.0; |
dhpt | 2:9a7f77850970 | 55 | |
dhpt | 12:cbf6f5bbfbe6 | 56 | FLT32 g_cntUp; |
dhpt | 0:42ab58db8182 | 57 | |
dhpt | 0:42ab58db8182 | 58 | /*** Functions ***/ |
dhpt | 2:9a7f77850970 | 59 | /* 通信関数宣言 */ |
dhpt | 5:b2b19d2626c1 | 60 | u64_dataType_g Communicaion(double data,int byte); |
dhpt | 2:9a7f77850970 | 61 | void CommInit(); |
dhpt | 2:9a7f77850970 | 62 | double InputAnalgData(); |
dhpt | 2:9a7f77850970 | 63 | /* A/D変換割り込み宣言 */ |
dhpt | 2:9a7f77850970 | 64 | void ad_sampling(); |
dhpt | 2:9a7f77850970 | 65 | |
dhpt | 0:42ab58db8182 | 66 | |
dhpt | 0:42ab58db8182 | 67 | |
dhpt | 13:94ce8bd0c0e1 | 68 | INT32 main() |
dhpt | 13:94ce8bd0c0e1 | 69 | { |
dhpt | 0:42ab58db8182 | 70 | INT32 i = 0; |
dhpt | 4:a15ebde0a175 | 71 | INT32 cnt = 0; |
dhpt | 0:42ab58db8182 | 72 | DBL64 st = 0; |
dhpt | 0:42ab58db8182 | 73 | DBL64 et = 0; |
dhpt | 13:94ce8bd0c0e1 | 74 | u64_dataType_g sendData; |
dhpt | 1:91d6b2ee7a2e | 75 | myled1 = 1; |
dhpt | 13:94ce8bd0c0e1 | 76 | |
dhpt | 2:9a7f77850970 | 77 | /* 通信初期化 */ |
dhpt | 2:9a7f77850970 | 78 | CommInit(); /* 初期化 */ |
dhpt | 13:94ce8bd0c0e1 | 79 | |
dhpt | 1:91d6b2ee7a2e | 80 | /* A/D変換対タイマ割り込み開始 */ |
dhpt | 1:91d6b2ee7a2e | 81 | myled2 = 1; |
dhpt | 0:42ab58db8182 | 82 | /* Start interval timer */ |
dhpt | 0:42ab58db8182 | 83 | sampling.attach(&ad_sampling, SAMPLING_RATE); |
dhpt | 1:91d6b2ee7a2e | 84 | myled2 = 0; |
dhpt | 13:94ce8bd0c0e1 | 85 | |
dhpt | 0:42ab58db8182 | 86 | while(1) { |
dhpt | 0:42ab58db8182 | 87 | /* timer read */ |
dhpt | 4:a15ebde0a175 | 88 | st = timer.read_us(); |
dhpt | 1:91d6b2ee7a2e | 89 | myled3 = 0; |
dhpt | 13:94ce8bd0c0e1 | 90 | |
dhpt | 0:42ab58db8182 | 91 | /* メイン処理 */ |
dhpt | 4:a15ebde0a175 | 92 | if(cnt >= 1000) { |
dhpt | 13:94ce8bd0c0e1 | 93 | myled1 = !myled1; |
dhpt | 13:94ce8bd0c0e1 | 94 | cnt = 0; |
dhpt | 4:a15ebde0a175 | 95 | } |
dhpt | 4:a15ebde0a175 | 96 | cnt++; |
dhpt | 0:42ab58db8182 | 97 | i++; |
dhpt | 8:19d636daf453 | 98 | |
dhpt | 8:19d636daf453 | 99 | /* test */ |
dhpt | 8:19d636daf453 | 100 | //ad_sampling(); |
dhpt | 13:94ce8bd0c0e1 | 101 | |
dhpt | 0:42ab58db8182 | 102 | /* データ送信判定 */ |
dhpt | 0:42ab58db8182 | 103 | if(g_sendFlg == 1) { |
dhpt | 0:42ab58db8182 | 104 | /* データ送信 */ |
dhpt | 0:42ab58db8182 | 105 | i++; |
dhpt | 13:94ce8bd0c0e1 | 106 | #ifdef DEBUG_ |
dhpt | 4:a15ebde0a175 | 107 | pc.printf("### cnt: %d, ad cnt: %d, wave: %f hogehoge ###\r\n", i, g_adCnt, InputData); |
dhpt | 3:5d91bfe4a79d | 108 | aout= (float)InputData; |
dhpt | 13:94ce8bd0c0e1 | 109 | #endif |
dhpt | 13:94ce8bd0c0e1 | 110 | #ifdef TESTCOM_ |
dhpt | 13:94ce8bd0c0e1 | 111 | pc.printf("send: %d,%lf\t\r\n", i,InputData); |
dhpt | 13:94ce8bd0c0e1 | 112 | #endif |
dhpt | 5:b2b19d2626c1 | 113 | __disable_irq(); // 禁止 |
dhpt | 8:19d636daf453 | 114 | //InputData = 2.4; |
dhpt | 13:94ce8bd0c0e1 | 115 | aout= InputData /* / 3.3*/; |
dhpt | 5:b2b19d2626c1 | 116 | sendData = Communicaion(InputData,1); |
dhpt | 5:b2b19d2626c1 | 117 | __enable_irq(); // 許可 |
dhpt | 0:42ab58db8182 | 118 | /* フラグリセット */ |
dhpt | 0:42ab58db8182 | 119 | g_sendFlg = 0; |
dhpt | 13:94ce8bd0c0e1 | 120 | //pc.printf("\r\nsend: %1.8lf, ", sendData.DData); |
dhpt | 13:94ce8bd0c0e1 | 121 | for(i=0; i<8; i++) { |
dhpt | 13:94ce8bd0c0e1 | 122 | //LPC_UART0->THR =sendData.CData[i]; |
dhpt | 13:94ce8bd0c0e1 | 123 | #ifdef TESTCOM_ |
dhpt | 13:94ce8bd0c0e1 | 124 | pc.printf("%02x ", sendData.CData[i]); |
dhpt | 13:94ce8bd0c0e1 | 125 | #endif |
dhpt | 13:94ce8bd0c0e1 | 126 | } |
dhpt | 13:94ce8bd0c0e1 | 127 | |
dhpt | 0:42ab58db8182 | 128 | } |
dhpt | 13:94ce8bd0c0e1 | 129 | |
dhpt | 0:42ab58db8182 | 130 | /* timer read */ |
dhpt | 4:a15ebde0a175 | 131 | et = timer.read_us(); |
dhpt | 0:42ab58db8182 | 132 | /* 制御周期まで待機 */ |
dhpt | 4:a15ebde0a175 | 133 | /*Thread::wait((uint32_t)(MAINCYCLE - (et - st)));*/ |
dhpt | 4:a15ebde0a175 | 134 | wait_us((uint32_t)(MAINCYCLE - (et - st))); |
dhpt | 0:42ab58db8182 | 135 | } |
dhpt | 0:42ab58db8182 | 136 | } |
dhpt | 2:9a7f77850970 | 137 | |
dhpt | 2:9a7f77850970 | 138 | /* A/D変換割り込み */ |
dhpt | 13:94ce8bd0c0e1 | 139 | void ad_sampling() |
dhpt | 13:94ce8bd0c0e1 | 140 | { |
dhpt | 2:9a7f77850970 | 141 | static INT32 i = 0; |
dhpt | 3:5d91bfe4a79d | 142 | INT32 hpf_on, lpf_on, brf_on; |
dhpt | 4:a15ebde0a175 | 143 | /* 割り込み100回で点滅 */ |
dhpt | 4:a15ebde0a175 | 144 | if(i >= 100) { |
dhpt | 13:94ce8bd0c0e1 | 145 | myled2 = !myled2; |
dhpt | 13:94ce8bd0c0e1 | 146 | i = 0; |
dhpt | 4:a15ebde0a175 | 147 | } |
dhpt | 4:a15ebde0a175 | 148 | i++; |
dhpt | 2:9a7f77850970 | 149 | g_adCnt++; |
dhpt | 4:a15ebde0a175 | 150 | InputData = 0.0; |
dhpt | 2:9a7f77850970 | 151 | InputData = InputAnalgData(); /*[V] */ |
dhpt | 13:94ce8bd0c0e1 | 152 | |
dhpt | 3:5d91bfe4a79d | 153 | /* filter */ |
dhpt | 11:3afd371235c5 | 154 | hpf_on = 1; |
dhpt | 11:3afd371235c5 | 155 | lpf_on = 1; |
dhpt | 3:5d91bfe4a79d | 156 | brf_on = 0; |
dhpt | 4:a15ebde0a175 | 157 | /** !!! サンプリング周波数確認 !!! **/ |
dhpt | 4:a15ebde0a175 | 158 | /* InputData = (int32_t)filter.calc( (double)(wave_in.read_u16() - INT16_MAX), hpf_on, lpf_on, brf_on ); */ |
dhpt | 13:94ce8bd0c0e1 | 159 | // InputData = filter.calc( InputData, hpf_on, lpf_on, brf_on ); |
dhpt | 13:94ce8bd0c0e1 | 160 | |
dhpt | 13:94ce8bd0c0e1 | 161 | |
dhpt | 13:94ce8bd0c0e1 | 162 | #ifdef DEBUG_ |
dhpt | 3:5d91bfe4a79d | 163 | /*pc.printf("attach: %d,%d\r\n", i, InputData);*/ |
dhpt | 2:9a7f77850970 | 164 | g_wave = i / 100 * 3.3; |
dhpt | 2:9a7f77850970 | 165 | g_wave = g_adCnt * 3.3; |
dhpt | 2:9a7f77850970 | 166 | if(i > 100) i = 0; |
dhpt | 13:94ce8bd0c0e1 | 167 | #endif |
dhpt | 2:9a7f77850970 | 168 | /* wait(0.01); */ |
dhpt | 2:9a7f77850970 | 169 | /* A/D変換完了後送信 */ |
dhpt | 2:9a7f77850970 | 170 | g_sendFlg = 1; |
dhpt | 2:9a7f77850970 | 171 | } |
dhpt | 2:9a7f77850970 | 172 | |
dhpt | 2:9a7f77850970 | 173 | |
dhpt | 2:9a7f77850970 | 174 | void CommInit() /* 通信初期化 */ |
dhpt | 2:9a7f77850970 | 175 | { |
dhpt | 9:83a02b5f76f0 | 176 | Fdiv = SystemCoreClock / (4 * 16 * 115200); // 9600bps |
dhpt | 2:9a7f77850970 | 177 | } |
dhpt | 2:9a7f77850970 | 178 | |
dhpt | 5:b2b19d2626c1 | 179 | u64_dataType_g Communicaion(double data,int byte) |
dhpt | 2:9a7f77850970 | 180 | { |
dhpt | 13:94ce8bd0c0e1 | 181 | |
dhpt | 2:9a7f77850970 | 182 | int i; |
dhpt | 8:19d636daf453 | 183 | char header = 0x01; |
dhpt | 12:cbf6f5bbfbe6 | 184 | char hoge = 0x00; |
dhpt | 13:94ce8bd0c0e1 | 185 | u64_dataType_g sendData; |
dhpt | 12:cbf6f5bbfbe6 | 186 | u32_dataType_g testData; |
dhpt | 12:cbf6f5bbfbe6 | 187 | /* test */ |
dhpt | 13:94ce8bd0c0e1 | 188 | g_cntUp = g_cntUp + 0.01; |
dhpt | 13:94ce8bd0c0e1 | 189 | if(g_cntUp > 3.0) g_cntUp = 0.0; |
dhpt | 12:cbf6f5bbfbe6 | 190 | |
dhpt | 13:94ce8bd0c0e1 | 191 | sendData.DData = (float)1.0; |
dhpt | 13:94ce8bd0c0e1 | 192 | testData.DData = (float)data; |
dhpt | 11:3afd371235c5 | 193 | //testData.DData = (float)myled1; |
dhpt | 13:94ce8bd0c0e1 | 194 | |
dhpt | 2:9a7f77850970 | 195 | LPC_PINCON->PINSEL0 &= ~(3 << 4); |
dhpt | 2:9a7f77850970 | 196 | LPC_PINCON->PINSEL0 |= (1 << 4); // TXD0 (01) |
dhpt | 13:94ce8bd0c0e1 | 197 | |
dhpt | 2:9a7f77850970 | 198 | LPC_SC->PCLKSEL0 &= ~(3 << 6); // PCLK_UART0 ck/4 (00) |
dhpt | 2:9a7f77850970 | 199 | LPC_SC->PCONP |= (1 << 3); // PCUART0 |
dhpt | 13:94ce8bd0c0e1 | 200 | |
dhpt | 2:9a7f77850970 | 201 | LPC_UART0->LCR |= (1 << 7); // enable access DLAB |
dhpt | 2:9a7f77850970 | 202 | LPC_UART0->DLL = Fdiv & 0xff; |
dhpt | 2:9a7f77850970 | 203 | LPC_UART0->DLM = (Fdiv >> 8) & 0xff; |
dhpt | 2:9a7f77850970 | 204 | LPC_UART0->LCR &= ~(1 << 7); // disable access DLAB |
dhpt | 13:94ce8bd0c0e1 | 205 | |
dhpt | 2:9a7f77850970 | 206 | LPC_UART0->LCR |= (3 << 0); // 8bit |
dhpt | 2:9a7f77850970 | 207 | LPC_UART0->FCR = (7 << 0); // RX1char(00), FIFO reset |
dhpt | 2:9a7f77850970 | 208 | LPC_UART0->IER = (1 << 0); // RBR |
dhpt | 13:94ce8bd0c0e1 | 209 | |
dhpt | 8:19d636daf453 | 210 | /* send header */ |
dhpt | 8:19d636daf453 | 211 | LPC_UART0->THR = header; |
dhpt | 13:94ce8bd0c0e1 | 212 | for(i=0; i<4; i++) { |
dhpt | 13:94ce8bd0c0e1 | 213 | //LPC_UART0->THR =sendData.CData[i]; |
dhpt | 13:94ce8bd0c0e1 | 214 | LPC_UART0->THR =testData.CData[i]; |
dhpt | 13:94ce8bd0c0e1 | 215 | #ifdef TESTCOM_ |
dhpt | 13:94ce8bd0c0e1 | 216 | pc.printf("send: %d,%lf\r\n", i,sendData.CData[i]); |
dhpt | 13:94ce8bd0c0e1 | 217 | #endif |
dhpt | 2:9a7f77850970 | 218 | } |
dhpt | 13:94ce8bd0c0e1 | 219 | for(i=0; i<3; i++) { |
dhpt | 12:cbf6f5bbfbe6 | 220 | LPC_UART0->THR = hoge; |
dhpt | 12:cbf6f5bbfbe6 | 221 | } |
dhpt | 13:94ce8bd0c0e1 | 222 | |
dhpt | 2:9a7f77850970 | 223 | |
dhpt | 2:9a7f77850970 | 224 | NVIC_EnableIRQ(UART0_IRQn); |
dhpt | 13:94ce8bd0c0e1 | 225 | wait_us(100); |
dhpt | 5:b2b19d2626c1 | 226 | return sendData; |
dhpt | 2:9a7f77850970 | 227 | } |
dhpt | 2:9a7f77850970 | 228 | |
dhpt | 13:94ce8bd0c0e1 | 229 | double InputAnalgData() /* A/D 読み取り */ |
dhpt | 2:9a7f77850970 | 230 | { |
dhpt | 13:94ce8bd0c0e1 | 231 | double Result = 0.0; |
dhpt | 13:94ce8bd0c0e1 | 232 | |
dhpt | 13:94ce8bd0c0e1 | 233 | Result = (double)wave_in.read() *3.3; |
dhpt | 13:94ce8bd0c0e1 | 234 | /* 1 2 3 4 5 6 7 8 */ |
dhpt | 13:94ce8bd0c0e1 | 235 | // Result = 0x0123456789ABCDEF; |
dhpt | 13:94ce8bd0c0e1 | 236 | // Result = 2.0; |
dhpt | 13:94ce8bd0c0e1 | 237 | //Result += 1; |
dhpt | 13:94ce8bd0c0e1 | 238 | //if(Result > 3) Result = 0; |
dhpt | 13:94ce8bd0c0e1 | 239 | /*aout= Result / 3.3;*/ |
dhpt | 13:94ce8bd0c0e1 | 240 | //wait_us(100); |
dhpt | 13:94ce8bd0c0e1 | 241 | return Result; |
dhpt | 2:9a7f77850970 | 242 | } |
dhpt | 2:9a7f77850970 | 243 |