打印
[PIC32/SAM]

PIC32MX单片机系列之PWM

[复制链接]
498|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2022-6-13 14:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
ic, mx, pi
简介

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引脚接入蜂鸣器,效果如下:




使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1944

主题

15669

帖子

12

粉丝