Arduino UNO定时器的使用示例

Posted perseverance52

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Arduino UNO定时器的使用示例相关的知识,希望对你有一定的参考价值。

Arduino 定时器的使用示例

  • Arduino UNO板而言,它的控制芯片是atmega328,它有0、1、2三个定时计数器,除了定时中断,它们还可以控制引脚pwm输出,通过查询芯片手册和引脚分布可知这三个定时器分别控制的引脚。

T/C0: Pin6(OC0A)和Pin5(OC0B)

T/C1: Pin9(OC1A)和Pin10(OC1B)

T/C3: Pin11(OC2A)和Pin3(OC2B)

实际上Arduino已经将T/C0的溢出中断运用到了delay()、delayMicroseconds、millis()、micros()中,这些函数都写在了Arduino核心代码wiring.c文件中,

  • 注意: Arduino 的 PWM 输出是依靠内置的3个 Timer 来控制的,所以 Timer1 会同时影响到 D9、D10 两个端口的 analogWrite() 方法,但可以通过调用
  • Timer1.pwm(pin, duty, period) 来设定,duty 是占空比(分辨率为10bits,取值0~1023),period 是可选参数,设定周期,如果不设定则为默认值,范围为 1 ~ 8388480us,即最大可产生1MHz方波

使用定时器让板载LED每0.5s切换一下状态示例:TimerOne 库函数调用的是 Timer1 定时器。

#include "TimerOne.h"
void setup()
{
 pinMode(13, OUTPUT);
 Timer1.initialize(500000); // 初始化 Timer1 ,定时器每间隔 0.5s(500000us = 500ms = 0.5s)执行中断函数一次
 Timer1.pwm(9, 512); // 设置D9 PWM 占空比为50%
 Timer1.attachInterrupt(Flash); // 设定 callback 为 Timer 的中断函数 
}
void Flash()
{
 digitalWrite(13, digitalRead(13) ^ 1);// “^”异或符,如果为HIGH,输出 LOW,反之亦然
}
void loop()
{
}
  • MsTimer2
#include <MsTimer2.h>
void Flash() {
 digitalWrite(13, digitalRead(13) ^ 1);
}
void setup() {
 pinMode(13, OUTPUT);
 MsTimer2::set(500, Flash); // 定时器间隔 0.5s (500ms = 0.5s)
 MsTimer2::start();//开始计时
}
void loop() {
}
  • TimerOneMsTimer2 的区别非常大,前者调用的是Timer1 是 16bit 定时器,分辨率可以达到1us,而后者调用Timer2 是8bit 定时器分辨率只能达到1ms。而且 TimerOne 的函数方法要比 MsTimer2 丰富。
  • 注意事项:中断程序内不能使用I2C、SPI、串口等通信协议

以上是关于Arduino UNO定时器的使用示例的主要内容,如果未能解决你的问题,请参考以下文章

Arduino UNO + Proteus串口通讯仿真实验汇总

Proteus仿真Arduino UNO步进电机驱动示例

Proteus仿真VSM Studio Arduino UNO串口通讯示例

用Proteus仿真Arduino UNO ADC模数转换

Arduino UNO ADC模拟按键检测原理介绍

Arduino UNO AT25F512示例程序