PWM 舵机
1.实验目的
本示例程序通过使用 K230 开发板上的 PWM 功能,控制一个标准的 180 度舵机进行 往复旋转。舵机会先从 -90 度逐步转到 +90 度,再按相反顺序回到 -90 度,形成一个完整的“去→回”动作循环。
本小节实验SG90舵机进行实现,开始前请先了解接线说明,如下图所示,
- 将舵机的VCC接到开发板的拓展排针的5V;
- 将舵机的GND接到开发板的拓展排针的GND;
- 将舵机的PWM信号线接到开发板的拓展排针的IO42;
2.实验原理
PWM 是一种用“开-关”脉冲信号,模拟“模拟信号”的技术。
它的核心在于快速地开关电路,通过控制高电平持续的时间,实现对输出功率的调节。
周期 (T):一整个高低电平变化的时间
占空比 (Duty Cycle):高电平在整个周期中所占的比例
例如:
占空比 | 高电平持续时间 | 模拟输出效果(假设5V) |
---|---|---|
0% | 0ms | 0V |
50% | T/2 | 2.5V(平均电压) |
100% | T | 5V |
PWM 的作用和应用:
- 舵机控制
- 标准舵机工作在 50Hz(周期20ms)
- PWM高电平宽度控制舵机角度:
- 0.5ms(2.5%) → -90°
- 1.5ms(7.5%) → 0°
- 2.5ms(12.5%)→ +90°
-
电机调速:控制直流电机的转速,PWM 占空比越大,电机转得越快。
-
LED 调光:用于控制亮度:占空比高 → 更亮,占空比低 → 更暗
-
音频输出:可以用 PWM 生成简单的声音信号。
3.代码解析
导入模块
from machine import Pin, PWM
from machine import FPIOA
import time
引脚功能配置
fpioa = FPIOA()
fpioa.set_function(42, FPIOA.PWM0)
使用 FPIOA
将物理引脚 IO42 映射为 PWM0
功能,舵机的控制信号输出就是从这个引脚发出的。
PWM 初始化
S1 = PWM(0, 50, duty=0, enable=True)
PWM(0, 50)
:选择 PWM 通道 0,频率 50Hz(标准舵机的控制频率)。
duty=0
:初始化占空比为 0(默认不发送有效信号)。
enable=True
:启用该 PWM 通道。
舵机角度控制函数
def Servo(servo, angle):
duty = (angle + 90) / 180 * 10 + 2.5
servo.duty(duty)
舵机的控制信号是一个 PWM 脉冲,不同的占空比对应不同的角度。这个函数将输入角度(-90° ~ +90°)转换为占空比(约 2.5% 到 12.5%):
- -90° → 2.5% 占空比
- 0° → 7.5% 占空比
- +90° → 12.5% 占空比
控制舵机往复旋转
angles_forward = [-90, -45, 0, 45, 90]
angles_backward = [45, 0, -45, -90]
while True:
for angle in angles_forward:
Servo(S1, angle)
time.sleep(0.5)
for angle in angles_backward:
Servo(S1, angle)
time.sleep(0.5)
- 第一段循环:舵机依次转动到 -90 → -45 → 0 → 45 → 90
- 第二段循环:舵机再从 45 回到 -90,形成“复位”
每步之间暂停 0.5 秒,使动作看起来平稳自然。
4.示例代码
'''
本程序遵循GPL V3协议, 请遵循协议
实验平台: DshanPI CanMV
开发板文档站点 : https://eai.100ask.net/
百问网学习平台 : https://www.100ask.net
百问网官方B站 : https://space.bilibili.com/275908810
百问网官方淘宝 : https://100ask.taobao.com
'''
from machine import Pin, PWM
from machine import FPIOA
import time
# 配置引脚42为PWM0功能
fpioa = FPIOA()
fpioa.set_function(42, FPIOA.PWM0)
# 初始化舵机PWM对象(PWM通道0,频率50Hz)
S1 = PWM(0, 50, duty=0, enable=True)
def Servo(servo, angle):
'''
舵机角度控制函数
角度范围:-90 到 90
对应 PWM 占空比范围:2.5% ~ 12.5%
'''
duty = (angle + 90) / 180 * 10 + 2.5 # 将角度映射到 duty 占空比
servo.duty(duty)
# 定义旋转角度顺序:先前进到 90,再逐步退回到 -90
angles_forward = [-90, -45, 0, 45, 90]
angles_backward = [45, 0, -45, -90]
while True:
# 顺时针旋转
for angle in angles_forward:
Servo(S1, angle)
time.sleep(0.5)
# 逆时针回到初始位置
for angle in angles_backward:
Servo(S1, angle)
time.sleep(0.5)
5.实验结果
控制一个标准的 180 度SG90舵机进行 往复旋转。