電子工作の知恵袋

 
 

 

PixiModule UART
USB-UART変換ケーブル




 

    *コンテンツはお客様ご自身のご判断と責任においてご利用ください。
     また、掲載内容を他に流用・転載することは一部・全てを問わず固くお断りいたします。
     引用する場合はリンク表示にてお願いいたします。
     


電子工作の知恵袋


PIC16F690のA/D入力処理

 

 

    マイコンボードには、ポートの電圧を測定してディジタル量に変換することのできるAD機能があります。

    このアナログ・ディジタル変換という機能は大変便利なのですが、うまく使うにはやっぱりちょっとしたコツが必要です。

    ここでは、ハードウエアとソフトウエア両面から使い方を説明します。

     

     

     

    このページでは、当店提供の汎用Cソースコードを使います。

    PIC16F690マイコンモジュールで使用することができる各種Cソースコードはユーザーサポートページからダウンロードできます。

     

    また、ここでご説明する内容は当店の商品であるPIC16F690マイコンモジュールを前提としています。

    他社製マイコンボードでの作動は一切関知していませんのでご注意ください。 

     

     

     

      

     

 

    (1)使用するボードと配線の一例

     

    PIC16F690マイコンモジュール(*例に挙げているマイコンモジュールは販売終了しました。)のIO0〜IO3,IO5〜IO7はプログラムの設定によって、アナログ・ディジタル変換の機能を割り当てることができるようになっています。(IO4は不可)

      

     

     

     

    以下は、使用するマイコンボードの大まかなブロック図です。

     

     

     

     

    今回の説明では、以下のようにIO0にボリュームを接続することにします。

     

     

     

    使用するボリュームは抵抗値が1kΩ程度のものを使用しました。

    これは、IO0に10kΩのプルダウン抵抗がボード上に実装されているため、ボリュームの抵抗値は低めの値のものを使用します。

    もちろん、どんなボリュームでOKですが、回転角と電圧値の関係が直線的になりません。

    ポートに電圧を直接印加する場合は、電圧範囲0〜5V、印加側の出力インピーダンスがなるべく低いものを使います。

     

    どうしても、高い抵抗値のボリュームしかない場合や、出力インピーダンスが高い(目安1kΩ以上)機器と接続しなければならない時は、ボード上の10kΩのプルダウン抵抗をとりはずせばOKです。

    ただし、端子がオープン状態になるので、とりはずした後の作業では、静電気には注意してください。

     

    ボリュームの電圧を受けるIO0にコンデンサをGNDとの間に接続します。

    理由としては、ボリューム内部の接点の摺動で発生するノイズを吸収するためと、外来ノイズを少しでも小さくするためです。

    コンデンサの容量値は、実験で決めますが、今回は0.1μFのものを使います。

    (手持ちでない場合は、無理に調達する必要はありません。多少ノイズには弱くなります)

     

     

     

    (2)ソフトウエア

     

    さて、スイッチ入力のページでも同じような事をお話しましたが、AD入力でも少々問題があります。

    それが、微小ノイズです。

     

    微小ノイズは、いろいろな原因があります。

    一番多いのは、電源変動ノイズ・負荷変動によるGNDレベルの変動・EMC(電磁波障害)などです。

    電灯ノイズ(50Hzや60Hz。最近はインバーター方式が多いので数十KHzなど)というのもあります。

    他には、ボリュームを回した時の摺動ノイズなどがあげられます。

    要は、アナログ電圧というのは、どんな状況でも必ずノイズが上乗せされているということです。

     

    この微小ノイズは、普通数mVから数百mV(場合によっては数V以上)の電圧変動となって現れてきます。

    そのため、ADで読み取ろうとしても、スイッチのチャタリングと同じで、その値を本当に信用していいのかどうかがわからない可能性があります。

     

     

    つまり、ソフトウエアでノイズをキャンセル・フィルタリングする必要があります。

     

    その手法のひとつに、平均化という方法があります。

    これは、一定期間毎に読み取りを行い、読み取った値の平均値を使用する方法です。

    一般的にノイズというものは時間平均をすると値がプラスマイナスゼロになる性質があり、平均化はその性質を応用したものです。

    他には、各読み取り値に重みづけを行って、計算する方法などいろいろありますが、PICレベルで難しい方法を取り入れるのもメモリーの無駄ですので平均化手法で十分です。

    どうしても無理なら、ノイズの量を減らすなど根本を見直すべきです。

     

     

     

     

     

    (プログラム例)

    IO0の電圧に応じてLEDのPWMデューティ比を変化させる。電圧0Vでデューティ0%。電圧5Vでデューティ100%。

     

    adinit(0x00,0x14);      //IO0をADポートとしての初期化

    unsigned int temp=0;    //テンポラリー変数

    unsigned char adval=0;  //テンポラリー変数

     

    //メインルーチン開始---------------------------------------

     

        temp=ad(4);         //IO0(RC0)の電圧読み取り 1回目

        wait(10);           //10mS待機

     

        temp=temp+ad(4);    //2回目

        wait(10);

     

        temp=temp+ad(4);    //3回目

     

        adval=temp/3;       //平均値算出

     

        pwmsetduty(adval);  //LEDのPWMデューティ設定

     

        wait(10);

     

     

        //メインルーチン終了-----------------------------------

      

     

     

    ボードのコネクタ端子は、以下の表にあるように10kΩのプルダウン抵抗付きでマイコンの各ポートに接続されています。

     

     

     

    原理をわかっていただくために、3回セットの平均化プログラムとしました。

    プログラムでは、IO0の電圧を10mSnインターバルを空けて計3回読み取り、それらの平均値advalを求めます

    算出した平均値は、pwmsetduty関数の引数にadvalをそのまま使用すれば、LEDがボリュームの電圧に応じて変化するようになります。

     

    平均化の方法も考えればいろいろありますので、ご自分で思いついたら試してみるのも楽しいのではないでしょうか。

     

     


カテゴリ
電子工作の知恵袋 最新情報