关键词: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输出脉冲计数相关推荐

  1. linux删除指定大小的文件,Linux下删除空文件,删除指定大小的文件

    Linux下批量删除空文件(大小等于0的文件)的方法: find . -name "*" -type f -size 0c | xargs -n 1 rm -f 用这个还可以删除指 ...

  2. linux在指定行添加内容,linux下利用shell在指定的行添加内容的方法

    linux下利用shell在指定的行添加内容的方法 在linux的一些配置中总会要进行某个文件中的某行的操作,进行增加,修改,删除等操作. 而这里主要是进行的是指定的行添加数据的操作: 脚本如下: s ...

  3. linux压缩指定时间的文件,Linux下压缩某个文件夹(文件夹打包)

    tar -zcvf /home/xahot.tar.gz /xahot tar -zcvf 打包后生成的文件名全路径 要打包的目录 例子:把/xahot文件夹打包后生成一个/home/xahot.ta ...

  4. linux安装指定mysql版本安装,linux yum安装指定版本mysql

    1.下载mysql rpm包 cd /usr/local/src wget https://dev.mysql.com/get/mysql80-community-release-el7-.noarc ...

  5. linux杀死指定名称的进程,Linux kill 杀死指定进程

    一  杀死指定进程 现知道有一个php线程正在运行,需要杀死 root 26278 1 0 2015 ? 00:00:31 /usr/local/php/bin/php /var/www/html/r ...

  6. linux zip指定目录解压,Linux zip解压/压缩并指定目录

    android中所有颜色大全 < ?xml version="1.0" encoding="utf-8" ?>       < resourc ...

  7. linux执行指定程序的命令,linux 下使用指定的用户来执行命令

    有时间,我们需要在开机的时候执行一些特定的程序或都脚本,因为涉及到安全主面的问题,所以又不想用root来执行,那怎样办呢. 经过查看 su 的帮助提示,发现: [root@redhat6 ~]# su ...

  8. linux 输出后面几列内容,Linux下使用awk如何获取关键字所在字段号,第几列,以及打印这个字段之后的所有字段?...

    netstat 的原始结果如下: [root@Test tmp]# netstat -tunp| grep 'ESTABLISHED' tcp 0 0 10.251.101.163:6379 10.2 ...

  9. linux 输出日志 1 与2,linux日志机制syslogd总结

    1.     BSD syslogd的组成结构: 从上图可以看到相关的日志文件主要来源于三种途径: (1)    内核: 许多内核例程调用log函数产生log消息,另外klogd守护进程能够监听并得到 ...

最新文章

  1. CentOS7编译安装MySQL5.7之后安装mysql-devel出错解决方案
  2. 基于R语言构建的电影评分预测模型
  3. Docker与LXC、虚拟化技术的区别——虚拟化技术本质上是在模拟硬件,Docker底层是LXC,本质都是cgroups是在直接操作硬件...
  4. 【日记】一次程序调优发现的同步IO写的问题,切记
  5. wlop一张多少钱_50etf期权交易一张合约多少钱?
  6. 初探目前最火的鸿蒙系统,跑了个 “hello world”!
  7. 【深度学习】sigmoid - 二次代价函数 - 交叉熵 - logistic回归 - softmax
  8. java 利用dfs生成简单的随机迷宫(效率不高)
  9. XManager 远程连接Netbackup图形用户界面
  10. Java -- 泛型
  11. 从零开始学keras之卷积神经网络介绍
  12. java爬虫,提供链接直接爬取网页代码
  13. python tornado高并发_tornado IO并发真的很高么?
  14. 客户网站被黑导致CDN加速后打开域名就提示域名纠错
  15. 小程序微信聊天功能中发送emoji表情
  16. 计算机机器语言教程,机器语言.ppt
  17. 网络安全等级保护细则
  18. 两个重要极限及相关推导极限
  19. 贯彻落实83号文,超图“互联网+不动产”再升级
  20. python转换excel 列号 为数字 数字转为列号

热门文章

  1. 难忘的一天——装操作系统(四)
  2. 数据库里存json数据
  3. 智能文档理解:通用文档预训练模型
  4. 北京大学开源分词工具pkuseg 初试与使用感受
  5. NSight Compute 用户手册(上)
  6. NVIDIA Jarvis:一个GPU加速对话人工智能应用的框架
  7. 目标形体形状轮廓重建:ICCV2019论文解析
  8. 2021年大数据ELK(十六):Elasticsearch SQL(职位查询案例)
  9. [C] Dijkstra算法——通过边实现松弛
  10. java多线程消息队列_java多线程消息队列的实现