筋電センサプログラム

Dependencies:   mbed-rtos mbed

筋電

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?

UserRevisionLine numberNew 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