问题描述
想让你的K230开发板操控舵机灵活转动?掌握PWM信号应用是关键!这份超实用指南请收好👇
一、硬件准备
1、K230 开发板(例子里面我们使用的是庐山派开发板)
2、舵机 (淘宝购买,本次demo舵机链接:https://item.taobao.com/item.htm?id=17392171945)
3、杜邦线
1. K230 PWM 资源
可选用这些 PWM 引脚:
| PWM设备 | GPIO num | GPIO num | GPIO num |
|---|---|---|---|
| PWM0 | GPIO42 | GPIO54 | GPIO60 |
| PWM1 | GPIO43 | GPIO55 | GPIO61 |
| PWM2 | GPIO7 | GPIO46 | GPIO56 |
| PWM3 | GPIO8 | GPIO47 | GPIO57 |
| PWM4 | GPIO9 | GPIO52 | GPIO58 |
| PWM5 | GPIO25 | GPIO53 | GPIO59 |
注意:关于 PWM* 的 GPIO 配置,虽然可以选择任意一个 GPIO 引脚进行配置,但同一时刻,表格中每一行只能有一个 GPIO 被配置为 PWM 功能。
1、硬件连接
K230 | 舵机
----------------------------
PWM0 (GPIO42) → SIG(信号线)
5V电源 ↔ 5V电源
GND ↔ GND

舵机控制线:

庐山派连接引脚如下图所示:

注意事项:
在驱动电机(如舵机)时,通常需要使用外部电源供电,不建议直接依赖开发板自身的电源。这是因为电机在运行或堵转(卡住)时会产生较大的驱动电流,例如本示例中的舵机在堵转时电流可达 1.5A。而开发板的供电能力有限,无法稳定提供如此大的电流,可能导致电压跌落,甚至损坏开发板。
此外,电机在启动、停止或反转过程中可能会产生反向高压(反电动势),进一步增加对开发板的损害风险。
为确保供电稳定,本项目中使用了独立的 5V 外部电源为板子供电(如下图蓝色标记所示)。同时确保舵机与开发板的 GND(地线)连接在一起,以实现共地,保证信号传输正常。

2、舵机控制原理
这个指令信号就像一个“电脉冲”,它有两个部分:一个是“通电”的时间(高电平),一个是“断电”的时间(低电平)。
关键在于“通电”的时间长短。你让这个“通电”时间在0.5毫秒到2.5毫秒之间变化:
- 通电时间很短(比如0.5ms),它就转到最左边(比如-90°)
- 通电时间中等(比如1.5ms),它就转到正中间(比如0°)
- 通电时间很长(比如2.5ms),它就转到最右边(比如+90°)
所以,你通过改变这20毫秒一拍里,“通电”那一下持续多久,就能精确地控制它转到哪个角度,并停在那里不动。
在MicroPython编程里从-90°到90°,就是用不同的通电时间(脉冲宽度)来对应这个范围的角度。比如1ms对应-90°,1.5ms对应0°,2ms对应+90°(具体对应关系要看舵机规格)
3、操作步骤
参考 demo:
升级最新的 K230 固件:
https://kendryte-download.canaan-creative.com/developer/releases/canmv_k230_micropython/daily_build/
demo 路径:
/canmv/sdcard/examples/03-Machine/pwm-servo.py
- 初始化 PWM 模块( 50Hz 频率):
from machine import PWM
pwm = PWM(42, freq = 50) # 通道0,引脚42,频率50Hz
2、控制角度
def angle_to_pulse(angle):
return 0.5 + (angle / 180) * 2.0
# 计算脉冲宽度对应的duty值
def pulse_to_duty(pulse_ms):
returnint((pulse_ms / 20) * 65535)
def pulse_to_ns(pulse_ms):
returnint(pulse_ms * 1000 * 1000)
# 移动舵机到指定角度
def move_servo(angle):
pulse = angle_to_pulse(angle)
pulse_to_duty(pulse)
pwm.duty_u16(duty)
#pulse_to_ns(angle)
#pwm.duty_ns(duty)
print(duty)
3、 控制舵机来回转动:
#角度变动时的等待时间
DELAY_PER_DEGREE = 0.1
print("舵机摆动启动...")
try:
while True:
# 从最小角度移动到最大角度
for angle in range(ANGLE_RANGE[0], ANGLE_RANGE[1] + 1,1):
move_servo(angle)
time.sleep(DELAY_PER_DEGREE)
# 从最大角度移动到最小角度
for angle in range(ANGLE_RANGE[1], ANGLE_RANGE[0] - 1, -1):
move_servo(angle)
time.sleep(DELAY_PER_DEGREE)
except KeyboardInterrupt:
print("程序终止")
# 归中后关闭PWM
move_servo(90)
time.sleep(1)
pwm.deinit()
⚠️注意事项
① 舵机需独立供电,避免电流过大影响主板
② 同一 PWM 模块的通道(0/1/2或3/4/5)共享频率,多舵机控制需统一设为 50Hz
③ 首次使用建议校准脉宽与角度对应关系
用 K230 的 PWM 功能,轻松实现机械臂关节转动、机器人转向等创意项目!你打算用它来做什么?欢迎评论区交流~
庐山派CanMV 镜像下载:
https://www.kendryte.com/zh/resource/images,k230
庐山派官方 PWM 参考资料:
https://wiki.lckfb.com/zh-hans/lushan-pi-k230/basic/pwm.html
本期我们带大家掌握了用 PWM 控制舵机的方法,下一期,我们将进一步升级 —— 结合 PID 算法与手掌检测技术,教你打造一个能快速响应、精准跟随手掌移动的应用,让机械与视觉的协作更具灵动性!