脉宽调制(PWM,Pulse Width Modulation)功能在嵌入式系统中非常常见,它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
Rockchip PWM 能够支持Linux下的标准PWM接口编程。
板上引出一路PWM用于自定义用途,其余还有用于屏幕背光的PWM,已被其它驱动独占,不能用作其它功能。
此路PWM的序号为7,在Linux下对应的设备节点可以通过如下命令查询
root@linaro-alip:~# find /sys -name "*pwmchip*"
/sys/class/pwm/pwmchip2
/sys/class/pwm/pwmchip0
/sys/class/pwm/pwmchip1
/sys/devices/platform/febd0030.pwm/pwm/pwmchip1
/sys/devices/platform/febd0020.pwm/pwm/pwmchip0
/sys/devices/platform/febf0010.pwm/pwm/pwmchip2
通过查询datasheet或者设备树可以得知 febd0030 为 pwm7 的寄存器首地址,因此 pwmchip1 为pwm7的节点。
下面通过简易的逻辑分析仪来抓取此路pwm的波形,接线如下
sysfs的节点都需要root权限才能操作,使用命令行或者C语言编译出来的程序操作pwm都需要root权限。如果是ssh或者使用LX终端的,先执行如下命令获取root权限。
sudo su
将pwm设置为userspace使用
echo 0 > /sys/class/pwm/pwmchip1/export
设置PWM 的周期,这里的单位ns
echo 10000 > /sys/class/pwm/pwmchip1/pwm0/period
设置占空比,如果是正常的输出极性,这个参数指定PWM 波一个周期内高电平持续时间,单位ns
echo 5000 > /sys/class/pwm/pwmchip1/pwm0/duty_cycle
polarity参数用于指定输出极性,即PWM 输出是否反相
echo normal > /sys/class/pwm/pwmchip1/pwm0/polarity
使能pwm通道输出
echo 1 > /sys/class/pwm/pwmchip1/pwm0/enable
执行结果如下,可以看到正确的周期和高电平持续时间。此处一格长度为1us
通过连接 libperipheral_api.a 静态库,可以使用C语言调用以下接口来操作PWM
/**
* @name: user_pwm_enable
* @description: 设置pwm属性并开启pwm
* @param pwmchip_num: pwmchip序号
* @param pwmchannel_num: pwm通道号
* @param period: 周期
* @param duty_cycle: 高电平持续时间
* @param polarity: 0 - 极性不反转 其它 - 极性反转
* @return 等于0 - 成功 小于0 - 失败
*/
int user_pwm_enable(int pwmchip_num, int pwmchannel_num, int period, int duty_cycle, unsigned char polarity);
/**
* @name: user_pwm_disable
* @description: 关闭pwm
* @param pwmchip_num: pwmchip序号
* @param pwmchannel_num: pwm通道号
* @return 等于0 - 成功 小于0 - 失败
*/
int user_pwm_disable(int pwmchip_num, int pwmchannel_num);
测试demo如下,以操作 PWM7为例
#include "peripheral_api.h"
void pwm_api_test(void)
{
user_pwm_enable(1,0,8000,6000,0);
sleep(5);
user_pwm_disable(1,0);
return;
}
int main()
{
pwm_api_test();
return 0;
}
将peripheral_api.a静态库、peripheral_api.h和测试demo源码test.c放到同一路径下,编译命令如下
aarch64-none-linux-gnu-gcc test.c peripheral_api.a -I. -o pwmtest
在板上执行 ./pwmtest
使用逻辑分析仪抓取波形如下
可以看到高电平持续时间为6us,周期8us