Contents

LED 調光及其他調光:Raspberry Pi 上的 PWM

PWM 是我們每天都在使用的東西,即使我們不知道它。這是一種簡單且在一系列應用中非常有用的技術。最好的是,您的 Raspberry Pi 可以毫不費力地完成這件事。如何?讓我們來看看。

什麼是脈寬調變?

術語「脈衝寬度調變」雖然看似複雜,但指的是開和關狀態之間快速切換電訊號的行為。該技術提供了一種產生不同模擬訊號的簡單方法,無需額外的硬體(例如 Raspberry Pi HAT 或外部元件)。事實上,對於控制爐灶、旋轉馬達或調節 LED 亮度等任務,PWM 訊號可以有效地模擬真實的類比電壓。

工作週期

該過程涉及將一系列脈衝饋送到負載(即被驅動的物體)。雖然這個動作本身看起來很簡單,但當這些脈衝的持續時間改變時,它就變得更有意義。透過改變脈衝的寬度,我們能夠改變它們保持活動或「開啟」的時間長度。每個週期內脈衝保持活動狀態的時間比例稱為佔空比。

考慮佔空比為百分之五十的三伏特脈寬調變 (PWM) 訊號。在這種情況下,施加在發光二極體 (LED) 上的平均電壓將對應於不間斷的一伏半訊​​號。透過增加佔空比,LED的亮度會增加,而減少佔空比會導致光度相應下降。同樣,音訊訊號也可以利用 PWM 來生成,如果同時使用其他 PWM 應用程序,可能會導致樹莓派的音訊輸出受到干擾。

/bc/images/pwm-anim.gif

樹莓派上的 PWM

對於 Raspberry Pi 上的所有 GPIO 引腳來說,使用軟體脈衝寬度調變 (PWM) 是一個可行的選擇。但是,對硬體 PWM 功能的存取僅限於特定引腳,即 GPIO12、GPIO13、GPIO18 和 GPIO19。

利用電腦軟體產生訊號可能會導致CPU資源消耗增加。當中央處理單元 (CPU) 忙於執行此任務時,它可能會忙於其他可能對脈寬調變 (PWM) 時序產生負面影響的任務。

因此,將任務委託給專用電路通常是更好的主意。對於 Raspberry Pi,此電路位於裝有 CPU 的系統單晶片內。硬體 PWM 通常更加精確和方便,因此在大多數情況下它是首選。如果您想了解 Raspberry Pi 4 的 Broadcom BCM2711 晶片的內部情況,那麼您可以查看 BCM2711 文件 。第 8 章介紹了 PWM 的內容!

調暗 LED

為了讓 LED 與 Raspberry Pi 一起正常工作,我們需要執行一些麵包板操作。此過程需要串聯配置 LED 和電流調節電阻。至關重要的是,包含該電阻器,因為它可以防止 LED 承受過大的電流,從而防止 LED 不幸死亡,其特徵是因煙霧分解而散發出有毒氣味。

計算電阻值

電阻與 LED 的連接位置對其性能沒有任何影響;相反,電阻值決定了流過裝置的電流。鑑於 Raspberry Pi 4 每個接腳可提供約 16 毫安培 (mA) 電流,因此可以利用歐姆定律來計算正常運作所需的電阻值。

上述原理規定阻抗需要等於導體兩端相對於流過導體的電流的電位差。 Raspberry Pi GPIO 腳所提供的電壓已知為 3.3 伏,而規定電流為 16 毫安培,即 0.016 安培。將這些值相除後,結果為 206。然而,定位具有如此精確規格的電阻器可能具有挑戰性;因此,將採用 220 歐姆的替代品。

請將 LED 燈帶的正極端子(陽極)連接到 GPIO 18,該連接埠對應 Raspberry Pi 上的實體接腳 12。此外,將 LED 燈條的負極端子(陰極)連接到設備的任一接地接腳。請記住在電路中包含一個電阻器,根據需要將其放置在路徑上的任何位置。完成這些準備工作後,您就可以繼續您的專案了。

