毕业论文

当前位置: 毕业论文 > 范文 >

定时器中断是干嘛的?(5)

时间:2022-03-06 14:05来源:优尔论文
输入捕捉寄存器(仅适用于16位定时器) TIMSKx 定时器/计数器中断屏蔽寄存器;启用/禁用定时器中断 TIFRx 定时器/计数器中断标志寄存器;表示挂起的定时

输入捕捉寄存器(仅适用于16位定时器)

TIMSKx 定时器/计数器中断屏蔽寄存器;启用/禁用定时器中断

TIFRx 定时器/计数器中断标志寄存器;表示挂起的定时器中断

这里给个 Timer0 的寄存器,更多请参考技术文档。

2、预分频系数与比较匹配器

        Arduino UNO 时钟以16MHz运行。计数器的一个刻度值表示 1 / 16,000,000秒(~63ns),跑完1s需要计数值16,000,000。

(1)Timer0 和 Timer2 是8位定时器,可以存储最大计数器值255。

(2)Timer1 是一个16位定时器,可以存储最大计数器值65535。

        一旦计数器达到其最大值,它将回到零(这称为溢出)。因此,需要对时钟频率进行分频处理,即预分频器。通过预分频器控制定时计数器的增量速度。预分频器与定时器的计数速度如下:

  定时器速度(HZ) = Arduino UNO时钟速度(16MHz) / 预分频器系数

        因此,1预分频器将以16MHz递增计数器,8预分频器将在2MHz递增,64预分频器= 250kHz,依此类推。

        定时器 Timer0 的预分频系数配置如表:

        现在您可以用以下公式计算中断频率:

  中断频率(Hz)=(Arduino时钟速度16MHz)/(预分频器*(比较匹配寄存器+ 1))

        重新排列上面的等式,给出你想要的中断频率,你可以求解比较匹配寄存器值:

  比较匹配寄存器= [16,000,000Hz /(预分频器*所需的中断频率)] - 1

        当你使用定时器0和2时,这个数字必须小于256,对于timer1小于65536。

        所以如果你想每秒一次中断(频率为1Hz):

  比较匹配寄存器= [16,000,000 /(预分频器 * 1)] -1

        预分频器为1024,你得到:

  比较匹配寄存器= [16,000,000 /(1024 * 1)] -1 = 15,624

        因为256 <15,624 <65,536,你必须使用timer1来实现这个中断。

3、定时器模式

        定时器可以配置为不同的模式。

(1)PWM模式。 纸浆宽度调制模式。 OCxy输出用于生成PWM信号

(2)CTC模式。 比较匹配时清除计时器。 当定时器计数器到达比较匹配寄存器时,定时器将被清除。

        定时器 Timer0 的模式选择配置如表:

 3。3 定时器的配置

int toggle0,toggle1,toggle2;

  void setup(){

  cli();关闭全局中断

  //设置定时器0为10kHz(100us)

  TCCR0A = 0;//将整个TCCR0A寄存器设置为0

  TCCR0B = 0;//将整个TCCR0B寄存器设置为0

  TCNT0  = 0;//将计数器值初始化为0

  //设置计数器为10kHZ,即100us

  OCR0A = 24;//比较匹配寄存器= [16,000,000Hz /(预分频器*所需中断频率)] - 1

             //比较匹配寄存器=24,中断间隔=100us即中断频率10khz

  TCCR0A |= (1 << WGM01);//打开CTC模式

  TCCR0B |= (1 << CS01) | (1 << CS00); //设置CS01位为1,CS00位为1(64倍预分频)   

  TIMSK0 |= (1 << OCIE0A);//启用定时器比较中断

  //设置定时器1为1kHz

  TCCR1A = 0;//将整个TCCR1A寄存器设置为0

  TCCR1B = 0;//将整个TCCR1B寄存器设置为0

  TCNT1  = 0;//将计数器值初始化为0 定时器中断是干嘛的?(5):http://www.youerw.com/fanwen/lunwen_90686.html

------分隔线----------------------------
推荐内容