linux输出指定数量脉冲,ESM335x Linux输出脉冲计数
关键词:Linux,脉冲计数,ESM335x
作者:emtronix
摘要:ESM335X具有4路PWM输出,其中PWM1和PWM2除了可以用于产生标准的PWM信号,现已支持输出脉冲计数功能,可以在应用程序中设置脉冲个数,当输出脉冲个数达到指定值时,驱动程序自动停止PWM输出,由于系统响应延迟,使用输出脉冲计数功能时最高频率不应超过100KHz。本文将介绍Linux系统下输出脉冲计数功能的使用方法。
1、综述
ESM335X具有4路PWM输出,其中PWM1和PWM2除了可以用于产生标准的PWM信号,现已支持输出脉冲计数功能,可以在应用程序中设置脉冲个数,当输出脉冲个数达到指定值时,驱动程序自动停止PWM输出,由于系统响应延迟,使用输出脉冲计数功能时最高频率不应超过100KHz。本文将介绍Linux系统下输出脉冲计数功能的使用方法。
2、应用程序
1、使用PWM输出功能需要设置如下结构体:
struct pwm_config_info
{
unsigned intfreq; /* in Hz */
unsigned intduty; /* in % */
unsigned intpolarity;
unsigned intcount;
};
我们为了实现输出计数功能更新了此结构体,如果需要使用输出脉冲计数功能,用户需要更新头文件“em335x_drivers.h”中的此结构体及相应的封装函数(见下文),我们也提供更改过的头文件和示例程序,需要的用户可以和我们联系。
● freq用于设置频率,单位Hz,设置为0时停止输出
● duty用于设置占空比,单位%
● polarity用于设置输出极性(高电平有效或低电平有效),可以取值:
#definePWM_POLARITY_NORMAL(0 << 0) // 高电平有效
#define PWM_POLARITY_INVERTED(1 << 0) // 低电平有效
只有当PWM脉冲信号输出时,其对应的IO才会被驱动为高电平或低电平,其余时间PWM引脚为高阻输入状态,由于ESM335x主板上GPIO上拉电阻的作用,在没有脉冲输出时,PWM引脚为上拉输入状态(高电平)。如果实际使用时希望PWM平时保持为低电平,则需要在PWM信号上增加反向器或者增加1K欧姆的下拉电阻。
● count用于设置输出脉冲个数,count设置为0时为标准PWM输出,连续输出
2、使用PWM输出时,首先需要打开对应的设备文件,然后在调用write()函数进行参数设置,我们对write()函数进行了进一步封装:
int PWM_Start(int fd, int freq, int duty, int count )
{
int rc;
struct pwm_config_infoconf;
conf.freq = freq;
conf.duty = duty;
conf.polarity = POLARITY;
conf.count = count;
rc = write(fd, &conf, sizeof(struct pwm_config_info));
return rc;
}
用户在应用程序中可以直接调用此函数使能PWM脉冲输出功能:
#include "pwm_api.h"
int fd;
int npwm = 1;
char device[32];
unsigned intfreq = 1000;
unsigned intduty = 50;
unsigned intcount = 5;
sprintf( device, "/dev/em335x_pwm%d", npwm );
fd = open(device, O_RDWR);
if ( fd < 0)
{
printf("can not open /dev/em335x_pwm%d device file!\n", npwm);
return -1;
}
printf( "Open %s\n", device );
PWM_Start( fd, freq, duty, count );
3、使用脉冲输出计数功能后,在PWM输出时可以调用read()函数读取剩余输出个数,对于标准的连续PWM输出read()函数没有意义:
int buf;
int nread = read ( fd, &buf, sizeof(buf) );
if ( nread < 0 )
{
perror ( "read" );
exit(-1);
}
if ( buf > 0 )
printf ( "remaining count = %d\n", buf );
4、使用过程中也可以用write()函数停止PWM输出,我们也进行了封装:
int PWM_Stop(int fd )
{
int rc;
struct pwm_config_infoconf;
memset( &conf, 0, sizeof(struct pwm_config_info));
rc = write(fd, &conf, sizeof(struct pwm_config_info));
return rc;
}
用户直接调用此函数就可以停止PWM输出:
PWM_Stop( fd);
使用完之后关闭设备文件:
close(fd);
5、我们在驱动中也实现了对select()函数的支持,select()函数只在进行PWM输出计数时有意义,熟悉select()函数的用户可以在应用程序中使用select()函数等待PWM脉冲计数输出完成设置的个数,然后再进行其他操作,select()函数可以使用户不必为了等待PWM脉冲计数输出完成而阻塞应用程序,同时select()函数也可以使用户同时对PWM1和PWM2两个设备进行监控,在应用程序中的使用方法如下:
fd_set fdWrite;
struct timeval aTime;
int ret;
while(1)
{
FD_ZERO(&fdWrite);
FD_SET(fd,&fdWrite);
aTime.tv_sec = 2;
aTime.tv_usec = 0;
ret = select ( fd+1, NULL, &fdWrite, NULL, &aTime );
if ( ret<0 )
printf( "select, something wrong!\n " );
if ( ret>0 )
{
if ( FD_ISSET(fd, &fdWrite) )
{
printf ( "pwm out all complete!\n" );
/* PWM输出已经输出完设置个数,用户可以在此进行下一步操作 */
/* write(……) or something else */
break;
}
}
}
Polarity= PWM_POLARITY_INVERTED(低电平有效), freq=5000, duty=60, count=3 时程序运行结果如下:
如果需要使用脉冲输出计数功能或者有任何疑问请和我们联系。
linux输出指定数量脉冲,ESM335x Linux输出脉冲计数相关推荐
- linux删除指定大小的文件,Linux下删除空文件,删除指定大小的文件
Linux下批量删除空文件(大小等于0的文件)的方法: find . -name "*" -type f -size 0c | xargs -n 1 rm -f 用这个还可以删除指 ...
- linux在指定行添加内容,linux下利用shell在指定的行添加内容的方法
linux下利用shell在指定的行添加内容的方法 在linux的一些配置中总会要进行某个文件中的某行的操作,进行增加,修改,删除等操作. 而这里主要是进行的是指定的行添加数据的操作: 脚本如下: s ...
- linux压缩指定时间的文件,Linux下压缩某个文件夹(文件夹打包)
tar -zcvf /home/xahot.tar.gz /xahot tar -zcvf 打包后生成的文件名全路径 要打包的目录 例子:把/xahot文件夹打包后生成一个/home/xahot.ta ...
- linux安装指定mysql版本安装,linux yum安装指定版本mysql
1.下载mysql rpm包 cd /usr/local/src wget https://dev.mysql.com/get/mysql80-community-release-el7-.noarc ...
- linux杀死指定名称的进程,Linux kill 杀死指定进程
一 杀死指定进程 现知道有一个php线程正在运行,需要杀死 root 26278 1 0 2015 ? 00:00:31 /usr/local/php/bin/php /var/www/html/r ...
- linux zip指定目录解压,Linux zip解压/压缩并指定目录
android中所有颜色大全 < ?xml version="1.0" encoding="utf-8" ?> < resourc ...
- linux执行指定程序的命令,linux 下使用指定的用户来执行命令
有时间,我们需要在开机的时候执行一些特定的程序或都脚本,因为涉及到安全主面的问题,所以又不想用root来执行,那怎样办呢. 经过查看 su 的帮助提示,发现: [root@redhat6 ~]# su ...
- linux 输出后面几列内容,Linux下使用awk如何获取关键字所在字段号,第几列,以及打印这个字段之后的所有字段?...
netstat 的原始结果如下: [root@Test tmp]# netstat -tunp| grep 'ESTABLISHED' tcp 0 0 10.251.101.163:6379 10.2 ...
- linux 输出日志 1 与2,linux日志机制syslogd总结
1. BSD syslogd的组成结构: 从上图可以看到相关的日志文件主要来源于三种途径: (1) 内核: 许多内核例程调用log函数产生log消息,另外klogd守护进程能够监听并得到 ...
最新文章
- CentOS7编译安装MySQL5.7之后安装mysql-devel出错解决方案
- 基于R语言构建的电影评分预测模型
- Docker与LXC、虚拟化技术的区别——虚拟化技术本质上是在模拟硬件,Docker底层是LXC,本质都是cgroups是在直接操作硬件...
- 【日记】一次程序调优发现的同步IO写的问题,切记
- wlop一张多少钱_50etf期权交易一张合约多少钱?
- 初探目前最火的鸿蒙系统,跑了个 “hello world”!
- 【深度学习】sigmoid - 二次代价函数 - 交叉熵 - logistic回归 - softmax
- java 利用dfs生成简单的随机迷宫(效率不高)
- XManager 远程连接Netbackup图形用户界面
- Java -- 泛型
- 从零开始学keras之卷积神经网络介绍
- java爬虫,提供链接直接爬取网页代码
- python tornado高并发_tornado IO并发真的很高么?
- 客户网站被黑导致CDN加速后打开域名就提示域名纠错
- 小程序微信聊天功能中发送emoji表情
- 计算机机器语言教程,机器语言.ppt
- 网络安全等级保护细则
- 两个重要极限及相关推导极限
- 贯彻落实83号文,超图“互联网+不动产”再升级
- python转换excel 列号 为数字 数字转为列号