嵌入式技术论坛
直播中

张龙祥

9年用户 1314经验值
擅长:连接器
私信 关注
[问答]

是什么原因导致PWM无法输出占空比100%的?

使用场景

RTT 5.0.0
STM32F429
PWM14通道1
硬件上使用开漏输出

具体问题

1.初始化设置pwm占空比

直接设置占空比为100%,如图

2.jpg

定时器寄存器截图如下

2.jpg

代码如下

static void timer_callback(void *parameter)
{
volatile float duty = 0;//占空比
volatile uint32_t output = 0;
output = 1 * PERIOD;
return rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, PERIOD, output);
}

使用裸机上的驱动移植到RTT上运行

定时器寄存器截图如下

2.jpg

占空比100%

2.jpg

问题原因分析

RTT的STM32的PWM驱动代码

想要PWM输出高电平,占空比设置100%。就得设置PWM脉宽大于周期时间。

RTT的STM32的PWM驱动代码在PWM脉宽大于周期时间时,强制等于周期时间。

这样会导致计数值会计数到周期时间,即CCR=CNT时,导致电平拉低。

2.jpg

如STM32资料所示,当CCR>ARR时,才能输出完整的高电平。

CCR=ARR时,会有一个脉冲发出

2.jpg

对应强制等于周期时间代码如下,最大只能为CCR=ARR,所以无法输出高电平

rt_err_t drv_pwm_set()
{
........
else if (pulse > period)
{
pulse = period;
}
.......
}

应修改为判断脉宽大于等于周期时,即默认用户需要使用高电平,输出占空比100%时

让CCR>ARR,输出高电平
rt_err_t drv_pwm_set()
{
........
else if (pulse >= period)
{
pulse = period + 1;
}
.......
}

回帖(6)

李秀兰

2023-1-10 16:45:42
要把底层 PWM (定时器)设置的值打印出来,确认是否有偏差
举报

张龙祥

2023-1-10 16:45:51
我找到问题了,驱动代码内把CCR值减一了。
可以帮忙看一下我分析的对不对
举报

李秀兰

2023-1-10 16:46:01
这个地方再确认下 PWM 为 0 的极端情况就可以了
比如 0 是,是否为 低电平,具体这个值设置范围,需要看下MCU手册
举报

张龙祥

2023-1-10 16:46:12
0的话是低电平已验证了
举报

李秀兰

2023-1-10 16:46:21
那就问题不大了,可以这么改
举报

张龙祥

2023-1-10 16:46:31
那样改的话会导致频率有点误差。
我又分析了一遍,看一下这样改是不是更合适
举报

更多回帖

发帖
×
20
完善资料,
赚取积分