PICマイコン(PIC12F675)のコンパレータの使い方

組み込みエンジニア

こんにちは、ENGかぴです。

マイコンのソフト開発しているとコンパレータを使うことがあります。コンパレータは基準の電圧に対して入力を比較して1か0かで動きを判断するときに使います。コンパレータの使い方についてPIC12F675を使って説明しています。

応用としてコンパレータにヒステリシス特性を拡張する方法をまとめています。

PICマイコン(PIC12F675)のコンパレータとヒステリシス特性

PIC12F675を使ってマイコンの動きを勉強するためにPIC12F675の機能でできることについてまとめています。

PICマイコン(PIC12F675)で実現できる機能と解説リンクまとめ

PICマイコン(PIC12F675)のコンパレータ

コンパレータは比較する機能という意味です。自分の設定した基準の値と比較して入力電圧が超えていればビットをセットし、低ければビットをクリアするなど用途によって使い分けることができます。

コンパレータの動き方

コンパレータの説明
コンパレータの説明

コンパレータはプラス端子とマイナス端子のアナログ入力電圧を比較して基準とした電圧よりも高くなったか、低くなったかを検出できるものです。コンパレータの出力については論理を反転させることもでき用途に応じて使い分けることができます。

コンパレータの比較電源の構成

引用:PIC12F675のデータシート(リファレンス電圧)
引用:PIC12F675のデータシート(リファレンス電圧)
引用:PIC12F675のデータシート(リファレンス電圧の設定)
引用:PIC12F675のデータシート(リファレンス電圧の設定)

PIC12F675ではコンパレータ用にリファレンス電圧を作ることができます。マイコン内部のRを選択することで様々なリファレンス電圧を生成します。生成できるリファレンス電圧はVRCONレジスタのビット設定で決まります。

VRCONレジスタのVRRが1か0でlow rangeとhigh rangeの式を使い分けます。VRRビットが1の場合は0~(15/24)×VDDまでの範囲でVDD/24ごとに変更できます。VRRビットが0の場合はVDD/4~VDD/4+(15/32)×VDDまでの範囲でVDD/32ごとに変更できます。

VR3-VR0を変更した後は応答時間(Setting Time)があるため約10usの待ち時間が必要です。また、コンパレータに入力するアナログ入力について入力電圧がVDD-1.5V以内にしておく必要がありので、外部回路で調整する必要があります。

PICマイコン(PIC12F675)の初期化

PICマイコンを使用するためにはマイコンをどのような機能で使用するのかを選択する初期化を行う必要があります。コンパレータを使用するまでの初期化について説明していきます。

共通部分の初期化

Configuration BitやWDTの設定については下記記事を参考にしてください。

PICマイコン(PIC12F675)を使ってWDTの意味を考える

I/Oポートの設定

I/Oポートの設定はTRISIOレジスタで設定します。設定の仕方については下記記事を参考にしてください。

PICマイコン(PIC12F675)のI/Oポート設定と使い方

コンパレータとして使用するピンは入力にする必要があります。今回はGP1とGP3を入力とし、そのほかは出力として使用します。

コンパレータの初期化(CMCON)

コンパレータを使用するためにはCMCONレジスタの設定を行う必要があります。

引用:PIC12F675のデータシート(CMCONレジスタ)
引用:PIC12F675のデータシート(CMCONレジスタ)

bit2-0はコンパレータの入出力構成を選択します。今回はリファレンス電圧を使用して比較を行い比較の結果でLEDを点灯させたいので0b011をセットします。

引用:PIC12F675のデータシート(コンパレータの入出力)
引用:PIC12F675のデータシート(コンパレータの入出力)

bit3はbit2-bit0(CM2-CM0)が0b110または0b101のときの場合はVin-をCIN+ピンに接続する場合は1をセットしVin-ピンをCIN-ピンに接続する場合は0をセットします。

bit4はコンパレータの出力を反転する場合に1をセットし反転しない場合は0をセットします。

bit6はbit4(CINV)が0の場合、Vin+>Vin-ならば1になりVin+<Vin-ならば0になります。CINVが1の場合はこの逆の動きになります。

コンパレータの初期化(VRCON)

コンパレータのリファレンス電圧の設定はVRCONレジスタで行う必要があります。

引用:PIC12F675のデータシート(VRCONレジスタ)
引用:PIC12F675のデータシート(VRCONレジスタ)

bit3-0はbit5(VRR)が1か0かでレンジが変わります。発生するリファレンス電圧の式によって電圧が決まります。

