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) { |
2. 在 attach 中获取 driver.json 的 ppr 参数,并设置到 QEI 底层驱动中
attach: function (inputs, context) { |
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 文档 。