找回密码
 立即注册
楼主: et***

使用STC32G12K128芯片INT0中断测量脉冲宽度问题

[复制链接]

该用户从未签到

46

主题

3109

回帖

7011

积分

超级版主

积分
7011
发表于 2024-5-2 16:56:03 | 显示全部楼层
本帖最后由 梁工 于 2024-5-2 18:20 编辑
etec 发表于 2024-5-2 16:14
您好,梁工,按照您的建议,我再INT0中断中,读取T3定时器值前,先停止T3计数,读取完后,再启动那个T3定 ...

我没有用过STM8S105,不知道其读取定时器16位值的机理,有的MCU读取时,是会瞬间读取16位或锁存16位的值,所以不会存在问题。
但是51的架构,每次读只能读取一个字节,如果不停止计数器,不管先读TH3还是先读TL3,均有可能在读取一个字节后,刚好出现进位,再读取另一字节,组合成16位就出错了,具体例子:
比如当先计数值为0x03ff,先读取高字节0x03,刚读完,计时器+1,变成了0x0400,然后读取低字节得到0x00,则本次读取数值为0x0300,少了255。
比如当先计数值为0x03ff,先读取低字节0xff,刚读完,计时器+1,变成了0x0400,然后读取高字节得到0x04,则本次读取数值为0x04ff,多了256。
避免方法是:
1、读之前关闭定时器。读取完成再开启定时器。
2、先读高字节,再读低字节,再比较一下刚才读的高字节与当前的高字节是否相等,不相等意味着出现进位,则高字节=1或重读高字节即可。

STC的PWM用于捕捉模式则不会有上述问题,下降沿出现时,瞬间锁存16位计数值,过一会去读取都没有问题,并且误差不超过1个时钟。
回复 支持 反对 送花

使用道具 举报

该用户从未签到

3

主题

8

回帖

43

积分

新手上路

积分
43
 楼主| 发表于 2024-5-2 17:36:40 | 显示全部楼层
梁工 发表于 2024-5-2 16:56
我没有用过STM8S105,捕捉掉其读取定时器16位值的机理,有的MCU读取时,是会瞬间读取16位或锁存16位的值 ...

好的,梁工,我理解了,非常感谢!
回复 支持 反对 送花

使用道具 举报

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

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2024-5-29 18:56 , Processed in 0.073995 second(s), 31 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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