/bc/images/raspberry-pi-led-circuit.jpg

在樹莓派上實現 PWM

為了讓硬體 PWM 在 Raspberry Pi 上運作,我們將使用 Cameron Davidson-Pilon 的 rpi-hardware-pwm 函式庫,改編自 由Jeremy Impson 所寫的程式碼。這已在 Pioreactor(基於 Pi 的生物反應器)中使用,但對於我們的目的來說它足夠簡單。

我們將首先存取位於“/boot”資料夾中的設定檔。為了繼續我們的任務,有必要附加一行文本,即「dtoverlay=pwm-2chan」。如果我們需要使用分配給 18 和 19 的 GPIO 引腳之外的引腳,我們可以根據需要添加補充參數。然而,在這種情況下,我們將保持簡單性。

重新啟動你的 Pi 並運行:

 lsmod | grep pwm 

目前命令產生已附加到作業系統的基本核心元件(指定為核心)的所有模組的全面清單。為了專門確定與脈衝寬度調變相關的元件,我們使用了 grep 函數,它代表「全域應用的正規表示式印表機」。

如果編目模組中存在「pwm\_bcm2835」表示安裝成功,則我們的初步設定流程即將完成。最後一步涉及透過終端命令安裝實際的庫:

 sudo pip3 install rpi-hardware-pwm 

我們現在準備開始了。

/bc/images/a-coder-woman.jpg

編碼 PWM LED 電路

事實上,是時候在 Thonny 環境中利用 Python 語言深入研究程式設計世界了。首先,必須啟動 Thonny 平台,然後在其介面中複製提供的程式碼片段。成功輸入代碼後,按「執行」按鈕執行程式。

 from rpi_hardware_pwm import HardwarePWM
import time
pwm = HardwarePWM(pwm_channel=0, hz=60) # here's where we initialize the PWM
pwm.start(0) # start the PWM at zero – which means the LED is off
for i in range(101):
    pwm.change_duty_cycle(i)
    time.sleep(.1) # by introducing a small delay, we can make the effect visible.
pwm.stop()

事實上,在正常情況下,人們應該觀察到 LED 會逐漸變亮,直到計數器變數達到 100 的值。此時,LED 將停止發光。有必要對這一現象進行詳細研究。

我們正在匯入硬體 PWM 庫的相關部分及其關聯的時間模組,並定義一個新變數。 pwm\_channel 可以分配為 0 或 1,其中 0 對應 Raspberry Pi 上的 GPIO 引腳 18,而 1 映射到 GPIO 引腳 19。

儘管必須考慮諸如 Raspberry Pi 的處理速度等實際限制,但人們可以任意為所需頻率分配赫茲 (hz) 值。 hz 值為 60 時不應出現可察覺的脈寬調變 (PWM) 閃爍。建議從極低的赫茲值開始,例如 10,然後逐漸增加,直到可辨別的脈衝變得可見。這種方法可以直接觀察現象,而不是只依賴接受陳述。

我們目前的任務涉及透過利用 Python for 迴圈逐步增加脈寬調變 (PWM) 訊號的佔空比,範圍從 0% 到 100%。 「time.sleep」參數可以根據個人喜好或特定要求進行調整,因為 PWM 由硬體處理並且獨立於任何軟體延遲運行。

關於 PWM,還有更多東西要學習

確實,值得稱讚的是,您已經在 Raspberry Pi 上成功執行了 PWM 程式。然而,值得注意的是,當利用適當的外圍硬體(例如專用 PWM HAT)時,脈寬調變的潛在應用非常廣泛。因此,謹慎的做法是不要將自己局限於單一 LED 的簡單照明,而是探索透過各種調製方式控制馬達、編碼訊息和產生音訊訊號的可能性。可用的機會確實很豐富,等待探索。