一、PWM基礎(chǔ)原理與RK平臺特性
(一)PWM核心原理
脈寬調(diào)制(PWM,Pulse Width Modulation)通過微處理器數(shù)字輸出控制模擬電路,核心是調(diào)整輸出波形的周期(信號重復(fù)的時間間隔)和占空比(一個周期內(nèi)高電平持續(xù)時間占比),實現(xiàn)對電壓、亮度等物理量的精準調(diào)控,廣泛應(yīng)用于測量、通信、功率控制等領(lǐng)域。
(二)RK平臺PWM關(guān)鍵特性
1.支持模式:共3種模式,不同模式用途差異顯著
?Continuous mode(連續(xù)模式):持續(xù)輸出固定周期和占空比的波形,是最常用模式,主要用于背光控制、電機調(diào)速等場景
?One-shot mode(單觸發(fā)模式):僅輸出一個完整波形后停止,適用于單次觸發(fā)的控制場景(如單次脈沖信號觸發(fā))
?Capture mode(捕獲模式):用于捕獲外部輸入波形的高低電平寬度,典型應(yīng)用是紅外遙控解碼(配合中斷實現(xiàn)鍵值識別)
1.硬件配置:內(nèi)置4通道,每個通道對應(yīng)獨立控制單元,支持多設(shè)備同時使用PWM功能
2.內(nèi)核兼容性:覆蓋Linux 3.10、4.4及以上(含4.19)內(nèi)核版本,不同版本在驅(qū)動接口、DTS配置上存在差異
二、RK平臺PWM開發(fā)操作流程
(一)驅(qū)動相關(guān)配置
1.驅(qū)動文件路徑與差異
?統(tǒng)一路徑:drivers/pwm/pwm-rockchip.c(所有內(nèi)核版本通用)

?內(nèi)核版本差異:
Linux 3.10:使用原始接口(pwm_config()、pwm_enable()、pwm_disable()),僅支持Continuous mode
Linux 4.4及以上(含4.19):將參數(shù)配置與使能/禁用封裝為pwm_apply_state()函數(shù),支持一次修改多個參數(shù)(周期、占空比、極性),效率更高,同樣僅支持Continuous mode
1.DTS節(jié)點配置:需根據(jù)內(nèi)核版本調(diào)整參數(shù)數(shù)量,與“pwm-cells”值對應(yīng)

