LoginSignup
0
0

More than 1 year has passed since last update.

PC-G850VS / ミニI/OにADコンバーターMCP3008を接続する

Last updated at Posted at 2018-07-06

概要

PC-G850VSの11ピンコネクターをミニI/Oとして使って、そこに8チャンネル10ビットのADコンバーターMCP3008を外づけしてみる。

MCP3008は、既製のSPIライブラリで制御することがほとんどだと思うが、ここでは制御プログラムを独自に実装する。といってもたいそうなものでは全然なく、データシートのタイミングチャートどおりに3ビットパラレルのディジタル信号を36個順番にADコンバーターに送り込むだけである。あとはADコンバーターからビット[9]~[0]の順番で返ってくる10ビットAD変換値を読み取ればよい。

タイミング表

MCP3004/3008データシート, FIGURE 5-1, p.20をExcelで整理し直した。

入力チャンネルに応じて黄色列の値を上から順番にminiput()函数の引数としてPC-G850VSのミニI/OからADコンバーターへ送り込む。これで1サンプルが取得できる。Excelファイルはここ
image.png

実験回路

下の回路で試してみる。チャンネル[0]~[3]に印加された電圧をそれぞれAD変換する。

ソースコード

MCP3008.c
unsigned int read(unsigned char CH){
    unsigned char mosi[36] = {3,4,6,4,6,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,0,2,1};
    unsigned char ch[8][6] =          {{0,2,0,2,0,2},  /*CH0*/
                                       {0,2,0,2,4,6},  /*CH1*/
                                       {0,2,4,6,0,2},  /*CH2*/
                                       {0,2,4,6,4,6},  /*CH3*/
                                       {4,6,0,2,0,2},  /*CH4*/
                                       {4,6,0,2,4,6},  /*CH5*/
                                       {4,6,4,6,0,2},  /*CH6*/
                                       {4,6,4,6,4,6}}; /*CH7*/

    unsigned char miso[10];
    unsigned char i, k;
    unsigned int sum;

    /* Some bits of the digital data which are to be transferred to ADC are replaced according to the input channel you specify.*/
    for(i=0; i<6; i++){
        mosi[i+5] = ch[CH][i];
    }

    /*The thirty-six of 3-bit digital data are transferred to ADC, and then the ADC will output each bit of a 10-bit digital code one at a time.*/
    k = 9;
    for(i=0; i<36; i++){
        miniput(mosi[i]);
        if((i>=16) && (i%2==0)){
            miso[k] = miniget();
            k--;
        }
    }

    /*Some shifting operations can generate a 10-bit digital code.*/
    sum = 0;
    for(i=0; i<10; i++){
        sum |= miso[i]<<i;
    }

    return sum;
}

main(){
    unsigned int i; /*For PC-G850VS, a busy wait does not need a "volatile" qualifier.*/
    while(1){
        printf("%4d, %4d, %4d, %4d\n", read(0), read(1), read(2), read(3));
        for(i=0; i<500; i++){} /*busy wait*/
    }
}

実行結果

4チャンネルの変換結果をロジアナで連続して観測したところ:
screenshot.png

参考

関連

追記: ループを全部開いて少しだけ速くした

(2019/09/06) https://ti-nspire.hatenablog.com/entry/2019/09/06/120035

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0