suncat0504 发表于 2023-10-9 16:33

HC18M003使用PWM时占空比、死区时间计算

本帖最后由 suncat0504 于 2023-10-19 15:41 编辑

#申请原创#@21小跑堂 我在使用HC18M003单片机测试PWM的时候,对于PWM的占空比和死区时间的计算,没有搞明白就开始测试了。后来通过程序实例才搞明白是如何计算的。按照数据手册中说明的:1、占空比用到PWM0DL、PWM0DH两个寄存器

2、死区时间的计算用到PWM0DTL、PWM0DH寄存器

根据数据手册的说明,在2路独立模式下,死区计算用寄存器作为PWM1的占空比基础器使用。高位寄存器的第四位有效,无视高四位。占空比的计算公式:
    PWM0 占空比 = [ PWM0DH : PWM0DL] * PWM0 工作时钟周期
(在2路独立模式下)
    PWM1 占空比 = [ PWM0DTH : PWM0DTL] * PWM0 工作时钟周期
因为公式类似,只用一个来说明。当执行以下设置时(这个数据与例程中提供的有出入,例程中设为0x01FF,不太理解):
    PWM0DH = 0x02;
    PWM0DL = 0x00;
根据公式:
    占空比=0x1FF * PWM0工作时钟源周期
当OSCCON = 0x04;时,PWM0工作时钟源周期=1/4000000,
    因此占空比=0x200 * (1/4000000) = 512/4000000=128μS。
在互补模式下,死区时间的计算也正是这样:
    死区时间=[ PWM0DTH : PWM0DTL] * PWM0 工作时钟周期
若设置:
    PWM0DTH = 0X01;
    PWM0DTL = 0x00;
那么死区时间=256*(1/4000000)=64μS
对于以下程序,void main() {
    // 系统初始化
    OSCCON = 0x04;          //Fosc=32MHz,Fcpu四分频2T   
    //IO初始化
    ANSELC = 0xFF;
    TRISC= 0xFF;         //PC0,PC2设置数字输出模式
    // PWM初始化
    PWMMAP= 0x11;      //PWM引脚映射PC2PC0
    FLTMODE = 0X00;         //禁止故障检测
    PWM0C   = 0x01;          //时钟源RC32MHz/8
    PWM0C|= 0x00;          //PWM0和PWM01均为高有效
    PWMM    = 0x01;         //互补输出模式,自动重载
    PWM0PH= 0x03;
    PWM0PL= 0xFF;
    //PWM0周期 = [ PWM0PH : PWM0PL] * PWM0工作时钟源周期
    //       = 1023*(1/4000000)
    //       = 256 us
    PWM0DH= 0x02;
    PWM0DL= 0x00;          //占空比为25%(0x0200,忽略PWM0DH高四位)
    PWM0DTH = 0X01;
    PWM0DTL = 0x00;      //死区时间设置(0x0100,忽略PWM0DTH高四位)
    PWMEN   = 0x11;      //PWM0和PWM01使能
    while(1);
}

测出的实际波形如下:




kjkujkj21 发表于 2023-10-19 15:27

感谢楼主的分享,不错的想法。
页: [1]
查看完整版本: HC18M003使用PWM时占空比、死区时间计算