Arduino 的内部定时器
组件和用品
| × | 1 | ||||
| × | 1 | ||||
| × | 1 |
关于这个项目
概览
如果您需要计算准确的时间,您需要使用计时器,但通常使用 Arduino 的内部计时器并不那么容易,所以在本教程中,我尝试以简单的方式解释如何使用它们。
使用计时器非常重要,因为在 delay() 函数期间您不能做任何事情,但是使用计时器您可以做任何事情,因为当时刻到来时,它会激活中断。
我使用TIMER0是因为它是最简单的定时器,也许以后我会解释其他定时器。
工作原理
首先要看ATmega328P的datasheet。
这是计数器框图,看看这个你可以理解它是如何工作的。
预分频器从一个时钟周期接收一个脉冲,然后将其传递给控制逻辑,因此控制逻辑将 TCNTn 寄存器加 1。
现在我们可以将 TCNTn 的值与特定值进行比较。当TCNTn寄存器到达这个值时,就知道过了特定的时间。
此方法称为“比较时清除计时器”的 CTC 模式。 TCNTn 寄存器的值与 OCRn 寄存器进行比较,当发生比较匹配时,TOVn 产生中断。
另一个重要的是预分频器,通过它您可以创建时钟的不同分频,实际上 16MHz 太多了,但是,多亏了预分频器,您可以创建它的一些约数。这取决于TCCR0B寄存器的配置。
另一个重要的事情是确定OCRn寄存器的值来计算特定的时间,你需要一点数学。
我知道所有这些看起来都太复杂了,但我相信下面的代码会解决每个问题。
在这种情况下,我们每 0.001 秒激活一个中断请求。
TCCR0A|=(1<
最后设置预分频器很重要,因为在这条指令之后定时器开始计数,如果你需要停止它,你必须重置TCCR0B的所有位。
下面是一个例子。
代码
- 内部定时器
内部定时器Arduino
/*该程序使用内部定时器每 1 秒打开和关闭引脚 13 上的 LED*/int timer=0;bool state=0;void setup() { pinMode(13,OUTPUT); TCCR0A=(1<=1000){ state=!state;定时器=0; } digitalWrite(13,state); }ISR(TIMER0_COMPA_vect){ //这是中断请求定时器++;}
示意图
制造工艺