筋電センサプログラム

Dependencies:   mbed-rtos mbed

筋電

Committer:
dhpt
Date:
Sat Mar 18 04:04:40 2017 +0000
Revision:
9:83a02b5f76f0
Parent:
8:19d636daf453
Child:
10:2d6af31ea51e
???????

Who changed what in which revision?

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