硬汉嵌入式论坛

 找回密码
 立即注册
查看: 811|回复: 5
收起左侧

[MDK] 定时器PWM,使用安富莱tim_pwm例程进行对舵机的控制,舵机是工作在50Hz,根据2.5%~12.5%占空比来调节角度的

[复制链接]

4

主题

11

回帖

23

积分

新手上路

积分
23
发表于 2024-12-10 10:45:40 | 显示全部楼层 |阅读模式
使用安富莱tim_pwm例程进行对舵机的控制,舵机是工作在50Hz,根据2.5%~12.5%占空比来调节角度的。因此如果输出一个50Hz,占空比为7.5%的话,舵机理应旋转90度。
但是根据实验现象,使用bsp_SetTIMOutPWM(GPIOB, GPIO_Pin_6, TIM4, 1, 50, 50*15);,发现舵机只能旋转八十多度,使用逻辑分析仪进行采样,发现实际占空比与7.5%相差有点大。
请问这是定时器的精度本来就如此,还是其他什么原因呢?

回复

使用道具 举报

4

主题

11

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2024-12-10 10:48:55 | 显示全部楼层
图片没发成功,在这里附图
逻辑分析仪.png
主函数简单测试.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 2024-12-10 15:23:31 | 显示全部楼层
帮你测试了下,还可以,需要精度高点,可以自己微调下。

7.3%

123345.png
回复

使用道具 举报

4

主题

11

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2024-12-10 18:21:50 | 显示全部楼层
eric2013 发表于 2024-12-10 15:23
帮你测试了下,还可以,需要精度高点,可以自己微调下。

7.3%

好的硬汉哥,那我给他补偿一下,感谢
回复

使用道具 举报

4

主题

11

回帖

23

积分

新手上路

积分
23
 楼主| 发表于 2024-12-17 11:13:53 | 显示全部楼层
发现问题了,不是定时器精度的问题。是硬汉哥的bsp_tim_pwm在计算pulse = (_ulDutyCycle * usPeriod) / 10000;时,会损失精度。

例如,我对舵机进行控制,设置的PWM时使用的是50Hz,根据2.5%~12.5%占空比来调节角度。
所以在bsp_tim_pwm中被配置为
usPrescaler = 10000 - 1;
usPeriod = (uiTIMxCLK / 10000) / _ulFreq - 1;    //即usPeriod = 144 - 1;
若设置占空比位7.5%,即ulDutyCycle = 750;
则pulse = (_ulDutyCycle * usPeriod) / 10000;     //即pulse = 10;  
可以看到,pulse 小数点之后.725的精度被损失了。
经计算,此时占空比=pulse / period = 10 / 143 = 0.0699,与本人实测相符

综上,占空比是由pulse / usPeriod 来决定的,这也就导致了对舵机这种需要更精准控制占空比的PWM不太准确,只能大幅度转动。

本人初学,现只能想到将Period设置得更大,这样就可以使pulse不需要除以一个10000这么大的数,进而损失了PWM精度
bsp_tim_pwm.png
回复

使用道具 举报

1万

主题

7万

回帖

11万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
116225
QQ
发表于 2024-12-18 08:47:57 | 显示全部楼层
cyyzlh 发表于 2024-12-17 11:13
发现问题了,不是定时器精度的问题。是硬汉哥的bsp_tim_pwm在计算pulse = (_ulDutyCycle * usPeriod) / 100 ...

对,这个地方是一个点,可以根据自己的需要调节下。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2025-6-10 14:44 , Processed in 0.254948 second(s), 28 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表