增量式光电编码器是工业自动化领域最常用的转速测量传感器。针对转速测量的应用需求,我们在em9280的硬件基础上,设计了相应的驱动程序并提供标准的流式驱动程序api,为客户应用程序增加转速测量功能提供了一种快速低成本的实现途径。本文主要介绍英创工控主板em9280与增量式光电旋转编码器的软硬件接口。
接口硬件说明
鉴于本应用主要是监测转速信号,因此只需要接入增量式光电旋转编码器的a、b两相脉冲信号即可。典型的a、b相信号的关系如下图所示:
上图的左面是a、b相在电机顺时针方向旋转时的波形,其特点是a相脉冲超前b相脉冲90º相位。而图的右边是点击逆时针旋转时的波形,此时b相超前a相90º相位。
一般说来,光电编码器的a、b相信号需要经过隔离及电平转换电路,方可接入em9280的相应管脚。隔离整形后的a、b相输出信号必须是3.3v的ttl信号,与em9280连接如下表所示:
光电编码器
em9280管脚
简要说明
a相信号
gpio23
3.3v ttl电平信号
b相信号
gpio22
3.3v ttl电平信号
由于内部电路对a、b相信号进一步做了去抖动处理,因此要求输入信号频率不能高于5khz,方能保证后续计数结果的正确。
从应用编程的角度看,光电编码器的基本指标包括:(1)每分钟最大转速,(2)每转输出的脉冲数,也就是光电编码器的分辨率。
接口软件说明
光电编码转速测量的驱动程序已内置在em9280的内核中,其设备文件名为”rot1:”。当打开该设备文件后,em9280的对应管脚(gpio23和gpio22)将自动转为相应的脉冲输入状态。当然这两个管脚不能再作为通用gpio或i2c接口使用。
当调用createfile(_t(”rot1:”), ….)打开设备文件后,可通过writefile设置光电编码器的参数,参数包含在以下数据结构:
typedef struct _rotary_encoder_info
{
byte ucsize; // 填入本结构的字节数 = 21
dword dwmaxrotary; // 正常工况每分钟旋转圈数,单位为rpm
dword dwresolution; // 每转输出的脉冲数
dword dwalarmrotaryhigh; // 转速报警高限值,单位rpm,= 0: 禁止该功能
dword dwalarmrotarylow; // 转速报警低限值,单位rpm,= 0: 禁止该功能
dword dwperiod; // 采样周期,单位为ms,= 0:自动设置采样周期
} rotary_encoder_info, *protary_encoder_info;
在上述数据结构中,dwmaxrotary设置的上限是编码器的最高转速,也可根据实际应用设置为正常工况的最高转速。本驱动程序支持的采样间隔共10档,分别为1ms、2ms、5ms、10ms、20ms、50ms、100ms、200ms、500ms、1000ms。采样周期与编码器参数的关系为:
n =(dwmaxrotary×dwresolution / 60)× dwperiod / 1000
上式中n表示在一个采样间隔所采集的脉冲数,当n为正时,表示顺时针旋转,n为负数时,表示逆时针旋转。在本驱动程序中,采集输出的数据即为n,数据类型为带符号的16-bit整型量。具体设置并启动测量的api调用为:
rotary_encoder_info info; //定义结构对象
dword dwreturnwritten; //实际写入的字节数
//填写数据结构参数
info.ucsize = sizeof(rotary_encoder_info);
// … …
writefile(hrot, &info, sizeof(rotary_encoder_info), &dwreturnwritten, 0);
上面调用中的hrot是createfile返回的文件句柄。若dwperiod设置为自动(= 0),则可通过以下api读取驱动实际使用的采样周期:
readfile(hrot, &info, sizeof(rotary_encoder_info), &dwreturnread, 0);
若应用程序设置自动采样周期,驱动程序将根据光电编码器的基本参数(转速和分辨率),选取满足一定精度的最小采样周期。
当通过writefile设置并启动了转速测量后,还可通过readfile随时读取当前转速或截止当前时刻的转速数据序列(即转速曲线),具体调用方式为:
int short dbuf[1024]; // 16-bit 带符号整型量数据buffer
dword dwbuflen; // buffer长度,必须两字节对齐
dword dwreturnread; // 返回的字节数
dword dwnbsamples;
dwbuflen = 20 * sizeof(int short); // 采集20个样点
dwreturnread = 0; // 必须置0
readfile(hrot, dbuf, dwbuflen, &dwreturnread, 0);
dwnbsamples = dwreturnread / sizeof(int short);
注意实际采集的点数有可能小于希望采集的点数。在驱动程序内部缓冲的最大数据点数为32k,即32768个样点。上面调用中特别要注意的是dwbuflen必须为两字节对齐,这是因为16-bit 带符号整型量占用2个字节。
无排放多用途车和专用车
Google 汽车最新专利,撞到行人后把人黏在车上
OPPO年底首发搭载高通双模5G芯片手机,同时支持SA和NSA
基于单片机和传感器技术实现多参数气体检测仪的应用方案
英飞凌汽车HID前灯镇流器及PFC控制解决方案
英创信息技术EM9280与光电编码器的接口及应用简介
工业大数据领域:荣之联营业收入远超东方国信
美国正试图通过限制半导体对华出口让中国屈服
机器人大军抗疫各显神通 三大方面切入疫情防控
LCD液晶段码屏显示驱动IC-VK1056B/C更少脚位,体积封装小FAE支持
LTC5589/LTC5599低功率IQ调制器的基带设计示例
直线电机和直线模组的区别
iPhone迎来新突破,立体悬浮屏+药丸形三摄+A14 Bionic
ColorOS宣布ColorOS7的内部代号,将于11月20日发布
具有无线数据传输功能的红外测温仪的设计
初创公司发布可用于物联网可穿戴设备为目标市场的的MRAM微控制器
三星的下一代芯片将重点放在AI和5G技术上
拥有加密货币之前要知道什么
关于苹果自研5G基带芯片的性能分析
CPU风扇产生噪音的原因