0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

英创信息技术ESM335x Linux输出脉冲计数介绍

英创信息技术 来源:英创信息技术 作者:英创信息技术 2020-02-04 10:47 次阅读

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

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10990

    浏览量

    206738
  • 嵌入式主板
    +关注

    关注

    7

    文章

    6064

    浏览量

    34614
收藏 人收藏

    评论

    相关推荐

    stm8外部中断用来脉冲计数,外部中断开始计数,LED灯就不正常了的原因?

    外部中断用来脉冲计数。不计数时,定时器正常,每秒翻转一次LED灯。外部中断开始计数,LED灯就不正常了,有时两三秒,有时五六秒才翻转。一开始以为是优先级,可是配置软件优先级后还是一样啊。。。大神们指点一下
    发表于 04-22 07:29

    电路中如何实现脉冲计数功能和相位检测

    在进行DA转换,频率脉冲电压转换,pwm转变成对应的模拟量,电路是怎么实现对固定要求长度或固定频率脉冲个数进行计数进而转换成模拟量的功能? 在进行变频器有源逆变pwm回馈时,如何检测电网电压的相位,仅仅是用大阻值电阻降压分辨其三
    发表于 01-31 19:55

    CKS32F4xx系列产品Timer的基本使用方法-定时器脉冲计数

    CKS32F4xx系列产品Timer的基本使用方法-定时器脉冲计数
    的头像 发表于 11-09 17:38 548次阅读
    CKS32F4xx系列产品Timer的基本使用方法-定时器<b class='flag-5'>脉冲计数</b>

    STM8的中断脉冲计数,最大可以计数多少?

    最大能够计数多少个脉冲
    发表于 10-13 06:57

    信息技术是干什么?

    广播电子技术信息技术
    橙群微电子
    发布于 :2023年09月22日 09:17:48

    如何使用网络IO的脉冲计数脉冲输出功能?

    一适用型号该笔记适用于ME31系列、MA01系列等IO设备,其中脉冲计数需要IO设备具有输入检测(即,DI输入)功能,脉冲输出需要具有开关量输出(即,DO
    的头像 发表于 09-08 08:22 708次阅读
    如何使用网络IO的<b class='flag-5'>脉冲计数</b>和<b class='flag-5'>脉冲</b><b class='flag-5'>输出</b>功能?

    数字7段脉冲计数器电路分享

    可以使用 7490 解码计数器和 7557A 构建脉冲计数器。该电路可以从9计数到3。所有 2 的引脚 7490 必须连接在一起。
    的头像 发表于 07-27 15:59 586次阅读
    数字7段<b class='flag-5'>脉冲计数</b>器电路分享

    基于CD4511的两位数显脉冲计数

    使用计数器T0,工作在方式0,对外部脉冲进行计数,当外部脉冲数量累计达到1000后LED显示值加1。其实验电路如图所示
    的头像 发表于 07-12 11:51 980次阅读
    基于CD4511的两位数显<b class='flag-5'>脉冲计数</b>器

    圆光栅角度编码器计数采集流量计脉冲计数测量

    ● 光栅尺磁栅尺解码转换成标准Modbus RTU协议 ● 光栅尺5V差分信号直接输入,4倍频计数 ● 模块可以输出5V的电源给光栅尺供电 ● 高速光栅尺磁栅尺计数,频率可达5MHz ● 支持
    的头像 发表于 07-04 13:38 677次阅读
    圆光栅角度编码器<b class='flag-5'>计数</b>采集流量计<b class='flag-5'>脉冲计数</b>测量

    水表电表脉冲计数器 物流包裹数量计数器采集模块485 DO超速报警输出

    ● 编码器计数转换成标准Modbus RTU协议 ● 编码转速测量,能识别正反转,可报警输出 ● 也可以设置作为2路独立DI高速计数器 ● 一路DO输出可设置为
    的头像 发表于 06-26 15:01 712次阅读
    水表电表<b class='flag-5'>脉冲计数</b>器 物流包裹数量<b class='flag-5'>计数</b>器采集模块485  DO超速报警<b class='flag-5'>输出</b>

    2023年中海达星推官系列直播再度启航,与您一起探讨空间信息技术

    信息技术
    中海达
    发布于 :2023年06月21日 11:45:49

    M261芯片如何用定时器不中断的方式对外部脉冲计数

    M261芯片,如何用定时器不中断的方式对外部脉冲计数? 采用中断方式,如果脉冲频率过高,会频繁进出中断,如何不入中断来对外部脉冲计数
    发表于 06-19 08:22

    M261 TIMER capture外部脉冲计数的参数怎么设置?

    M261,咨询TIMER capture外部脉冲计数的设置参数? 有人能给一个例子吗?弄了很久都是没反应。
    发表于 06-19 06:53

    传感器脉冲频率计数远程采集WiFi模块 支持NPN和PNP

    ● 流量计脉冲计数或流量测量 ● 冲床冲压次数计数 ● 生产产量计数 ● 以太网工业自动化控制系统
    的头像 发表于 06-16 16:30 423次阅读
    传感器<b class='flag-5'>脉冲</b>频率<b class='flag-5'>计数</b>远程采集WiFi模块 支持NPN和PNP

    CKS32F4xx系列产品Timer的基本使用方法-定时器脉冲计数

    上一章我们介绍了CKS32F4的通用定时器定时操作的使用方法,这一章我们将向大家介绍通用定时器作为定时器脉冲计数的使用。在本章中,我们将用TIM5的通道1(PA0)来做输入捕获,捕获PA0上的
    的头像 发表于 06-05 09:39 536次阅读
    CKS32F4xx系列产品Timer的基本使用方法-定时器<b class='flag-5'>脉冲计数</b>