K230 使用 PWM 控制舵机

Viewed 50

问题描述


想让你的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

image.png

舵机控制线:

image.png

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

注意事项:

在驱动电机(如舵机)时,通常需要使用外部电源供电,不建议直接依赖开发板自身的电源。这是因为电机在运行或堵转(卡住)时会产生较大的驱动电流,例如本示例中的舵机在堵转时电流可达 1.5A。而开发板的供电能力有限,无法稳定提供如此大的电流,可能导致电压跌落,甚至损坏开发板。

此外,电机在启动、停止或反转过程中可能会产生反向高压(反电动势),进一步增加对开发板的损害风险。

为确保供电稳定,本项目中使用了独立的 5V 外部电源为板子供电(如下图蓝色标记所示)。同时确保舵机与开发板的 GND(地线)连接在一起,以实现共地,保证信号传输正常。

image.png

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

  1. 初始化 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 算法与手掌检测技术,教你打造一个能快速响应、精准跟随手掌移动的应用,让机械与视觉的协作更具灵动性!

1 Answers