linux输出指定数量脉冲,英创信息技术ESM335x Linux输出脉冲计数介绍

1、综述

ESM335X具有4路PWM输出,其中PWM1和PWM2除了可以用于产生标准的PWM信号,现已支持输出脉冲计数功能,可以在应用程序中设置脉冲个数,当输出脉冲个数达到指定值时,驱动程序自动停止PWM输出,由于系统响应延迟,使用输出脉冲计数功能时最高频率不应超过100KHz。本文将介绍Linux系统下输出脉冲计数功能的使用方法。

2、应用程序

1、使用PWM输出功能需要设置如下结构体:

structpwm_config_info

{

unsignedintfreq;/*in Hz*/

unsignedintduty;/*in %*/

unsignedintpolarity;

unsignedintcount;

};

我们为了实现输出计数功能更新了此结构体,如果需要使用输出脉冲计数功能,用户需要更新头文件“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()函数进行了进一步封装:

intPWM_Start(intfd,intfreq,intduty,intcount )

{

intrc;

structpwm_config_infoconf;

conf.freq = freq;

conf.duty = duty;

conf.polarity = POLARITY;

conf.count = count;

rc =write(fd, &conf,sizeof(structpwm_config_info));

returnrc;

}

用户在应用程序中可以直接调用此函数使能PWM脉冲输出功能:

#include "pwm_api.h"

intfd;

intnpwm = 1;

chardevice[32];

unsignedintfreq = 1000;

unsignedintduty = 50;

unsignedintcount = 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()函数没有意义:

intbuf;

intnread = read ( fd, &buf,sizeof(buf) );

if( nread < 0 )

{

perror( "read" );

exit(-1);

}

if( buf > 0 )

printf( "remaining count = %d\n", buf );

4、使用过程中也可以用write()函数停止PWM输出,我们也进行了封装:

intPWM_Stop(intfd )

{

intrc;

structpwm_config_infoconf;

memset( &conf, 0,sizeof(structpwm_config_info));

rc = write(fd, &conf,sizeof(structpwm_config_info));

returnrc;

}

用户直接调用此函数就可以停止PWM输出:

PWM_Stop( fd);

使用完之后关闭设备文件:

close(fd);

5、我们在驱动中也实现了对select()函数的支持,select()函数只在进行PWM输出计数时有意义,熟悉select()函数的用户可以在应用程序中使用select()函数等待PWM脉冲计数输出完成设置的个数,然后再进行其他操作,select()函数可以使用户不必为了等待PWM脉冲计数输出完成而阻塞应用程序,同时select()函数也可以使用户同时对PWM1和PWM2两个设备进行监控,在应用程序中的使用方法如下:

fd_set fdWrite;

structtimeval aTime;

intret;

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

89e1d7055f61430c5224c4b82d0a856d.gif

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值