• 追加された行はこの色です。
  • 削除された行はこの色です。
#freeze
 閲覧総計:&counter();  (本日:&counter(today);  昨日:&counter(yesterday);)~
 *LEDの明るさを変える(PWM)(16F1827 XC8) [#lf796826]
 
 PWM機能の使い方を確認する目的で、PWM信号のdutyを変更し、LEDの明るさを
 変えるプログラムを作成した。
 新型の16F1XXXシリーズは、旧16Fシリーズと比較してPWM機能がとても高機能に
 なっているが、その分操作法が風雑になっている。
 今回はCCP(RA3)からPWM信号を発振する。Timer2を使用する。
 【ポイント】
 ・16F1827のPWM機能に関する解説は↓こちらのページに詳しい
 http://www.geocities.jp/zattouka/GarageHouse/micon/MPLAB/16F1827/memo.htm
 PICの動かせ方入門「16F1827覚書」
 
 |&attachref(TS3V0008.JPG,zoom,200x300,button){新しい写真添付};|&attachref(16F1827ピン配置.JPG,zoom,200x250,button){新しい写真添付};|
 
  /* PWM機能の確認(LEDの明るさを徐々に変える)
   * PIC16F1827
   * XC8 v1.20
   * LED:RA2,RA3
   */
  #include <xc.h>
  
  #pragma config FOSC = INTOSC, WDTE = OFF, BOREN = OFF, IESO = OFF, FCMEN = OFF
  #pragma config PLLEN = OFF, STVREN = OFF, LVP = OFF
  
  //__delay_us(), __delay_ms()へのクロック情報の設定
  #define _XTAL_FREQ 8000000 //PICのクロックをHzで設定(8MHz)
  
  int main(void) {
      //使用変数の定義
      unsigned int dutycycle; //0〜65535
  
      //PICの初期設定
      OSCCON = 0b01110000; //PLL:OFF, 内部クロック8MHzで駆動
      ANSELA = 0b00000000; //RA4(AN4)-RA0(AN0)は全て0:デジタルI/Oとする
      TRISA = 0b00000000; //PORTA全てを0:出力に設定
      PORTA = 0b00000000; //PORTAの中身をきれいにする
  
      //CCP3(RA3)へPWM信号を出力(Timer2使用)
      //PWM各種設定値の計算
      //クロック8MHz Tosc = 0.125μsの時
      //3000HzのPWM信号を発信する場合
      //
      //周期 = 3000Hz = 1/3000 = 333μs
      //(PR2の範囲は0〜255)
      //Timer2のプリスケール 4
      //周期 = (PR2 + 1) * 4 * Tosc * (Timer2のプリスケール値)であるから
      //PR2 = (周期 / (4 * Tosc * (Timer2のプリスケール値)) - 1
      //PR2 = (333 / (4 * 0.125 * 4)) - 1
      //PR2 = 165
      //
      //PWM分解能 DC1(Max)は
      //duty = DC1 * Tosc * (Timer2のプリスケール値)であるから
      //DC1 = duty / (Tosc * (Timer2のプリスケール値))
      //DC1(Max) = 333 / (0.125 * 4)
      //DC1(Max) = 666
  
      //PWM各種条件設定
      //CCP3(RA3)へPWM信号を出力
      CCPTMRS = 0b00000000; //CCP3はTimer2使用に設定
      CCP3CON = 0b00001100; //PWMモードを使用する
      T2CON = 0b00000001; ////プリスケール 4に設定
      PR2 = 165; //PWM周波数3000Hzに設定
      TMR2 = 0; //Timer2カウンターをクリアー
      T2CONbits.TMR2ON = 1; //Timer2 ON
  
      //メイン処理
      LATAbits.LATA2 = 1; //RA2:パワーオンを示すLED点灯,照度比較用LED
      while(1) {
          for(dutycycle = 0; dutycycle < 666; dutycycle++) { //3000Hz時の分解能は666
              //LEDの明るさを徐々に変える
              //dutycycleの変更
              //解像度10ビットのうち上位8ビットをCCPR3Lレジスタに格納
              CCPR3L = dutycycle >> 2;
              //解像度10ビットのうち下位2ビットをCCP3CONレジスタの4,5ビットへ格納
              CCP3CON |= (dutycycle & 0x0003) << 4;
              __delay_ms(10); //0.01秒(=10ミリ秒)待つ
          }
      }
  }
  
 ★この情報は役に立ちましたか?
 #vote(はい[3],普通[0],いいえ[1])
 #vote(はい[3],普通[0],いいえ[2])
 
 #comment_nospam