首页/新闻资讯/正文详情

SG90与MG90S舵机选型指南及STM32 PWM控制实战

发布时间:2026/9/23 8:01:05 来源:云帆数科 栏目:资讯中心
SG90与MG90S舵机选型指南及STM32 PWM控制实战
舵机这个小东西看起来简单两根线供电一根线给信号就能转但真到选型的时候SG90和MG90S这两个型号能把人纠结死。我见过太多人随手买一堆SG90结果装到机械臂上一上负载就抖成筛子也见过有人全上MG90S结果发现轻量场景下多花的钱完全没必要。更麻烦的是很多人连舵机的控制原理都没搞明白直接抄一段代码烧进去舵机要么不动要么乱转要么发出咔咔的堵转声然后就开始怀疑是不是自己买的舵机有问题。这篇内容就是冲着这两个问题来的第一把SG90和MG90S的区别讲透从内部结构到实际表现让你看完就知道什么场景该选哪个第二用STM32CubeMX从零配置PWM输出把舵机控制跑通顺便把那些新手最容易踩的坑提前给你标出来。不管你是刚接触嵌入式的新手还是做过几个项目但一直没认真研究过舵机选型的老手这篇内容都能让你少走弯路。1. 先搞清楚舵机到底在转什么1.1 舵机的本质是一个带反馈的减速电机很多人第一次拿到舵机以为它就是个普通电机给电就转。实际上舵机内部是一个完整的闭环控制系统拆开外壳你能看到一个小型直流电机、一组塑料或金属齿轮组成的减速箱、一个电位器角度传感器、以及一块小小的控制板。这四样东西构成了一个位置伺服系统。工作逻辑是这样的控制板接收外部PWM信号把信号的脉宽解读为目标角度然后读取电位器的当前电压值换算出当前实际角度两者做差得到误差再根据误差大小和方向驱动电机正转或反转直到误差归零。整个过程是持续进行的所以舵机在到达目标角度后会不断微调维持位置稳定。这就解释了为什么舵机有三根线而不是两根。两根线是电源正负第三根是信号线。电源线给电机和控制板供电信号线只负责传递目标角度信息。舵机的力矩来自电源不是来自信号线这一点后面讲STM32接线的时候会再强调。1.2 PWM信号和角度之间的对应关系舵机的控制信号是PWM但不是所有PWM都能驱动舵机。标准舵机期望的PWM频率是50Hz也就是周期20ms。在这个周期内高电平的持续时间决定了目标角度。对于SG90和MG90S这类180度舵机对应关系通常是脉宽对应角度说明0.5ms0度最小位置1.0ms45度四分之一位置1.5ms90度中间位置2.0ms135度四分之三位置2.5ms180度最大位置这个对应关系不是所有舵机都完全一致不同厂家、不同批次会有微小偏差。有些舵机的0度对应0.4ms180度对应2.4ms。所以你在写代码的时候最好先用一个可调的方式测试一下手头舵机的实际范围不要直接把0.5ms到2.5ms写死。还有一个容易忽略的点脉宽和角度是线性对应的。也就是说如果你想让舵机转到30度脉宽应该是0.5ms (30/180) × (2.5ms - 0.5ms) 0.833ms。这个线性关系是舵机控制的基础后面写角度转换函数的时候会用到。1.3 为什么频率必须是50Hz有人可能会想我把PWM频率调高一点比如100Hz舵机响应不是更快吗答案是不行。舵机内部的控制板对信号频率有要求大多数模拟舵机只接受50Hz左右的信号。频率太高控制板可能无法正确解析脉宽频率太低舵机会出现明显的抖动因为更新间隔太长位置维持不够及时。数字舵机对频率的容忍度稍微高一些可以接受100Hz甚至更高的信号但SG90和MG90S都属于模拟舵机或者准数字舵机老老实实用50Hz最稳妥。这个频率对应的周期是20ms在STM32CubeMX里配置定时器的时候我们要让定时器的溢出周期正好是20ms。2. SG90和MG90S的差异到底在哪里2.1 齿轮材质决定了寿命和力矩上限SG90和MG90S最核心的区别就在齿轮上。SG90用的是全塑料齿轮MG90S用的是金属齿轮。这个差异带来的影响是全方位的。塑料齿轮的优点是成本低、重量轻、运转噪音小。缺点是强度有限承受大扭矩的时候容易扫齿。所谓扫齿就是齿轮的齿牙被磨平或者崩断舵机就废了。SG90的堵转扭矩标称大约在1.2到1.8 kg·cm之间实际使用中如果你让它长时间顶着一个比较大的阻力塑料齿轮很快就会磨损。金属齿轮的强度明显更高MG90S的堵转扭矩标称大约在1.8到2.2 kg·cm之间比SG90高出一截。更重要的是金属齿轮在承受冲击负载的时候不容易崩齿寿命更长。但金属齿轮也有缺点重量比塑料齿轮重运转噪音更大而且金属齿轮之间如果没有充分润滑磨损速度反而可能比塑料齿轮更快。我自己的经验是如果你做的是固定翼飞机的舵面控制、小型机械臂的关节、或者任何需要承受一定反作用力的场景直接上MG90S不要犹豫。如果你做的是轻量级的开关控制、模型车的转向、或者只是演示用的摆件SG90完全够用。2.2 重量差异对项目的影响SG90的重量大约是9克MG90S大约是13.4克。单看数字差异不大但在多舵机项目里这个差异会被放大。比如一个六足机器人18个舵机用SG90总重约162克用MG90S总重约241克差了将近80克。对于靠舵机自身力矩驱动的机器人来说每增加一克重量都意味着舵机需要输出更大的力矩来克服自身重量这是一个负反馈循环。所以在选型的时候不能只看单个舵机的参数要把整个系统的重量预算算进去。如果项目对重量敏感比如飞行器或者需要长时间续航的移动机器人SG90的轻量化优势就体现出来了。如果项目对力矩和寿命要求更高MG90S多出来的那几克重量是可以接受的代价。2.3 实际使用中的表现差异除了齿轮材质和重量SG90和MG90S在实际使用中还有一些细微但重要的差异。SG90的响应速度标称是0.1秒每60度MG90S是0.1秒每60度左右两者在空载速度上差别不大。但在带载情况下MG90S因为齿轮强度更高速度衰减明显小于SG90。也就是说当舵机需要推动一个负载的时候MG90S能更快到达目标位置。另一个差异是虚位。虚位是指舵机在收到相同PWM信号时实际角度的重复精度。塑料齿轮因为磨损较快使用一段时间后虚位会变大表现为舵机回到同一位置时角度有偏差。金属齿轮的虚位保持性更好长期使用后角度重复精度更高。还有一个容易被忽略的点SG90对电源电压比较敏感。在4.8V和6V供电下SG90的力矩差异很明显。MG90S虽然也受电压影响但因为它本身力矩余量更大在4.8V下也能满足大多数轻中度负载的需求。所以如果你只能用4.8V供电MG90S的适应性更好。3. 用STM32CubeMX配置舵机PWM输出3.1 定时器选型和参数计算STM32F103系列有多个通用定时器比如TIM1到TIM4。我们要选一个支持PWM输出的通道。以TIM2的通道1为例它对应PA0引脚。选哪个定时器其实差别不大关键是算清楚预分频器和自动重装载值。STM32F103C8T6的系统时钟通常是72MHz。我们要生成50Hz的PWM周期是20ms。定时器的计数频率和溢出时间的关系是溢出时间 (预分频器 1) × (自动重装载值 1) / 定时器时钟频率假设定时器时钟是72MHz我们想让自动重装载值尽量大一些这样占空比的分辨率更高。取预分频器为71则计数频率为72MHz / 72 1MHz每个计数周期是1微秒。要得到20ms的周期自动重装载值应该是20000 - 1 19999。这样配置之后比较寄存器的值直接对应脉宽的微秒数。比如要输出1.5ms的脉宽比较寄存器设为1500。要输出0.5ms设为500。非常直观。在CubeMX里的操作步骤是打开Timers选项卡选择TIM2Clock Source选Internal ClockChannel1选PWM Generation CH1。然后在Parameter Settings里设置Prescaler为71Counter Period为19999Pulse设为1500默认1.5ms舵机回中。其他参数保持默认即可。3.2 时钟树配置中容易忽略的细节CubeMX的时钟树配置是很多人翻车的地方。默认情况下CubeMX可能会把系统时钟配成内部HSI的8MHz而不是外部晶振的72MHz。如果你不手动改定时器的时钟频率就不是72MHz算出来的预分频器和重装载值全部对不上舵机要么不动要么乱转。正确的做法是在Clock Configuration选项卡里把HSE选为Crystal/Ceramic Resonator然后在PLL Source Mux里选HSE把PLL倍频系数调到9倍这样8MHz × 9 72MHz。最后把System Clock Mux选PLLCLKAPB1 Prescaler设为2这样APB1定时器时钟就是72MHz。注意APB1的预分频器设为2之后APB1总线时钟是36MHz但定时器时钟会自动倍频到72MHz。这个细节在参考手册里有说明但很多人第一次配置的时候会忽略。配置完成后在CubeMX的时钟树界面应该能看到TIM2的时钟输入是72MHz。如果显示的不是这个值回去检查PLL配置和APB1预分频器。3.3 生成代码后的PWM启动流程CubeMX生成代码之后PWM的初始化已经在MX_TIM2_Init()函数里完成了但定时器还没有启动。你需要在main函数里手动调用HAL_TIM_PWM_Start()来启动PWM输出。HAL_TIM_PWM_Start(htim2, TIM_CHANNEL_1);这一行代码放在main函数的初始化区域while(1)之前。调用之后PA0引脚就会持续输出1.5ms脉宽的PWM信号舵机会转到90度位置。如果要改变角度用这个宏__HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_1, pulse_width);其中pulse_width是以微秒为单位的脉宽值。比如要转到0度传500转到180度传2500。封装成角度设置函数的话可以这样写void Set_Servo_Angle(float angle) { if (angle 0) angle 0; if (angle 180) angle 180; uint16_t pulse 500 (uint16_t)(angle / 180.0f * 2000); __HAL_TIM_SET_COMPARE(htim2, TIM_CHANNEL_1, pulse); }这个函数把0到180度的角度映射到500到2500微秒的脉宽。注意这里用了浮点运算在STM32F103这种没有FPU的芯片上会稍微慢一点但舵机控制对实时性要求不高完全没问题。如果你追求极致效率可以把角度乘以10变成整数运算但没必要。4. 接线和供电最容易翻车的地方4.1 舵机供电绝对不能从STM32取这是新手最容易犯的错误也是烧板子最常见的原因。SG90在空载时的电流大约是100到200mA堵转时瞬间电流可以超过1A。MG90S的堵转电流更大能到1.5A甚至更高。STM32开发板上的3.3V或5V稳压芯片通常只能提供几百毫安的电流根本带不动舵机。正确的做法是给舵机单独供电。可以用一块单独的5V稳压模块比如LM2596或者AMS1117-5.0配合足够的散热也可以用电池直接供电注意电压范围。舵机的电源正负接到独立电源上信号线接到STM32的PWM输出引脚同时把独立电源的地和STM32的地连在一起。共地是必须的否则PWM信号没有参考电平舵机不会正常工作。提示如果你发现舵机一上电STM32就复位或者程序跑飞十有八九是舵机从板子上取电导致电压跌落。立刻改成独立供电。4.2 电源去耦和噪声抑制舵机内部的电机在运转时会产生大量的电气噪声这些噪声会通过电源线传导回STM32导致ADC采样不准、通信出错甚至程序异常。在舵机电源引脚附近并联一个100μF的电解电容和一个0.1μF的陶瓷电容可以有效吸收电机换向时产生的尖峰。如果项目对噪声特别敏感比如同时有ADC采集或者无线通信可以在舵机电源线上串一个磁珠或者小电感进一步隔离高频噪声。信号线上也可以串一个100Ω左右的电阻减少信号反射和振铃。4.3 多舵机项目的供电方案当你需要驱动多个舵机的时候供电方案需要重新设计。假设你要驱动6个MG90S每个堵转电流按1.5A算最坏情况下总电流可能达到9A。普通的稳压模块根本扛不住。这时候有几个选择一是用大电流的开关电源比如5V 10A的电源适配器二是用多路独立的稳压模块每个模块负责几个舵机三是用电池组直接供电比如2节18650锂电池串联得到7.4V再通过大电流降压模块降到6V。不管用哪种方案都要确保电源的瞬时响应能力足够。舵机在启动和换向的瞬间电流变化很快电源如果响应跟不上电压会瞬间跌落导致舵机抖动或者STM32复位。在电源输出端并联大容量电容比如1000μF以上可以缓解这个问题。5. 调试过程中那些让人抓狂的问题5.1 舵机抖动不止的排查思路舵机抖动是最常见的现象原因可能有很多。按照从简单到复杂的顺序排查先检查电源。用万用表测量舵机供电电压在舵机运转时观察电压是否稳定。如果电压波动超过0.5V基本可以确定是供电问题。换更大电流的电源或者在舵机电源引脚并联大电容。再检查PWM信号。用示波器或者逻辑分析仪看PA0引脚的波形确认频率是50Hz脉宽在0.5ms到2.5ms之间。如果没有示波器可以用另一个舵机接同一个信号线看是否也抖动。如果两个舵机都抖问题在信号端如果只有一个抖问题在那个舵机上。最后检查机械结构。舵机在到达目标位置后如果受到持续的阻力会不断修正位置表现为抖动。检查舵机臂是否被卡住或者负载是否超过了舵机的力矩范围。5.2 舵机不动或者只往一个方向转如果舵机完全不动先确认PWM信号有没有输出。用万用表测PA0引脚的平均电压1.5ms脉宽对应大约0.375V5V × 1.5ms / 20ms。如果电压是0或者5V说明PWM没有正常输出检查HAL_TIM_PWM_Start()有没有调用定时器有没有使能。如果舵机只往一个方向转到底然后卡住通常是脉宽超出了舵机的有效范围。有些舵机的有效范围是0.5ms到2.5ms但有些只有0.8ms到2.2ms。如果你给了0.5ms但舵机只认0.8ms它就会一直往一个方向转直到机械限位。解决办法是先用1.5ms让舵机回中然后慢慢增加或减少脉宽观察舵机的实际响应范围。5.3 舵机发出咔咔声但不动这种声音通常是齿轮打滑或者堵转的声音。如果是SG90很可能是塑料齿轮已经扫齿了。拆开舵机外壳检查齿轮如果齿牙有明显磨损或者断裂只能更换舵机。如果是MG90S金属齿轮一般不会扫齿但可能是负载太大导致电机堵转。减轻负载或者换更大扭矩的舵机。还有一种可能是舵机的机械限位被触发。有些舵机内部有机械挡块当舵机转到极限位置时会顶住挡块电机继续通电就会发出咔咔声。这时候应该减小脉宽范围不要让舵机转到极限位置。5.4 多个舵机同时工作时互相干扰多舵机项目里如果所有舵机共用一条电源线一个大舵机启动时的电流冲击会导致电压瞬间跌落其他舵机可能因此抖动或者复位。解决办法是给每个舵机或者每组舵机单独走电源线从电源输出端星型连接到各个舵机避免串联供电。信号线之间也可能有串扰尤其是信号线走线比较长的时候。如果发现某个舵机的动作会影响另一个舵机尝试把信号线分开走或者在信号线上串小电阻。6. 从能跑到好用几个实战优化技巧6.1 舵机缓动函数的实现直接让舵机从0度跳到180度舵机会以最大速度冲过去机械冲击很大齿轮磨损也快。在实际项目中通常需要让舵机平滑地从一个角度过渡到另一个角度。实现方法很简单把目标角度和当前角度之间的差值分成若干步每步延时一小段时间。void Servo_Move_Smooth(float target_angle, uint16_t duration_ms) { static float current_angle 90.0f; uint16_t steps duration_ms / 10; float delta (target_angle - current_angle) / steps; for (uint16_t i 0; i steps; i) { current_angle delta; Set_Servo_Angle(current_angle); HAL_Delay(10); } current_angle target_angle; Set_Servo_Angle(current_angle); }这个函数把移动过程分成每10ms一步总时长由duration_ms控制。步数越多运动越平滑但响应也越慢。根据实际需求调整duration_ms一般200ms到500ms比较合适。6.2 用定时器中断替代HAL_Delay上面的缓动函数用了HAL_Delay这会阻塞主循环。如果项目里还有其他任务要处理比如读取传感器或者响应按键阻塞式延时就不合适了。更好的做法是用定时器中断来更新舵机角度。思路是用一个定时器每10ms产生一次中断在中断里更新舵机角度。主循环只负责设置目标角度不参与实际的舵机控制。这样主循环可以自由处理其他任务舵机运动也不会被打断。具体实现可以用一个结构体数组来管理多个舵机的状态typedef struct { float current_angle; float target_angle; float step; uint8_t is_moving; } Servo_State; Servo_State servos[6];在定时器中断里遍历这个数组对每个正在运动的舵机更新角度。主循环里只需要设置target_angle和step然后把is_moving置1。6.3 舵机掉电位置记忆有些项目需要在掉电后记住舵机的位置重新上电后回到之前的角度。STM32的Flash可以用来存储这些数据。在舵机运动结束后把当前角度写入Flash的某个地址上电初始化的时候从Flash读取设置舵机的初始位置。需要注意的是Flash的写入次数有限STM32F103的Flash擦写寿命大约是10000次。如果舵机运动频繁不能每次运动都写Flash。可以在掉电检测中断里写入或者每隔一段时间写入一次。6.4 选择SG90还是MG90S的决策清单最后给一个实用的决策清单帮你快速判断该选哪个判断条件选SG90选MG90S负载重量轻小于100克中重100克以上使用频率偶尔动作频繁动作项目寿命短期演示长期运行重量敏感度高低预算紧张充裕抗冲击要求低高噪音要求安静可接受噪音如果以上条件有超过三条指向MG90S直接上金属齿轮的。多花的钱会在减少的维护和更换次数里省回来。我在实际项目里最常遇到的情况是新手用SG90做机械臂结果第一个关节的舵机在调试阶段就扫齿了然后换MG90S发现力矩还是不够最后换成MG996R。所以如果你做的是机械臂或者任何需要持续输出力矩的场景建议直接从MG90S起步不要走SG90的弯路。SG90最适合的场景是固定翼舵面、小型开关控制、以及那些只需要偶尔动作的轻负载应用。

