标题:
AVR单片机定时器重装初值如何计算?
[打印本页]
作者:
hxdby
时间:
2022-2-14 16:36
标题:
AVR单片机定时器重装初值如何计算?
大家好,
我用Atmel的ATMEGA328PB 单片机,之前用定时器时,基本都是1s进一次溢出中断,1s的初值计算,我是这么算的:
用ATMEGA328PB内部时钟8M,分配给定时器的时钟也是8M,内部预分频256后,定时器时钟为8M/256= 31250Hz
这意味着1s内定时器会计数31250次,所以16位的定时器,定时1s进一次中断的初值为:65536(2的16次方)- 31250=34280
34280对应的十六进制为85EE,对应的定时器初值高八位为TCNT1H=0x85, 对应的定时器初值低八位为TCNT1L=0xEE.
通过这样计算,我经过测试,确实可以产生1s进一次中断的效果,说明没什么问题,我也一直在这么用。
但是我现在想产生1ms进一次中断的效果,根据上面的思路,1s定时器要计数31250次,所以推导1ms定时器要计数31250/1000ms=31.25次,四舍五入取个31次。
计算初值为65536-31=65505,得到初值的十六进制为FFE1, TCNT1H=FF, TCNT1L=E1.
但实际情况是,这似乎是错的,我写了一段测试代码进行测试,发现这个初值并不能产生1ms进一次中断,实际好像比1ms低很多,可能是微秒级。我写了段数码管显示代码来显示一串数字3秒钟,变量设置的是3000ms, 但实际开机时,数字一闪就没了,根本显示不到3s, 说明这个初值可能是不对的。
我的整个程序中开了三个定时器中断,其中一个是1ms, 另外两个是1s, 我把测试代码放到1s中断中没问题,但是1ms是有问题的。
有大神能帮助看看,这个初值计算是哪里有问题吗?感谢!
作者:
wc86110
时间:
2022-2-15 05:43
说得云里雾里的直上代码更直白些,另外开三个定时器中断它是需要时间来处理的
作者:
温xyz
时间:
2022-2-15 08:48
为什么要用到三个定时器?并且有两个1秒的?
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1