筋電センサプログラム

Dependencies:   mbed-rtos mbed

筋電

Committer:
dhpt
Date:
Mon Feb 13 13:13:41 2017 +0000
Revision:
5:b2b19d2626c1
Parent:
4:a15ebde0a175
Child:
6:2c32373e7628
??;

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