筋電センサプログラム

Dependencies:   mbed-rtos mbed

筋電

Committer:
dhpt
Date:
Mon Feb 13 06:20:56 2017 +0000
Revision:
4:a15ebde0a175
Parent:
3:5d91bfe4a79d
Child:
5:b2b19d2626c1
debug

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