脉宽调制信号PWM(Pulse Width Modulation)
PWM是用于使用数字输出引脚将比例控制信号应用于外部设备的常用方法。例如:伺服机使用输入PWM信号的脉冲宽度来确定它们的旋转角度。LCD显示屏根据PWM信号的平均值来调整它们的亮度。
PWM是一个根据给定的频率和占空比震荡的数字(即方波)信号:
- 频率(用HZ表示)描述了输出脉冲重复的频率。
- 周期是每一个周期所需的时间,是频率的倒数。
- 占空比(使用一个百分比表示)描述了该频率窗口内地脉冲宽度。
例如,设置为50%占空比的PWM信号对于每个周期有一般时间为高电平:
你可以调整占空比来增加或者减少信号的平均高电平时间,下面的图表分别展示了0%,25%和100%的占空比:
注意:大多数PWM硬件在每一个周期内至少会切换一次,所以即使占空比是0%和100%,它在每一个周期的开始仍然会有一个小的过度。
管理连接
为了打开一个到PWM端口的连接,你需要知道那个唯一的PWM名称。在开发的初始阶段,或者移植app到一个新硬件,使用PeripheralManagerService 的getPwmList()方法获取所有可用PWM的端口名称是很帮助的:
PeripheralManagerService manager = new PeripheralManagerService();
List<String> portList = manager.getPwmList();
if (portList.isEmpty()) {
Log.i(TAG, "No PWM port available on this device.");
} else {
Log.i(TAG, "List of available ports: " + portList);
}
一旦你知道了目标端口的名称,使用PeripheralManagerService 来连接到该端口。当你完成与PWM端口的交互后,要关闭连接来释放资源。另外,直到当前连接关闭之前你不能在此端口上重新打开一个连接。使用端口的close()方法来关闭连接。
public class HomeActivity extends Activity {
// PWM Name
private static final String PWM_NAME = ...;
private Pwm mPwm;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Attempt to access the PWM port
try {
mPwm = mPeripheralManager.openPwm(PWM_NAME);
} catch (IOException e) {
Log.w(TAG, "Unable to access PWM", e);
}
}
@Override
protected void onDestroy() {
super.onDestroy();
if (mPwm != null) {
try {
mPwm.close();
mPwm = null;
} catch (IOException e) {
Log.w(TAG, "Unable to close PWM", e);
}
}
}
}
配置以及控制PWM信号
在获取到连接之后,为PWM信号配置时序参数。你在第一次激活信号之前必须设置这些参数。调用setEnabled(true)来激活PWM信号,如果你需要暂时禁用信号,你可以调用setEnabled(false)。
下面的例子配置了PWM的频率为120HZ(周期为8.33ms),并且占空比为25%(每个周期的高电平时间是2.08ms):
public void initializePwm(Pwm pwm) throws IOException {
pwm.setPwmFrequencyHz(120);
pwm.setPwmDutyCycle(25);
// Enable the PWM signal
pwm.setEnabled(true);
}