backlight: backlight {compatible ="pwm-backlight";pwms = <&pwm0?0250000>;brightness-levels = <01...255>;// 256級亮度,0~255對應(yīng)0%~100%占空比default-brightness-level = <200>;// 默認亮度(第200級)enable-gpios = <&gpio1?13GPIO_ACTIVE_HIGH>;// 背光使能引腳};
?參數(shù)說明
參數(shù)1:index(通道索引),默認0(RK平臺每個PWM芯片僅1個通道)
參數(shù)2:周期(單位:ns),如25000ns對應(yīng)40KHz頻率
參數(shù)3:極性(可選),PWM_POLARITY_INVERTED表示負極性,僅“pwm-cells=3”時需配置
?版本差異示例
Linux 3.10(pwm-cells=2):pwms = <&pwm 0 25000>;
Linux 4.4/4.19(pwm-cells=3):pwms = <&pwm 0 25000 PWM_POLARITY_INVERTED>;
?背光場景擴展配置:需添加亮度等級、默認亮度、使能引腳等參數(shù),示例如下
(二)PWM工作流程(以Linux 4.4為例,Continuous mode)
1.狀態(tài)應(yīng)用(Apply State):觸發(fā)PWM參數(shù)配置流程,先判斷是否需要加鎖
?需加鎖:先執(zhí)行Lock操作,避免配置過程中參數(shù)被篡改
?無需加鎖:直接進入?yún)?shù)配置
1.參數(shù)配置
?必選:配置周期(Period)和占空比(Duty Cycle)
?可選:若支持極性配置(pwm-cells=3),設(shè)置極性(Normal/Inverted)
1.鎖操作:若之前加鎖,配置完成后執(zhí)行Unlock
2.使能/禁用控制
?需使能(Enable PWM=yes):執(zhí)行Enable操作,PWM開始輸出波形
?需禁用(Enable PWM=no):執(zhí)行Disable操作,PWM停止輸出
1.狀態(tài)同步(Sync State):確保硬件狀態(tài)與配置參數(shù)一致,完成流程
(三)用戶空間使用(通過/sys/class/pwm接口)
1.導(dǎo)出PWM通道:進入/sys/class/pwm/pwmchip0/,執(zhí)行echo 0 > export,生成pwm0目錄(關(guān)閉通道執(zhí)行echo 0 > unexport)
2.配置參數(shù):進入pwm0目錄,通過文件寫入配置
?周期:echo 10000 > period(10000ns=10μs,對應(yīng)100KHz頻率)
?占空比:echo 5000 > duty_cycle(5000ns,占空比50%)
?極性:echo normal > polarity(normal =正極性,inversed =負極性)
1.使能輸出:echo 1 > enable(禁用執(zhí)行echo 0 > enable)
三、RK平臺PWM主要用途
(一)背光控制(最典型場景)
基于Continuous mode,通過調(diào)整PWM占空比控制背光亮度:
?正極性:亮度等級0~255對應(yīng)占空比0%~100%(等級越高越亮)
?負極性:亮度等級與占空比反向(等級越高越暗)
?應(yīng)用:顯示屏背光調(diào)節(jié),如手機、平板、電視等設(shè)備
(二)紅外遙控解碼(基于Capture mode)
1.原理:PWM捕獲紅外接收頭輸出的高低電平寬度,觸發(fā)中斷后CPU讀取寄存器值,根據(jù)NEC編碼協(xié)議(RK平臺僅支持NEC)解碼用戶碼和鍵值碼
2.操作流程
&remotectl {handle_cpu_id = <2>;// 中斷處理CPU核心(4核0~3,雙核0~1)ir_key1{rockchip,usercode = <0x4040>;rockchip,key_table = <0xf4KEY_UP>, <0xf1KEY_DOWN>;// 鍵值與功能映射};};
?打開調(diào)試開關(guān):
echo1 > sys/module/rockchip_pwm_remotectl/parameters/code_print
?記錄鍵值:按下遙控器按鍵,通過打印獲取usercode(如0x4040)和鍵值(如0xe9)
?添加鍵值到DTS:在&remotectl {}節(jié)點中配置usercode和key_table,示例
(三)其他用途
?電機調(diào)速:通過調(diào)整PWM占空比控制電機轉(zhuǎn)速(如風(fēng)扇、小功率電機)
?電壓調(diào)節(jié)(PWM Regulator):配合電源管理模塊,輸出不同占空比的PWM信號實現(xiàn)電壓動態(tài)調(diào)整
四、常見問題與解決方案
(一)U-Boot與Kernel銜接問題
1.問題現(xiàn)象:U-Boot中使用PWM調(diào)壓后,進入Kernel階段PWM失效(如電壓不足死機)
2.原因:
?Kernel未同步U-Boot階段的PWM硬件狀態(tài)(如clock count)
?兩者時鐘源頻率、極性、周期配置不一致
1.解決方案
?更新驅(qū)動文件:drivers/pwm/pwm-rockchip.c
?統(tǒng)一配置:U-Boot與Kernel的GPLL時鐘頻率(PWM時鐘掛在GPLL下)、極性、周期保持一致;U-Boot頻率通過開機log查看,Kernel頻率通過cat /sys/kernel/debug/clock/clock_tree | grep gpll查看
(二)PWM Regulator引腳上下拉配置問題
1.問題現(xiàn)象:系統(tǒng)重啟(reboot)后,PWM Regulator默認電壓變化
2.原因:重啟時GRF寄存器不復(fù)位,但PWM控制器復(fù)位,引腳上下拉配置為“none”導(dǎo)致狀態(tài)異常
3.解決方案
// dtsi中定義pwm2_pin_pull_down: pwm2-pin-pull-down {rockchip,pins = <119RK_FUNC_1 &pcfg_pull_down>;};// dts中覆蓋&pwm2 {status ="okay";pinctrl-names ="active";pinctrl-0= <&pwm2_pin_pull_down>;};
?確認硬件默認上下拉:通過原理圖查看引腳標識(“d”=下拉,“u”=上拉,如RK3399 PWM2引腳GPIO1_C3/PWM2_d為默認下拉)
?DTS配置引腳上下拉:在dtsi中定義pinctrl,dts中覆蓋配置,示例
(三)PWM波形示波器無法檢測
1.第一步:檢查PWM是否工作(通過Counter Register寄存器)
?寄存器值變化:PWM工作正常,問題在引腳
可能原因:iomux配置錯誤(引腳功能未切換為PWM)、io-domain配置錯誤、外部硬件干擾
解決方案:重新配置iomux和io-domain,排查硬件接線或干擾源
?寄存器值無變化:PWM工作異常,問題在核心配置
可能原因:時鐘未使能、PWM未使能、duty>period(占空比配置無效)、RK3368未配置GRF_SOC_CON15寄存器bit12=1
解決方案:使能時鐘和PWM,修正duty與period關(guān)系,RK3368額外配置GRF寄存器
五、思維導(dǎo)圖總結(jié)
?
-
PWM
+關(guān)注
關(guān)注
116文章
5869瀏覽量
225584 -
微處理器
+關(guān)注
關(guān)注
11文章
2431瀏覽量
85833 -
脈寬調(diào)制
+關(guān)注
關(guān)注
3文章
238瀏覽量
39439
發(fā)布評論請先 登錄
基于小凌派RK2206開發(fā)板:OpenHarmony如何使用IoT接口控制PWM外設(shè)
【瑞芯微RK1808計算棒試用體驗】RK3399 平臺使用RK1808 加速棒總結(jié)
記錄總結(jié)一下基于RK3128平臺的LCD驅(qū)動調(diào)試步驟
Firefly-RK3288PWM輸出介紹
OpenHarmony:如何使用HDF平臺驅(qū)動控制PWM
RK平臺Linux IOMMU開發(fā):從原理到實戰(zhàn)
RK平臺PWM開發(fā)總結(jié)
評論