本帖最后由 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);
}
测出的实际波形如下:
|