计时器是微控制器的重要功能,使您可以精确执行任务,而无需依赖延迟。 Arduino Uno具有三个内置硬件计时器(Timer0,Timer1和Timer2),可以为各种功能进行配置,例如生成PWM信号,计时事件或调度任务。本教程将指导您了解和使用Arduino计时器。
你需要什么
- Arduino Uno(或兼容板)
- LED和220-OHM电阻(用于基于计时的示例)
- 面包板和跳线电线
- Arduino IDE安装在您的计算机上
步骤1:了解Arduino计时器
Arduino Uno的Atmega328p微控制器有三个硬件计时器:
计时器 | 位分辨率 | 主要用法 |
---|---|---|
timer0 | 8位 | Millis(),micros(),PWM 5,6 |
timer1 | 16位 | PWM的Servo Library,第9、10号 |
timer2 | 8位 | tone()函数,pwm 3,11 |
计时器的关键特征
- 计时器可以生成PWM信号。
- 计时器可以触发中断。
- 计时器由Arduino函数内部使用,例如
delay()
和millis()
.
步骤2:生成简单的PWM信号
PWM(脉冲宽度调制)信号通常用于控制LED亮度或运动速度。让我们使用timer0创建一个PWM信号。
示例代码:使用PWM的LED亮度控制
#define ledPin 6 // Pin 6 uses Timer0 for PWM
void setup() {
pinMode(ledPin, OUTPUT);
}
void loop() {
for (int brightness = 0; brightness <= 255; brightness++) {
analogWrite(ledPin, brightness); // Increase brightness
delay(10);
}
for (int brightness = 255; brightness >= 0; brightness--) {
analogWrite(ledPin, brightness); // Decrease brightness
delay(10);
}
}
步骤3:使用中断的计时器
您可以将计时器配置为定期触发中断。例如,可以设置timer1以每秒切换LED。
示例代码:timer1中断
#define ledPin 13 // Built-in LED
void setup() {
pinMode(ledPin, OUTPUT);
// Configure Timer1
noInterrupts(); // Disable interrupts during setup
TCCR1A = 0; // Clear Timer1 control registers
TCCR1B = 0;
TCNT1 = 0; // Initialize counter value to 0
OCR1A = 15624; // Compare match register (1Hz at 16MHz with 1024 prescaler)
TCCR1B |= (1 << WGM12); // CTC mode
TCCR1B |= (1 << CS12) | (1 << CS10); // 1024 prescaler
TIMSK1 |= (1 << OCIE1A); // Enable Timer1 compare interrupt
interrupts(); // Enable interrupts
}
ISR(TIMER1_COMPA_vect) {
digitalWrite(ledPin, !digitalRead(ledPin)); // Toggle LED
}
void loop() {
// Main loop does nothing; timer handles the LED
}
步骤4:用计时器测量时间
您可以使用计时器来测量精确的持续时间。 Timer2适用于小间隔,因为它是8位计时器。
示例代码:timer2用于时间测量
volatile unsigned long overflowCount = 0;
void setup() {
Serial.begin(9600);
// Configure Timer2
noInterrupts();
TCCR2A = 0;
TCCR2B = 0;
TCNT2 = 0;
TCCR2B |= (1 << CS22); // Prescaler 64
TIMSK2 |= (1 << TOIE2); // Enable Timer2 overflow interrupt
interrupts();
}
ISR(TIMER2_OVF_vect) {
overflowCount++;
}
void loop() {
unsigned long timeElapsed = overflowCount * 16.384; // Each overflow = 16.384ms
Serial.print("Time elapsed: ");
Serial.print(timeElapsed);
Serial.println(" ms");
delay(1000);
}
步骤5:使用计时器库
为了简化与计时器的合作,您可以使用诸如 定时龙 或者 计时.
使用计时库
- 将计时库安装在Arduino IDE中。
- 使用它轻松安排任务:
#include <TimerOne.h>
#define ledPin 13
void toggleLED() {
digitalWrite(ledPin, !digitalRead(ledPin));
}
void setup() {
pinMode(ledPin, OUTPUT);
Timer1.initialize(1000000); // Set timer to 1 second (1,000,000 microseconds)
Timer1.attachInterrupt(toggleLED); // Attach the interrupt function
}
void loop() {
// Main loop does nothing; Timer1 handles the LED
}
计时器的应用
- 生成用于电机控制的精确的PWM信号
- 安排任务而无需阻止代码(例如,多任务)
- 测量事件的时间间隔
- 创建精确的延迟而无需使用
delay()
- 管理闪烁LED或发送数据之类的定期操作
故障排除
- 计时器冲突: 确保您不要将相同的计时器用于多个功能(例如,伺服库和PWM)。
-
中断无法正常工作: 检查中断是否已启用
interrupts()
. - 意外行为: 双检查预定器并比较正确的时机匹配值。
结论
您已经学会了如何使用Arduino计时器来生成PWM信号,处理中断和测量时间。掌握计时器解锁强大的功能,以创建高效,精确的Arduino项目。尝试不同的配置,并应用计时器以优化您的下一个项目!