A/Dコンバータ MCP3208(SPI)を利用しA/D変換を行う

〔マイコン使用による電子部品の使い方に戻る〕


 通常のマイコンにはA/D変換機能が内蔵されています、ですのでそれを利用すれば良いのですが。
分解能が10ビット(0-1023)が殆どです、このMCP3208は12ビット(0-4095)で8チャンネル入力可能です
分解能を上げたい時や入力チャンネルを増やしたい時又は、差動入力を行いたい時に利用すれば 良いでしょう。

MCP3208のピン構成図  この図はデータシートからの拝借ですが、SPIで接続します。
 SPIの通信速度は2MHzまで、電源は2.7V-5.5V操作です。
 (2.7Vで動作させる場合は、通信速度は1MHz)

 AGND:アナログ側のグランドです
 DGND:デジタル側のグランドです

CS/SHDN:LOWで通信開始ですが、HIGHになると低電力スタンバイモードに移行します。

《制御ビットの詳細》

この様に5ビットで制御します。
開始 SGL/
DIFF
D2 D1 D0
開始    :開始ビットで"1"固定
SGL/DIFF :1=シングルエンド 0=差動入力モード
D2-D0   :読み込むチャンネルを3ビットで指定 CH0[000]-CH7[111]
       (但し、差動入力モードの説明はデータシートを参照下さい)

実際に送信する場合は?

送受信データ
xは"0"でも"1"でもお好きな方で、?は"0"or"1"何方か不明、見ないデータです。

この様に3バイト送信し、受信データからB0-B11を取り出せば読み出せます。
チャンネル1から読み出すなら 0b00000110 0b01000000 0b00000000 とします。
尚、MCP3208は"D0"を受信してから1.5クロックの間にA/D変換を行う見たいです。

《配線図》

配線図
 左が実態配線図です。

 電源は5Vで動作させています。
 MCP3208の右上がピン番号1番です。
 半固定抵抗は"CH0"に入力しています。

 SPIのSS(CS)信号は、デジタル10番ピンを
 使用しています。

 実際に組込む場合は、
 AGND/DGNDは離す等の回路の分離を行ったり、
 バイパスコンデンサ(推奨値は1uF)を取付けて
 下さい。

 下記スケッチを実行させると
 3秒後に開始し、1秒毎にアナログ値を読出し
 ArduinoIDEのシリアルモニターに表示します。

《スケッチ》

IDEに下記のスケッチプログラムをコピーペーストして貼り付けて下さい。
IDEツールバーの「Upload」ボタンをクリックしてコンパイルとarduinoボードに書込みを行います。
---------------------------------------------------------------------
#include <SPI.h>

#define MCP3208_CS 10

void setup()
{
     // シリアルモニターの設定
     Serial.begin(9600) ;
     // SPIの初期化
     SPI.begin() ;                           // SPIを行う為の初期化
     SPI.setBitOrder(MSBFIRST) ;             // ビットオーダー
     SPI.setDataMode(SPI_MODE1) ;            // CLK極性 0(idle=LOW) CLK位相 1(LOW > HIGH)
     SPI.setClockDivider(SPI_CLOCK_DIV8) ;   // SPI通信クロック(CLK)は2MHz

     delay(3000) ;                           // 3Sしたら開始
}
void loop()
{
     int dt ;

     // MCP3208のCH0からアナログ値を読み込む
     dt = ADC_analogRead(MCP3208_CS,0) ;
     Serial.print("Analog CH0=") ;
     Serial.println(dt) ;
     delay(1000) ;
}
// ADC_analogRead(ss,channel)   MCP3208からアナログ値を読み取る処理
//  ss      : SPIのSS(CS)ピン番号を指定する
//  channel : 読み取るチャンネルを指定する(0-7ch)
int ADC_analogRead(int ss,int channel)
{
     static char f ;
     int d1 , d2 ;

     // 指定されたSSピンを出力に設定する(但し最初コールの1回のみ)
     if (f != 1) {
          pinMode(ss,OUTPUT) ;
          digitalWrite(ss,HIGH) ;
          f = 1 ;
          delay(1) ;
     }
     // ADCから指定チャンネルのデータを読み出す
     digitalWrite(ss,LOW) ;              // SS(CS)ラインをLOWにする
     d1 = SPI.transfer( 0x06 | (channel >> 2) ) ;
     d1 = SPI.transfer( channel << 6 ) ;
     d2 = SPI.transfer(0x00) ;
     digitalWrite(ss,HIGH) ;             // SS(CS)ラインをHIGHにする

     return (d1 & 0x0F)*256 + d2 ;
}
---------------------------------------------------------------------
ADC_analogRead( )関数について

ans = ADC_analogRead(ss,channel)
  MCP3208からアナログ値を読み取る処理を行います。
  ss    :MCP3208のSS(CS)に接続しているピンを指定します
        このピンは"pinMode(ss,OUTPUT);"を宣言しなくてもOKです。
  channel :読み出すアナログ値のチャンネル番号(0-7ch)を指定します
  ans   :読み出したアナログ値を返します(0-4095)


※ マスター(Arduino/PIC)にMCP3208や他のSPIデバイスを複数個接続した場合の話や、
  PICでMCP3208にアクセスする方法などは、こちらのページに記述しているので合わせて読んで
  置きましょう。

※ ADS1015はI2Cで接続しますが、このA/Dコンバータについてはこちらのページを見て下さい。




【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.