前回はZCD(ゼロクロス検出器)で割り込みかけてみました。今回はアナログ入力電圧2つを比較する内蔵コンパレータを使ってみます。なにか基準電圧を上回ったら信号を出力したりできるもの。結果で割り込むことも可能ですが、直接外部出力信号とすることも可能。外付けオペアンプなど不要で済むのはありがたいかも。
※『PIC三昧』PIC関係の記事総目次はこちら
PIC16F18855のデータシートの?な点
手元のデータシートはDS40001802Dという番号のデータシートなのですが、そのコンパレータのところに1点よくわからぬ表があり。以下引用させていただきます。
上記をみるとコンパレータは5個搭載しているように見えるのですが、他の文書、そしてMPLAB X IDEのMCCから見えるリソースは2個だけであります。2個のところに黄色でマーカを引いたのは私です。手元の文書が古いの?
MCC Classicを使ってコンフィギュレーション
さてMicroChip社MPLAB X IDEの誇る自動コンフィギュレーションツールMCC(いつものようにClassic版)を使ってPIC16F18855搭載の(アナログ)コンパレータを使用するためには、Device Resourcesから対象リソースをProject Resourcesへ取り込む必要があります。コンパレータのところを開くとこんな感じ。
2個あるコンパレータのうち、CMP1の方を「+」してみた後、ピン・マネージャを眺めるとこんな感じでした。
CMP1の入力端子のうち+側の端子はPortAの2か3限定なのね。キビシー。今回使用しているEVAボードでは、PortAの0/1/2/3にはLEDが取り付けられており使用は避けたいデス。そこでCMP2に変更してみました。
CMP2を「+」した後ピンマネージャを眺めれば以下の如し。+側の端子が一本PortBの0番端子にアサイン可能。‐側の端子もPortBの1番にアサイン可能であります。
上記のように入力は2端子ともボード上フリーで使えるPortBの0番1番にアサインしました。コンパレータ出力はというと上記のようにPortAの0番としてみました。PortAの0番にはEVAボードのLEDが接続されているので、アナログコンパレータ出力を直の信号としてLEDで観察することが可能であります。
ついでにPortAの3番を「いつものLチカ」用に確保。
コンパレータの設定が以下に。今回割り込みは用いないのでチェックしてません。出力は正相、ヒステリシスあり(データシートみるとティピカル25mV程度のヒステリシスとのことです。)
上記設定後、Generateボタンを押してソースを生成しました。
自動生成されたソースに書き込むのはLチカ部分のみ
自動生成ソースによりコンパレータのハードウエア設定が成され、後はハードが勝手に動作してくれるので、main()関数側で殊更に何かする必要はありません。それでは寂しいのでmain側でいつものLチカさせてます。コンパレータの動作とはまったく無関係にソフトでLチカを続けると。
void main(void) { SYSTEM_Initialize(); while (1) { RA3 = 0; __delay_ms(500); RA3 = 1; __delay_ms(2000); } }
実験用の回路
以下に実験に使った回路を掲げます。青の点線内がEVAボード搭載部分のうち今回関係する部分です。点線の外側が外付け部品でブレッドボード上に構成した部分です。
実験結果
まず端子RB1(コンパレータのマイナス側端子)に接続している抵抗分割で作った「参照電圧」の測定値が以下に。電源電圧3.3Vのほぼ2分の1の電圧が予定どおりに観察できてます。
つづいて、RB0に接続した可変抵抗から出力される電圧の読み値[V]です。以下の状態は可変抵抗を操作してコンパレータ出力のLEDが非点灯状態のほぼほぼ最大値っす。
つづいて、可変抵抗を操作してコンパレータ出力のLEDが点灯する最小値ギリギリの値です。こんな感じ。
だいたい1.6Vならコンパレータ出力OFF、1.7Vならコンパレータ出力ONっていう感じね。
今回はコンパレータの入力も出力も外部直接だったけれど、内部で接続できるものもいろいろあるのよ。そいつらはまた次回以降だな。