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

0f4d45c3d9a5cfb263d3d9dcc889d9c4.gif

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值