资源描述:
《ESM335x Linux输出脉冲计数》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、成都英创信息技术有限公司ESM335xLinux输出脉冲计数ESM335xLinux输出脉冲计数1、综述ESM335X具有4路PWM输出,其中PWM1和PWM2除了可以用于产生标准的PWM信号,现已支持输出脉冲计数功能,可以在应用程序中设置脉冲个数,当输出脉冲个数达到指定值时,驱动程序自动停止PWM输出,由于系统响应延迟,使用输出脉冲计数功能时最高频率不应超过100KHz。本文将介绍Linux系统下输出脉冲计数功能的使用方法。2、应用程序1、使用PWM输出功能需要设置如下结构体:structpwm_config_inf
2、o{unsignedintfreq;/*inHz*/unsignedintduty;/*in%*/unsignedintpolarity;unsignedintcount;};我们为了实现输出计数功能更新了此结构体,如果需要使用输出脉冲计数功能,用户需要更新头文件“em335x_drivers.h”中的此结构体及相应的封装函数(见下文),我们也提供更改过的头文件和示例程序,需要的用户可以和我们联系。●freq用于设置频率,单位Hz,设置为0时停止输出●duty用于设置占空比,单位%●polarity用于设置输出极性(高
3、电平有效或低电平有效),可以取值:1/6成都英创信息技术有限公司ESM335xLinux输出脉冲计数#definePWM_POLARITY_NORMAL(0<<0)//高电平有效#definePWM_POLARITY_INVERTED(1<<0)//低电平有效只有当PWM脉冲信号输出时,其对应的IO才会被驱动为高电平或低电平,其余时间PWM引脚为高阻输入状态,由于ESM335x主板上GPIO上拉电阻的作用,在没有脉冲输出时,PWM引脚为上拉输入状态(高电平)。如果实际使用时希望PWM平时保持为低电平,则需要在PWM信号
4、上增加反向器或者增加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.
5、count=count;rc=write(fd,&conf,sizeof(structpwm_config_info));returnrc;}用户在应用程序中可以直接调用此函数使能PWM脉冲输出功能:#include"pwm_api.h"2/6成都英创信息技术有限公司ESM335xLinux输出脉冲计数intfd;intnpwm=1;chardevice[32];unsignedintfreq=1000;unsignedintduty=50;unsignedintcount=5;sprintf(device,"/dev
6、/em335x_pwm%d",npwm);fd=open(device,O_RDWR);if(fd<0){printf("cannotopen/dev/em335x_pwm%ddevicefile!",npwm);return-1;}printf("Open%s",device);PWM_Start(fd,freq,duty,count);3、使用脉冲输出计数功能后,在PWM输出时可以调用read()函数读取剩余输出个数,对于标准的连续PWM输出read()函数没有意义:intbuf;intnread=read
7、(fd,&buf,sizeof(buf));if(nread<0){perror("read");exit(-1);}if(buf>0)3/6成都英创信息技术有限公司ESM335xLinux输出脉冲计数printf("remainingcount=%d",buf);4、使用过程中也可以用write()函数停止PWM输出,我们也进行了封装:intPWM_Stop(intfd){intrc;structpwm_config_infoconf;memset(&conf,0,sizeof(structpwm_config_
8、info));rc=write(fd,&conf,sizeof(structpwm_config_info));returnrc;}用户直接调用此函数就可以停止PWM输出:PWM_Stop(fd);使用完之后关闭设备文件:close(fd);5、我们在驱动中也实现了对select()函数的支持,select()函数只在进行PWM输