实践/固件编程

树莓派Pico怎么用MicroPython驱动舵机?PWM频率和脉宽避坑

固件编程 2026-10-11 19:52:10 5阅读 5讨论 举报

第一次用树莓派Pico驱动舵机,很多人的代码看着没毛病,舵机却纹丝不动,或者转不到头的角度。这通常不是板子坏了,而是没搞懂舵机靠什么信号工作。今天就用MicroPython在Pico上把驱动SG90这类标准舵机这件事说透。

舵机到底吃的是什么信号

普通位置舵机内部就是一个占空比比较环路:它接收一个周期20毫秒、也就是50赫兹的PWM信号,靠信号脉宽对应的角度去转。理论上脉宽1毫秒对应0度、1.5毫秒对应90度、2毫秒对应当180度,但实际不同品牌的舵机会有点差异,范围多在0.5毫秒到2.5毫秒之间。所以驱动舵机的核心,是给它一个频率固定、脉宽可变的PWM信号,而不是单纯给高电平。

把这一点想明白,那些"转不起""停不下"的怪问题就解掉了一半。

接线:三根线别接反

标准舵机三根线,颜色基本固定:接地的通常棕色,正极红色,信号线橙色或黄色。Pico是3.3伏逻辑,但舵机一般要5伏供电,所以信号线和正极不要混。棕色接GND,红色接5V,信号线接到任意一个支持PWM的GPIO上,比如GP0或GP28。

需要特别提醒:舵机启动瞬间电流不小,很多入门教程建议给它单独接5V外部电源,别把多路舵机的电流全压在Pico的板上,否则板子容易复位。

MicroPython代码怎么写

Pico的MicroPython里用machine库的PWM模块。先创建一个PWM对象,把频率设成50赫兹,再用duty_u16设置占空比。duty_u16的取值范围是0到65535,因为周期20毫秒对应12.5%的占空比是180度,对应duty_u16就是815左右,以此类推,0度约1638、45度约3276、90度约4915,这样一级级推上去就行。

更省事的写法是封一个函数,把角度先换算成脉宽,再换算成duty_u16。先把角度从0到180映射到0.5到2.5毫秒的脉宽,再把脉宽拿到65535的满量程里换算成占空比数值,写进Duty,一个for循环就能让舵机从0度慢慢摆到180度。

两个避坑点

第一个坑是脉宽超界。舵机对超出范围的脉宽要么不理睬、要么硬顶,长期顶着容易烧舵机,转的时候要给角度留点余量,别硬塞0到180的极限。第二个坑是多路舵机供电不足,一路塞在Pico板上没事,三四路一起来,板子和舵机都吃不消,要么换专用舵机驱动板,要么多路共用一个外接电源。

把频率定在50赫兹、脉宽量准、供电管够这三件事做好,Pico驱动舵机就算真正入门了。接下来无论是给小车装个波头的眼睛,还是给机械臂调角度,你都有底子了。

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


登录 后发表评论
5条评论
探头看一眼
1楼 · 9小时前

供电不足我踩过,一次带三个舵机全卡住还以为是代码问题,后来单独供电全好了,这条坑必踩。

刷着刷着入坑了
2楼 · 9小时前

微型的S90一般没问题,但上MG90S或更大的舵机,电流明显不一样,供电这块真不能省。

好说好说
3楼 · 9小时前

用函数把角度换算成duty_u16再循环,这个封装思路很受用,改完一行就能调角度,谢谢楼主。

阿伟不emo
4楼 · 9小时前

舵机吃的是50Hz的PWM信号这个点太关键了,我一开始当成普通高低电平输出,板子压根不明白我要干嘛。

胶佬憨憨
5楼 · 9小时前

duty_u16换算那个讲得清楚,之前一直被角度和duty数值对应关系搞晕,现在明白是脉宽在中间搭桥。

本文作者
固件烧录仔
固件烧录仔 实践者
最近更新:2026-10-11 19:52