完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
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 %sn", 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 = %dn", 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 时程序运行结果如下: 如果需要使用脉冲输出计数功能或者有任何疑问请和我们联系。 |
|
相关推荐 |
|
只有小组成员才能发言,加入小组>>
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 17:50 , Processed in 0.361316 second(s), Total 41, Slave 31 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号