1、综述
在工业控制中,经常需要获取脉冲信号计数值、频率、周期、占空比等参数。英创嵌入式主板esm335x系列 linux系统现已实现外部输入脉冲信号的计数、频率、周期、占空比测量功能。
主要功能及技术指标如下:
1、读取一段时间内的外部输入脉冲信号计数值。
2、外部输入脉冲信号周期、有效脉宽测量。
3、根据测得周期计算外部输入脉冲信号瞬时频率。
4、根据测得计数值和测量时间间隔计算两次有效信号读取时间内外部输入脉冲信号重复频率(平均频率)。
5、测得误差200khz左右时最大,瞬时频率误差不超过0.1%,重复频率误差不超过0.005%,占空比误差不超过0.05%,计数值测量准确无误差。
2、硬件连接
esm335x系列嵌入式主板引出了3路pwm输出,其中两路(pwm1和pwm2)可以用来进行外界输入的脉冲信号计数、频率、占空比测量,相应的gpio复用脚为gpio6和gpio7, 对应的引脚请参考光盘资料《esmarc 335x工控主板数据手册》,用户使用脉冲波输入计数功能时可将外来信号接到上述两个gpio管脚中的任意一个,并且地线与开发板接地引脚相连,然后在应用程序中获得计数值、频率、占空比。若用户启用了脉冲输入计数功能,则相应管脚不能再作为pwm脉冲输出或gpio使用。
使用注意事项:
1、gpio管脚最大只允许输入3.3v电压,超过将会导致开发板损坏!以开发板接地脚为基准,负值电压无效,不符合电压要求时需要设计缓冲放大电路。
2、输入脉冲波最大频率不应超过200khz!超过之后由于硬件限制测量误差将急剧变大。
3、应用程序
为了简化用户使用脉冲计数功能,内部使用了原pwm输出模块,linux系统内部没有增加新的设备节点,使用设备的计数功能(capture模式,后文简称cap),仍然需要使用pwm模式的设备节点进行模块功能设置。
(1)程序中使用到的结构体及常量定义
与内核直接交换数据读取设备原始测量值的结构体为cap_config_info,应用于read、write函数:
typedef struct cap_config_info
{
// 以下为输入参数
unsigned intdwpolarity; // 设置输入信号极性
unsigned intdwmaxfreq; // 设置输入信号最大频率
// 以下为输出参数,输入无效
unsigned longdwtimeus; // 两次读取之间的时间差
unsigned intdwcount; // 两次读取之间的计数值
unsigned intdwperiodns; // 读取时刻脉冲周期
unsigned intdwwidthns; // 读取时刻的脉冲有效脉宽
}cap_info, *pcap_info;
1、dwpolarity用于设置输入脉冲信号极性,可设为pwm_polarity_normal和pwm_polarity_inverted,定义在pwm_api.h头文件中。
2、dwmaxfreq等于0时用于停止计数功能,dwmaxfreq不为零时用于设置输入信号最大频率,最大频率不应超过200khz,输入单位为hz。
3、dwtimeus为输出参数,读取获得上次读操作(或使能操作)到本次读操作之间的时间差,单位为us。
4、dwcount为输出参数,读取获得上次读操作(或使能操作)到本次读操作之间的计数值,单位为 个。
5、dwperiodns为输出参数,读取获得本次读操作时脉冲信号周期, 单位为ns。
6、dwwidthns为输出参数,读取获得本次读操作时脉冲信号有效脉冲宽度,单位为ns。
7、用户可根据dwperiodns和dwwidthns计算占空比。
8、用户可根据dwperiodns计算读操作时的脉冲信号频率。
9、用户可根据dwtimeus和dwcount计算两次读操作之间的输入信号的平均频率。
(2)函数及系统调用
在进行计数操作时,首先打开相应的设备节点/dev/em335x_pwmx,x为编号(1或者2),使能设备开始计数相关代码:
a) 打开设备节点:
intnpwm = 1;
sprintf( device, /dev/em335x_pwm%d, npwm );
fd = open(device, o_rdwr);
if ( fd 1)
{
periodus = (double)conf.dwperiodns/1000.0; // 单位转换
widthus = (double)conf.dwwidthns/1000.0;
duty = (double)conf.dwwidthns*100000.0/conf.dwperiodns;
freq = cap_clk_freq/(double)conf.dwperiodns;
avgfreq = (double)conf.dwcount*cap_clk_freq/(double)conf.dwtimeus;
}
else
{
periodus = 0;
widthus = 0;
duty = 0;
freq = 0;
avgfreq = 0;
}
d) 使用完成后需要关闭计数功能,同样可以自行设置参数调用write或者使用cap_stop,也可以直接使用close关闭设备节点同事停止使用计数功能:
int cap_stop(int fd )
{
printf ( stopping^^^^^^^ );
int rc;
struct cap_config_infoconf;
memset( &conf, 0, sizeof(struct pwm_config_info));
conf.dwmaxfreq = 0;
rc = write(fd, &conf, sizeof(struct cap_config_info));
return rc;
}
调用上述函数:
cap_stop( fd);
使用完成后需要关闭设备节点。
close(fd);
e) 触发机制(选读):
如下图所示,在每一次上升沿或者下降沿处会触发硬件捕获功能,获得输入脉冲信号的参数并保存,应用程序中在任意时刻调用读操作得到的数据是最近一次上升沿或下降沿处的数据。此图中调用read1一之后调用read2,得到的计数值为2,时间差为(硬件触发2-硬件触发1)的时间差。用户使用时请注意输入信号有效时间段。所得时间不能作为两次读操作之间的时间差使用。如果要将读取的时间值作为两次读操作的时间值需要在前一次读操作后调用cap_start或直接用write函数传递相同参数清零硬件保存值。
4、实验测量
由于硬件的限制,测得瞬时频率、周期、占空比精度有限。硬件操作使用的时钟信号为100mhz,即周期、有效脉宽时间只能得到高于10ns的数值。平均频率的测量需要保证整个测量时间段内输入脉冲信号一直有脉冲输入!平均频率的误差整个测量范围内不超过10hz。实验使用rigol dg1022 信号发生器作为外部脉冲信号源,可以调整信号周期占空比,设置一定时间内的脉冲个数。
频率测量(khz):
输入
200.000
197.000
97.000
1.020
瞬间频率
200.000
196.850
96.993
1.020
平均频率
199.992
196.992
96.998
1.020
测得瞬时数据误差随频率增加而变大,具体数据可根据测量时间最小值10ns进行计算。
在150khz时测量的不同占空比值如下表:
输入%
90.00
50.00
20.00
10.00
测得%
89.96
50.00
19.97
9.91
在100khz时测量的不同占空比值如下表:
输入%
90.00
50.00
20.00
10.00
测得%
90.00
50.00
20.00
10.00
在100khz时连续测量的1s内脉冲个数如下表(信号源输入个数设置模式上限50k个,通过设置信号源取不同输入值):
输入%
39 999
23 338
8 766
432
测得%
39 999
23 338
8 766
432
注:当频率升高时,系统高负荷运转,实际读取时间差变化加大,如果连续读取,读到的计数值要以读到的时间差为准进行数值判断,实际读取个数并无误差。
计数值在允许输入频率内无误差。
如果需要使用此功能或有任何疑问,请和我们联系。
Facebook面临第二次伦敦高等法院集体诉讼
工业机器视觉在其他领域的应用
直流接触器助力安全可靠的电动汽车
华为小米2020年半导体投资项目汇总
利用3D光学和声学影像的抽血机器人可实现几乎100%一次抽血成功
英创信息技术脉冲计数功能在ESM335x-Linux主板上的实现
中国联通正式公布了2019-2021年光纤活动连接器集中采购项目中标结果
快速了解NSA批准的两层商业加密
特斯拉将于明年在其上海工厂生产Model Y?
配备3级自动驾驶和激光雷达技术的奥迪A8
台式机如何连接wifi_台式机找不到无线网络
江淮钇为向用户批量交付全球首款钠电池车
两种穿戴健身记录仪的方式
百万像素摄像机芯片技术解析
电流检测在车载系统中的应用
DIP插件加工注意事项
电动机启动、调速等电气控制图
发光二极管的原理和应用
目标成为国家能源政策指引,麻省理工学院发布未来电业报告
穿心电容的原理及作用(二)