筋電センサプログラム

Dependencies:   mbed-rtos mbed

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers main.cpp Source File

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