2013年10月30日水曜日

Raspberry Pi でAD 12bit 8ch モジュールを使ってみる

Raspberry Pi でAD 12bit 2ch モジュールを使用してみます。
その際のサンプルプログラムについて説明します。
C言語はwiringpiを使います。


#include "common.h"

#include "MCUGear.h"
#include "MCUGearBase.h"
#include <wiringPi.h>
#include <wiringPiI2C.h>
#include <wiringPiSPI.h>
#include <stdio.h>

int read12bit8chAD(MCUGear *mcugear, int spichan, char ch);
void IOSimpleSPI(MCUGear *mcugear);

int main(void){

int spiSpeed = 1000000; //1MHz
int spiChan = 0; //CE0

int data[8];

if(wiringPiSetup() == -1)//wiringpiのセットアップ
return 1;

if(wiringPiSPISetup(spiChan, spiSpeed)== -1) //set CE0 and 1MHz//SPIのセットアップ
return 1;

pinMode(pin, OUTPUT);
pinMode(sw, INPUT);
pinMode(outpin[0], OUTPUT);
pinMode(outpin[1], OUTPUT);
pinMode(outpin[2], OUTPUT);
pinMode(outpin[3], OUTPUT);
pinMode(outpin[4], OUTPUT);
pinMode(outpin[5], OUTPUT);

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

MCUGear AD8chM = MCUGear(N_SDA_SDA_SDA, 4); 
        //モジュール基板の裏に設定したアドレスとSPIバス 4ピン
        //任意名称「AD8chM 」という名前でモジュールを定義しています

   //Set IO --------------------------
    IOSimpleSPI(&AD8chM);
   //GPIOのどの端子をモジュールをどの端子に当てはめるかを定義する
   //---------------------------------------------------------------------
    
while(1){

//8ch AD module AD8chM.connectModule(); //connect--- //GPIOからモジュールまで配線を再構築 data[0] = read12bit8chAD(&AD8chM ,spiChan ,0);//AD0chをAD変換 data[1] = read12bit8chAD(&AD8chM ,spiChan ,1);//AD1chをAD変換 data[2] = read12bit8chAD(&AD8chM ,spiChan ,2); data[3] = read12bit8chAD(&AD8chM ,spiChan ,3); data[4] = read12bit8chAD(&AD8chM ,spiChan ,4); data[5] = read12bit8chAD(&AD8chM ,spiChan ,5); data[6] = read12bit8chAD(&AD8chM ,spiChan ,6); data[7] = read12bit8chAD(&AD8chM ,spiChan ,7); AD8chM.disconnectModule(); //disconnect---//GPIOからモジュールまで配線を切断 printf("AD0 = %d, AD1 = %d, AD2 = %d, AD3 = %d, AD4 = %d, AD5 = %d, AD6 = %d, AD7 = %d\n",data[0], data[1],data[2], data[3],data[4], data[5],data[6], data[7]);//ターミナルに表示

}

return 0;
}


void IOSimpleSPI(MCUGear *mcugear){


    unsigned char fio[12];

    // detect
    mcugear->detect_module(fio);//モジュールの取り付け位置を把握
    delay(100);
    printf("fio[0] = %d",fio[0]);
//1:MISO 13
//2:MOSI 12
//3:SCK  14
//4:CE0  10   
    
    mcugear->savePinSetting(0, IO_13, IO_REG_IN_DIR, fio[0]);//input モジュールの0番端子にMISOを割り当てる
    mcugear->savePinSetting(1, IO_12, IO_REG_OUT_DIR, fio[1]);//output モジュールの1番にMOSIを割り当てる
    mcugear->savePinSetting(2, IO_14, IO_REG_OUT_DIR, fio[2]);//output モジュールの2番にSCKを割り当てる
    mcugear->savePinSetting(3, IO_10, IO_REG_OUT_DIR, fio[3]);//output モジュールの3番にCE0を割り当てる

#ifdef BOOST_MODE
    mcugear->makeCircuit();//追々説明します
#endif

}


//MCP3204とのSPI通信 通常配線したデジタル回路として扱います

int read12bit8chAD(MCUGear *mcugear, int spichan,char ch){

int value = 0;
unsigned char spiBuff[3];

if(ch < 8){
spiBuff[0] = 0x18 + ch;
spiBuff[0] = (spiBuff[0] << 2);
spiBuff[1] = 0;
spiBuff[2] = 0;
 
}else{
return -1;
}

wiringPiSPIDataRW(spichan,spiBuff,3);
value = spiBuff[1] << 8;
value = spiBuff[2] + value;
value = value >> 4;

return value;
}


0 件のコメント:

コメントを投稿