打印
[STM32G4]

关于多定时器中断定时不准确的问题

[复制链接]
2486|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Hi,all

系统开了俩个定时器中断,其中一个周期50us,优先级最高(实际执行时间约为23us)。第二个周期500us,优先级次之

我发现实际在系统运行的时候,500us中断的任务周期部分点存在超时,变为525us以上,进一步导致数据处理偏差较大:电机恒定500rpm转速运行时,转速有个周期约为1s波动。
实际500us内任务的执行时间较短,执行时间40us以内。

然后为了验证是否500us中断定时不准导致的数据,我在main函数内开了一个500us的任务,将原任务放在此处执行,此时数据正常了。并且main函数的500us任务定时也基本是准的。它是由50us任务累加十次在main的死循环中触发一下

这边不明白的main死循环函数的优先级低于定时器任务,为什么反而它更准呢?
猜想是不是可能500us刚开始运行时此时来了50us任务,500us被打断了,被顺延了一个50us任务的执行时间?500us任务的输入原始数据是在50us任务内采集保存在buffer里面的,500us任务只执行计算。此时就算被打断应该也不影响速度的正常计算吧?

同时想请教大家如果不使用RTOS(最快只有1ms任务),怎么能开俩个互补影响的定时器任务呢?我目前的设置是不是有问题呢?

转速1s周期异常波动.png (148.53 KB )

转速1s周期异常波动

转速1s周期异常波动

转速1s周期异常波动.png (148.53 KB )

转速1s周期异常波动.png

脉宽触发.jpg (319.92 KB )

脉宽触发.jpg

NVIC配置.png (330.45 KB )

NVIC配置.png

500us定时器配置.png (309.47 KB )

500us定时器配置.png

使用特权

评论回复
沙发
xuanhuanzi| | 2024-6-9 18:10 | 只看该作者
异常波动是什么造成的。

使用特权

评论回复
板凳
qintian0303| | 2024-6-10 15:46 | 只看该作者
一个周期50us,优先级最高(实际执行时间约为23us),这么小的周期你是如何测试出来的?

使用特权

评论回复
地板
qqqasdfc| | 2024-6-10 23:45 | 只看该作者
厉害

使用特权

评论回复
5
Hufei1994|  楼主 | 2024-6-11 08:51 | 只看该作者
qintian0303 发表于 2024-6-10 15:46
一个周期50us,优先级最高(实际执行时间约为23us),这么小的周期你是如何测试出来的? ...

是用示波器测量GPIO翻转实现的

使用特权

评论回复
6
cr315| | 2024-6-12 10:24 | 只看该作者
优化中断处理

使用特权

评论回复
7
呐咯密密| | 2024-6-12 15:05 | 只看该作者
我看了一下,大致是两个问题,第一个是你的50us中断23us触发了,是不是设置有问题,预分频器和重装载值不正确。其次是500us这个和50us(如果设置错误,应该是25us)属于倍数关系,当两个定时器同时启动,在计数到500us时候,两个中断会同时触发,但是50us的优先级高会优先被触发,这就导致500us这个中断可能会在50us这个中断结束后才会被触发

使用特权

评论回复
8
呐咯密密| | 2024-6-12 15:06 | 只看该作者
仅仅是猜测,不对论述结果正确性负责

使用特权

评论回复
9
jcky001| | 2024-6-12 16:00 | 只看该作者
考虑在中断处理函数中仅设置标志位,然后在主循环中根据这些标志位来执行相应的任务。这样可以减少中断处理函数的执行时间,并允许主循环在适当的时候处理任务。

使用特权

评论回复
10
laocuo1142| | 2024-6-12 16:59 | 只看该作者
在中断处理函数中避免锁定任何资源

使用特权

评论回复
11
Hufei1994|  楼主 | 2024-6-12 19:06 | 只看该作者
呐咯密密 发表于 2024-6-12 15:06
仅仅是猜测,不对论述结果正确性负责

感谢解答,问题已经解决了。
导致问题的原因是高级定时的ARR值设置成了期望值减1(170Mhz的MCU,中心对齐模式,ARR设置成了4250-1),正确值应该是就是期望值,不用减1,进而导致50us计时不准,然后应该是造成了周期性偏移,但是为啥周期是1s还没想明白

使用特权

评论回复
12
flycamelaaa| | 2024-6-12 20:26 | 只看该作者
检查硬件定时器的精度和稳定性。有时,硬件定时器本身可能存在一些误差或抖动。

使用特权

评论回复
13
powerantone| | 2024-6-13 10:00 | 只看该作者
如果硬件定时器无法满足需求,可以考虑使用软件定时器。例如,在主循环中使用一个计数器来模拟定时器。这种方法虽然不如硬件定时器精确,但在某些情况下可能足够用。

使用特权

评论回复
14
香水城| | 2024-6-17 11:38 | 只看该作者
Hufei1994 发表于 2024-6-12 19:06
感谢解答,问题已经解决了。
导致问题的原因是高级定时的ARR值设置成了期望值减1(170Mhz的MCU,中心对齐 ...

定时器时基参数的设置这个地方要注意类似细节。

对于单向计数模式,即向上或向下计数模式,计数周期为 ARR+1个计数时钟;

对于中心对齐计数模式,即向上和向下计数模式,计数周期为 2*ARR个时钟;

使用特权

评论回复
15
EmmaTT| | 2024-6-18 21:17 | 只看该作者
rtos是不是反应比裸机慢啊

使用特权

评论回复
16
大鹏2365| | 2024-7-28 23:14 | 只看该作者
在没有RTOS的情况下,主循环通常会比中断优先级低。您提到主循环中的500us任务正常运行,可能是因为主循环的调度更加简单,而不涉及中断的嵌套和优先级问题。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

28

主题

160

帖子

0

粉丝