【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】
pwm驱动也是常见的一种驱动方式。常见的pwm,其实就是一组方波,方波中的高低电平之比称之为空占比。通过调节这个空占比,可以实现不同的控制目的,比如说呼吸灯、电机控制等等。接下来,正好可以看看如何对v3s的pwm进行设置,以及如何在linux平台下使用pwm。
1、pwm0和pwm1
目前V3S支持两个pwm输出,分别是pwm0和pwm1。如下图所示,
2、要使能pwm功能,最主要就是修改设备树配置文件,
第一,在sun8i-v3s.dtsi中,添加pwm0和pwm1节点,
pwm0_pins: pwm0 {
pins = "PB4";
function = "pwm0";
};
pwm1_pins: pwm1 {
pins = "PB5";
function = "pwm1";
};
第二,在sun8i-v3s-licheepi-zero.dts中使能pwm,
&pwm {
pinctrl-names = "default";
pinctrl-0 = <&pwm0_pins>, <&pwm1_pins>;
status = "okay";
};
修改了这两个文件,下面要做的就是把他们编译成dtb,下载到sd卡里面,等待重启即可。注意,拷贝的dtb文件是un8i-v3s-licheepi-zero-dock.dtb。
3、pwm驱动文件
如果对驱动代码有兴趣,可以通过sun8i-v3s-pwm这个关键字去查找一下。查找后发现,相关的驱动文件名是drivers/pwm/pwm-sun4i.c,不想下载的朋友也可以在网上直接查看代码,链接地址如下所示,
https://github.com/Lichee-Pi/linux/blob/zero-4.14.y/drivers/pwm/pwm-sun4i.c
此外,之前这份驱动已经包含在了zImage里面,所以不需要重新编译内核。
4、开始调试
前面如果大家做过实验,就可以发现,如果我们没有修改设备树文件,那么发现在/sys/class/pwm节点下什么也没有。但是修改了之后,就会发现/sys/class/pwm一下子多了很多的内容,
# cd /sys/class
# cd pwm/
# ls
pwmchip0
# cd pwmchip0/
# ls
device export npwm power subsystem uevent unexport
# ls -l
total 0
lrwxrwxrwx 1 root root 0 Jan 1 00:31 device -> ../../../1c21400.pwm
--w------- 1 root root 4096 Jan 1 00:31 export
-r--r--r-- 1 root root 4096 Jan 1 00:31 npwm
drwxr-xr-x 2 root root 0 Jan 1 00:31 power
lrwxrwxrwx 1 root root 0 Jan 1 00:31 subsystem -> ../../../../../../class/pwm
-rw-r--r-- 1 root root 4096 Jan 1 00:31 uevent
--w------- 1 root root 4096 Jan 1 00:31 unexport
首先,我们可以通过export来使能通道,输入0就可以创建通道0,输入1就可以创建通道1,根据具体情况而定。
# echo 0 > /sys/class/pwm/pwmchip0/export
# ls
device npwm pwm0 uevent
export power subsystem unexport
# ls -l
total 0
lrwxrwxrwx 1 root root 0 Jan 1 00:31 device -> ../../../1c21400.pwm
--w------- 1 root root 4096 Jan 1 00:31 export
-r--r--r-- 1 root root 4096 Jan 1 00:31 npwm
drwxr-xr-x 2 root root 0 Jan 1 00:31 power
drwxr-xr-x 3 root root 0 Jan 1 00:31 pwm0
lrwxrwxrwx 1 root root 0 Jan 1 00:31 subsystem -> ../../../../../../class/pwm
-rw-r--r-- 1 root root 4096 Jan 1 00:31 uevent
--w------- 1 root root 4096 Jan 1 00:31 unexport
# echo 1 > /sys/class/pwm/pwmchip0/export
# ls -l
total 0
lrwxrwxrwx 1 root root 0 Jan 1 00:31 device -> ../../../1c21400.pwm
--w------- 1 root root 4096 Jan 1 00:31 export
-r--r--r-- 1 root root 4096 Jan 1 00:31 npwm
drwxr-xr-x 2 root root 0 Jan 1 00:31 power
drwxr-xr-x 3 root root 0 Jan 1 00:31 pwm0
drwxr-xr-x 3 root root 0 Jan 1 00:31 pwm1
lrwxrwxrwx 1 root root 0 Jan 1 00:31 subsystem -> ../../../../../../class/pwm
-rw-r--r-- 1 root root 4096 Jan 1 00:31 uevent
--w------- 1 root root 4096 Jan 1 00:31 unexport
通道创建好了,就可以进入到通道里面,看看有哪些配置。以通道0为例,
# cd pwm0
# ls
capture enable polarity uevent
duty_cycle period power
# ls -l
total 0
-r--r--r-- 1 root root 4096 Jan 1 00:32 capture
-rw-r--r-- 1 root root 4096 Jan 1 00:32 duty_cycle
-rw-r--r-- 1 root root 4096 Jan 1 00:32 enable
-rw-r--r-- 1 root root 4096 Jan 1 00:32 period
-rw-r--r-- 1 root root 4096 Jan 1 00:32 polarity
drwxr-xr-x 2 root root 0 Jan 1 00:32 power
简单来说,可以通过三个数值就可以实现最基本的pwm功能。其中period代表频率,duty_cycle代表空占比,enable代表使能开关,
echo 1000000 > /sys/class/pwm/pwmchip0/pwm0/period
echo 500000 > /sys/class/pwm/pwmchip0/pwm0/duty_cycle
echo 1 > /sys/class/pwm/pwmchip0/pwm0/enable
echo 0 > /sys/class/pwm/pwmchip0/pwm0/enable
假设cpu频率是1GHz,而我们希望得到的pwm频率是1000,那么这里的period就是1G/1000,而duty_cycle被设置成了500000,代表空占比是50%,enable为1代表打开,0则代表关闭。通道1也是这个道理,用同样的方法配置一下即可。
5、实际测量和验证
如果需要实际验证pwm的效果,最好有一个示波器,这样会比较方便一点,效果也比较明显。