(夏季休業のお知らせ)

8月10日15時 から 20日まで発送・問合せ等のすべての業務をお休みいたします。
 

 

電子工作の知恵袋

 
 

 

PixiModule UART
USB-UART変換ケーブル
実動デモ


 

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


電子工作の知恵袋


PIC16F690のPWM応用例

 

 

    マイコンボードのPWMを使ったイルミネーションのデモをご説明します。

    クリスマスツリーのイルミネーション飾りや最近良く見る家の周りの電飾などに応用できます。

    自分の思う通りにピカピカさせることができれば、おもわず魅入ってしまうこと請け合いです。

     

     

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

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

     

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

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

     

     

     

      

     

 

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

     

    PIC16F690マイコンモジュールにはPWM出力を想定した回路構成となっており、内蔵ドライバー回路のみで500mAまでの電流をオンオフすることが可能です。

    ボードには、ハイサイド出力ドライバー(流れ出し)とローサイド出力ドライバー(引き込み)の2種類があり、片側のみ又は両方同時に使用できます。

     

     

     

     

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

     

    今回のPWMの説明では以下のようにBR3368 スタンレー電気の赤色LEDを15ケ使用します。

     

     

     

     

    この配線の設定は、LED一列に流れる電流は約20mA、マイコンモジュールの消費電流を足して全体で約100mAほどです。

     

    電源電圧は11〜16V、少々余裕をみて電流が150mA以上出力できる能力のあるものを使用します。

    電圧と電流が満足できれば、乾電池や車のバッテリーもしくはACアダプターでも問題ありません。

    尚、この配線では、電源電圧が11V〜16Vの範囲で作動しますが、電源電圧の補償処理を行っていないため、11Vと16Vでは最大輝度に差が発生します。

    電圧が安定化されていれば、最大輝度は変化しませんので、できるだけ安定した電源を使用することをお勧めします。

     

    使用する抵抗はどのようなタイプでもOKですが、電力定格が0.25W以上のものを使用してください。

    もし、抵抗にチューブをかぶせるなどを行った場合、放熱が足りずに抵抗が熱くなることがあります。

    その場合、放熱に問題がないか製作後はしばらく様子をみることをお勧めします。

     

     

     

     

    (2)PWMソフトウエア

     

    今回、ソフトウエアは、LED電流をPWM制御して明るさがゆっくりと自動で変化するソフトウエアをPIC16F690マイコンモジュールに組み込みます。

     

    ここで説明するサンプルソフトウエアのソースコードはユーザーサポートページより無料でダウンロードできます。

     

     

    設定機能としては、PWMのデューティが一定時間毎に0%から100%までゆっくりと変化し、100%に到達したら逆にゆっくりと0%に向かって変化します。

    以上の繰り返しを無限に行うプログラムです。

    このプログラムを実行するとLEDの明るさがフワ〜とゆっくり変化していきます。

    部屋のイルミネーションとしては、か妖しい(怪しい?)雰囲気を醸し出すこと請け合いです。

    LEDの色を1種類ではなく、同じ列に何種類か混ぜることができますので、クリスマスツリーの飾りにもいいかもしれません。(同系統の色違いLEDを推奨)

     

     

     

     

    (a)メインルーチン

     

        while(1){

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

     

            //カウンター変化待ち

            while(pc==qpc){ }

     

     

            //山パターンの設定

            if(yamaflag==0){    //上がり

                pwmsetduty(pc);

            }

            else{       //下がり

                pwmsetduty(0xff-pc);

            }

     

            if(pc==0xff){

                yamaflag=yamaflag^0x01; //  フラグ反転

            }

     

            qpc=pc; //進行カウンター過去値更新

     

     

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

        }

     

     

    初期化の部分で、必要なもの(ポート、タイマー、A/D、割り込み等)はこれ以前の記述で既に終わらせています。

    その部分は、汎用Cソースコードの説明と重なりますので、詳しくはダウンロードしたソースコードを見てください。

     

     

    さて、メインルーチンは非常に簡単な構造です。

     

    まず、’pc’という変数が、後述するタイマー部分によって、0x00(0)から0xff(255)まで自動的に一定時間毎(20mS)に1づつ変化していきます。

     

    次に、メインルーチンの先頭で、その’pc’の値が変化したかどうかを判定します。

    変化するまで待機して、もし変化したならwhileループを抜け出してPWMのデューティ値を処理する部分に移行します。

     

    PWMのデューティを’pc’の値に合わせて変更することで、先ほどの機能が実現できますが、汎用Cソースコードにはpwmsetduty(x)という関数が入っており、その関数を使うことで非常に簡単にPWMのデューティを設定することができるようになっています。

     

    このPWMのデューティを設定する関数は8ビットの値でデューティを表すように決められています。

    設定は、0x00で0%、0xffで100%になります。

     

    ’pc’は0x00から0xffまで変化するので、その値をPWMのデューティを設定する関数pwmsetdutyでそのまま使うことができます。

    こうすることで、’pc’の値に合わせてデューティが変化するので、20mS毎にPWMのデューティが変化することになります。

    ’pc’が増えると、デューティが大きくなり、LEDが相応の明るさで光るという算段です。

     

     

    さて、このままだとデューティが100%に達した後、’pc’がオーバーフローして0に戻るため、デューティも0%になってしまいます。

    つまり、輝度がのこぎり波形になってしまいます。

    これはこれで、おもしろいのですが、今回はデューティが行ったり来たりすることを考えていますので、もう少しプログラムに手を加えます。

     

    それには、デューティを0から100にする処理部分と100から0にする処理部分の2通りが必要です。

    プログラムでは’yamaflag’という変数でそれを制御しています。

    ’yamaflag’が0の時はデューティが増える処理、1の時は減る処理となるよう判定を加えます。

    そして、’pc’が0xffになった時点で’yamaflag’を0から1に、または1から0にすれば、自動でデューティが増えたり減ったりするようになります。

     

    最後は、’pc’が変化したかどうかを、また次のサイクルで判定するために、変化した後の値を覚えておきます。

     

     

     

    (b)タイマー割り込み

     

            //1mSタイマー毎の処理がある場合の記載場所-----------

                //進行カウンターインクリメント

                tcount++;

                if(intval <= tcount){

                    tcount=0;

                    pc++;   //進行カウンターインクリメント

                             // 0xff以上はオーバーフローさせて0から開始

                }

     

            //-------------------------------------------------

     

     

    割り込みはタイマー割り込みの部分を使用します。

    タイマーは事前の設定で1mS毎に割り込みがかかるよう設定されています。

    この割り込みが’intval’で指定した回数ごとに’pc’を1づつ増やすようにします。

    ’intval’は事前に20と指定してあります。

    ’pc’は8ビットの変数なので、値が0xff(255)を超えると0に戻ります。

     

     

     

     

     

     

    意外というか、思ったより簡単だったと思います。

    メインルーチンはたったの13行です。

    割り込みも5行程度のシンプルなプログラムです。

     

    このプログラムに、あなたが手を加えることで更に色々なパターンを作り出すことができるでしょう。

     

    マイコンは、準備するまでが大変で最初の敷居が高い素子ですが、一度手順というか敷居を超えてしまうと、次からはほとんど手間なしで出来てしまいます。

    これを機会に、ぜひチャレンジしてみてください。

     

     

     

    とりあえず使ってみたい方、もっと複雑なものが欲しい場合は、以下のようなものもあります。

     

    プログラマブルLED制御モジュール 8ch 25V0.6A

     

     

     

     


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

  電子工作大好き社員募集中! 株式会社ヌマタR&D