筋電センサプログラム

Dependencies:   mbed-rtos mbed

筋電

main.cpp

Committer:
dhpt
Date:
2018-01-04
Revision:
13:94ce8bd0c0e1
Parent:
12:cbf6f5bbfbe6

File content as of revision 13:94ce8bd0c0e1:

/* memo
 * サンプリング1msでは筋電位には遅い?
 * FFTの1kHz以上は取れなくなる
 * 1kHzだとオシロでFFT見た時ぎりぎり
 */
/*** Include ***/
#include "mbed.h"
#include "rtos.h"
#include "FilterTest.h"

#include "typedef.h"

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

#define SAMPLING_RATE   (0.001)     /* A/D sampling rate (1kHz) */
#define MAINCYCLE 1000               /* [us] */

#define INT16_MAX     (32767)
#define INT16_MIN     (-32768)
/*
#define DEBUG
#define TESTCOM
*/
union u64_dataType_g {
    double DData;
    char CData[8];
};

union u32_dataType_g {
    float DData;
    char CData[4];
};

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

UINT32      g_sendFlg;
FLT32       g_wave;

UINT32      g_adCnt;

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

FLT32 g_cntUp;

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



INT32 main()
{
    INT32 i = 0;
    INT32 cnt = 0;
    DBL64 st = 0;
    DBL64 et = 0;
    u64_dataType_g sendData;
    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_us();
        myled3 = 0;

        /* メイン処理 */
        if(cnt >= 1000) {
            myled1 = !myled1;
            cnt = 0;
        }
        cnt++;
        i++;

        /* test */
        //ad_sampling();

        /* データ送信判定 */
        if(g_sendFlg == 1) {
            /* データ送信 */
            i++;
#ifdef DEBUG_
            pc.printf("### cnt: %d, ad cnt: %d, wave: %f hogehoge ###\r\n", i, g_adCnt, InputData);
            aout= (float)InputData;
#endif
#ifdef TESTCOM_
            pc.printf("send: %d,%lf\t\r\n", i,InputData);
#endif
            __disable_irq(); // 禁止
            //InputData = 2.4;
            aout= InputData /* / 3.3*/;
            sendData = Communicaion(InputData,1);
            __enable_irq(); // 許可
            /* フラグリセット */
            g_sendFlg = 0;
            //pc.printf("\r\nsend: %1.8lf, ", sendData.DData);
            for(i=0; i<8; i++) {
                //LPC_UART0->THR =sendData.CData[i];
#ifdef TESTCOM_
                pc.printf("%02x ", sendData.CData[i]);
#endif
            }

        }

        /* timer read */
        et = timer.read_us();
        /* 制御周期まで待機 */
        /*Thread::wait((uint32_t)(MAINCYCLE - (et - st)));*/
        wait_us((uint32_t)(MAINCYCLE - (et - st)));
    }
}

/* A/D変換割り込み */
void ad_sampling()
{
    static INT32 i = 0;
    INT32 hpf_on, lpf_on, brf_on;
    /* 割り込み100回で点滅 */
    if(i >= 100) {
        myled2 = !myled2;
        i = 0;
    }
    i++;
    g_adCnt++;
    InputData = 0.0;
    InputData = InputAnalgData();  /*[V] */

    /* filter */
    hpf_on = 1;
    lpf_on = 1;
    brf_on = 0;
    /** !!! サンプリング周波数確認 !!! **/
    /* InputData = (int32_t)filter.calc( (double)(wave_in.read_u16() - INT16_MAX), hpf_on, lpf_on, brf_on ); */
    // InputData = filter.calc( InputData, hpf_on, lpf_on, brf_on );


#ifdef DEBUG_
    /*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;
}


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

u64_dataType_g Communicaion(double data,int byte)
{

    int i;
    char header = 0x01;
    char hoge = 0x00;
    u64_dataType_g sendData;
    u32_dataType_g testData;
    /* test */
    g_cntUp = g_cntUp + 0.01;
    if(g_cntUp > 3.0) g_cntUp = 0.0;

    sendData.DData = (float)1.0;
    testData.DData = (float)data;
    //testData.DData = (float)myled1;

    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

    /* send header */
    LPC_UART0->THR = header;
    for(i=0; i<4; i++) {
        //LPC_UART0->THR =sendData.CData[i];
         LPC_UART0->THR =testData.CData[i];
#ifdef TESTCOM_
        pc.printf("send: %d,%lf\r\n", i,sendData.CData[i]);
#endif
    }
    for(i=0; i<3; i++) {
        LPC_UART0->THR = hoge;
    }


    NVIC_EnableIRQ(UART0_IRQn);
    wait_us(100);
    return sendData;
}

double InputAnalgData() /* A/D  読み取り */
{
    double Result = 0.0;

    Result = (double)wave_in.read()  *3.3;
    /*          1 2 3 4 5 6 7 8   */
    // Result = 0x0123456789ABCDEF;
    // Result = 2.0;
    //Result += 1;
    //if(Result > 3) Result = 0;
    /*aout= Result / 3.3;*/
    //wait_us(100);
    return Result;
}