筋電センサプログラム

Dependencies:   mbed-rtos mbed

筋電

main.cpp

Committer:
dhpt
Date:
2017-01-28
Revision:
2:9a7f77850970
Parent:
1:91d6b2ee7a2e
Child:
3:5d91bfe4a79d

File content as of revision 2:9a7f77850970:

/*** Include ***/
#include "mbed.h"
#include "rtos.h"

#include "typedef.h"

/*** Define ***/
#define ON      (1)
#define OFF     (0)

#define SAMPLING_RATE   (0.01)     /* A/D sampling rate (1kHz) */
#define MAINCYCLE 20               /* [ms] */

#define DEBUG

union u64_dataType_g
{
    double DData;
    char CData[8];   
};


/*** Global Variable ***/
DigitalOut  myled1(LED1);           /* 起動確認用 */
DigitalOut  myled2(LED2);           /* 割り込み確認用 */
DigitalOut  myled3(LED3);           /* 休止状態確認用 */
Ticker      sampling;               /* Interval timer for A/D sampling */
AnalogIn    wave_in(p20);           /* Waveform input */
Serial      pc(USBTX, USBRX);       /* tx, rx */
Timer       timer;

UINT32      g_sendFlg;
FLT32       g_wave;

UINT32      g_adCnt;

/* 変数定義 */
uint32_t Fdiv;
double InputData = 0;    



/*** Functions ***/
/* 通信関数宣言 */
void Communicaion(double data,int byte);
void CommInit();
double InputAnalgData();
/* A/D変換割り込み宣言 */
void ad_sampling();



INT32 main() {
    INT32 i = 0;
    DBL64 st = 0;
    DBL64 et = 0;
    myled1 = 1;
    
    /* 通信初期化 */
    CommInit();     /* 初期化 */
    
    /* A/D変換対タイマ割り込み開始 */
    myled2 = 1;
    /* Start interval timer */
    sampling.attach(&ad_sampling, SAMPLING_RATE);
    myled2 = 0;
    
    while(1) {
        /* timer read */
        st = timer.read_ms();
        myled3 = 0;
        
        /* メイン処理 */
        myled1 = !myled1;
        i++;
        
        /* データ送信判定 */
        if(g_sendFlg == 1) {
            /* データ送信 */
            i++;
            #ifdef DEBUG_
            pc.printf("cnt: %d, ad cnt: %d, wave: %f\r\n", i, g_adCnt, InputData);
            /* InputData = InputData + 0.1; */
            #endif

            Communicaion(InputData,1);            
            /* フラグリセット */
            g_sendFlg = 0;
        }
        
        /* timer read */
        et = timer.read_ms();
        /* 制御周期まで待機 */
        Thread::wait((uint32_t)(MAINCYCLE - (et - st)));
    }
}

/* A/D変換割り込み */
void ad_sampling(){
    static INT32 i = 0;
    /* 割り込み中点灯 */
    myled2 = 1;
    g_adCnt++;
    InputData = InputAnalgData();  /*[V] */
    #ifdef DEBUG_
    i++;
    pc.printf("attach: %d,%d\r\n", i, InputData);
    g_wave = i / 100 * 3.3;
    g_wave = g_adCnt * 3.3;
    if(i > 100) i = 0;
    #endif
    /* wait(0.01); */
    /* A/D変換完了後送信 */
    g_sendFlg = 1;
    myled2 = 0;
}


void CommInit() /* 通信初期化 */
{
    Fdiv = SystemCoreClock / (4 * 16 * 9600); // 9600bps
}

void Communicaion(double data,int byte)
{
    
    int i;
    u64_dataType_g sendData;    
    sendData.DData = data;
    
    
    LPC_PINCON->PINSEL0 &= ~(3 << 4);
    LPC_PINCON->PINSEL0 |= (1 << 4);    //  TXD0 (01)
 
    LPC_SC->PCLKSEL0 &= ~(3 << 6);      // PCLK_UART0 ck/4 (00)
    LPC_SC->PCONP |= (1 << 3);          // PCUART0
    
    LPC_UART0->LCR |= (1 << 7);         // enable access DLAB
    LPC_UART0->DLL = Fdiv & 0xff;
    LPC_UART0->DLM = (Fdiv >> 8) & 0xff;
    LPC_UART0->LCR &= ~(1 << 7);        // disable access DLAB
    
    LPC_UART0->LCR |= (3 << 0);         // 8bit
    LPC_UART0->FCR = (7 << 0); // RX1char(00), FIFO reset
    LPC_UART0->IER = (1 << 0); // RBR
    
    for(i=0;i<8;i++)
    {
        LPC_UART0->THR =sendData.CData[i];
    }
    

    NVIC_EnableIRQ(UART0_IRQn);

}

double InputAnalgData() /* A/D  読み取り */ 
{
   double Result = 0;
   
   Result = (double)wave_in.read()*10*3.3;
   
   return Result;
}