STC15w4k61s4增强型6通道pwm频率失控问题
如图所示在控制占空比变化过程中,中间一小段pwm波形的频率变为设定频率的一半占空比变为50,导致占空比输出应为87实际为13,求各位大佬帮忙看一下本帖最后由 梁工 于 2023-3-20 21:46 编辑
STC15W4K系列的15位PWM是用匹配取反的方式实现的,所以一定要在PWM周期中断里更新占空比数据,避临界情况出现(占空比反转,比如本来占空比20%变成80%)。我最早的四轴飞行器飞控版本就是STC15W4K做的,只要遵循上述操作,PWM就会不会异常,飞了几年四轴没失控过的。
到了STC8A8K64D4和STC8G2K系列的15位PWM改进为匹配点输出1或0,不会出现占空比反转的情况,但依旧要在周期中断中更新占空比(不过临界情况最多影响一个周期)。
STC8H系列、STC32G系列的高级PWM是比较输出方式,也不会出现占空比翻转。 梁工 发表于 2023-3-16 11:59
STC15W4K系列的15位PWM是用匹配取反的方式实现的,所以一定要在PWM周期中断里更新占空比数据,避临界情况出 ...
好的谢谢,我去试一试:handshake 梁工 发表于 2023-3-16 11:59
STC15W4K系列的15位PWM是用匹配取反的方式实现的,所以一定要在PWM周期中断里更新占空比数据,避临界情况出 ...
你好梁工,我在中断里更新T2的值还是会出现反转的情况,在某个周期里T2没反转电平,代码如下
void pwminit(void)
{
//IP2 |=0x04;
P_SW2 |= 0x80;
PWMCFG = 0x00;
PWMCKS = 0x01;
PWMC = CTL_CYCLE;
PWM3CR = 0x00;
PWM3T1 = 0x00;
PWM3T2 = CTL_CYCLE/2;
PWMCR |= 0xc0;
P_SW2 &=~0x80;
}
void PWM_int(void) interrupt 22
{
if(PWMIF & 0x40)
{
PWMIF &=~0x40;
ceshi=!ceshi;
if((ctl_duty>0)&&(ctl_duty<100))
{
if(last_pwmt2_count!=pwmt2_count)
{
last_pwmt2_count=pwmt2_count;
P_SW2 |= 0x80;
PWM3T2 = pwmt2_count;
PWMCR |= 0x02; //设置为pwm输出口
P_SW2 &=~0x80;
}
}else if(ctl_duty>=100)
{
PWMCR &=~0x02;
ctl_pul=1;
}else if(ctl_duty<=0)
{
PWMCR &=~0x02;
ctl_pul=0;
}
}
} 星染 发表于 2023-3-20 17:42
你好梁工,我在中断里更新T2的值还是会出现反转的情况,在某个周期里T2没反转电平,代码如下
...
会不会是别的中断耽误了时间?PWM中断更新不容易出现问题的。 梁工 发表于 2023-3-20 21:48
会不会是别的中断耽误了时间?PWM中断更新不容易出现问题的。
别的中断都关了,主程序里边的其他东西都去了还是空一个周期 星染 发表于 2023-3-21 10:34
别的中断都关了,主程序里边的其他东西都去了还是空一个周期
这样更不应该出现问题,我用这个芯片的PWM有10年了,从没出现过翻转。你先测试一下我们的例子吧。 梁工 发表于 2023-3-21 10:47
这样更不应该出现问题,我用这个芯片的PWM有10年了,从没出现过翻转。你先测试一下我们的例子吧。 ...
解决了梁工,判断一下赋值给T2的变量范围就行了合理就更新T2 星染 发表于 2023-3-24 15:20
解决了梁工,判断一下赋值给T2的变量范围就行了合理就更新T2
值不能太小,也不能太大,否则来不及更新就会导致出错。 STC的高级PWM的功能实在是强大,我已受益匪浅,但是到如今再次使用还是有些犯晕出错!!后续还是得以梁工等的自动点才慢慢领悟一些,惭愧!
页:
[1]
2