英创信息技术EM9380多路任意脉冲发生器及应用

em9380是面向实时控制应用的一款工控主板,这里所说的实时控制是指那些控制周期可能短至几十微妙的控制应用。em9380通过板上独立运行的硬件协处理器(cortex-m3),可很好的满足这类应用的需求。多路任意脉冲发生器,就是按照用户预设的流程,按设定的时间间隔(最短25us),同时更新多路(最多8路)数字输出的电平状态,从而构成多路任意周期的脉冲信号输出。多路任意脉冲发生器功能,可用于步进电机的控制,在纺织、印刷设备中有广泛的应用。本文后续部分将主要介绍在应用程序中实现任意脉冲发生器功能的流程。
接口硬件说明
em9380中的gpio0–gpio15是由其硬件协处理器直接控制的,它们均可作为任意脉冲发生器的输出,输出的总数不超过8路。对选定作为意脉冲输出的gpio,首先需要设置成输出模式。因为在em9380上电或复位启动后,gpio0 – gpio15均处于输出状态的,由于内部100kω上拉,其电平均为高电平(管脚悬空时)。在实际应用中,若需要脉冲输出的初始电平为低电平,可在其管脚接10kω的下拉电阻至地。
接口软件说明
为了操作gpio0–gpio15这组gpio,首先需要打开硬件写处理器的驱动程序,其设备文件名为”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,支持以下gpio命令:
mcu_generic_gpio_oe // 输出使能
mcu_generic_gpio_od // 输出禁止,作为数字输入
mcu_generic_gpio_set // 输出高电平
mcu_generic_gpio_clr // 输出低电平
mcu_generic_gpio_pin // 读取输入管脚电平状态
mcu_generic_gpio_of // 实时控制输出流
其中前5个命令通过以下的数据结构来设置相关参数,从而实现gpio的命令:
typedef struct
{
byte ucsize; // 本数据结构大小 = 17字节
byte uccmd; // gpio命令码:mcu_generic_gpio_xxx
dword dwpins; // 操作的管脚位
dword dwstatus; // 返回的管脚电平状态
dword dwperiod; // 实时控制周期,单位us;= 0: 常规功能
bool bflashed; // 保存本配置作为启动缺省功能
byte ucchksum; // 校验和
} mcu_gpio_info, *pmcu_gpio_info; // struct for gpio
对于本应用来说,首先需要把所选择的gpio设置为输出模式,具体代码如下:
mcu_gpio_info info; //定义结构对象
memset(&info, 0, sizeof(mcu_gpio_info));//清零
//填写所需的参数
info.ucsize = sizeof(mcu_gpio_info);
info.uccmd = mcu_generic_gpio_oe; //设置为输出模式
info.dwpins = gpio3 | gpio2 | gpio1 | gpio0; //设置4路脉冲输出
// 生成chksum字节
info.ucchksum = chksum(&info, sizeof(mcu_gpio_info)-1);
// 调用deviceiocontrol
if (!deviceiocontrol(hmcu2, // file handle to the driver
mcu_ioctl_access, // i/o control code
&info, // input buffer
sizeof(mcu_gpio_info), // in buffer size
null, // out buffer
0, // out buffer size
null, // pointer to number of bytes returned
null)) // ignored (=null)
{
// 出错处理......
return false;
}
其次是设置脉冲的初始电平及脉冲的更新周期,其主要代码如下:
memset(&info, 0, sizeof(mcu_gpio_info));//清零
//填写所需的参数
info.ucsize = sizeof(mcu_gpio_info);
info.uccmd = mcu_generic_gpio_set; //输出的初始电平为高电平
//info.uccmd = mcu_generic_gpio_clr; //输出的初始电平为低电平
info.dwpins = gpio3 | gpio2 | gpio1 | gpio0; //设置4路脉冲输出
info.dwperiod = 25; //设置更新周期为25us
接着的生成chksum字节和调用deviceiocontrol操作和上一步是一样的,不再赘述。
设置了更新周期后,硬件协处理器已处于脉冲输出状态,只等驱动程序mcu2下传相应的数据流了。下传的数据流将按以下数据结构分包逐一下传:
typedef struct
{
byte ucsize; //本数据结构大小 = 64字节
byte uccmd; // = mcu_generic_gpio_of
byte ucrawdat[60]; // 更新数据字节
byte ucchksum; //
} mcu_gpio_flow, *pmcu_gpio_flow; // struct for gpio
每一个更新数据字节对应着一次更新,所以一包数据可供60个更新周期使用。数据字节的格式是按gpio的编号右对齐的,即设置的gpio中,编号最小的那一路,其更新的bit为更新数据字节的lsb(d0),其他数据按编号递增,向左排列至msb(d7)。
下传数据流,同样需要做chksum,再调用deviceiocontrol:
if (!deviceiocontrol(hmcu2, //file handle to the driver
mcu_ioctl_access, // i/o control code
&flow, // input buffer
sizeof(mcu_gpio_flow), // in buffer size
null, // out buffer
0, // out buffer size
null, // pointer to number of bytes returned
null)) // ignored (=null)
{
// 出错处理......
return false;
}
数据更新流程说明
对任意脉冲发生器功能,em9380硬件协处理器内部设置有一对256字节的乒乓buffer。这样驱动程序mcu2在下传数据包时,每次可发送4个数据包(第一次下传1个包即可),这样可进一步提高主cpu的工作效率。对25us更新周期来说,就表示驱动程序下传数据的间隔为6ms。一旦第一包数据下传至硬件协处理器,实质性启动任意脉冲波形输出后,当有空闲的乒乓buffer时,硬件协处理器会立即通知驱动程序mcu2。应用程序可设置专门线程获取数据请求事件,从而启动数据下传。其基本的流程如下:
dword dwreturn = 0; // 返回状态,= 1:数据请求,= 0:超时
dword dwtimeout = 12; // 12ms,2倍正常下传间隔
// 初始下传一个数据包,然后进入主循环。
// ......
// 主循环:等待下传数据请求
for(; ;)
{
if (!deviceiocontrol(hmcu2, // file handle to the driver
mcu_ioctl_wait_for_data, // i/o control code
&dwtimeout, // input buffer
sizeof(dword), // in buffer size
null, // out buffer
0, // out buffer size
&dwreturn, // pointer to number of bytes returned
null)) // ignored (=null)
{
// 出错处理......
}
if(dwreturn)
{
// 下传数据包(4包)......
dwreturn = 0; // 清标志
}
}

中微中标长江存储9台刻蚀设备订单 将迈向成长期新阶段
一位成就系统工程师的职业生涯
“一体化”模式与钢铁制造业数字化转型
Intel:ARM架构的SoC FPGA将继续更新,IA架构的未来也会有!
常用信号的分类与观察
英创信息技术EM9380多路任意脉冲发生器及应用
如何利用xilinx器件中LUT的结构特征设计乘法器呢?
爱特公司宣布其多种FPGA产品现可搭配使用加密内核,Acte
主板维修入门教程:电路的基本概念
智能制造是什么 智能制造是干什么的
iPhone 12或有5.4英寸,iPhone 9也将搭载Face ID
交流负反馈电路原理图
基于Qtopia的嵌入式九宫格方式的中文输入法设计
实体商家会受到5G时代的冲击吗
为什么说 GaN 是 5G 的超级“动力”
瑞迅科技触控一体机在茶咖商用设备上的应用解决方案
三星S7/S7 edge有三种方式来更新Android 7.0
中国移动推出切片分组网络SPN技术已具备规模试商用条件
一款可提高电源效率的负端同步整流芯片U7710
嵌入式微处理器对电源管理的支持