2013年10月24日木曜日

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

FRDM-KL25Z でAD 12bit 2chモジュールを使う場合の説明です。
取得したアナログデータは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を有効にする

Serial pc(USBTX, USBRX); // tx, rx Set BaudRate = 115200 in main()
//Initialize modules-----------------------------------------------------------------------
MCUGear AD12M(PTE0, PTE1, N_SCL_SCL_VSS,4);       //AD(MCP3202) 12bit Module : Set number of module pin 

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

//Sample setting-----------------------------------------------------------------------
SPI spi(PTD2,PTD3,PTD1); // mosi, miso, sclk
DigitalOut cs(PTD0); //for SPI communications

void IOSimpleSPI(MCUGear *mcugear);             //IO setting for Simple SPI module
int read12bitAD(MCUGear *mcugear, char ch);     //simple ADC 


//***************************************************************************************
int main() {

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

   //Set IO --------------------------------------------------------------
    IOSimpleSPI(&AD12M);
   //IOの配線情報を保存しmbedのどの端子をモジュールのどの端子に当てはめるかを決めます
   //---------------------------------------------------------------------
   wait(1);
   
    int data1[2];
    
    while(1) {
       //12bit AD Mobdule-------------------------------------------------

       cs = 1; //reset CS pin
       AD12M.connectModule();   //connect---//配線情報を基にモジュールとマイコン端子との配線を再構築します
       data1[0] = read12bitAD(&AD12M, 0);//AD 0chの値を取得します
       data1[1] = read12bitAD(&AD12M, 1);//AD 1chの値を取得します
       AD12M.disconnectModule();   //disconnect---//マイコンとモジュールの配線を切断します
       

       //12bit 2ch AD
       pc.printf("0ch%d, 1ch%d,  ",data1[0],data1[1]);//PCに送ります
       pc.printf("\r\n");


    }    
}


//モジュールに搭載されているMCP3202のデバイスを動かすための関数です
//Sample functions
//----------------------------------------------------------------------------------
//Simple read 12bit 2ch AD module
//----------------------------------------------------------------------------------
int read12bitAD(MCUGear *mcugear, char ch){

    char sendData;
    int whoami[3];
   

    spi.frequency(2000000); //1MHz for KL25Z
    if(ch == 0){
        sendData = 0x80;
    }else if(ch == 1){
        sendData = 0xC0;
    }else{
        return -1;
    }
    
    //12bit AD Mobdule----------------
 //   cs = 1; //reset CS pin
 //   mcugear->connectModule();   //connect---
    
    cs = 0; 
    //FRDM KL25Z is 8-bit format.
    whoami[2] = spi.write(0x01);//0000 0001
    whoami[2] = spi.write(sendData);
    whoami[0] = whoami[2]<<8;
    whoami[0] = whoami[0] + spi.write(0x00) - 0xE000;//0000 0000
//    whoami[2] = 0;//clear buffer
    cs = 1;
 //   mcugear->disconnectModule();   //disconnect---
    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 件のコメント:

コメントを投稿