PWM 周期=[PWMT+1]*Tosc*(CLKDIV 分频值)
这个公式描述了脉冲宽度调制(PWM)的周期计算方法:
- PWM周期:指的是一个完整的PWM波形的周期时间,通常以时间单位表示,比如毫秒或微秒。
- PWMT:表示PWM定时器的预设值。
- Tosc:是振荡器周期时间,即一个振荡周期的时间。通常以时间单位表示,比如秒或者微秒。
- CLKDIV分频值:指的是时钟分频器的分频值,用于控制时钟信号的频率。
根据这个公式,首先你需要计算[PWMT+1]*Tosc,然后乘以时钟分频器的分频值,就可以得到PWM的周期。
脉冲宽度 = (PWMDx[9:0]+1)*TOSC*(CLKDIV 分频值)
这个公式描述了计算脉冲宽度的方法:
- 脉冲宽度:指的是PWM信号的高电平持续时间,通常以时间单位表示,比如毫秒或微秒。
- PWMDx[9:0]:表示PWM寄存器中的预设值,用于确定PWM的高电平持续时间。这里的[9:0]表示该寄存器中包含了10位的值。
- TOSC:是振荡器的周期时间,即一个振荡周期的时间。通常以时间单位表示,比如秒或者微秒。
- CLKDIV分频值:指的是时钟分频器的分频值,用于控制时钟信号的频率。
根据这个公式,首先你需要将PWMDx[9:0]的值加1,然后乘以TOSC和时钟分频器的分频值,就可以得到脉冲的宽度。
PWM 占空比计算公式:
占空比= ( PWMDx[9:0]+1) / ( PWMT [ 9:0 ] +1)
举例说明:
void Set_PWM()
{
PWMTL = 0x8f; //PWM0~3共周期,周期低位
PWMT4L = 0x8f; //PWM4独立周期,周期低位
PWMTH = 0B00001101; //周期高两位及PWM4占空比高两位
//PWM0~3周期为:(0B110001111+1)*(1/16)*2 =50uS
//PWM4周期为:(0B1110001111+1)*(1/16)*2 =114uS
PWMD01H = 0x00; //高位改变后不能立即生效,需要给占空比的低位寄存器后才能加载
//PWM0 占空比设置为20%
PWMD0L = 0x4F; //(79+1)/(399+1) = 20%
//PWM1 占空比设置为40%
PWMD1L = 0x9F; //(159+1)/(399+1) = 40%
PWMD23H = 0x10;
//PWM2 占空比设置为60%
PWMD2L = 0xEF; //(239+1)/(399+1) = 60%
//PWM3 占空比设置为80%
PWMD3L = 0x3F; //(319+1)/(399+1) = 80%
//PWM4 占空比设置为25%
PWMD4L = 0xE3; //(227+1)/(911+1) = 25%
PWM01DT = 0x3F; //死区时间,低6位有效位=(0B00111111+1)*(1/16)*1 =4uS
PWM23DT = 0;
PWMCON2 = 0B00000000; //正常输出
PWMCON1 = 0B00000000; //PWM01位置选择为RB5/RB4;禁止死区;可使能PWM0/1互补,PWM2/3互补
PWMCON0 = 0B00111111; //PWM分频Fosc/2,使能PWM0、PWM1、PWM2、PWM3、PWM4
}
以PWM0为例,PWM0的占空比高2位是00,低8位是0100 1111,即0x04F,十进制为79,
PWM0的周期高2位是01,低8位是1000 1111,即0x18F,十进制为399
(PWM0的周期由一个10位的值组成,高2位为01,低8位为1000 1111,即0x18F。要将这个值解释为一个十进制数,可以使用以下方法:
- 首先,将高2位与低8位组合成一个完整的10位二进制数。高位01,低位10001111,组合起来为0110001111。
- 将这个10位二进制数转换为十进制数。在这种情况下,0110001111的十进制表示为399)
根据公式3 占空比=(PWMDx[9:0]+1)/(PWMT[9:0]+1),可以计算出占空比为(79+1)/(399+1)=20%