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){
}
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を除く任意のポートに設定できます。目的、用途に応じてポート、タイマー、周期、デューティ比を使い分けます。
※コメント投稿者のブログIDはブログ作成者のみに通知されます