增量式光电编码器是工业自动化领域最常用的转速测量传感器。针对转速测量的应用需求,我们在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个字节。
全部0条评论
快来发表一下你的评论吧 !