閲覧総計:&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_Change_Duty(unsigned int duty_ratio); 関連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_Change_Duty(unsigned int duty_ratio); //関数プロトタイプ宣言終わり //自作my_Pwm関数の使用例 //発光ダイオード(LED)の明るさを徐々に変える void main() { //メインプログラム //利用変数の定義 unsigned int i; //利用変数の定義終わり //マイコンの初期化 PORTB = 0b00000000; //PORTBの中身をきれいにする TRISB = 0b00000000; //PORTBを8つ全て0:出力に設定 Pwm_Init(5000); //PWM機能の初期化 //マイコンの初期化終わり PORTB.F2 = 1; //照度比較用LED ON 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_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; } //自作my_Pwm関数終わり ★この情報は役に立ちましたか? #vote(はい[3],いいえ[24]) - CCP1CONレジスタの6,7ビットなんて無意味じゃないの?? -- [[PWM]] &new{2007-02-12 (月) 12:29:20}; #comment