JH7UBCブログ

アマチュア無線 電子工作 家庭菜園など趣味のブログです

PIC16F1705 PWM テスト2

2019-05-01 10:32:00 | PIC16F1705

 PIC16F1705にはPWM出力用に、CCPモジュール2個(CCP1(PWM1),CCP2(PWM2))と専用のPWMモジュール2個(PWM3,PWM4)持っています。

 今回は、PWMモジュールを使ってみます。このモジュールは、下の図のような構造を持っています。

 CCPモジュールとの違いは、Duty Cycle registerの名称がPWMxDCHとなり、Duty Cycle設定用のデータの下位2bitが専用のレジスタPWMxDCLに格納されることです。

 (PIC16F1705の説明書より)

 今回のテストでは、PWM3をRA0にPWM4をRA1に出力します。

 PWM3,PWM4ともタイマーは、TMR2を使い、PWM周期は1ms(1000Hz)とし、PWM3にはデューティ比30%,PWM4にはデューティ比70%の信号を出力してみます。

 プログラムです。(mainプログラムのみ示します)

 クロックは、内臓クロック8MHzです。

-------------------------------------------------------

void main() {
    OSCCON = 0b01110010;    // 内部クロック8MHz
    ANSELA = 0b00000000;    // AN0-AN1を使わない
    ANSELC = 0b00000000;    // AN4-AN6を使わない
    TRISA  = 0b00000000;    // RORTAは全て出力
    TRISC  = 0b00000000;    // PORTCは全て出力
    PORTA  = 0b00000000;    // PORTAクリア
    PORTC  = 0b00000000;    // PORTCクリア
       
    /*
     * RA0にPWM3を出力する
     * RA1にPWM4を出力する
     */
    RA0PPS = 0b00001110;    //RA0=PWM3OUT
    RA1PPS = 0b00001111;    //RA1=PWM4OUT
   
    PWM3CON = 0b10000000;   //PWM3 enable,active high
    PWM4CON = 0b10000000;   //PWM4 enable,active high
    CCPTMRS = 0b00000000;   //PWM3,PWM4にTimer2を割り当てる
   
    PR2 = 124;              //Timer2の周期を設定 1ms(1000Hz)
    PWM3DCH = 37;           //PWM3のデューティ比 30%
    PWM3DCL = 0;
    PWM4DCH = 87;           //PWM4のデューティ比70%
    PWM4DCL = 0;
    T2CON = 0b00000110;     //prescale 1:16 Timer2 start
   
    while(1){
       
    }
}

-------------------------------------------------------

 出力波形です。青がPWM3、赤がPWM4です。

 まとめると、PIC16F1705は、4つのPWM出力ができますが、使えるタイマーは、TMR2,TMR4,TMR6(いずれも8bitタイマー)です。

 PWM出力は、RA3を除く任意のポートに設定できます。目的、用途に応じてポート、タイマー、周期、デューティ比を使い分けます。


最新の画像もっと見る

コメントを投稿