筋電センサプログラム
Embed:
(wiki syntax)
Show/hide line numbers
main.cpp
00001 /* memo 00002 * サンプリング1msでは筋電位には遅い? 00003 * FFTの1kHz以上は取れなくなる 00004 * 1kHzだとオシロでFFT見た時ぎりぎり 00005 */ 00006 /*** Include ***/ 00007 #include "mbed.h" 00008 #include "rtos.h" 00009 #include "FilterTest.h" 00010 00011 #include "typedef.h" 00012 00013 /*** Define ***/ 00014 #define ON (1) 00015 #define OFF (0) 00016 00017 #define SAMPLING_RATE (0.001) /* A/D sampling rate (1kHz) */ 00018 #define MAINCYCLE 1000 /* [us] */ 00019 00020 #define INT16_MAX (32767) 00021 #define INT16_MIN (-32768) 00022 /* 00023 #define DEBUG 00024 #define TESTCOM 00025 */ 00026 union u64_dataType_g { 00027 double DData; 00028 char CData[8]; 00029 }; 00030 00031 union u32_dataType_g { 00032 float DData; 00033 char CData[4]; 00034 }; 00035 00036 /*** Global Variable ***/ 00037 DigitalOut myled1(LED1); /* 起動確認用 */ 00038 DigitalOut myled2(LED2); /* 割り込み確認用 */ 00039 DigitalOut myled3(LED3); /* 休止状態確認用 */ 00040 AnalogOut aout(p18); /* デバッグ用 */ 00041 Ticker sampling; /* Interval timer for A/D sampling */ 00042 AnalogIn wave_in(p20); /* Waveform input */ 00043 Serial pc(USBTX, USBRX); /* tx, rx */ 00044 Timer timer; 00045 FilterTest filter; 00046 00047 UINT32 g_sendFlg; 00048 FLT32 g_wave; 00049 00050 UINT32 g_adCnt; 00051 00052 /* 変数定義 */ 00053 uint32_t Fdiv; 00054 double InputData = 0.0; 00055 00056 FLT32 g_cntUp; 00057 00058 /*** Functions ***/ 00059 /* 通信関数宣言 */ 00060 u64_dataType_g Communicaion(double data,int byte); 00061 void CommInit(); 00062 double InputAnalgData(); 00063 /* A/D変換割り込み宣言 */ 00064 void ad_sampling(); 00065 00066 00067 00068 INT32 main() 00069 { 00070 INT32 i = 0; 00071 INT32 cnt = 0; 00072 DBL64 st = 0; 00073 DBL64 et = 0; 00074 u64_dataType_g sendData; 00075 myled1 = 1; 00076 00077 /* 通信初期化 */ 00078 CommInit(); /* 初期化 */ 00079 00080 /* A/D変換対タイマ割り込み開始 */ 00081 myled2 = 1; 00082 /* Start interval timer */ 00083 sampling.attach(&ad_sampling, SAMPLING_RATE); 00084 myled2 = 0; 00085 00086 while(1) { 00087 /* timer read */ 00088 st = timer.read_us(); 00089 myled3 = 0; 00090 00091 /* メイン処理 */ 00092 if(cnt >= 1000) { 00093 myled1 = !myled1; 00094 cnt = 0; 00095 } 00096 cnt++; 00097 i++; 00098 00099 /* test */ 00100 //ad_sampling(); 00101 00102 /* データ送信判定 */ 00103 if(g_sendFlg == 1) { 00104 /* データ送信 */ 00105 i++; 00106 #ifdef DEBUG_ 00107 pc.printf("### cnt: %d, ad cnt: %d, wave: %f hogehoge ###\r\n", i, g_adCnt, InputData); 00108 aout= (float)InputData; 00109 #endif 00110 #ifdef TESTCOM_ 00111 pc.printf("send: %d,%lf\t\r\n", i,InputData); 00112 #endif 00113 __disable_irq(); // 禁止 00114 //InputData = 2.4; 00115 aout= InputData /* / 3.3*/; 00116 sendData = Communicaion(InputData,1); 00117 __enable_irq(); // 許可 00118 /* フラグリセット */ 00119 g_sendFlg = 0; 00120 //pc.printf("\r\nsend: %1.8lf, ", sendData.DData); 00121 for(i=0; i<8; i++) { 00122 //LPC_UART0->THR =sendData.CData[i]; 00123 #ifdef TESTCOM_ 00124 pc.printf("%02x ", sendData.CData[i]); 00125 #endif 00126 } 00127 00128 } 00129 00130 /* timer read */ 00131 et = timer.read_us(); 00132 /* 制御周期まで待機 */ 00133 /*Thread::wait((uint32_t)(MAINCYCLE - (et - st)));*/ 00134 wait_us((uint32_t)(MAINCYCLE - (et - st))); 00135 } 00136 } 00137 00138 /* A/D変換割り込み */ 00139 void ad_sampling() 00140 { 00141 static INT32 i = 0; 00142 INT32 hpf_on, lpf_on, brf_on; 00143 /* 割り込み100回で点滅 */ 00144 if(i >= 100) { 00145 myled2 = !myled2; 00146 i = 0; 00147 } 00148 i++; 00149 g_adCnt++; 00150 InputData = 0.0; 00151 InputData = InputAnalgData(); /*[V] */ 00152 00153 /* filter */ 00154 hpf_on = 1; 00155 lpf_on = 1; 00156 brf_on = 0; 00157 /** !!! サンプリング周波数確認 !!! **/ 00158 /* InputData = (int32_t)filter.calc( (double)(wave_in.read_u16() - INT16_MAX), hpf_on, lpf_on, brf_on ); */ 00159 // InputData = filter.calc( InputData, hpf_on, lpf_on, brf_on ); 00160 00161 00162 #ifdef DEBUG_ 00163 /*pc.printf("attach: %d,%d\r\n", i, InputData);*/ 00164 g_wave = i / 100 * 3.3; 00165 g_wave = g_adCnt * 3.3; 00166 if(i > 100) i = 0; 00167 #endif 00168 /* wait(0.01); */ 00169 /* A/D変換完了後送信 */ 00170 g_sendFlg = 1; 00171 } 00172 00173 00174 void CommInit() /* 通信初期化 */ 00175 { 00176 Fdiv = SystemCoreClock / (4 * 16 * 115200); // 9600bps 00177 } 00178 00179 u64_dataType_g Communicaion(double data,int byte) 00180 { 00181 00182 int i; 00183 char header = 0x01; 00184 char hoge = 0x00; 00185 u64_dataType_g sendData; 00186 u32_dataType_g testData; 00187 /* test */ 00188 g_cntUp = g_cntUp + 0.01; 00189 if(g_cntUp > 3.0) g_cntUp = 0.0; 00190 00191 sendData.DData = (float)1.0; 00192 testData.DData = (float)data; 00193 //testData.DData = (float)myled1; 00194 00195 LPC_PINCON->PINSEL0 &= ~(3 << 4); 00196 LPC_PINCON->PINSEL0 |= (1 << 4); // TXD0 (01) 00197 00198 LPC_SC->PCLKSEL0 &= ~(3 << 6); // PCLK_UART0 ck/4 (00) 00199 LPC_SC->PCONP |= (1 << 3); // PCUART0 00200 00201 LPC_UART0->LCR |= (1 << 7); // enable access DLAB 00202 LPC_UART0->DLL = Fdiv & 0xff; 00203 LPC_UART0->DLM = (Fdiv >> 8) & 0xff; 00204 LPC_UART0->LCR &= ~(1 << 7); // disable access DLAB 00205 00206 LPC_UART0->LCR |= (3 << 0); // 8bit 00207 LPC_UART0->FCR = (7 << 0); // RX1char(00), FIFO reset 00208 LPC_UART0->IER = (1 << 0); // RBR 00209 00210 /* send header */ 00211 LPC_UART0->THR = header; 00212 for(i=0; i<4; i++) { 00213 //LPC_UART0->THR =sendData.CData[i]; 00214 LPC_UART0->THR =testData.CData[i]; 00215 #ifdef TESTCOM_ 00216 pc.printf("send: %d,%lf\r\n", i,sendData.CData[i]); 00217 #endif 00218 } 00219 for(i=0; i<3; i++) { 00220 LPC_UART0->THR = hoge; 00221 } 00222 00223 00224 NVIC_EnableIRQ(UART0_IRQn); 00225 wait_us(100); 00226 return sendData; 00227 } 00228 00229 double InputAnalgData() /* A/D 読み取り */ 00230 { 00231 double Result = 0.0; 00232 00233 Result = (double)wave_in.read() *3.3; 00234 /* 1 2 3 4 5 6 7 8 */ 00235 // Result = 0x0123456789ABCDEF; 00236 // Result = 2.0; 00237 //Result += 1; 00238 //if(Result > 3) Result = 0; 00239 /*aout= Result / 3.3;*/ 00240 //wait_us(100); 00241 return Result; 00242 } 00243
Generated on Tue Jul 12 2022 23:47:38 by
1.7.2