实践/固件编程

树莓派Pico用MicroPython控制舵机怎么写?PWM频率和占空比避坑

固件编程 2026-10-14 08:47:26 31阅读 4讨论 举报
树莓派Pico用MicroPython控制舵机怎么写?PWM频率和占空比避坑

树莓派Pico配MicroPython,是新手学机器人控制的很顺手的组合——不用碰复杂的编译环境,开了Thonny写完就能跑。我第一次用Pico控制SG90舵机时,卡在最基础却最容易被忽略的一件事上:PWM那两个参数到底怎么设。这篇文章把舵机控制的写法和你该注意的坑一次讲清楚。

先设频率:舵机认50Hz

普通舵机靠PWM的脉宽来定角度,而它的基准频率基本都是50Hz,也就是周期20毫秒。所以第一行关键代码是把Pico那个引脚初始化成PWM,然后freq(50)。很多人直接把GPIO当高低电平写digitalWrite,舵机要么不动要么乱转,就是因为频率没对上。

MicroPython里写起来是这样:先machine.PWM(machine.Pin(15))建一个PWM对象,再servo.freq(50)把频率订死到50Hz。从此这个引脚的占空比就决定舵机转到哪个角度了。

占空比要换算,别直接写0到255

接下来就是最容易懵的点:MicroPython的PWM用duty_u16()来设占空比,范围是0到65535,不是Arduino里常见的0到255。要把角度换算成这个数,得先知道一个标准:0.5毫秒脉宽对应0度,1.5毫秒对应90度,2.5毫秒对应180度。

换算公式不复杂:占空值 = 脉宽(毫秒) / 周期20毫秒 × 65535。算一下就知道0度约是1638,180度约是8192。所以写个映射函数,把“我想转多少度”翻译成duty_u16该填的数字,舵机就能指到任意角度了。

供电别靠Pico的3.3V

这是个很实际的坑:SG90这种舵机启动瞬间电流能到几百毫安,靠Pico板上那个3.3V或VBUS的5V去喂,很容易把板子拖复位、甚至让USB口保护。稳妥做法是舵机的红线、棕线单独接一个外部5V电源(比如电池盒),信号线才由Pico的GPIO出,并且Pico和外部电源共地。

如果只是做轻载的小演示,接VBUS勉强能用,但一旦加了负载或同时拖多个舵机,就一定要外接电源了。这个是不少新手在“舵机把板子带崩”之后才悟到的。

多用几个顺手的映射函数

把角度换算封装成一个servo_write(pin, angle)函数,后面写机械臂、云台都会很省心。函数里做两步:先把角度map到脉冲宽度0.5到2.5毫秒,再把脉宽map到占空比0到65535,最后duty_u16写进去。这样一个函数,凡是标准50Hz舵机都能复用。

Pico加MicroPython做舵机控制的优点是试错成本低、写法直观,你把频率、占空比换算、外部供电这三件事想明白,从单舵机到多舵机机械臂,基本就是套同一个函数的量。

版权声明:
作者:隔壁老王的教程
链接:https://www.aiddithome.com/p/193e36b812411e.html
来源:固件编程
实践版权归作者所有,未经允许请勿转载,若此实践存在违规行为,您可以点击 “举报”。


登录 后发表评论
4条评论
调参到凌晨
1楼 · 21小时前

把角度换算封装成函数这招灵,后面做云台直接复用同一段

只看不说话
2楼 · 21小时前

duty_u16那个换算我第一次差点当0-255写,直接把舵机干懵了,感谢点破

参数党小马
3楼 · 21小时前

供电确实要外接,我第一次直接插Pico上,一动就复位,加上外接5V就好了

天快亮了
4楼 · 21小时前

频率50Hz这个点卡了我一下午,没设freq的时候舵机死活不动,设完就好了

本文作者
最近更新:2026-10-14 08:47