简介 PIC32MX系列单片机内部集成有输出比较模块,主要用于响应设定时基事件时产生单脉冲信号或者一连串脉冲信号。我的理解是通过定时器设定一个触发条件,输出比较模块匹配后从输出口产生一个电平信号。再通过对相应寄存器的配置,自由设定PWM输出频率及占空比。 初始化
void PWM_Init()
{
OC2RS = 0;
OC2R = 0;
//OC2CON = 0x8006;
OC2CONbits.ON = 1; // enable compare module
OC2CONbits.SIDL = 0; //continue operation when cpu is in IDLE mode
OC2CONbits.OC32 = 0; // compare module compared with 16 bit timer source
OC2CONbits.OCFLT = 0; // disabled pwm fault condition
OC2CONbits.OCTSEL = 0; // choose timer2 for timer source
OC2CONbits.OCM = 0x6; // oc1 pin mode is PWM,and PWM fault mode disabled
}
代码主要内容是讲OC2模块设定为PWM模式,选定Timer2作为时钟源,就是简介中时基事件的发生源。
PWM频率设置
频率的设置基于公式,Tpwm = (PR + 1) * Tpb * T(Timer2预分频)
Tpb表示单片机的外设时钟周期。
如 Tpb = 40Mhz , Ttimer2 = 16 , Tpwm = 3Khz
则PR = 832。
void Timer2_Init()
{
T2CONbits.SIDL = 0;
T2CONbits.TGATE = 0;
T2CONbits.TCKPS = 4; // Timer2预分配为1:16
T2CONbits.T32 = 0;
T2CONbits.TCS = 0;
T2CONbits.ON = 1;
TMR2 = 0x0000;
PR2 = 832;
T2CONbits.TON = 1;
}
PWM占空比设置调节占空比就是设定OC2RS数值与周期数的比列,如下图所示。
void Pwm_Out(uint32_t pwm_duty) { uint16_t dc; if(pwm_duty>PWM_DUTY_MAX) pwm_duty = PWM_DUTY_MAX; dc = PWM_DUTY_MAX - pwm_duty; OC2RS = dc; }
注:PWM_DUTY_MAX即周期数(PR+1).
输出效果将OC2引脚接入蜂鸣器,效果如下:
|