PICマイコン(PIC16F1827)でコンパレータを実装する

組み込みエンジニア

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

PIC16F1827はコンパレータ機能を持っており基準電圧に対して入力電圧が高いか低いかを判断した結果を出力することができます。MCCでCMP実装し基準電圧にFVRを使う方法とDACを使う方法の2通りの動作確認を行いました。

CMPを実装する

PIC16F1827のCMPの設定はMCCを使って行っています。MCCの使い方については下記記事にまとめています。

MPLAB Code Configurator(MCC)の追加と使い方

MCCを使用してCMP、FVR、DACの設定を行います。

System Moduleの設定

最初に共通事項であるSystem Moduleの設定を行います。MPLAB X IDEを起動しMCCのアイコンをクリックしてMCCを有効にします。

System Moduleの設定(MCC)
System Moduleの設定(MCC)

内部クロックを使用するためINTOSCを選択しています。クロック周波数は任意でもよいですが4MHz_Hzを選択しています。クロックを高速にするほど消費電流が増えてしまいます。他にも設定項目はありますがクロックの設定のみとしています。

CMP1を設定する

CMP1をDevice Resources内のPeripherals欄のCMP1を選択して追加します。

CMP1の設定(MCC)
CMP1の設定(MCC)

CMP1を選択しEnable Comparatorにチェックを入れます。Positive Inputは基準電圧になりますがFVRを選択します。Negative Inputに入力ピンを選択します。

Enable Synchoronous ModeはTimer1と同期をとるかの選択ですが、Timer1を使用しないのでチェックする必要はありません。Enable Comparator Hysteresisは閾値付近で頻繁に動作しないようにヒステリシス特性を持たせるかの選択です。ヒステリシス特性はデータシートによると65mVほどです。

Enable output Pinはコンパレータで判断した結果を出力ピンから出力するかの選択です。内部で保持して判断する場合は必要ありません。

CMP2を設定する

CMP2をDevice Resources内のPeripherals欄のCMP2を選択して追加します。

CMP2の設定(MCC)
CMP2の設定(MCC)

CMP2もCMP1と同様に設定しますが、Positive InputをDACとします。DACの出力電圧制御するレジスタであるDACCON1を変更することでヒステリシス特性の拡張を行います。レジスタ値の変更はMCCが生成した関数を使用します。ヒステリック特性の考え方で説明しています。

FVRを設定する

FVRはDevice Resources内のPeripherals欄のFVRを選択しFVRをクリックして追加します。

FVRの設定(MCC)
FVRの設定(MCC)

CMPの基準電圧はFVR_buffer2に割り当たられているのでFVR_buffer2 Gainで基準電圧を設定します。1xを選択すると1.024V、2xを選択すると2.048V、4xを選択すると4.096Vになります。

FVR_buffer1はADCの電源電圧に割り当たられていますが使用しないためOFFにしています。

DACの設定をする

DACはDevice Resources内のPeripherals欄のDACを選択しDACをクリックして追加します。

DACの設定(MCC)
DACの設定(MCC)

DACはPositive Referenceで選択した電圧を32段階で出力できる機能です。5ビットで値を制御します。DACCON1レジスタの値を変更することで出力電圧を変更することができます。電源電圧が5VのときDACCON1レジスタを0x10にすると出力電圧が2.5Vになります。

コンパレータで照度センサーの結果を判断する

下記記事ではAD変換の結果が任意の値を下回った場合にLEDを点灯させるかの判断を行っています。

PICマイコン(PIC16F1827)でAD変換を実装する

明るいか暗いかの2値での判断の場合はAD変換値を判断するソフトを組み込まなくてもコンパレータを使用することで同様の動作が実現できます。

照度センサーの使い方
照度センサーの使い方

照度センサは新日本無線のNJL7302-F5を使用しています。照度センサを飽和領域で使用するとVCEが0.6V程度になります。

照度センサのデータシートを確認するとコレクタの電源がVceと表記されています。エミッタコレクタ間の飽和電圧と同じなので間違えてしまいそうですが、コレクタに接続しているのはプラス電源なのでDC5.0Vになります。

Vceが5.0Vになる点から流したいIL(uA)の点までを線で結んだ時のEvとの交点が飽和電圧もしくはアナログ領域での値になります。Ev=20luxで飽和領域となるようにILが30uA程度とすることでほぼ2値で判定するように使用します。

電流を絞ると抵抗が大きくなり電圧変化が大きくなり照度を細かく判定できないためほぼONかOFFかの2値での判断になります。一方抵抗を小さくすると消費電流が増えますが電圧の変化量が少なくなるため照度を比較して処理を変えるような使い方ができます。

