Arduino Uno 中基于 Timer1 的 PWM
在之前的文章中,我们已经了解了如何使用 **analogWrite()** 函数在 Arduino Uno 上设置 PWM。Arduino Uno 的 3、5、6、9、10 和 11 引脚可以支持 PWM。除了 5 和 6 引脚外,所有引脚的方波频率为 490 Hz(周期约为 2 毫秒),5 和 6 引脚的频率为 980 Hz(周期约为 1 秒)。使用 **analogWrite()**,您可以控制占空比,但无法控制生成的方波频率。
在本文中,我们将探讨另一种在 Arduino Uno 中设置 PWM 的方法,该方法特定于 Timer1。这种方法的优点是可以同时控制 PWM 信号的频率和占空比。这基于我们之前在 Arduino 中关于定时器中断的文章中看到的 TimerOne 库。转到工具 → 库管理器,并下载 **TimerOne** 库。
语法
PWM 的语法如下:
Timer1.pwm(pin, duty);
其中 pin 是您希望设置 PWM 的引脚号。只有 9 和 10 引脚允许基于 Timer1 的 PWM。
Duty 是占空比(从 0 到 1023)。0 表示 0% 的占空比,而 1023 表示 100%。
如果希望在执行过程中更改占空比,可以使用:
Timer1.setPwmDuty(pin, duty);
要禁用 PWM,可以使用:
Timer1.disablePwm(pin);
您可能想知道我们在哪里设置了 PWM 的频率。我们在 setup 中使用 Timer.initialize() 函数进行设置。
Timer1.initialize(microseconds);
其中参数是波形的微秒间隔。因此,如果希望频率为 100kHz,则将微秒时间设置为 10。
Timer1.initialize(10);
示例
我们将查看 TimerOne 库附带的示例。转到文件 → 示例 → TimerOne → FanSpeed
您也可以在 GitHub 上找到代码:https://github.com/PaulStoffregen/TimerOne/blob/master/examples/FanSpeed/FanSpeed.pde
在这里,连接到 4 引脚(您需要将其更改为 Arduino Uno 的 9 或 10 引脚)的风扇速度使用 PWM 进行更改。
我们包含库并首先指定风扇引脚。
#include −TimerOne.h> const int fanPin = 9;
在 setup 中,我们将 Timer1 库初始化为 40 微秒间隔(或 25 kHz 频率),并且我们还初始化 Serial。
void setup(void) { Timer1.initialize(40); // 40 us = 25 kHz Serial.begin(9600); }
在循环中,我们在 for 循环中以 1% 为步长将占空比从 30% 增加到 100%。
void loop(void) { // slowly increase the PWM fan speed // for (float dutyCycle = 30.0; dutyCycle < 100.0; dutyCycle++) { Serial.print("PWM Fan, Duty Cycle = "); Serial.println(dutyCycle); Timer1.pwm(fanPin, (dutyCycle / 100) * 1023); delay(500); } }