bit5は出力電圧の範囲のレンジを選択します。1をセットするとローレンジとなり0をセットするとハイレンジになります。

bit7はリファレンス電圧を使用するかを選択します。1をセットすると使用し0をセットすると使用しません。

初期化部分を実装する

#include <xc.h>
//--------------定数定義----------------------------
#define _XTAL_FREQ	4000000

void main(void) {
    //各種初期化  
    ADCON0 = 0x00;  //ADコンバータ使用しない
    ANSEL = 0x00;   
    TRISIO = 0x0A;  //GP1,GP3入力、その他出力
    GPIO = 0x00;    //ポートの設定 1:High 0:Low
    OPTION_REG = 0x4F;  //プリスケーラ128 WDTで使用
    //コンパレータ
    CMCON = 0x03;   //コンパレータCiN-とリファレンス電圧を比較
    VRCON = 0xAC;   //リファレンス電圧ON、VRR=1 Vcc/2
    __delay_us(20); //設定待ち

コンパレータとして使用した場合該当するI/Oピンはアナログ入力端子になります。TRISIOレジスタも対応するGPIOピンを入力にしておく必要があります。

リファレンス電圧の設定をした後は電源が安定するまで約10usかかるので余裕をもって20usウェイトを置いています。

コンパレータを実装する

コンパレータを使用して電圧の可変を検出してLEDを点灯/消灯する回路を考えます。

コンパレータ動作確認の回路図

コンパレータ動作確認の回路図
コンパレータ動作確認の回路図

可変抵抗VR1を可変していきリファレンス電圧を2.5Vにしているので2.5Vを上回っているときはVIN+<VIN-となるのでCOUTが0になりLED1が点灯します。2.5Vを下回るとCOUTが1になりLED1が消灯します。

コンパレータの処理を実装する

    while(1){
        CLRWDT();
        
        if( COUT == 1){
            //リファレンス電圧よりも低い時の処理
        }
        else{
            //リファレンス電圧よりも高い時の処理
        }
    }

今回はコンパレータによる処理の切り分けはPICマイコンによってCOUTの出力を切り替えるため特に処理はありません。COUTを確認してリファレンス電圧よりも高い場合と低い場合の処理を切り替える処理を入れると良いでしょう。

コンパレータは比較する電圧付近では動作が安定しない(入力がチャタリングする)ことがあります。これを防ぐためにはヒステリシス特性を持たせることが必要です。

本記事の応用としてコンパレータにヒステリシス特性を持たせる方法を下記記事にまとめています。

PICマイコン(PIC12F675)のコンパレータとヒステリシス特性

ソースコード全体

以下のソースコードはコンパイルして動作確認をしております。チェックはしておりますがコメントなど細かな部分で間違っている可能性があります。参考としてお使いいただければと思います。

// CONFIG
#pragma config FOSC = INTRCIO
#pragma config WDTE = ON 
#pragma config PWRTE = OFF
#pragma config MCLRE = OFF 
#pragma config BOREN = OFF 
#pragma config CP = OFF     
#pragma config CPD = OFF  

#include <xc.h>
//--------------定数定義----------------------------
#define _XTAL_FREQ	4000000

void main(void) {
    //各種初期化  
    ADCON0 = 0x00;  //ADコンバータ使用しない
    ANSEL = 0x00;   
    TRISIO = 0x0A;  //GP1,GP3入力、その他出力
    GPIO = 0x00;    //ポートの設定 1:High 0:Low
    OPTION_REG = 0x4F;  //プリスケーラ128 WDTで使用
    //コンパレータ
    CMCON = 0x03;   //コンパレータCiN-とリファレンス電圧を比較
    VRCON = 0xAC;   //リファレンス電圧ON、VRR=1 Vcc/2
    __delay_us(20); //設定待ち
    
    while(1){
        CLRWDT();
        
        if( COUT == 1){
            //リファレンス電圧よりも低い時の処理
        }
        else{
            //リファレンス電圧よりも高い時の処理
        }
    }
}
//---------------------end file----------------------------

関連リンク

PICマイコンを使ってマイコンのレジスタの設定やMPLAB X IDEのプラグインであるMCCを使用して動作確認したことについてまとめています。

PICマイコン(PIC12F675)で実現できる機能と解説リンクまとめ

PICマイコン(PIC16F1827)で実現できる機能と解説リンクまとめ

RUNTEQ-プログラミングで自由を手に入れる

最後まで、読んでいただきありがとうございました。

タイトルとURLをコピーしました