AD変換値で判断する場合は電圧値によって処理を複数に分けることができますが、コンパレータは基準電圧対して電圧が高いか低いかの2値での判断となります。このように用途に応じて使い分けることができます。

MCCでCMP1とFVRの設定を行いPin Managerでピン割り付けを行うとソフト開発を行わなくても動作の確認ができます。周辺回路は動作確認の回路図を参考にしてください。

ヒステリック特性の考え方

CMPにはヒステリシス特性を持たせることができますがヒステリシス特性を拡張して一度ON動作したら一定電圧まで下がらないとOFFしないようにします。また一度OFFしても一定電圧を超えないとONしないようにすることを考えます。

ヒステリック特性の説明
ヒステリック特性の説明

ヒステリシス特性を拡張するためにDACによる電源を基準電圧で使用します。DACは電源電圧を5ビット(32分周)しながら電圧調整して出力する機能です。DACをコンパレータの基準電圧に指定することでヒステリシス特性の拡張を行います。

#define DW_DACR 0x0D //基準電圧が下がる(VDD=5Vであれば2.0V)
#define UP_DACR 0x13  //基準電圧が上がる(VDD=5Vであれば3.0V)

if( CMP2_GetOutputStatus() ){
    //VTL以下の時
    if( cmpflg == false ){
        cmpflg = true;
        DAC_SetOutput(UP_DACR); //DAC出力電圧の変更(VTHを上げる)
    }
}
else{
    //VTH以上の時
    if( cmpflg ){
        cmpflg = false;
        DAC_SetOutput(DW_DACR); //DAC出力電圧の変更(VTLを下げる)
    }
}

入力電圧がVTH以上になると基準電圧を下げることで入力電圧がVTH下回ってもVTL以下にならない限りHレベルを維持します。

入力電圧がVTL以下になると基準電圧を上げることで入力電圧がVTLを超えてもVTH以上にならない限りLレベルを維持します。

頻繁に出力が切り替わるとソフト内の処理に影響が出ることもあるので誤動作防止のためコンパレータにヒステリシス特性を持たせるのが一般的です。

PIC16F1287に実装されているヒステリック特性でも十分だと思いますが、ノイズの影響などで入力電圧の変化が大きく場合に有効な方法ですが外来ノイズが大きい場合は周辺回路で対策する方が良いでしょう。

動作確認

PIC16F1827のコンパレータ入力ピンにNJL7302-F5及び可変抵抗を接続してコンパレータの結果を出力してLEDを点灯/消灯します。

動作確認用の回路

PIC16F1827のCMPの動作確認回路
PIC16F1827のCMPの動作確認回路

可変抵抗VR2を変化させるとCMP2が動作してLED1が点灯/消灯します。CMP2はヒステリック特性の拡張を行うため基準電圧をDACにしています。

VR1は照度センサーの動作調整用ですが、特に調整をせず100kΩ程度で固定しています。照度センサー(SN1)に手をかざして暗くするとLED2が点灯します。明るくなるとLED2が消灯します。ピン設定は以下の通りです。

PIC16F1827のピン設定(MCC)
PIC16F1827のピン設定(MCC)

動作結果

VR2を変化させてコンパレータ入力電圧を実測したとき2.83Vになった時にLED1が点灯し1.91Vになった時にLED1が消灯していたためヒステリシス特性の拡張ができていることが分かりました。

照度センサーについては照度が測定できないため手をかざして照度を落とすとLDE2が点灯することが確認できています。手を離すと照度があがりLDE2が消灯することが確認できました。

ソースコード全体

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

#include "mcc_generated_files/mcc.h"

#define DW_DACR 0x0D
#define UP_DACR 0x13

bool cmpflg = false;

/* Main application */
void main(void)
{
    SYSTEM_Initialize();

    while (1)
    {   
        if( CMP2_GetOutputStatus() ){
            //VTH以上の時
            if( cmpflg ){
                cmpflg = false;
                DAC_SetOutput(DW_DACR);
            }
        }
        else{
            //VTL以下の時
            if( cmpflg == false ){
                cmpflg = true;
                DAC_SetOutput(UP_DACR);
            }
        }
    }
}
/**
 End of File
*/

本ソースコードはMPLAB X IDEにMCCのプラグインをインストールしていないと使用できません。

関連リンク

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

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

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

あなたの市場価値を見いだす転職サイト【ミイダス】無料会員登録

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

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