實驗目的
利用脈沖調制效應(PWM)等效改變輸出功率大小控制LED,從而實現呼吸燈效果,需要用到RGB LED模塊
模塊連接
IO 插針接口上一共集成了兩路PWM,分別是PWM2和PWM3,對應GPIO88、GPIO89
PWM2和PWM3對應Pin3和Pin5引腳,這里使用Pin1和Pin3分別連接LED的GND和R口
修改設備樹
arch/loongarch/boot/dts/loongson/loongson_2k0300.dtsi
pwm2: pwm@0x1611b020 {compatible = "loongson,ls2k-pwm";reg = <0 0x1611b020 0 0xf>;interrupt-parent = <&icu>;interrupts = <17>;#pwm-cells = <2>;clock-frequency = <100000000>;status = "disabled";
};pwm3: pwm@0x1611b030 {compatible = "loongson,ls2k-pwm";reg = <0 0x1611b030 0 0xf>;interrupt-parent = <&icu>;interrupts = <17>;#pwm-cells = <2>;clock-frequency = <100000000>;status = "disabled";
};
arch/loongarch/boot/dts/loongson/2k0300-pinctrl.dtsi
pwm2_pin: pwm2-pin{pwm2_mux_m0: pwm2-mux-m0{loongson,pinmux = <&gpa4 2 2>;loongson,pinmux-funcsel = <PINCTL_FUNCTION1>;};pwm2_mux_m1: pwm2-mux-m1{loongson,pinmux = <&gpa5 8 8>; /* pwm2 have two multiplex methods */loongson,pinmux-funcsel = <PINCTL_FUNCTION2>;};
};pwm3_pin: pwm3-pin{pwm3_mux_m0: pwm3-mux-m0{loongson,pinmux = <&gpa4 3 3>;loongson,pinmux-funcsel = <PINCTL_FUNCTION1>;};pwm3_mux_m1: pwm3-mux-m1{ /* pwm3 have two multiplex methods */loongson,pinmux = <&gpa5 9 9>;loongson,pinmux-funcsel = <PINCTL_FUNCTION2>;};
};
arch/loongarch/boot/dts/loongson/loongson_2k0300_pai_99.dts
&pwm2{status = "okay";pinctrl-names = "default";pinctrl-0 = <&pwm2_mux_m1>;
};
&pwm3{status = "okay";pinctrl-names = "default";pinctrl-0 = <&pwm3_mux_m1>;
};
修改完畢后重新編譯內核,將內核部署到開發板/boot
目錄下,重啟開發板發現/sys/class/pwm
下已經生成兩個pwmchip節點
波形測試
運行測試腳本run.sh,周期和占空比脈沖的時間單位為ns
echo 0 > /sys/class/pwm/pwmchip0/export # 導出pwm節點
echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable # 關閉pwm輸出
echo 100000 > /sys/class/pwm/pwmchip0/pwm0/period # 設置pwm周期
echo 50000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle # 設置占空比脈沖數
echo "normal" > /sys/class/pwm/pwmchip0/pwm0/polarity # 設置極性,有normal和inversed兩種
echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable # 開啟pwm輸出
示波器查看PWM2輸出波形:生成了10KHz的波形,占空比為50%
PWM LED模擬呼吸燈效果,為了簡單起見就不寫C語言代碼了
num=10
peroid=100000
max=100000
min=10
flag=0echo $peroid > /sys/class/pwm/pwmchip0/pwm0/periodwhile true
doif [ $flag -eq 0 ]then if [ $num -lt $max ]then echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable
# echo $peroid > /sys/class/pwm/pwmchip0/pwm0/periodecho $num > /sys/class/pwm/pwmchip0/pwm0/duty_cycleecho "normal" > /sys/class/pwm/pwmchip0/pwm0/polarityecho 1 > /sys/class/pwm/pwmchip0/pwm0/enablesleep 0.1let num+=10000 elseflag=1fielseif [ $num -gt $min ]then echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable
# echo $peroid > /sys/class/pwm/pwmchip0/pwm0/periodecho $num > /sys/class/pwm/pwmchip0/pwm0/duty_cycleecho "normal" > /sys/class/pwm/pwmchip0/pwm0/polarityecho 1 > /sys/class/pwm/pwmchip0/pwm0/enablesleep 0.1let num-=10000elseflag=0fi fi
done
實驗效果
PWM動態輸出效果 + 呼吸燈