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() {
}
TimerOne
和MsTimer2
的区别非常大,前者调用的是Timer1
是 16bit 定时器,分辨率可以达到1us,而后者调用Timer2
是8bit 定时器分辨率只能达到1ms。而且TimerOne
的函数方法要比MsTimer2
丰富。- 注意事项:中断程序内不能使用I2C、SPI、串口等通信协议
以上是关于Arduino UNO定时器的使用示例的主要内容,如果未能解决你的问题,请参考以下文章
Arduino UNO + Proteus串口通讯仿真实验汇总