1. 项目背景与硬件准备
嘉楠堪智K230开发板是一款面向边缘计算和AIoT应用的高性能开发平台,由01 Studio推出。这款开发板搭载了双核RISC-V处理器,主频高达1GHz,具备丰富的GPIO接口和硬件加速能力。在本次实验中,我们将重点利用其PWM(脉冲宽度调制)功能来实现对舵机的精确控制。
舵机(Servo Motor)是一种能够精确控制旋转角度的电机,广泛应用于机器人、航模、智能家居等领域。常见的舵机分为180°角度舵机和360°连续旋转舵机两种类型。前者可以精确控制到特定角度位置,后者则可以控制旋转方向和速度。
1.1 所需硬件清单
- 01 Studio K230开发板(含配套电源)
- SG90舵机(180°型号)或类似规格舵机
- 3P杜邦线(公对公)若干
- 可选:外部5V电源(用于大功率舵机)
注意:当使用电流较大的舵机时,建议使用独立电源供电,避免开发板电源过载。
1.2 硬件连接说明
K230开发板提供了4路PWM输出(通过GPIO42、43、46、47引脚),每路PWM均可用于控制一个舵机。连接时需要注意:
舵机通常采用3P接口,线序一般为:
- 棕色/黑色:GND(接地)
- 红色:VCC(5V电源)
- 橙色/黄色:信号线(PWM控制)
开发板上的对应引脚:
- GPIO42:PWM0
- GPIO43:PWM1
- GPIO46:PWM2
- GPIO47:PWM3
连接示例(以GPIO42控制一个舵机为例):
- 舵机GND → 开发板GND
- 舵机VCC → 开发板5V
- 舵机信号线 → GPIO42
2. PWM控制原理与舵机工作机制
2.1 PWM基础原理
PWM(Pulse Width Modulation)即脉冲宽度调制,是一种通过调节脉冲信号的占空比来控制设备的技术。对于舵机控制,PWM信号的典型参数为:
- 频率:50Hz(周期20ms)
- 高电平持续时间:0.5ms-2.5ms
- 占空比范围:2.5%-12.5%
2.2 舵机角度控制机制
对于180°舵机,PWM信号的高电平持续时间与角度对应关系如下:
- 0.5ms → -90°
- 1.5ms → 0°
- 2.5ms → +90°
这种线性关系可以用公式表示:
脉冲宽度(μs) = 500 + (角度 + 90) * 2000 / 180360°连续旋转舵机的控制原理类似,但高电平持续时间对应的是旋转方向和速度:
- 1.5ms → 停止
- <1.5ms → 逆时针旋转(值越小速度越快)
1.5ms → 顺时针旋转(值越大速度越快)
3. 开发环境配置与代码实现
3.1 MicroPython环境准备
K230开发板支持MicroPython编程,我们需要先配置开发环境:
- 下载并安装CanMV IDE(01 Studio官方开发环境)
- 通过USB连接开发板
- 在IDE中选择正确的串口端口
- 创建新项目并保存为
servo_test.py
3.2 核心代码解析
以下是完整的舵机控制代码,我们将分段解析其实现原理:
from machine import Pin, PWM from machine import FPIOA import time # 配置引脚42为PWM0功能 fpioa = FPIOA() fpioa.set_function(42, FPIOA.PWM0) # 构建PWM0对象,频率50Hz,初始占空比0 S1 = PWM(0, freq=50, duty_ns=0) def Servo(servo, angle): """舵机控制函数 :param servo: PWM对象 :param angle: 角度值(-90到90) """ servo.duty_ns(int((angle + 90)/180 * 2000000 + 500000)) # 主循环 while True: Servo(S1, -90) # -90度 time.sleep(1) Servo(S1, -45) # -45度 time.sleep(1) Servo(S1, 0) # 0度 time.sleep(1) Servo(S1, 45) # 45度 time.sleep(1) Servo(S1, 90) # 90度 time.sleep(1)3.3 代码关键点说明
FPIOA类:用于配置引脚功能,将物理GPIO映射到特定功能(如PWM)PWM类:创建PWM对象,参数包括:- 通道号(0-3对应PWM0-PWM3)
- 频率(设置为50Hz,标准舵机频率)
- 初始占空比(以纳秒为单位)
Servo()函数:将角度转换为对应的PWM脉冲宽度- 公式解析:
(angle + 90)/180将角度归一化到0-1范围 *2000000将范围映射到2000000ns(2ms)+500000加上基础500000ns(0.5ms)
- 公式解析:
4. 进阶应用与问题排查
4.1 多路舵机控制
K230开发板支持同时控制最多4个舵机,只需配置不同的PWM通道即可。以下是两路舵机控制的示例:
# 配置PWM0(GPIO42) fpioa.set_function(42, FPIOA.PWM0) S1 = PWM(0, freq=50, duty_ns=0) # 配置PWM1(GPIO43) fpioa.set_function(43, FPIOA.PWM1) S2 = PWM(1, freq=50, duty_ns=0) while True: Servo(S1, 45) Servo(S2, -45) time.sleep(1) Servo(S1, -45) Servo(S2, 45) time.sleep(1)4.2 常见问题与解决方案
舵机无反应:
- 检查电源连接是否正常(用万用表测量VCC-GND电压)
- 确认信号线连接正确(开发板GPIO→舵机信号线)
- 检查代码中PWM通道配置是否正确
舵机抖动或不稳定:
- 可能是电源功率不足,尝试使用外部电源
- 检查PWM频率是否设置为50Hz
- 确保代码中没有频繁重新初始化PWM对象
角度控制不准确:
- 校准舵机中性位置(1.5ms脉冲对应0°)
- 检查机械结构是否有卡顿或负载过重
- 尝试微调脉冲宽度参数(500000-2500000ns范围)
4.3 性能优化建议
对于需要快速响应的应用,可以:
- 减少
time.sleep()的间隔时间 - 使用中断或定时器实现更精确的控制
- 考虑使用DMA方式生成PWM信号
- 减少
当控制多个舵机时:
- 注意总电流不要超过开发板供电能力
- 可以为每组舵机配置独立电源
- 使用PCA9685等PWM扩展芯片
在机器人应用中:
- 建立舵机角度与机械位置的映射表
- 实现平滑运动算法(如余弦加速度)
- 添加限位保护防止机械结构损坏
5. 实际应用案例扩展
5.1 机械臂控制
通过组合多个舵机,可以构建简单的机械臂系统。例如3自由度机械臂:
# 初始化3个舵机 fpioa.set_function(42, FPIOA.PWM0) # 底座旋转 fpioa.set_function(43, FPIOA.PWM1) # 大臂 fpioa.set_function(46, FPIOA.PWM2) # 小臂 base = PWM(0, freq=50) arm1 = PWM(1, freq=50) arm2 = PWM(2, freq=50) def move_to_angle(b, a1, a2): Servo(base, b) Servo(arm1, a1) Servo(arm2, a2) time.sleep(0.5) # 等待运动完成 # 示例动作序列 move_to_angle(0, 45, -30) move_to_angle(30, 30, -15) move_to_angle(-30, 60, -45)5.2 智能小车转向控制
360°连续旋转舵机可用作小车的驱动电机:
# 配置为连续旋转模式 wheel = PWM(0, freq=50) def set_speed(speed): # -90到90对应反向全速到正向全速 wheel.duty_ns(int((speed + 90)/180 * 2000000 + 500000)) # 前进 set_speed(60) # 中等速度前进 time.sleep(2) # 后退 set_speed(-60) # 中等速度后退 time.sleep(2) # 停止 set_speed(0)5.3 云台摄像头控制
两个180°舵机可以组成Pan-Tilt云台:
pan = PWM(0, freq=50) # 水平旋转 tilt = PWM(1, freq=50) # 俯仰 def scan_pattern(): for p in range(-60, 61, 15): Servo(pan, p) for t in range(-30, 31, 10): Servo(tilt, t) time.sleep(0.2) scan_pattern()在实际项目中,可以结合K230的图像识别能力,实现自动跟踪等高级功能。
通过本实验,我们不仅掌握了K230开发板的PWM功能使用,还深入理解了舵机控制原理。这种基础控制在机器人、智能硬件等领域有广泛应用,是嵌入式开发的重要技能之一。