PWM

PWM,是 Pulse Width Modulation(脉冲宽度调制)的缩写,它是一种常见的硬件接口,用以通过数字输出控制模拟电路设备。

如果想更多的了解 PWM,可以到这里

前提条件

使用 PWM

请根据外设的数据手册,确定外设的接口类型为 PWM。

配置 driver.json

确定自己的硬件接口是 PWM 后,需要声明硬件接口类型为 PWM。在 driver.json 文件里的 inputs,指定接口类型(type)为 PWM。

{
...
"inputs": {
"pwm": {
"type": "pwm",
"args": {
"frequency": 200
}
},
}
}

接口属性

PWM 接口可以配置如下属性:

  • frequency 设置输出方波频率。

编写驱动

PWM 主要有两个接口:

  • setDuty,设置 PWM 接口的占空比,其参数的取值范围是0至1之间的一个浮点数,它会改变 PWM 接口负载两端的平均电压。
pwm.setDuty(0.5);
  • setFrequency,设置 PWM 接口的输出方波频率,单位是 Hz。
pwm.setFrequency(300);

如果想了解更多细节,请参考其 API 文档

应用

LED 模块(ky-016)

LED 模块拥有三个输出方波频率为 800Hz 的 PWM 端口R、G、B,在 driver.json 文件中声明三个类型为 PWM 的接口,设定输出方波频率为 800Hz。

"models": [
"KY-016"
],
"inputs": {
"pwm-r": {
"type": "pwm",
"args": {
"frequency": 800
}
},
"pwm-g": {
"type": "pwm",
"args": {
"frequency": 800
}
},
"pwm-b": {
"type": "pwm",
"args": {
"frequency": 800
}
}
}

我们为 LED 模块提供四个接口,分别是设置灯颜色(setRGB)、读取当前 RGB 值(getRGB)、亮灯(turnOn)以及灭灯(turnOff),其具体实现方式如下:

  • setRGB ,设置R、G、B 引脚的占空比,通过控制RGB负载上的平均电压,调节三种基色的强度,让灯显示各种颜色
  • getRGB ,返回当前 RGB 值
  • turnOn ,调用 setRGB 函数,设置 R、G、B 三引脚占空比为1,让灯亮白光
  • turnOff ,调用 setRGB 函数,设置 R、G、B 三引脚占空比为0,让灯灭
'use strict';

var driver = require('ruff-driver');

module.exports = driver({

attach: function (inputs) {
this._pwmR = inputs['pwm-r'];
this._pwmG = inputs['pwm-g'];
this._pwmB = inputs['pwm-b'];
},

exports: {
setRGB: function (rgb, callback) {
if (Array.isArray(rgb)) {
this._r = rgb[0];
this._g = rgb[1];
this._b = rgb[2];
}

this._pwmR.setDuty(this._r / 0xff);
this._pwmG.setDuty(this._g / 0xff);
this._pwmB.setDuty(this._b / 0xff, callback);
},

getRGB: function (callback) {
return setImmediate(callback, undefined, [this._r, this._g, this._b]);
},

turnOn: function (callback) {
this.setRGB([0xff, 0xff, 0xff], callback);
},

turnOff: function (callback) {
this.setRGB([0x00, 0x00, 0x00], callback);
}
}
});