2013年10月30日水曜日

FRDM-KL25Z で AD 12bit 8chモジュールを使う

mbedでAD 12bit 8chモジュールを使う場合の説明です。
取得したアナログデータはUSBを通してPCで表示できます。TeraTermなどで確認してみてください。
MCU Gearの各プログラムをダウンロードしてmain.cppに以下のように記述すれば動きます。



#include "mbed.h"


#include "MCUGearBase.h"

#include "MCUGear.h"
#include "common.h"//このファイルの中にある#define LPC1768_mbedを有効、//#define FS_KL25Zを無効にする

//Initialize modules-----------------------------------------------------------------------

MCUGear AD8ch12M(PTE0, PTE1, N_SDA_SDA_SDA,4);    //AD(MCP3208) 12bit 8ch Module
//p28,p27はI2C通信バスです。I2Cでデジタルスイッチ群を操作し配線を再構築しています 
//N_SCL_SCL_VSSはモジュール基板裏面に設定したアドレスです
//SPI通信をするので4ピン再構築します
//ここでは任意の名前「AD8ch12M」という名前で登録しています
//-----------------------------------------------------------------------------------------

//Sample setting-----------------------------------------------------------------------

SPI spi(PTD2,PTD3,PTD1); // mosi, miso, sclk
DigitalOut cs(PTD0); //for SPI communications
Serial pc(USBTX, USBRX); // tx, rx
//-------------------------------------------------------------------------------------

//sample functions------------------------------------------------------------

void IOSimpleSPI(MCUGear *mcugear);             //IO setting for Simple SPI module
int read12bit8chAD(MCUGear *mcugear, char ch);  //simple ADC 8ch   //I2C端子と、モジュール基板の裏にアドレスを設定、4つの信号端子を使う
//----------------------------------------------------------------------------

//***************************************************************************************

int main() {
    
    initBase(); //initialize Baseboard//ベースボードの初期化

   //Set IO --------------------------------------------------------------

    IOSimpleSPI(&AD8ch12M);
   //IOの配線情報を保存しmbedのどの端子をモジュールのどの端子に当てはめるかを決めます
   //--------------------------

    int data2[8];

    while(1) {
       //12bit AD Mobdule-------------------------------------------------

       cs = 1; //reset CS pin
       AD8ch12M.connectModule();   //connect---//配線情報を基にモジュールとマイコン端子との配線を再構築します
//一度構築すると普通のデジタル回路と同じように扱えます
       data2[0] = read12bit8chAD(&AD8ch12M, 0);    //0ch//AD 0chの値を取得します
       data2[1] = read12bit8chAD(&AD8ch12M, 1);    //1ch
       data2[2] = read12bit8chAD(&AD8ch12M, 2);    //2ch
       data2[3] = read12bit8chAD(&AD8ch12M, 3);    //3ch
       data2[4] = read12bit8chAD(&AD8ch12M, 4);    //4ch
       data2[5] = read12bit8chAD(&AD8ch12M, 5);    //5ch
       data2[6] = read12bit8chAD(&AD8ch12M, 6);    //6ch
       data2[7] = read12bit8chAD(&AD8ch12M, 7);    //7ch
       AD8ch12M.disconnectModule();   //disconnect---//マイコンとモジュールの配線を切断します

       pc.printf("AD 0ch = %d  1ch = %d\n",whoami[0],whoami[1]);//PCに送ります

       wait(0.5);

    }    

}
//***************************************************************************************


//モジュールに搭載されているMCP3202のデバイスを動かすための関数です


//----------------------------------------------------------------------------------
//Simple write for 12bit 8ch AD module
//----------------------------------------------------------------------------------
int read12bit8chAD(MCUGear *mcugear, char ch){

    char sendData;
    int whoami[3];
    
    char sendData2;
//0000 0000 0110 00 00 [0000 0000 0000]
    if(ch < 8){
        sendData = 0x18+ch; //0001 1000
        sendData2 = sendData >> 2;
        sendData = sendData << 6;
        
    }else{
        return -1;
    }
    
    //12bit AD Mobdule----------------
    spi.frequency(2000000); //1MHz for KL25Z
    cs = 0;
    spi.write(sendData2);
    whoami[2] = spi.write(sendData);
    whoami[0] = whoami[2]<<8;
    whoami[0] = whoami[0] + spi.write(0x00)-0xE000;   //get data from AD device
    cs = 1;
    return whoami[0];

}

//マイコンとモジュールの配線情報を保存します。
//----------------------------------------------------------------------------------
//IO setting for Multifunction module
//----------------------------------------------------------------------------------
void IOSimpleSPI(MCUGear *mcugear){
    uint8_t fio[12];
    mcugear->detect_module(fio);//指定したモジュールがベースボードのどこに接続されているかを探してきます
    
    //miso(PTD3),mosi(PTD2),sck(PTD1),cs(PTD0)
    mcugear->savePinSetting(0, IO_MBED_PTD3, IO_REG_IN_DIR, fio[0]);//モジュールの0番端子にMISO:IN
    mcugear->savePinSetting(1, IO_MBED_PTD2, IO_REG_OUT_DIR, fio[1]);//モジュールの1番端子にMOSI:OUT
    mcugear->savePinSetting(2, IO_MBED_PTD1, IO_REG_OUT_DIR, fio[2]);//モジュールの2番端子にSCK:OUT
    mcugear->savePinSetting(3, IO_MBED_PTD0, IO_REG_OUT_DIR, fio[3]);//モジュールの3番端子にCS:OUT

#ifdef BOOST_MODE
    mcugear->makeCircuit();//これは再構築をショートカットするためにベースボードに配線情報を保存する関数です。
//速度を上げたいときに使えますが、自動的に行われるのでモジュールの積層方法によってタイミングがずれます。
#endif
}

0 件のコメント:

コメントを投稿