全志V3S嵌入式驱动开发(pwm驱动)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】

        pwm驱动也是常见的一种驱动方式。常见的pwm,其实就是一组方波,方波中的高低电平之比称之为空占比。通过调节这个空占比,可以实现不同的控制目的,比如说呼吸灯、电机控制等等。接下来,正好可以看看如何对v3s的pwm进行设置,以及如何在linux平台下使用pwm。

1、pwm0和pwm1

        目前V3S支持两个pwm输出,分别是pwm0和pwm1。如下图所示,

全志V3S嵌入式驱动开发(pwm驱动)_第1张图片

 

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的效果,最好有一个示波器,这样会比较方便一点,效果也比较明显。

全志V3S嵌入式驱动开发(pwm驱动)_第2张图片

 

你可能感兴趣的:(全志V3S嵌入式开发,驱动开发)