相关推荐

嵌入式驱动开发忙啥咧
嵌入式驱动开发忙啥咧

嵌入式LINUX开发中,产品的定制化占了很大一部分工作内容。像物料替换、产品改型等。 那么驱动开发人员就必须适配相应的驱动,生成固件交付了。具体的工作就是改设备树,适配驱动,调试验证功能。 一、设备树 设备树在现在的Linux中… · 2026/9/23 8:01:05

Llama2 Transformer架构解析与优化实践
Llama2 Transformer架构解析与优化实践

1. Llama2 Transformer架构全景透视Meta开源的Llama2系列模型正在重塑大语言模型的开源生态。作为基于Transformer架构的标杆之作,Llama2-7B/13B/70B三个版本在参数量与计算效率之间实现了精妙平衡。与传统Transformer相比,其核心改进集中在注意力机制优… · 2026/9/23 8:01:05

前端性能优化:首屏时间采集与监控实战
前端性能优化:首屏时间采集与监控实战

1. 首屏时间采集的前端性能优化实战首屏时间(First Contentful Paint)是衡量网页性能的核心指标之一,它直接决定了用户对网站的第一印象。作为前端工程师,我们经常遇到这样的场景:明明服务端响应很快,但用户… · 2026/9/23 8:00:58

3个致命坑:苹果手机怎么打马赛克在实战项目中翻车实录
3个致命坑:苹果手机怎么打马赛克在实战项目中翻车实录

