技术文章

当前页面: 首页 >技术文章 >ESM335x Linux输出脉冲计数

ESM335x Linux输出脉冲计数

供稿:成都英创信息技术有限公司 2016/6/15 10:00:28

0 人气:458

  • 关键词: Linux 脉冲计数 ESM335x
  • 摘要: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 时程序运行结果如下:




如果需要使用脉冲输出计数功能或者有任何疑问请和我们联系。

更多内容请访问 成都英创信息技术有限公司(http://c.gongkong.com/?cid=5085)

手机扫描二维码分享本页

工控网APP下载安装

工控速派APP下载安装

 

我来评价

评价:
一般