嵌入式Linux工控板的PWM功能
PWM编号 | 设备文件名 | 输出管脚 |
PWM1 | ''/dev/em9x60_pwm1'' | GPIO12 |
PWM2 | ''/dev/em9x60_pwm2'' | GPIO14 |
PWM3 | ''/dev/em9x60_pwm3'' | GPIO15 |
PWM功能的操作很简单,在打开设备文件后,通过两个IOCTL命令来实现PWM的启动和停止:
IOCTL命令 | 参数 | 备注 |
EM9X60_PWM_IOCTL_START | 是 | 设置 PWM的频率和占空比,并启动 |
EM9X60_PWM_IOCTL_STOP | 否 | 停止PWM脉冲输出 |
启动PWM的命令,通过双参数数据结构来传递必要的参数:
struct double_pars
{
unsigned int par1;
unsigned int par2;
};
在上述结构中,par1用于设置PWM的输出频率,单位为Hz;而par2用于设置PWM的输出占空比,单位为% 。若我们需要生成38KHz脉冲用于红外串口数据的调制,则:
struct double_pars paras;
paras.par1 = 38000; // -> 38000Hz = 38KHz
paras.par2 = 50; // -> 50%
若我们希望用PWM1输出38KHz信号,其主要的代码为:
int fd = open(''/dev/em9x60_pwm1'', O_RDWR); //打开设备文件
通过IOCTL函数启动PWM:
int rc = ioctl(fd, EM9X60_PWM_IOCTL_START, ¶s); //启动PWM
或暂停PWM输出:
int rc = ioctl(fd, EM9X60_PWM_IOCTL_STOP, NULL); //暂停PWM
在使用PWM中需要注意以下几点:
1、EM9160所有的PWM通道都是与GPIO管脚复用的,因此需避免在设计出现GPIO的使用与PWM冲突。
2、若串口''/dev/ttyS2''或''/dev/ttyS4''-''/dev/ttyS6''之一被设置作为ISO7816的接口,它将自动占用PWM2或PWM3作为SCK时钟的输
出,因此应用程序也不应当打开对应的PWM设备文件,以避免资源冲突。
3、当PWM设备文件关闭、及执行来close(fd)后,对应的管脚会恢复成输入状态的GPIO,这时仍然可以通过GPIO的设备文件
“/dev/em9x60_gpio”来操作这些管脚。