筋電センサプログラム

Dependencies:   mbed-rtos mbed

筋電

Committer:
dhpt
Date:
Sat Sep 23 04:37:01 2017 +0000
Revision:
12:cbf6f5bbfbe6
Parent:
11:3afd371235c5
Child:
13:94ce8bd0c0e1
2017??????????

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