[其他] HC18M003使用PWM时占空比、死区时间计算

[复制链接]
 楼主| suncat0504 发表于 2023-10-9 16:33 | 显示全部楼层 |阅读模式
本帖最后由 suncat0504 于 2023-10-19 15:41 编辑

#申请原创#@21小跑堂

我在使用HC18M003单片机测试PWM的时候,对于PWM的占空比和死区时间的计算,没有搞明白就开始测试了。后来通过程序实例才搞明白是如何计算的。按照数据手册中说明的:

1、占空比用到PWM0DL、PWM0DH两个寄存器
0edc1028b5c188b1c1f53e22be5d1f72
2、死区时间的计算用到PWM0DTL、PWM0DH寄存器
a047e3688ccdc2ccb08e02210cb33eda

根据数据手册的说明,在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
对于以下程序,
  1. void main() {  
  2.     // 系统初始化
  3.     OSCCON = 0x04;          //Fosc=32MHz,Fcpu四分频2T   
  4.     //IO初始化
  5.     ANSELC = 0xFF;
  6.     TRISC  = 0xFF;           //PC0,PC2设置数字输出模式
  7.     // PWM初始化
  8.     PWMMAP  = 0x11;        //PWM引脚映射PC2  PC0
  9.     FLTMODE = 0X00;           //禁止故障检测
  10.     PWM0C   = 0x01;          //时钟源RC32MHz/8
  11.     PWM0C  |= 0x00;          //PWM0和PWM01均为高有效
  12.     PWMM    = 0x01;           //互补输出模式,自动重载  
  13.     PWM0PH  = 0x03;
  14.     PWM0PL  = 0xFF;  
  15.     //PWM0周期 = [ PWM0PH : PWM0PL] * PWM0工作时钟源周期
  16.     //       = 1023*(1/4000000)
  17.     //       = 256 us
  18.     PWM0DH  = 0x02;
  19.     PWM0DL  = 0x00;          //占空比为25%(0x0200,忽略PWM0DH高四位)
  20.     PWM0DTH = 0X01;
  21.     PWM0DTL = 0x00;        //死区时间设置(0x0100,忽略PWM0DTH高四位)
  22.     PWMEN   = 0x11;        //PWM0和PWM01使能
  23.     while(1);
  24. }
复制代码


测出的实际波形如下:
5341a2a4888a3068eca7d0a6cc9110dc



kjkujkj21 发表于 2023-10-19 15:27 | 显示全部楼层
感谢楼主的分享,不错的想法。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

158

主题

4505

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部