第一:应用层控制PWM基本简介
与前面LED设备的控制方式类似,PWM同样可以通过使用sysfd方式进程操控,进入到/sys/class/pwm目录下,如图所示:
这里举例出了8个以pwmchipX(X 表示数字 0~7)命名的文件夹,这八个文件夹其实就对应了 I.MX6U的 8 个 PWM 控制器,总共有 8 个 PWM 控制器,大家可以通过查询芯片参考手册得知。我们随便以其中一个为例,进入到 pwmchip0 目录下:
npwm:这是一个只读属性,读取该文件可以得知该 PWM 控制器下共有几路 PWM 输出
export:与 GPIO 控制一样,在使用 PWM 之前,也需要将其导出,通过 export 属性进行导出
第二:如何控制对应的PWM
通过 export 导出之后,便会生成 pwm0 这个目录,我们进入到该目录下看看:
enable:可读可写,写入“0”表示禁止 PWM;写入“1”表示使能 PWM。读取该文件获取 PWM 当前是禁止还是使能状态。
echo 0 》 enable #禁止 PWM 输出echo 1 》 enable #使能 PWM 输出
polarity:用于设置极性,可读可写,可写入的值如下:
echo normal 》 polarity #默认极性echo inversed 》 polarity #极性反转
period:用于配置 PWM 周期,可读可写;写入一个字符串数字值,以 ns(纳秒)为单位,譬如配置 PWM 周期为 10us(微秒):
echo 10000 》 period #PWM 周期设置为 10us(10 * 1000ns)
duty_cycle:用于配置 PWM 的占空比,可读可写;写入一个字符串数字值,同样也是以 ns 为单位,譬如:
echo 5000 》 duty_cycle #PWM 占空比设置为 5us
第三:具体代码实现
分析:
main()函数中,首先对传参进行校验,执行该应用程序的时候需要用户传入3个参数,分别是编号(0、 1、2、3 等,分别表示 I.MX6U 的 PWM1、PWM2、PWM3…)、周期(以 ns 为单位)、PWM 占空比(以ns 为单位)
。/testApp 0 500000 250000
接下来需要导出 pwm,首先使用 access()函数判断 pwm0 目录是否存在,如果存在表示 pwm 已经导出,如果不存在,则表示未导出,那么就需要通过 export 文件将其导出。导出成功之后,接着配置 PWM 周期、占空比,最后使能 PWM。编译示例代码:
总结:利用应用层可以实现对底层引脚PWM波形控制,检测对应的引脚可以观察相应的波形。