×

Arduino的内部定时器

消耗积分:0 | 格式:zip | 大小:0.35 MB | 2023-02-09

王军

分享资料个

描述

概述

如果你需要计算准确的时间你需要使用定时器,但通常Arduino的内部定时器并不是那么容易使用,所以在本教程中我试图解释如何以一种简单的方式使用它们。

使用定时器非常重要,因为在 delay() 函数期间你不能做任何事情,但是使用定时器你可以做任何事情,因为当时刻到来时,它会激活中断。

我使用TIMER0是因为它是最简单的定时器,也许以后我会解释其他定时器。

怎么运行的

首先要看的是ATmega328P的datasheet。

 
timer_0K7VXXfOCm.GIF?auto=compress%2Cformat&gifq=35&w=740&h=555&fit=max
计数器框图
 

这是计数器框图,看看这个你就能明白它是如何工作的。

预分频器从一个时钟周期接收一个脉冲,然后将其传递给控制逻辑,因此控制逻辑将 TCNTn 寄存器递增 1。

现在我们可以将 TCNTn 的值与特定值进行比较。当 TCNTn 寄存器到达这个值时,您就知道它已经过了特定的时间。

这种方法称为“Clear Timer on Compare”的 CTC 模式。TCNTn 寄存器的值与 OCRn 寄存器进行比较,当比较匹配发生时,TOVn 产生中断。

另一个重要的事情是预分频器,你可以用它来创建不同的时钟分频,事实上 16MHz 太多了,但是,多亏了预分频器,你可以创建它的一些约数。这取决于 TCCR0B 寄存器的配置。

 
tccr0b_nCgnWOYkC0.GIF?auto=compress%2Cformat&gifq=35&w=740&h=555&fit=max
 

 

 
clock_GvgOJ9Hemx.GIF?auto=compress%2Cformat&gifq=35&w=740&h=555&fit=max
 

另一个重要的事情是确定 OCRn 寄存器的值以计算特定时间,您需要一点数学知识。

 
image_IqGWJ5PQC4.png?auto=compress%2Cformat&w=740&h=555&fit=max
 

我知道所有这些看起来都太复杂了,但我相信下面的代码会解决每个问题。

在这种情况下,我们每 0.001 秒激活一个中断请求。

 TCCR0A|=(1<;    //Set the CTC mode
)<> OCR0A=0xF9;            //Set the value for 1ms
 TIMSK0|=(1<;   //Set the interrupt request
)<> sei();                 //Enable interrupt
 TCCR0B|=(1<;    //Set the prescale 1/64 clock
)<> TCCR0B|=(1<;
)<>ISR(TIMER0_COMPA_vect){    //This is the interrupt request
}

在最后设置预分频器很重要,因为在这条指令之后定时器开始计数,如果你需要停止它,你必须重置 TCCR0B 的所有位。

下面有一个例子。

 

 


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !