樹莓派GPIO開發(二)RGB模塊-PWM調節


配置環境

系統: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()  # 對象銷毀

代碼我還補充了一些注釋,小白應該也能看懂了。


相關推薦玩轉樹莓派系列文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM