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+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

立即開始
廣告
© . All rights reserved.