3个致命坑:苹果手机怎么打马赛克在实战项目中翻车实录 看了一堆教程还是不会写项目?别慌,这太正常了。我在做某个 实战项目 时,光是“苹果手机怎么打马赛克”这个功能就让我头秃了三天。表面看只是加个模糊效果,实则涉及性能、权限、内存管理三个深坑… · 2026/9/23 9:19:46

CSS style (input button) 实战:用 TaoToken 统一 Key 调试表单按钮样式
CSS style (input button) 实战:用 TaoToken 统一 Key 调试表单按钮样式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/9/23 9:19:46

会声会影x5素材下载新手避坑指南,3分钟搞懂源码逻辑
会声会影x5素材下载新手避坑指南,3分钟搞懂源码逻辑

会声会影x5素材下载新手避坑指南,3分钟搞懂源码逻辑 官方文档像天书?别急,今天用代码拆解会声会影x5素材下载底层逻辑,新手避坑不再难。… · 2026/9/23 9:19:46

Flink DataStream 用户自定义函数(UDF)与 Accumulator 计数器完全指南
Flink DataStream 用户自定义函数(UDF)与 Accumulator 计数器完全指南

大数据流处理批处理数据工程 【免费下载链接】flink 项目地址: https://gitcode.com/gh_mirrors/fli/flink 点击查看 免费下载 在 Flink DataStream 编程中,几乎每一个数据转换算子(map、filter、reduce 等)都需要一个用户自定义… · 2026/9/23 9:19:38

