什么是 PWM
PWM,全称脉冲宽度调制(Pulse Width Modulation),是一种将数字信号模拟成模拟信号的方法。【是的我知道这句话比较绕口】
数字信号与模拟信号
数字信号为只有两种状态的信号,比如0 或 1,开或关,True 或 False。模拟信号指的是能够在一个区间内随意变化的信号。
通过操作输出端口在短时间内的开或关,能够将输出端口的电压(比如5V)在这段时间内平均为 0V 到 5V 之间的任意电压值。
占空比
占空比是高电压信号的时间与总周期时间的比值,比如周期 5ms,信号 1ms 则占空比为 20%。
信号的波形如下图所示:
pwm.png舵机与 PWM
常见的舵机都使用 50Hz 的控制信号,也就是周期为 20ms 的信号。
其中,5% ~ 10% 的占空比对应了舵机的 0° ~ 180° 的动作范围。
sg90pwm.png程序
使用 WPILib 控制舵机非常简单。
首先我们需要 import 舵机的库
...
import edu.wpi.first.wpilibj.Servo;
...
之后在机器人类下面定义舵机变量
...
public class Robot extends TimedRobot {
private Servo example_servo;
...
}
...
在机器人初始化方法中创建servo对象,括号中的数字是舵机在电路中连接的 PWM 端口,0~9 在 RoboRIO 上,10~19 在扩展板上
...
@Override
public void robotInit() {
// the PWM port number is needed to create the servo object.
example_servo = new Servo(9);
...
}
...
之后就可以在程序中引用。下面给出了一个通过 XboxController 的按钮控制舵机的例子
...
@Override
public void teleopPeriodic() {
if (joystick.getAButton()) {
// set the servo to CCW maximum.
example_servo.set(0.0);
}
if (joystick.getBButton()) {
// set the servo to CW maximum.
example_servo.set(1.0);
}
...
}
...
example_servo.setAngle(degree)
同样可以被用来控制舵机,degree 为角度值,0.0 ~ 180.0
作业
-
写出一个使用 XboxController 0号摇杆控制 PWM 2号端口的舵机角度的程序(20分)
-
写出一个使用 XboxController LeftBumper 按钮控制 PWM 12号端口的舵机角度的程序,要求按钮按下抬起一次舵机转动到 100°,再次按下抬起舵机转动到 30°(20分)
要求:
-
请将题目抄写在程序注释中。
-
行数在 100-200 之间。
-
不要出现所在学校的校名或师生姓名。
-
遵守格式和注释要求。
网友评论