掌握 Arduino 内部定时器实现精准定时
组件与物料
| 组件 | 数量 |
|---|---|
| Arduino UNO | 1 |
| LED | 1 |
| 220Ω 电阻 | 1 |
项目简介
Arduino 内部定时器可实现精准定时,且不阻塞主循环。本教程以 Timer0 为例,详解 CTC 模式、预分频器、比较匹配中断配置,附带 1ms 定时翻转 LED 示例。
核心原理
- 计数器 TCNTn:每个时钟周期递增
- 预分频器:将 16MHz 系统时钟分频(1/8, 1/64, 1/256, 1/1024)
- CTC 模式:当 TCNTn 达到 OCRn 值时触发比较匹配中断,自动清零
- 中断向量:
TIMER0_COMPA_vect
关键寄存器配置
// 设置 CTC 模式
TCCR0A |= (1 << WGM01);
// 设置比较值:16MHz / 64 / 1000Hz = 250 -> 0xF9 (249)
OCR0A = 0xF9;
// 启用比较匹配 A 中断
TIMSK0 |= (1 << OCIE0A);
// 全局中断使能
sei();
// 设置预分频 1/64 (CS01=1, CS00=1)
TCCR0B |= (1 << CS01) | (1 << CS00);
完整示例:1 秒翻转 LED
int timer = 0;
bool state = 0;
void setup() {
pinMode(13, OUTPUT);
TCCR0A = (1 << WGM01); // CTC 模式
OCR0A = 0xF9; // 1ms @ 16MHz/64
TIMSK0 |= (1 << OCIE0A); // 启用中断
sei(); // 全局中断使能
TCCR0B |= (1 << CS01) | (1 << CS00); // 预分频 64,启动定时器
}
void loop() {
if (timer >= 1000) { // 1000ms = 1秒
state = !state;
timer = 0;
}
digitalWrite(13, state);
}
ISR(TIMER0_COMPA_vect) {
timer++; // 每 1ms 执行一次
}
注意事项
- 预分频设置必须放在最后,设置后定时器立即开始计数
- 停止定时器需清零 TCCR0B 所有位
- Timer0 被
millis()/delay()占用,修改可能影响标准库函数 - 更复杂应用可使用 Timer1 (16位) 或 Timer2
原理图

制造工艺
- DIY 蓝牙控制 Arduino 间谍小车
- FlickMote:基于手势的智能家居红外遥控器
- DIY Arduino TV-B-Gone:万能关机遥控器
- 自制大尺寸LED主时钟带闹钟功能 — 12米外清晰可见
- Find Me:基于 Arduino 与蓝牙的智能寻物器制作指南
- Arduino 项目优化供电方案:从按键开关到电池监测与数据记录
- Arduino 井字棋游戏:MAX7219 点阵屏 + 纸板外壳 DIY
- 从零构建智能 Arduino 四足机器人:完整指南
- DIY Arduino 手柄方向盘 - 游戏竞速模拟器自制指南
- 利用 Arduino Nano R3 自制全功能 CNC 雕刻机
- Earth Analyzer:面向精准农业的多模态物联网环境监测巡检车
- 基于 Arduino Mega 与物联网传感器的高级家庭监控系统