当サイトのコンテンツはご自身の判断と責任においてご利用ください。営利目的の利用は固くお断りします

更新2022/05/05

内蔵PWMでイルミネーション

PIC16F690で作る汎用モジュールのPWMを使ったイルミネーション電子工作例を紹介します。
自分の思う通りにピカピカさせることができれば、おもわず魅入ってしまうこと請け合いです。
この章では、PIC16F690で作る汎用モジュールPIC16F690汎用Cソースコードを使います。

(1)回路例

今回のPWMの応用例では、以下のようにBR3368 スタンレー電気の赤色LEDを20ケ使用したイルミネーションです。

LED一列に流れる電流は約20mA、全体で約100mAほどです。
電源電圧は11~16Vで最大電流が150mA以上の安定化電源またはバッテリーを使用します。
電圧と電流が満足できれば、乾電池や車のバッテリーもしくは平滑化されたDCを出力するACアダプターでも問題ありません。

尚、電源電圧の補償処理を行っていないため、電源電圧11Vと16VではLEDの輝度に差が発生します。
使用する抵抗は電力定格が0.25W以上のものを使用してください。

(2)PWMソフトウエア

今回の回路用プログラムは、LED電流をPWM制御して明るさがゆっくりと自動で変化するように制御します。
PWMのオンデューティが一定時間毎に0%から100%までゆっくりと変化し、100%に到達したら逆にゆっくりと0%に向かって変化します。
以上の繰り返しを無限に行うプログラムです。

このプログラムを実行するとLEDの明るさがフワ~とゆっくり変化していきます。
妖しい(怪しい?)雰囲気を醸し出すことでしょう。
LEDの色を1種類ではなく、同じ列に何種類か混ぜることができますので、クリスマスツリーの飾りにもいいかもしれません。

main関数と割り込み関数内に以下の処理プログラム記載します。
記載以外の部分はPIC16F690汎用Cソースコードを使います。

void main (void){
  //ローカル変数------------------------------------------
  char yamaflag=0; //山パターン方向フラグ 0:上昇 1:下降

  //クロック設定----------------------------------------------
  OSCCON=0x70; //OSC 8MHZ

  //ポートの設定と初期化---------------------------------------
  TRISA=0xff; //PORTA設定 固定(0:出力 1:入力)
  TRISB=0xff; //PORTB設定(0:出力 1:入力)
  TRISC=0xff; //PORTC設定(0:出力 1:入力)

  //AD機能の初期化------------------------------------------
  adinit(0x00,0x04); //左バイトANSELH、右バイトANSEL

  //タイマー1・タイマー2の初期化(固定)------------------
  timerinit();

  //PWMの設定-----------------------------------------------
  pwmportinit(); //(注)実行でRC5が出力&PWMに自動設定される
  pwmsetduty(0x00); //PWM初期デューティ0%に設定
  pwmsetfreq(1,0xfe); //PWM初期周波数1960Hz

  //全割り込みの許可(固定)---------------------------------
  PEIE=1; //INTCONレジスタのPIC内蔵モジュール割り込み許可フラグをセット
  GIE=1; //INTCONレジスタのグローバル割り込み制御ビット有効

  //その他最終処理-------------------------------------------
  TMR1ON=1; //タイマー1(1mS基準タイマー)開始(0:停止 1:開始)
  pwmstart(); //PWM開始

  //メインループ
  while(1){
    //カウンター変化待ち
    while(pc==qpc){ }

    //山パターンの設定
    if(yamaflag==0){
      //上がり
      pwmsetduty(pc);
    }else{
      //下がり
      pwmsetduty(0xff-pc);
    }
    if(pc==0xff){
      yamaflag=yamaflag^0x01; // フラグ反転
    }

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

  }
}


void interrupt checkint(void){
  static unsigned char tcount=0; //インターバルカウンターの宣言

  //タイマー1の割り込み判定
  if(TMR1IF==1){ //PIR1レジスタの割り込みフラグ判定
    TMR1H=TMR1H_init; //カウント値初期化
    TMR1L=TMR1L_init; //カウント値初期化
    TMR1IF=0; //PIR1レジスタの割り込みフラグクリア

    //進行カウンターインクリメント
    tcount++;
    if(intval <= tcount){
      tcount=0;
      pc++; //進行カウンターインクリメント 0xff以上はオーバーフローさせて0から開始
    }
  }

}

PIC16F690汎用Cソースコードをベースに作成したので、ゼロから作るより簡単です。
このプログラムに、あなたが手を加えることで更に色々なパターンを作り出すことができるでしょう。

(最新)

(中の人)


電子回路とファームウェア専門の元エンジニアが、初心者の頃の疑問や勉強・経験で知った「そうだったのか」を2009年から書いています。 ⇒続き

ページの先頭へ戻る
シェア
Tweet このエントリーをはてなブックマークに追加