配置環境
系統:Raspbian11(官方64位)
設備:樹莓派CM4
一、PWM簡單介紹
全稱:Pulse-width modulation,脈沖寬度調制,簡單的數模轉換方法
1.基本原理
脈沖寬度調制(PWM),是用脈沖信號對模擬信號進行近似的一 種技術,一般變換后脈沖的周期固定,但脈沖的工作周期 (Duty Cycle,即一個周期內高電平的比例)會依所需模擬信號的大小而改變,高電平所占比例越高,擬合的模擬信號的幅度越大。
PWM 技術通過使用高分辨率計數器(調制頻率)調制方波的占空比,從而實現對一個模擬信號的電平進行編碼。
2.PWM 信號主要有兩個參數:
(1)信號的周期長度(Period),通常用頻率(Frequency)來描述。 Frequency = 1/ Period 。
(2)工作周期(Duty Cycle),該參數通常用占空比(Duty Ratio) 來描述,占空比就是高電平在一個周期所占的百分比。
3.PWM的優點
最大的優點是從處理器到被控對象之間的所有信號都是數字形式 的,無需再進行數模轉換過程;
而且對噪聲的抗干擾能力也大大增強,這使得 PWM 在通訊等信號傳輸行業得到大量應用的主要原因。
4.PWM使用條件
模擬信號能否使用 PWM 進行編碼調制,僅依賴帶寬,這即意味着只要有足夠的帶寬,任何模擬信號值均可以采用 PWM 技術進行調制編碼,一般而言,負載需要的調制頻率要高於 10Hz,在 實際應用中,頻率約在 1kHz 到 200kHz 之間。
5.pwm調節電壓
假設一個PWM信號,V = +5V,CLK = 13KHz,Duty = 50%,那么它輸出的信號就可以看成是一個+2.5V的直流信號,占空比和電壓成正比。
二、RGB模塊簡單介紹
R、G、B三個引腳電壓的高低,決定了顏色的成分,而電壓的高低由PWM進行控制。樹莓派的通用GPIO都可以被設置為 PWM工作方式,普通引腳精度較低專用引腳精度較高,但是我們這里也用不着。(GPIO12、GPIO13、GPIO18、GPIO19可以實現硬件脈寬調制)
這里我用編號為11、13、15三個通用GPIO。
三、代碼實現
#-*- coding: utf-8 -*
import RPi.GPIO as GPIO
import time
class RGB_LED(object):
def __init__(self,pin_R,pin_G,pin_B):
self.pins = [pin_R,pin_G,pin_B]
# 設置為輸出引腳,初始化低電平,燈滅
for pin in self.pins:
GPIO.setup(pin, GPIO.OUT)
GPIO.output(pin, GPIO.LOW)
# 用RPi.GPIO的PWM方法設置三個引腳為pwm對象,頻率2000Hz
self.pwm_R = GPIO.PWM(pin_R, 2000)
self.pwm_G = GPIO.PWM(pin_G, 2000)
self.pwm_B = GPIO.PWM(pin_B, 2000)
# 初始占空比為0
self.pwm_R.start(0)
self.pwm_G.start(0)
self.pwm_B.start(0)
# 顏色轉為占空比,顏色取值范圍是(0,255),占空比取值范圍是(0,100),就是 (顏色/255)*100
def color2ratio(self,x,min_color,max_color,min_ratio,max_ratio):
return (x - min_color) * (max_ratio - min_ratio) / (max_color - min_color) + min_ratio
# 顏色設置
def setColor(self,col):
R_val,G_val,B_val = col # 把元組解包,賦值給變量
R =self.color2ratio(R_val, 0, 255, 0, 100)
G =self.color2ratio(G_val, 0, 255, 0, 100)
B =self.color2ratio(B_val, 0, 255, 0, 100)
# 改變占空比,使用RPI.GPIO的方法ChangeDutyCycle()
self.pwm_R.ChangeDutyCycle(R)
self.pwm_G.ChangeDutyCycle(G)
self.pwm_B.ChangeDutyCycle(B)
# 對象銷毀
def destroy(self):
self.pwm_R.stop() # 使用stop()方法,把PWM停止
self.pwm_G.stop()
self.pwm_B.stop()
for pin in self.pins:
GPIO.output(pin, GPIO.HIGH) # 把輸出引腳全部拉高
GPIO.cleanup() # 引腳清空,結束引腳的占用
if __name__ == "__main__":
# 設置引腳編號模式
GPIO.setmode(GPIO.BOARD)
# 定義三個引腳
pin_R = 11
pin_G = 13
pin_B = 15
# 定義 RGB_LED 對象
m_RGB_LED = RGB_LED(pin_R,pin_G,pin_B)
# 定義顯示的顏色(R,G,B)
colors = [(255,0,0),(0,255,0),(0,0,255),(255,255,0),(0,197,204),(192,255,62),(148,0,211),(118,238,0)];
# 循環顯示各種顏色
try:
while True:
for col in colors:
# 打印顏色
print(col)
# 設置顏色,使用了方法
m_RGB_LED.setColor(col)
# 延時
time.sleep(3)
except KeyboardInterrupt:
print('\n Ctrl + C QUIT')
finally:
m_RGB_LED.destroy() # 對象銷毀
代碼我還補充了一些注釋,小白應該也能看懂了。
相關推薦:玩轉樹莓派系列文章