• 追加された行はこの色です。
  • 削除された行はこの色です。
閲覧総計:&counter();  (本日:&counter(today);  昨日:&counter(yesterday);)~
 ~
 *1024分解能ハードPWM制御自作関数 [#ef01afa1]
 
 MikroCに用意されているPWM関数はPWM分解能が256である。
 しかし、PIC16系に組み込まれているハードウエアPWM機能は10ビット(1024分解能)
 である。
 ハードの性能を100%引き出す、1024分解能のPWM制御を実現する為に自作my_Pwm関数
 を作成したので紹介する。
 (発光ダイオード(LED)の明るさを徐々に変えるプログラムで稼働確認を実施) 06/11/26
 
 注)16F628Aの場合、PWM信号はRB3から発信される。
 
 関連自作my_Pwm関数
 void my_Pwm_Init(void);
 void my_Pwm_Change_Duty(unsigned int duty_ratio);
 void my_Pwm_Start(void);
 void my_Pwm_Stop(void);
 
 関連MikroC関数
 void Pwm_Init(unsigned long freq);
 void Pwm_Start(void);
 void Pwm_Stop(void);
 
 |&attachref(LEDの明るさを変える回路写真.JPG,zoom,150x150,button){新しい写真添付};|&attachref(LEDの明るさを変える.jpg,zoom,150x150,button){新しい写真添付};|
 
  /**
  * 1024分割制御 自作Pwm関数
  * 発光ダイオード(LED)の明るさを徐々に変える
  *
  * PIC 16F628A
  * 発信器:内臓4MHz
  * 電源:乾電池3本(4.5V)
  * LED: CCP1(RB3) 照度比較用 RB2 
  * 
  * Device Flags: _BODEN_OFF _BOREN_OFF _CP_OFF _PWRTE_ON _WDT_OFF
  *        _LVP_OFF _MCLRE_OFF _INTRC_OSC_NOCLKOUT
  *
  * 言語 MikroC v6.2
  */
  
  //関数プロトタイプ宣言
  void my_Pwm_Init(void);
  void my_Pwm_Change_Duty(unsigned int duty_ratio);
  void my_Pwm_Start(void);
  void my_Pwm_Stop(void);
  //関数プロトタイプ宣言終わり 
  
  //自作my_Pwm関数の使用例
  //発光ダイオード(LED)の明るさを徐々に変える
  void main() { //メインプログラム
      //利用変数の定義
      unsigned int i;
      //利用変数の定義終わり
  
      //マイコンの初期化
      PORTB = 0b00000000; //PORTBの中身をきれいにする
      TRISB = 0b00000000; //PORTBを8つ全て0:出力に設定
      my_Pwm_Init(); //PWM機能の初期化
      Pwm_Init(5000); //PWM機能の初期化
      //マイコンの初期化終わり
      
      PORTB.F2 = 1; //照度比較用LED ON
  
      my_Pwm_Start(); //PWM機能の起動
      Pwm_Start(); //PWM機能の起動
      do { //doとwhileの間を繰り返す
          for(i = 0; i < 1024; i++) {
              my_Pwm_Change_Duty(i); //LEDの明るさを徐々に変える
              Delay_ms(20); //0.02秒(=20ミリ秒)待つ
          }
      } while(1); //doとwhileの間を繰り返す
  } //メインプログラム終わり
  
  //自作my_Pwm関数
  //【参考資料】
  //後関氏「CCPのPWMモードでの使い方」
  //http://picfun.com/pic18.html
  //久世氏「ハードウェアのPWM機能を使って、数値を変える」
  //http://www.kuze.jp/sfc/page17.html
  void my_Pwm_Init(void) {
      //PWM Mode SET
      CCPR1L = 0;
      CCP1CON = 0b00001111;
  
      //TIMER2をEnableに。T2CON.TMR2 ON=1 プリスケール1
      T2CON = 0b00000100;
      PR2 = 0b11111111;
  }
  
  void my_Pwm_Change_Duty(unsigned int duty_ratio) {
      // duty_ratio:0〜1023 0:Min 1023:Max
      //duty_ratio上位8ビットをCCPR1Lレジスタへ格納 
      CCPR1L = duty_ratio >> 2;
      //duty_ratio下位2ビットをCCP1CONレジスタの6,7ビットへ格納
      CCP1CON.F6 = duty_ratio & 0b00000001;
      CCP1CON.F7 = (duty_ratio & 0b00000010) >> 1; 
  }
  
  void my_Pwm_Start(void) {
      PORTB.F3 = 1;
  }
  
  void my_Pwm_Stop(void) {
      PORTB.F3 = 0;
  }
  //自作my_Pwm関数終わり
 
 ★この情報は役に立ちましたか?
 #vote(はい[0],いいえ[0])
 
 #comment