RK3588開發(fā)板(armsom-w3) 之 PWM實(shí)操
PWM介紹
專欄總目錄
PWM是脈寬調(diào)制(Pulse Width Modulation)的縮寫。它是一種用于控制電子設(shè)備的技術(shù),通過改變電信號的脈沖寬度來實(shí)現(xiàn)對設(shè)備的控制。
PWM基本概念
PWM信號由一個固定頻率的周期性脈沖序列組成,每個脈沖的寬度(持續(xù)時間)可以根據(jù)需要進(jìn)行調(diào)節(jié)。調(diào)節(jié)脈沖寬度的比例可以改變平均電壓或電流的大小,從而實(shí)現(xiàn)對設(shè)備的控制。
當(dāng)談?wù)揚(yáng)WM時,以下三個關(guān)鍵術(shù)語經(jīng)常被提及:
頻率(Frequency):PWM信號的頻率是指每秒鐘內(nèi)脈沖的數(shù)量。
周期(Period):PWM信號的周期是指一個完整脈沖序列所花費(fèi)的時間。它是頻率的倒數(shù),以秒為單位表示。周期可以通過將頻率的倒數(shù)計算得到,例如,一個10kHz的PWM信號的周期為0.1毫秒(100微秒)。
占空比(Duty Cycle):占空比是指PWM信號中脈沖寬度與周期之間的比例關(guān)系。它表示了脈沖在一個周期中所占據(jù)的時間比例,通常以百分比表示。占空比為0%意味著脈沖不存在(完全低電平),而占空比為100%表示脈沖持續(xù)時間占據(jù)了整個周期(完全高電平)。在實(shí)際應(yīng)用中,占空比可以在0%到100%之間任意調(diào)整,以實(shí)現(xiàn)所需的控制效果。
PWM驅(qū)動
pwm驅(qū)動是一個通用的驅(qū)動,SOC廠家都會在SDK里面默認(rèn)打開
驅(qū)動文件
驅(qū)動文件所在位置:
drivers/pwm/pwm-rockchip.c
默認(rèn)SDK已經(jīng)加載好了PWM的驅(qū)動,下文我們主要注意PWM怎么使用
DTS 節(jié)點(diǎn)配置
DTS 配置參考文檔
Documentation/devicetree/bindings/pwm/pwm.txt
以下為一個例子的示例
pwms的幾個參數(shù)說明如下:
參數(shù) 1,表示 index (per-chip index of the PWM to request),一般是 0,因?yàn)槲覀?Rockchip PWM 每個chip 只有一個。
參數(shù) 2,表示 PWM 輸出波形的時間周期,單位是 ns;例如下面配置的 25000 就是表示想要得到的
PWM 輸出周期是 40K 赫茲。
參數(shù) 3,表示極性,為可選參數(shù);下面例子中的配置為負(fù)極性。
PWM使用
PWM 提供了用戶層的接口,在 /sys/class/pwm/ 節(jié)點(diǎn)下面,PWM 驅(qū)動加載成功后,會在/sys/class/pwm/ 目錄下產(chǎn)生 pwmchip0 目錄;向 export 文件寫入 0,就是打開 pwm 定時器 0,會產(chǎn)生一個 pwm0 目錄,相反的往 unexport 寫入 0 就會關(guān)閉 pwm 定時器了,同時 pwm0 目錄會
被刪除,該目錄下有以下幾個文件:
enable:寫入 1 使能 pwm,寫入 0 關(guān)閉 pwm;
polarity:有 normal 或 inversed兩個參數(shù)選擇,表示輸出引腳電平翻轉(zhuǎn);
duty_cycle:在 normal 模式下,表示一個周期內(nèi)高電平持續(xù)的時間(單位:納秒),在
reversed 模式下,表示一個周期中低電平持續(xù)的時間(單位:納秒);
period:表示 pwm 波的周期(單位:納秒);
以下是 pwmchip0 的例子,設(shè)置 pwm0 輸出頻率 100K,占空比 50%, 極性為正極性:
PWM應(yīng)用實(shí)例
通常電子設(shè)備中應(yīng)用pwm是比較常見的,比如風(fēng)扇電機(jī)控制,電視背光控制, LED 照明調(diào)光、電動工具馬達(dá)控制、汽車加熱器等領(lǐng)域。
這里簡單介紹一下pwm控制LED燈實(shí)現(xiàn)呼吸燈效果。
呼吸燈需要燈的驅(qū)動與PWM的驅(qū)動結(jié)合,兩個驅(qū)動之間傳遞數(shù)據(jù),我們可以在驅(qū)動中調(diào)用其他的驅(qū)動。
led是我需要的設(shè)備,這個設(shè)備用到了pwm,而pwm是用默認(rèn)的驅(qū)動。
硬件上我們在開發(fā)板找到具有pwm功能的引腳


設(shè)備樹的修改如下:
寫一個驅(qū)動。內(nèi)部在使用PWM子系統(tǒng)。形成了包含驅(qū)動的驅(qū)動。
示例代碼
驅(qū)動程序
DULE_LICENSE("GPL");
將上述驅(qū)動編譯為ko文件然后push進(jìn)3588開發(fā)板里面
應(yīng)用層程序
使用3588自帶的編譯器將用戶程序編譯進(jìn)開發(fā)板
prebuilts/gcc/linux-x86/aarch64/gcc-arm-10.3-2021.07-x86_64-aarch64-none-linux-gnu/bin/aarch64-none-linux-gnu-gcc apptest_breathing_light_.c -o testpwm
adb push path/testpwm /userdata
chmod 777 testpwm
./testpwm
最后可以看到燈明滅交替的效果