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 时程序运行结果如下:

 

ESM335x Linux输出脉冲计数的更多相关文章

  1. Linux文件计数

    1.当前目录下的文件数 ls -l |grep "^-"|wc -l 2.当前目录的目录树 ls -l |grep "^d"|wc -l 3.当前目录文件数包含 ...

  2. Linux 驱动开发

    linux驱动开发总结(一) 基础性总结 1, linux驱动一般分为3大类: * 字符设备 * 块设备 * 网络设备 2, 开发环境构建: * 交叉工具链构建 * NFS和tftp服务器安装 3, ...

  3. Linux内存管理 (11)page引用计数

    专题:Linux内存管理专题 关键词:struct page._count._mapcount.PG_locked/PG_referenced/PG_active/PG_dirty等. Linux的内 ...

  4. Linux下科学计数法(e)转化为数字的方法 [shell中几种数字计算说明]

    科学计数法使用e标识数值,将科学计算学转化为数字的思路:按e右边的数字移动小数点位数.e右边的数字如果是负数,则向左移动小数点.示例如下: 1.2345678e2 = 123.45678 1.2345 ...

  5. linux 处理两个文件的并集,交集,计数

    1. 取出两个文件的并集(重复的行只保留一份) cat file1 file2 | sort | uniq 2. 取出两个文件的交集(只留下同时存在于两个文件中的文件) cat file1 file2 ...

  6. Linux 内核引用计数的操作

    一个 kobject 的其中一个关键函数是作为一个引用计数器, 给一个它被嵌入的对象. 只 要对这个对象的引用存在, 这个对象( 和支持它的代码) 必须继续存在. 来操作一个 kobject 的引用计 ...

  7. 脉冲计数功能在ESM335x-Linux主板上的实现

    1.综述 在工业控制中,经常需要获取脉冲信号计数值.频率.周期.占空比等参数.英创嵌入式主板ESM335X系列 Linux系统现已实现外部输入脉冲信号的计数.频率.周期.占空比测量功能. 主要功能及技 ...

  8. Linux之时钟中断

    from:深入分析Linux内核源码(http://oss.org.cn/kernel-book/) 时钟中断的产生 Linux的OS时钟的物理产生原因是可编程定时/计数器产生的输出脉冲,这个脉冲送入 ...

  9. 模仿Linux内核kfifo实现的循环缓存

    想实现个循环缓冲区(Circular Buffer),搜了些资料多数是基于循环队列的实现方式.使用一个变量存放缓冲区中的数据长度或者空出来一个空间来判断缓冲区是否满了.偶然间看到分析Linux内核的循 ...

随机推荐

  1. Eclipse中web项目部署至Tomcat【转】

    Eclipse的web工程至Tomcat默认的部署目录是在工程空间下,本文旨在将部署目录改为Tomcat安装目录,并解决依赖包输出问题. 1.在Eclipse中添加Tomcat服务器.  2.将web ...

  2. Java 实现多线程的两种方式

    1:继承Therad类2:实现Runnable 接口 1.继承Thread类实现多线程继承Thread类的方法尽管被我列为一种多线程实现方式,但Thread本质上也是实现了Runnable接口的一个实 ...

  3. Badboy使用数据源Excel进行脚本参数化

    1.首先新建一个Excel,这里示例我写得非常简单,由两由数据组成,第一行为表头.见下图: 2.录制脚本,见上一篇,录制一个非常简单的搜狗查询 3.添加数据源,在Tools面板中找到Data Sour ...

  4. .net 实现上传文件分割,断点续传上传文件

    一 介绍 断点续传搜索大部分都是下载的断点续传,涉及到HTTP协议1.1的Range和Content-Range头. 来个简单的介绍 所谓断点续传,也就是要从文件已经下载的地方开始继续下载.在以前版本 ...

  5. nullcon HackIM 2016 -- Programming Question 5

    Dont blink your Eyes, you might miss it. But the fatigue and exhaustion rules out any logic, any wil ...

  6. PHP 7 Xdebug 深深的坑

    zend_extension 7.0 下的 php.ini 配置 [XDebug];; Only Zend OR (!) XDebugzend_extension=f:\xampp\php\ext\p ...

  7. Tesseract API在VS 2013中的配置以及调用

    [Tesseract]Tesseract API在VS 2013中的配置以及调用 时间:2016-05-31 20:35:19      阅读:127      评论:0      收藏:0      ...

  8. NLP学术组织、会与论文

    1. 自然语言处理怎么最快入门? 2. 初学者如何查阅自然语言处理(NLP)领域学术资料 2.0  ACL Anthology 2.1  Association for Computational L ...

  9. svn各个图标代表什么意思

    最近参与公司项目开发要使用SVN,下面随笔记下在使用SVN中常见的图标各代表什么意思 灰色向右箭头:本地修改过 ,本地代码没有及时上库.灰色向右且中间有个加号的箭头:本地比SVN上多出的文件灰色向右且 ...

  10. 模仿win10样式,基于jquery的时间控件

    工作需要,写了一个基于jquery的时间控件,仿win10系统时间控件格式. 目前基本功能都有了,但时间格式只实现少数,但由于结构设计已经充分优化,填充起来非常容易. 这个控件相对网上其他的时间控件, ...