本文介紹樹莓派(raspberry pi)在linux c 環境下的硬體pwm配置及使用方法。 1. 下載安裝wiringPi 此步驟建議參考官網指南 http://wiringpi.com/download-and-install/,wiringPi提供了對樹莓派的硬體IO訪問,包括GPIO/I2 ...
本文介紹樹莓派(raspberry pi)在linux c 環境下的硬體pwm配置及使用方法。
1. 下載安裝wiringPi
此步驟建議參考官網指南,wiringPi提供了對樹莓派的硬體IO訪問,包括GPIO/I2C/PWM等,下載安裝後本地會出現wiringPi文件夾,根目錄下有/examples 可供參考。
2. 樹莓派PWM硬體
以raspberry pi 3b 為例,嘗試在命令行下輸入 pinout,可查看當前pi的io映射圖
這是當前pi的gpio佈局,卻不是wiringPi的IO映射表,因此參考時需註意,好在搜索一番便找到一張raspberry 3b的wiringpi IO映射表
圖中的gpio1(pwm0) 及 gpio23(pwm1) 即為我們需要傳輸給wiringpi的硬體pwm輸出腳
3. wiringPi pwm 介面說明
在examples/pwm.c 或 wiringPi/wiringPi.c中可查看pwm的相關介面,但卻沒有詳細的調用說明,經過一番查閱,得出介面的使用方法為:
- pwmSetClock():設置pwm的工作時鐘。19.2MHz晶振為pwm提供時鐘輸入,wiringpi在初始化gpio時預設採用32倍分頻(參考wiringPI.c 中的pinMode() 代碼),因此不調用此函數,pwm的預設工作時鐘為600KHz.
- pwmSetRange():設置pwm的輸出周期。以600KHz的工作時鐘為例,假設pwm輸出頻率為freq,則range = 600000/freq.
- pwmSetMode():設置pwm的工作模式,wiringPi.h頭文件中包含此2種模式 PWM_MODE_MS/PWM_MODE_BAL,但並未做任何解釋。。.那就看手冊《BCM2837-ARM-Peripherals.pdf》吧
從描述來看,MSEN=0似乎用來傳輸N/M數據, MSEN=1才是設置占空比輸出,因此處的pwm輸出模式選擇PWM_MODE_MS - pwmWrite():設置pwm的輸出占空比。因為一個周期長度為range,因此占空比的範圍為0~range.
此外,wiringPi也提供了軟體PWM輸出,由於屏蔽了硬體相關信息,其介面理解也更為方便,在此不再贅述。