u盘安装系统全对比:3种主流方案完整示例,告别教程依赖症
u盘安装系统全对比:3种主流方案完整示例,告别教程依赖症

u盘安装系统全对比:3种主流方案完整示例,告别教程依赖症 看了一堆教程还是不会写项目?手里拿着U盘对着电脑发呆,重启几次还是进不了系统?别急,问题不在你笨,在于那些教程只讲原理不给 完整示例… · 2026/9/23 9:19:26

【计算机毕业设计单片机案例】基于 STM32 或 51 单片机的健康监测按键参数配置与声光告警装置 基于 STM32 或 51 单片机的 ECB01 蓝牙健康数据传输系统设计与实现(024108)
【计算机毕业设计单片机案例】基于 STM32 或 51 单片机的健康监测按键参数配置与声光告警装置 基于 STM32 或 51 单片机的 ECB01 蓝牙健康数据传输系统设计与实现(024108)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于嵌入式单片机,Java、小程序技术领域和毕业项目实战 ✌️… · 2026/9/23 9:19:26

3招搞定手机怎么下载微信面试难题实战项目解析
3招搞定手机怎么下载微信面试难题实战项目解析

3招搞定手机怎么下载微信面试难题实战项目解析 面试被问“手机怎么下载微信”背后的原理,90%的人答不上来。别笑,这看似弱智的问题,实则是考察你对移动应用分发机制、安全校验及网络协议理解的试金石。我带过不少校招新人,他们背了八股文,却连一个A… · 2026/9/23 0:00:03

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型
你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型

你有新短消息请注意查收:3个新手避坑指南搞定消息系统选型 面试被问“高并发下如何保证消息不丢失”,你张口就是“用Redis”,结果面试官追问“如果Redis宕机了怎么办”,你瞬间卡壳。这种场景太常见了,很多新手在背八股文时,只记住了技术名词… · 2026/9/23 0:00:29

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧
Win7无线热点配置工具源码解析:解决API失效的3个实战技巧

Win7无线热点配置工具源码解析:解决API失效的3个实战技巧 Win7无线热点配置工具在Win10/11上跑不动?不是你的问题,是版本升级后 API 全变了。很多老项目里的 netsh wlan… · 2026/9/23 0:00:36

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码