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動作クロックを逆算すると、
- 2MHz * 4 = 8MHz (FOSC/4)
- 2MHz * 8 = 16MHz (TMR2/2)
- 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;
}
補足・資料・リンク
- データシート、アプリケーションノートなど(PDF)