PICマイコン/MCP3204/3208を使う

MCP3204/3208は秋月電子で入手可能な4ch/8chの12bitのA/Dコンバータです。I/FはSPI*1となっており、PICマイコンとは相性がよく使いやすいです。また、A/D速度も100kspsと比較的高速です。チャンネル数が少ないMCP3201/3202もあります。
ここではPIC16F88を使用します。内部クロック8MHzで動作させて、MCP3204/3208の最高通信速度でフルサンプリングを行なってみたいと思います。SPIインターフェイス自体の使用方法は、他のPICでも変わらないのでそのまま動作すると思います。

目次

MCP3204/3208とは

PICマイコンと同じマイクロチップ社製のA/Dコンバータです。主な仕様は下表のようになっています。

主な仕様
パラメータ 記号 MIN TYP MAX 単位 条件
変換時間 tCONV 12 clock cycles
アナログ入力サンプル時間 tSAMPLE 1.5 clock cycles
スループット速度 fSAMPLE 100 ksps VDD=VREF=5V
スループット速度 fSAMPLE 50 ksps VDD=VREF=2.7V
分解能 12 bits
クロック周波数 fCLK 2.0 MHz VDD=5V
クロック周波数 fCLK 1.0 MHz VDD=2.7V

回路図

テスト用の回路としてこのような回路を使用しました。回路図は水魚堂のBSch3Vを使用しています。コンデンサはパスコンです。可変抵抗はA/Dの入力ソースとして使用しています。PICのリセット端子は使用しない設定にするのでリセット回路は不要です。

応用する場合は適宜変更してください。

動作速度

PIC内蔵のSPIインターフェイスを使用する場合、クロック周波数は駆動クロックFoscの1/4、1/16、1/64、TMR2/2の4種類から選択することになります。TMR2の出力はFosc/4が基準になっていますので、最速でもFosc/8の速度となります。

ADコンバータを最高速度の2MHzで使用するためのPIC動作クロックを逆算すると、

  1. 2MHz * 4 = 8MHz (FOSC/4)
  2. 2MHz * 8 = 16MHz (TMR2/2)
  3. 2MHz * 16 = 32MHz (NG)

妥当な動作周波数は、(1)(2)。TMR2リソースを温存する場合は(1)となります。(1)とすると丁度内蔵発振でカバーできる周波数で色々と都合がいいです。

一方で、ここまで動作クロックと通信クロックが近いと送受信割込を使った場合にコンテキストの保存&復帰に占める時間が問題になってきます。せっかく最高速度の2MHzを使用しても無駄になってしまいます。

割込を使わないでPIR1レジスタのSSPIFビットを監視するのも手ですが、ここでは通信クロックと動作クロックが同期していることを利用してSSPIFを監視せずにベタ書きします。SSPBUFレジスタに書き込んでから送受信が完了するまでの時間が決まっていますので、その間に別処理を行なうことも可能です。

下記はC言語を使用した例です。nop();はNOP命令に置き換えられます。CS_signがCS信号ピンに対応します。AD変換結果をADhighとADlowレジスタに取り込んでいます。余分を見てnop()を9個にしていますがsspbufへの代入も考えると8個で十分でしょう。C言語の場合は変数がどのバンクに置かれるかでも変わってきますので、実際の動作を確認しながら調整すると良いと思います。

{
    CS_sign = 0;
    sspbuf = 0x06;
    nop();  nop();  nop();  nop();  nop();  nop();  nop();  nop();  nop();
    sspbuf = 0x00;
    nop();  nop();  nop();  nop();  nop();  nop();  nop();  nop();  nop();
    ADhigh = sspbuf & 0x1f;
    sspbuf = 0x00;
    nop();  nop();  nop();  nop();  nop();  nop();  nop();  nop();  nop();
    ADlow  = sspbuf;
    CS_sign = 1;
}

初期化サンプル

参考までにSPIの初期化サンプルを置いておきます。

void SPI_initialize(void)
{
/*
              +--------- SMP   Sample Bit
              |+-------- CKE   Clock Edge
              ||     +-- BF    Buffer Full status bit
              ||     |
*/
    sspstat = 11000000b;
//  sspstat = 00000000b;
/*
              +--------- WCOL  Write collision bit
              |+-------- SSPOV Receive overflow bit
              ||+------- SSPEN SSP enable
              |||+------ CKP   Clock pole
              ||||
              ||||++++-- SSPM  SSP mode select
              ||||||||         (SPI Master, Fosc/4)
*/  
    sspcon =  00110000b;
//  sspcon =  00100000b;
    
    clear_bit(trisb, 4);        // SCK  for output
    clear_bit(trisb, 2);        // SDO  for output
    set_bit(trisb, 1);          // SDI  for input
    clear_bit(trisb, 3);        // CS   for output
    
    clear_bit(pir1, SSPIF);     // intr flag clear
    clear_bit(pie1, SSPIE);     // intr disable
    CS_sign = 1;
}

補足・資料・リンク


2005/08/18 komina
*1Serial Peripheral Interface。SDI、SDO、SCKおよびCSにて通信を行なう。