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);
   }
}

更新于:2021 年 5 月 29 日

7K+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告