打印
[其他]

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

[复制链接]
10453|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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引脚映射PC2  PC0
    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 | 只看该作者
感谢楼主的分享,不错的想法。

使用特权

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

本版积分规则

认证:大连伊飞特信息技术有限公司软件工程师
简介:本人于1993年毕业于大连理工大学。毕业后从事单片机开发工作5年,之后转入软件开发工作至今。

87

主题

2421

帖子

5

粉丝