PIC三昧(7) Zero-Cross Detection(ZCD)、PIC16F18855

Joseph Halfmoon

前回は小規模なデジタル・ロジックを構築できるCLC機能でした。今回はアナログです、といっても軽いアナログ。ゼロ(グランド)通過を検出するゼロクロス検出機能です。マイコンでは時々必要になるんじゃないかと思います。それこそ商用電源をゼロクロスすれば、50Hz(あるいは60Hz)のタイミングが取り出せるっと。

※『PIC三昧』PIC関係の記事総目次はこちら

※今回もターゲット・マイコンは、PIC16F18855 です。例によってMPLAB X IDEを起動しマイコン機種を選択した後、MCC Classicを使ってプロジェクトをコンフィギュレーションしております。

ZERO-CROSS DETECTION (ZCD) MODULE

ゼロクロスで一番心配になるのは電源、グラウンドの電圧に対してどの程度の入力電圧が許されるのかという1点です。PIC16F18855の場合、電源電圧VDDは最小2.3V、最大5.5Vで、端子に印加が許容できる電圧は -0.3VからVDD+0.3Vまでです。「ゼロクロス」といいながら、-0.3V以下の素のマイナス電圧が何もせずにそのままかかってしまうとマズイです。でもプラスマイナスでブンブン丸(古い)な信号をゼロクロスして~。また商用電源(日本では実効値100V、ピーク141V)をそのままかけるなど言語道断。その辺どう対処するの?

データシートのZCDモジュールの入力端子の説明を読めば、その対策が書かれてます(計算式や計算例、考慮にいれるキャパなどいろいろ書かれているのでデータシートみてね。)

    1. 入力電圧に応じた外部直列抵抗必須
    2. 必要に応じて外部プルアップ、プルダウンの設置

内部に保護ダイオードが入っていて、多少の電流ならこいつが頑張ってグランドを大きく下回ったり、VDD電圧を大きく上回ったりしないようにしてくれる。外部で内蔵ダイオードが対処可能な電流以下に抑えてね、ということみたいデス。流して良いのは300μAまでとな。これ以上の電流が端子に流れないように抵抗を計算して挿入せよ、ということです。また、ゼロクロスといいつつ、アナログ・コンパレータが検出するポイントは0.75V付近にあるようなので(負電源があるわけでなし、そんなもん?)、必要に応じて要調整ってことみたいです。

今回はまかり間違っても虎の子のターゲットボードが壊れないように、控えめな電圧波形を加えてます。なお、直列抵抗は電圧5Vのときということで計算して16.7kΩを得たのですが、ちょっと余裕みて20kΩとしてます。実験用の回路は以下です。ZCE_DUT_schematic

 

 

 

MCC Classic 使用のコンフィギュレーション

MPLAB X IDE上でPIC16F18855用に新規プロジェクトを作成した後、MCC Classicを使って、ソースコードを自動生成していきます。

まずZCDモジュールのリソースは最初はプロジェクトに含まれていないので、以下のウインドウから「+」ボタンを押して追加するところからです。ZCDresources

ZCDモジュールをProject Resourcesへ追加後、その設定ウインドウに必要事項を設定します。今回は「ゼロクロス(電圧下から上へ)」発生を割り込みで受けるので以下のようにチェックを入れてます。ZCDsettings

PINマネージャによるPIN設定は以下の通りです。pinSettings

ゼロクロス入力端子は、Port Bの0番端子固定です。一方割り込み発生をLEDで観察するためにEVAボード上のLEDを光らせているのでPort Aの0番を出力に設定しています。

以上設定してGenerateボタンを押してソースコードを自動生成します。

自動生成ソースコードに手を入れた部分

まず、ZCDを制御するための zcd.c ソースファイル内の割り込みハンドラに1行LED点灯のための文を追加します。割り込みフラグのクリアは自動生成の行です。こんな感じ。

void ZCD_ISR(void)
{
    RA0 = 1;
    PIR2bits.ZCDIF = 0;
}

続いてmain.c 内の main関数にちょいと仕込みを入れます。

void main(void)
{
    SYSTEM_Initialize();
    INTERRUPT_GlobalInterruptEnable();
    INTERRUPT_PeripheralInterruptEnable();
    while (1)
    {
        RA0 = 0;
        __delay_ms(10);
    }
}

もともと以下2行は自動生成ソースでコメントアウトされているものをコメント外しただけです。

 INTERRUPT_GlobalInterruptEnable();
 INTERRUPT_PeripheralInterruptEnable();

実質追加はwhile(1)ループの中身だけです。

以上の変更実施後ビルドし、生成されたオブジェクトファイルを実機に書き込みます。

実機実験結果

例によってAnalog Discovery2を使用です。PB0端子の先に20kΩ分の抵抗を接続し、その先にAWGのCH1を接続してあります。印加するアナログ信号は、

オフセット0.75V、振幅1Vの三角波

です。一応、マイナス0.25Vからの信号になるのでリアルにゼロクロスしてるけれども、万が一にも許容スペック割れることはない筈。PIC16F18855_ZCD_DUT

とてもコンサバな入力信号、黄色のCH1を入れたときのLED駆動信号=立ち上がりはZCD割り込み発生によるハンドラ起動、の波形、青色CH2が以下に。ZCD_waveform

周期1秒の三角波をいれております。黄色C1がほぼ0.75V付近で青C2が立ち上がり、後、立ち下がって(メインループ内でLED消灯)おるようです。

お手軽にゼロクロス検出できるのね。外付け抵抗いるけど。

PIC三昧(6) Configurable Logic Cell、PIC16F18855 へ戻る

PIC三昧(8) アナログ・コンパレータを使ってみる、PIC16F18855 へ進む