QEI

QEI(Quadrature Encoder Interface,正交编码器接口),是一种硬件接口,通过测量编码器 A/B 两相管脚输出的脉冲数量和相对相位,从而测量电机的转速和方向。

Ruff QEI 接口抽象了 QEI 硬件接口本身所具有的功能,屏蔽了 QEI 接口的初始化过程,寄存器配置,和获取寄存器数值等硬件细节,将 QEI 接口应有的功能体现在若干个 Ruff QEI 提供的 API。Ruff 开发者可以通过 QEI 接口提供的 API 来编写任何采用 QEI 接口的外设模块的软件驱动,最终暴露出更高层次的 API 来给应用开发者使用。

前提条件

使用 QEI

配置 driver.json

1. 填写model名字

mg513-30

2. 填写QEI对象名字和类型

在inputs对象中,确定QEI对象名字(如qei-obj),和QEI类型,类型必须填写qei

3. 填写ppr参数

PPR(Pulses Per Round,每圈脉冲数),如果你所用到的编码器的输出只有A/B接口,那么你需要填写ppr参数,如果你用到的编码器输出有A/B/Z三个接口(Z为index,电机每转一圈,Z管脚输出一个脉冲),那么你不需要填写ppr参数。

这里假设只有A/B接口,每转动电机一圈,将在A或B接口输出390个脉冲,那么ppr参数为390。

注意:这一步是可选的。

完整的例子如下:

{
"model": [
"mg513-30"
],
"inputs": {
"qei-obj": {
"type": "qei"
}
},
"args": {
"ppr": 390
}
}

编写驱动

1. 在 attach 中获取 QEI 设备对象

attach: function (inputs, context) {
this._qei = inputs['qei-obj'];
}

2. 在 attach 中获取 driver.json 的 ppr 参数,并设置到 QEI 底层驱动中

attach: function (inputs, context) {
this._qei = inputs['qei-obj'];
this._ppr = context.args.ppr;
this._qei.setPPR(context.args.ppr);
}

3. 在 exports 中定义要导出的函数,并实现其函数功能

这一步,需要利用 QEI 接口提供的 API 和一些自定义的代码,来封装成你所要定义的更高层次的 API,如下例所示,目的是想要获得 RPM(Round Per Minute,每分钟电机转动圈数)。

首先通过 QEI 接口的 getVelocity API 来获得转速数值(绝对值,单位为每秒脉冲数),然后通过 QEI 接口的 getDirection API 来获得电机转动方向(+1代表前向,-1代表后向),然后将两者相乘,再乘以 60,除以 ppr,最终就求得了电机的 RPM 。

exports: {
getRpm: function (callback) {
var that = this;
this._qei.getVelocity(function (error, velocity) {
that._qei.getDirection(function (error, direction) {
var rpm = direction * velocity * 60 / that._ppr;
callback(undefined, rpm);
});
});
}
}

如果想了解更多 QEI 接口 API,请参考 其 API 文档