在工业控制应用、特别是要求闭环控制的实时应用中,通常都需要实时采集模拟信号。因此作为一款面向实时控制应用的工控主板em9380,配置了最多可达8路的ad转换单元。为了实现闭环控制的高效操作,ad转换是由板上独立运行的硬件协处理器(cortex-m3)来直接操作。应用程序通过驱动程序,其设备文件名为“mcu2:”,来操作ad的功能。在标准配置的em9380中,其ad单元的基本技术特性包括:
• 单端输入采集,可进一步选择单通道、双通道、4通道及8通道模式。
•差分输入采集,可进一步选择单通道、双通道及4通道模式。
• 采集触发模式方面,支持软件触发和阈值触发两种模式。软件触发指一旦应用程序调用相关api函数,即进行数据采集;而阈值触发模式是指当应用程序启动ad采集后,
只有当输入的数据超出所设置的门限阈值时,才开始采集数据,这种模式广泛应用于状态监测及波形捕捉等应用。
• 采集数据方面,支持单点采集和波形采集两种模式。单点采集指每个通道仅采集一个样点;而波形采集则是按设置的采样间隔,采集一定长度的数据序列,这种模式一般
应用于需要分析波形数据的场合,如需要做fft,获得波形的频谱特征。
本文后续部分将针对em9380的多通道ad在硬件、软件方面的特性,具体介绍实现数据采集的相关步骤。
ad通道的硬件接口说明
em9380中与ad关联的管脚是gpio8 – gpio15,这8路gpio在上电时的缺省配置是数字输入模式。只有当应用程序调用ad转换的api时,其相应的管脚才会转换为模拟输入状态。em9380共支持7种输入模式,每种模式使用固定的通道配置,未使用的管脚则保持在gpio模式。输入模式与具体管脚的关系列表如下:
单通道单端输入
ad通道号
信号输入管脚
备注
ad_ch0
gpio8
与公共gnd构成信号回路
双通道单端输入
ad通道号
信号输入管脚
备注
ad_ch0
gpio8
与公共gnd构成信号回路
ad_ch1
gpio9
与公共gnd构成信号回路
4通道单端输入
ad通道号
信号输入管脚
备注
ad_ch0
gpio8
与公共gnd构成信号回路
ad_ch1
gpio9
与公共gnd构成信号回路
ad_ch2
gpio10
与公共gnd构成信号回路
ad_ch3
gpio11
与公共gnd构成信号回路
8通道单端输入
ad通道号
信号输入管脚
备注
ad_ch0
gpio8
与公共gnd构成信号回路
ad_ch1
gpio9
与公共gnd构成信号回路
ad_ch2
gpio10
与公共gnd构成信号回路
ad_ch3
gpio11
与公共gnd构成信号回路
ad_ch4
gpio12
与公共gnd构成信号回路
ad_ch5
gpio13
与公共gnd构成信号回路
ad_ch6
gpio14
与公共gnd构成信号回路
ad_ch7
gpio15
与公共gnd构成信号回路
单通道差分输入
ad通道号
输入管脚
输入信号
实际输入信号
ad_ch0
gpio8
ad_ch0+
ad_ch0+/ ad_ch0-
gpio9
ad_ch0-
双通道差分输入
ad通道号
输入管脚
输入信号
实际输入信号
ad_ch0
gpio8
ad_ch0+
ad_ch0+/ ad_ch0-
gpio9
ad_ch0-
ad_ch2
gpio10
ad_ch2+
ad_ch2+/ ad_ch2-
gpio11
ad_ch2-
4通道差分输入
ad通道号
输入管脚
输入信号
实际输入信号
ad_ch0
gpio8
ad_ch0+
ad_ch0+/ ad_ch0-
gpio9
ad_ch0-
ad_ch2
gpio10
ad_ch2+
ad_ch2+/ ad_ch2-
gpio11
ad_ch2-
ad_ch4
gpio12
ad_ch4+
ad_ch4+/ ad_ch4-
gpio13
ad_ch4-
ad_ch6
gpio14
ad_ch6+
ad_ch6+/ ad_ch6-
gpio15
ad_ch6-
对于单端输入,其输入满量程为0 – 2.5v,对应的量化数据分别为0 – 4095(12-bit ad分辨率)。差分输入时,数据值与输入电压的关系如下表所示:
ad转换数据(hex)
ch+输入电压
ch-输入电压
备注
4095(0xfff)
2.5v
0v
正向最大差
2048(0x800)
ch+ = ch-
0(0x000)
0
2.5v
反向最大差
在标准配置下,各ad通道的输入阻抗大致为40kω。为了保证ad转换的精度,建议前端输入的模拟信号,应根据实际信号的特点,加入适当的信号调理单元。
接口软件说明
为了操作em9380的ad采集功能,首先需要打开硬件协处理器的驱动程序,其设备文件名为”mcu2:”(注意是mcu2,而不是mcu1):
#include// 数据类型定义
handle hmcu2;
hmcu2 = createfile(_t(“mcu2:”), // name of device
generic_read|generic_write, // desired access
file_share_read|file_share_write, // sharing mode
null, // security attributes (ignored)
open_existing, // creation disposition
file_flag_random_access, // flags/attributes
null); // template file (ignored)
驱动程序mcu2通过deviceiocontrol,支持以下ad采集命令:
mcu_generic_adc_se1 // 单端输入,单通道模式
mcu_generic_adc_se2 // 单端输入,双通道模式
mcu_generic_adc_se4 // 单端输入,4通道模式
mcu_generic_adc_se8 // 单端输入,8通道模式
mcu_generic_adc_di1 // 差分输入,单通道模式
mcu_generic_adc_di2 // 差分输入,双通道模式
mcu_generic_adc_di4 // 差分输入,4通道模式
同时以上命令需通过以下的数据结构来设置相关参数:
typedef struct
{
byte ucsize; // 本数据结构大小 = 24字节
byte uccmd; // ad命令码:mcu_generic_adc_xxx
dword dwperiod; // 采样间隔,单位为us,= 0:软件触发
word wdata[8]; // 返回的采集数据
bool bflashed; // 保存本配置作为启动缺省功能
byte ucchksum; // 校验和
} mcu_adc_info, *pmcu_adc_info; // struct for adc
参数dwperiod为采样间隔,设置为0表示软件触发数据采集,不为0,则按设置的采样间隔进行ad转换。最短采样间隔为25us,即最高采样率40ksps。注意若启动多通道数据采集,则每通道的采样周期为dwperiod×通道数。
当dwperiod不为零时,wdata[ ]的前三个值将作为输入参数,其中wdata[0]表示采集的总样点数,wdata[1]表示阈值窗口的上限值(最大值=4095),wdata[2]表示阈值窗口的下限值(最小值=0)。通过这些参数的合理逻辑组合,就可实现以下4种数据形式的采集:
dwperiod
wdata[0]
wdata[1]
wdata[2]
采集数据
= 0
-
-
-
软件触发,单点采集
> 0
通道数
wdata[1] > wdata[2]
阈值触发,单点采集
> 0
通道数×n
0
0
软件触发,n点波形采集
> 0
通道数×n
wdata[1] > wdata[2]
阈值触发,n点波形采集
对单点数据采集,mcu2驱动将以mcu_adc_info数据结构的形式回传采集结果,其中采集数据包含在wdata[ ]中,分别对应ad的ch0 – ch7。wdata的数据格式为:
16-bit ad转换数据
d15 – d12(4-bit)
d11 – d0(12-bit)
通道号(0 – 7)
adc实际转换输出的数据值(0 – 4095)
对波形采集,为了提高效率,回传的数据采用以下数据结构的形式:
typedef struct
{
byte ucsize; // 本数据结构大小 = 51字节
byte uccmd; // ad命令码:mcu_generic_adc_xxx
word wdata[24]; // 返回的采集数据
byte ucchksum; // 校验和
} mcu_adc_flow, *pmcu_adc_flow; // struct for adc
24个采集数据将根据ad采集命令所使用的通道数,顺序循环排列。而每个数据的格式与单点采集数据的格式是一样的。
以下代码实现单端输入8通道,软件触发单点采集:
mcu_adc_info info; //定义结构对象
memset(&info, 0, sizeof(mcu_adc_info));//清零
//填写所需的参数
info.ucsize = sizeof(mcu_adc_info);
info.uccmd = mcu_generic_adc_se8; //单端8通道输入
info.dwperiod = 0; //软件触发,单点采集
// 生成chksum字节
info.ucchksum = chksum(&info, sizeof(mcu_adc_info)-1);
// 调用deviceiocontrol
if (!deviceiocontrol(hmcu2, // file handle to the driver
mcu_ioctl_access, // i/o control code
&info, // input buffer
sizeof(mcu_adc_info), // in buffer size
&info, // out buffer
sizeof(mcu_adc_info), // out buffer size
null, // pointer to number of bytes returned
null)) // ignored (=null)
{
// 出错处理......
return false;
}
// 对采集的数据info.wdata[]进行处理......
机器人配送商品 快递业进入爆发式发展阶段
地物光谱仪有什么用?
因特尔3D立体封装成CPU转折点
吸尘器哪个牌子好,斐纳TOMEFON吸尘器开箱实测
NI推出mmWave测试解决方案 加速5G商用进程
英创信息技术EM9380多通道AD数据采集介绍
华为Mate 9保时捷款多少钱,数万元?有钱都买不到
基于微纳光纤的温度/压力同时测量触觉传感器
工业智能网关如何连接设备进行数据采集工作
嵌入式系统中的内存压缩技术
TCP头部格式是什么
芯片缺货导致多家车企宣布停工
[图文]“特富龙”致癌风险上调一级
机房远程维护解决方案,无人值守机房依旧安全稳固
欧莱雅的微型可穿戴设备可让用户确定何时应该注意紫外线照射
魅族副总裁华海良晒出魅族16T的拍摄照片
细说现代光通信测试技术发展动态
香港城市大学开发出了一种触觉电子皮肤
AI算法使用皱纹,斑点识别照片中面孔的年龄
小米6发布会直播进行时:各种黑科技!小米6化身自拍神器,售价曝光2499起,尊享版2999起