閲覧総計:20929  (本日:1  昨日:0)


1024分解能ハードPWM制御自作関数

MikroCに用意されているPWM関数はPWM分解能が256である。
しかし、PIC16系に組み込まれているハードウエアPWM機能は10ビット(1024分解能)
である。
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);

LEDの明るさを変える回路写真.JPGLEDの明るさを変える.jpg
/**
* 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機能の初期化
    //マイコンの初期化終わり
    
    PORTB.F2 = 1; //照度比較用LED ON

    my_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
    //上位8ビットをCCPR1Lレジスタへ格納 
    CCPR1L = duty_ratio >> 2;
    //下位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関数終わり

★この情報は役に立ちましたか?

選択肢 投票
はい 0  
いいえ 0