STM32驱动MG996R舵机:从PWM开环到闭环控制
2026/9/19 6:02:33 网站建设 项目流程

做机器人、云台、机械臂这类项目,舵机永远是绕不开的零件。MG996R这只老将,价格便宜、力气不小,在入门和进阶项目里出现频率极高;而STM32作为控制核心,靠定时器输出PWM驱动它,又是最主流的一套玩法。不少人拿到舵机就开干,接上线、下载个例程、动起来了,但一旦遇到抖动、发热、角度不准,甚至连闭环是什么都没弄清,就开始怀疑硬件坏了。这篇文章我就把STM32驱动MG996R的PWM控制从参数计算讲到底层原理,再从开环到闭环把位置控制的逻辑拆开,适合正在做机械臂、云台、小车机械结构或者拿舵机练手的朋友,也适合准备把舵机项目做得更可靠的进阶玩家。

1. 先把MG996R和“PWM控角度”这件事吃透

1.1 MG996R的规格和实际使用边界

MG996R本质是一个直流电机加减速齿轮箱加内部电位器反馈的组合体。标称堵转扭矩大约9.4kg/cm(4.8V时)到11kg/cm(6V时),工作电压4.8V到6V,重量约55g。这个扭矩水平意味着它能带动中型舵机臂、云台、轻型机械臂关节,但别指望它去搬重物或者做高精度定位。它的内部电位器决定了输出轴角度,控制电路把PWM脉宽换算成目标电压,和电位器反馈电压做比较,有偏差就驱动电机往目标方向转,直到电位器电压和目标电压一致。

实际使用中,大家常说的“180度舵机”指的是PWM脉宽从0.5ms到2.5ms对应0度到180度,但不同厂家、不同批次的实际行程可能有差异。有的MG996R能转到接近200度,有的在两端极限位置会有机械限位卡住的声音。更要注意的是市面上存在“360度连续旋转舵机”版本,内部电位器被替换成固定电阻,PWM控制的是转速和方向而不是角度。新手经常买错,然后发现角度控制完全无效,这点后文会专门说。

1.2 PWM信号到底在表达什么

PWM不是一个“给电就转”的信号,而是一个“给脉宽定角度”的指令。MG996R的标准控制信号是50Hz,也就是周期20ms,高电平持续时间在0.5ms到2.5ms之间。0.5ms对应0度,1.5ms对应中位90度,2.5ms对应180度。简单说,舵机看的是高电平能撑多久,而不是电压高低或者频率高低。

很多人刚接触时容易把PWM和“调速”混在一起,看到“50Hz”就以为频率很低。实际上舵机对频率的要求并不苛刻,常见的45Hz到60Hz都能工作,关键是脉宽范围必须准确。你用示波器抓信号时会发现,舵机其实不关心周期到底是19ms还是21ms,它只在乎每个周期里高电平那段宽度。所以代码里只要把定时器的CCR值设对,周期差不多就行,不用纠结50Hz这个数字精确到小数点后几位。

1.3 为什么还要谈闭环

听起来有点矛盾,MG996R内部不是已经有电位器反馈了吗?这确实是一个闭环系统,但它的闭环只负责“让电机转到电位器指示的位置”。一旦负载变大、齿轮打滑、外力把输出轴掰偏了,或者使用连续旋转舵机导致电位器反馈失效,MCU侧就完全不掌握真实角度。此时你发送1.5ms脉宽,舵机可能因为堵转停在了89度,也可能因为齿轮间隙停在91度,MCU一概不知。

标题里的“闭环”指的就是在外部再加一个反馈环节,让MCU能读到输出轴的实际角度,再用PID等控制算法去修正PWM信号。这样即使MG996R内部有误差、负载有扰动,位置也能被拉回到目标值。这个思路和“数据质量问题闭环”“控制算法PID闭环”这些说法本质一样,都是“执行、反馈、修正”的循环。后面会在实战章节详细展开。

2. 工程上先解决硬件:接线、供电和引脚选型

2.1 供电是MG996R项目里最大的坑

MG996R正常工作时电流在200mA到500mA左右,堵转瞬间电流可能冲到1.5A甚至2.5A。很多开发板的板载5V稳压芯片只能提供几百毫安电流,一接舵机用力一转,电压瞬间被拉低,STM32直接复位或者跑飞。这就是大家常说的“复位电流”问题,也是舵机项目里最常见的故障之一。

正确做法是给舵机单独准备一路电源,比如5V 2A以上的开关电源、锂电池降压模块或者4节AA电池盒。关键是一定要把舵机电源的GND和STM32开发板的GND接到一起,否则PWM信号没有参考地,舵机要么不转要么乱抖。另外在舵机电源两端并联一个大电容,470uF到1000uF的电解电容比较合适,能有效吸收堵转时的电流尖峰,减少对控制电路的冲击。我实际测过,加了电容之后,STM32复位的概率明显下降。

还要注意MG996R的红色线接正极,棕色线接负极,橙色线是信号。信号线可以直接接STM32的3.3V GPIO,大多数情况下能正常工作,因为舵机内部电路对高电平的要求并不高。但如果你发现信号线过长导致抖动,可以考虑串一个33欧姆电阻或者加一级电平转换电路,降低信号反射和干扰。

2.2 引脚选择与硬件定时器分配

STM32驱动舵机最推荐的方式是用定时器的PWM输出模式,而不是自己写软件模拟PWM。理由很简单:硬件定时器产生PWM不占用CPU,你只需要在需要改变角度时更新一次CCR值,剩下的波形由定时器自动完成。网上有些教程用8051模拟16位PWM,那是没有硬件PWM外设的无奈之举,STM32完全没有必要这么干,软件模拟只会让CPU忙得喘不过气。

在STM32F103这类芯片上,TIM1、TIM2、TIM3、TIM4都可以输出PWM。以常用的TIM2为例,PA0是通道1,PA1是通道2,PA2是通道3,PA3是通道4。如果你要控制多个舵机,一个定时器的四个通道可以分别驱动四个舵机,前提是这四个舵机都使用相同的PWM周期。如果你想让不同舵机有不同的周期,那就得用不同的定时器或者调整软件逻辑。

如果你要控制8个以上舵机,硬件定时器通道不够用,可以考虑I2C接口的PCA9685舵机驱动板,16路PWM输出,扩展能力很强。但我个人建议,如果只是做3到6个舵机的小型机械臂,直接用STM32定时器就够了,少一层芯片就少一层故障点。PCB上走线也更简单。

2.3 舵机控制板、总线舵机和普通PWM舵机的差异

很多人会纠结要不要买总线舵机。普通PWM舵机比如MG996R、SG90,优点是便宜、驱动简单,缺点是MCU只能发指令出去,不知道舵机实际转没转、电流多大、温度多高。总线舵机比如飞特等品牌,通过串口或CAN通讯,可以把角度、电压、温度、负载等状态回传,非常适合做多自由度机械臂。但总线舵机的价格可能是MG996R的几倍,协议也复杂一些,入门阶段没必要一上来就上。

如果预算有限又想要反馈,可以在普通舵机输出轴上加一个外部磁编码器,比如AS5600,由MCU实时读取角度,这就是后文要做的外部闭环。这个方案性价比很高,代价是机械安装需要动点脑筋。还有一种折中方案是买带角度反馈的模拟舵机,但型号少、价格不透明,不如自己加编码器可控。

3. STM32定时器PWM生成:从CubeMX到代码

3.1 参数计算:PSC、ARR、CCR怎么配出50Hz和对应角度

以STM32F103C8T6为例,系统时钟72MHz,定时器挂在APB1总线上,在CubeMX正确配置后,定时器时钟也是72MHz。要让PWM周期为20ms,频率50Hz,需要设置预分频器PSC=71,自动重装载值ARR=19999。计算过程是这样的:

定时器时钟 = 72MHz / (PSC + 1) = 72MHz / 72 = 1MHz,也就是每个计数脉冲1us。PWM周期 = (ARR + 1) / 1MHz = 20000us = 20ms。这个组合是很多例程的标准配置,好记也好算。如果你换用其他STM32型号,比如F4系列时钟168MHz,只要保证定时器时钟是1MHz附近就行,比如PSC=167,ARR=19999,同样能得到50Hz。

占空比的控制通过CCR值完成。CCR=500时,高电平持续500us,对应0.5ms;CCR=1500时,高电平1.5ms,对应90度;CCR=2500时,高电平2.5ms,对应180度。角度和CCR的换算公式很简单:ccr = 500 + (angle / 180.0f) * 2000。也就是说,每1度大约对应11.11个计数单位。写代码时不要用整数除法,否则角度小于180度时会直接变成0。

这里有个容易踩的坑:CubeMX里的Timer Clock可能不是系统时钟。比如STM32F103的TIM2在APB1分频后,如果库函数配置不对,实际定时器时钟可能是36MHz。你在算PSC和ARR前,最好先确认CubeMX时钟树里有没有自动帮你把定时器时钟提到72MHz。最简单的方法是实测占空比,或者用逻辑分析仪抓PWM波形,别只相信理论计算。

3.2 CubeMX配置步骤

打开STM32CubeMX,选择芯片型号后,先在System Core里把RCC的HSE设为Crystal/Ceramic Resonator,在Clock Configuration里把HCLK设为72MHz。在Timers里选择TIM2,勾选Channel1为PWM Generation CH1,这样PA0就会被复用为TIM2_CH1。下面会出现参数配置界面,设置Prescaler为71,Counter Period为19999,Pulse可以随便填一个初值,比如750,这样上电默认输出0.75ms脉宽,舵机不会乱窜。

PWM模式选Mode1,也就是向上计数模式下,计数值小于CCR时输出高电平。实际上Mode1和Mode2的区别只是极性相反,如果你发现舵机方向反了或者抖动异常,可以检查一下这里是不是被改成了Mode2。生成代码后打开main.c,需要在初始化完成后调用HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1),否则TIM2虽然配置了,但PWM并没有真正输出。

还有一个很多人忽略的点:STM32CubeMX生成代码时,GPIO初始化会先于定时器初始化。如果在main函数开头、HAL_TIM_PWM_Start之前,PA0被配置成复用功能但PWM还没启动,此时引脚可能是低电平。如果你的舵机要求上电时信号必须是无效脉宽,否则会出现“上电瞬间乱转”,那就需要在外部电路上加一个下拉电阻,或者延迟启动PWM,给舵机一个稳定状态。

3.3 写一个角度控制函数

接下来写一个简单的驱动函数。核心操作就是根据目标角度计算CCR值,然后调用__HAL_TIM_SET_COMPARE更新占空比。限幅很重要,因为一旦角度超过180度或者脉宽超过2.5ms,舵机会顶到机械限位,发出难听的滋滋声,时间长了会过热甚至烧毁。

void setServoAngle(TIM_HandleTypeDef *htim, uint32_t channel, float angle) { if (angle < 0.0f) angle = 0.0f; if (angle > 180.0f) angle = 180.0f; uint32_t ccr = (uint32_t)(500 + (angle / 180.0f) * 2000); __HAL_TIM_SET_COMPARE(htim, channel, ccr); }

这段代码看着简单,但实际操作中建议再加一个斜坡处理函数,让舵机从当前角度平滑过渡到目标角度,而不是瞬间跳变。瞬间跳变对舵机齿轮冲击大,电流也会突然拉高,尤其是带载情况下更容易造成机械振动。简单做法是每次中断或主循环里只让目标角度步进一小步,比如每10ms只改变1度,直到到达最终目标。

还有一点要提醒:不要在一个实时性要求很高的中断服务函数里调用setServoAngle做大量浮点运算,STM32F103没有硬件浮点单元,浮点运算会占用不少时间。更合理的做法是在中断里只设置一个标志位或者更新目标角度,在主循环里统一计算并更新CCR。

3.4 从单舵机到多舵机:RTOS和传感器融合的思路

如果你想让舵机配合激光测距模块,把角度和距离数据通过串口发给电脑,最简单的方式是把整体逻辑放到一个主循环里:先读取测距数据,再根据算法计算舵机角度,控制舵机转到指定位置,然后通过串口把数据打包上传。这种方案在项目规模小的时候完全没问题,代码逻辑直观,调试也方便。

但如果你跑FreeRTOS,舵机控制、激光测距、串口发送这三个任务如果都重度使用CPU,就可能出现优先级反转或者任务卡顿。推荐的做法是:PWM波形由TIM2硬件产生,舵机任务只需要在收到指令后调用角度函数更新CCR,耗时不长;激光测距任务用软件定时器或者专用的测距中断去触发;串口发送任务用DMA来搬运数据。这样三个任务都很轻量,系统不会因为某个模块卡顿而影响整体流程。

热词里有朋友问“STM32 HAL RTOS配置运行舵机和激光测距解析发送到电脑串口”的思路,核心就是两点:第一,PWM产生绝不放在任务里用软件循环去跑;第二,所有外设初始化完成后,在RTOS启动前设好初始角度,避免任务调度前舵机就在乱动。

4. 闭环控制原理:从“发脉宽”到“知道转没转到”

4.1 什么是真正的“闭环”

开环控制就是我们前面写的setServoAngle,MCU发送脉宽,舵机内部自己转到某个角度,MCU不检查结果。闭环控制在控制理论里的定义是:参考输入、被控对象、反馈环节、控制器四个部分构成一个回路。你设定目标角度,控制器根据目标角度和实际角度的偏差计算控制量,这个控制量通过PWM发给舵机,舵机带动负载转动,反馈环节把实际角度告诉控制器,控制器再根据新偏差调整控制量。

传统舵机内部确实已经有这样一个闭环回路,但它只保证了“输出轴到了电位器指示的位置”,它不知道负载施加了多大的力,不知道齿轮磨损了多少,不知道外部有没有扰动。当你把舵机装进机械臂,末端要抓起一个物体时,MG996R的内部闭环可能因为力矩不够而停在半路,此时MCU如果继续认为“我发了1.8ms脉宽就是到了168度”,那整个机械臂的姿态控制就是错的。

所以在很多实际项目中,外部闭环不是可选项,而是必须项。你在舵机输出轴上加一个绝对角度传感器,比如AS5600,每次MCU控制前都先确认当前真实角度,再用PID修正,才能真正做到“我说到哪就到哪”。这也是“闭环”这个热词在工程项目里被反复强调的原因。

4.2 反馈方案选型:磁编码器、增量编码器、外部电位器和视觉

做位置闭环,首先得有角度反馈。常用方案有三种:外部电位器、增量编码器、磁编码器。外部电位器接线最简单,直接和MG996R内部电位器并联或者安装在输出轴上,ADC读取电压换算角度,缺点是电位器本身有磨损、精度一般、线性度也一般,适合临时测试。增量编码器需要AB相判断方向,还需要一个额外引脚做Z相零点,硬件复杂一些,但成本低,适合DIY。磁编码器比如AS5600是目前最推荐的方案,它通过I2C或者SPI直接输出绝对角度,没有机械磨损,精度约12位,也就是0.087度,配合MG996R绰绰有余。

这里要注意磁编码器的安装方式:AS5600需要一个径向磁化的磁铁,通常是一个直径6mm或8mm的小磁柱,贴到舵机输出轴或者转盘的中心,芯片正对着磁铁,间距控制在1mm到3mm。如果磁铁装歪了,角度读数的线性度会很差,甚至出现跳变。我之前踩过这个坑,一开始用普通磁铁替代,结果角度读数在某个区间内乱跳,后来换成卖家配套的径向磁铁才正常。

还有一种更进阶的反馈是视觉反馈,比如用摄像头识别舵机末端标记物的位置,再根据图像计算角度或者坐标。热词里“摄像头PWM来实现同步”指的就是把摄像头帧率和PWM更新节奏对齐,从而实现视觉伺服。这种方式很适合做自主定位和抓取,但采样率受限于摄像头帧率,一般只有30到60fps,而且图像处理会消耗不少CPU,不适合快速实时的位置闭环。我的建议是先用编码器把底层闭环跑顺,再考虑加视觉做上层决策。

4.3 PID控制的思路与整定顺序

PID公式用代码写出来就是:

output = Kp * error + Ki * integral + Kd * derivative;

其中error是目标角度减去当前角度,integral是误差的累积,derivative是误差的变化率。P项负责把舵机“拉”向目标,I项负责消除稳态误差,D项负责抑制过冲和振荡。对MG996R这种机械结构来说,最关键的是Kp不能太大,因为舵机齿轮有回差,电机响应有延迟,P太大一定会在目标位置附近来回抖动,发出那种高频“吱吱”声。

调参顺序我建议是:先把Ki和Kd设为0,只留Kp,从0.1开始慢慢加,直到舵机能逼近目标角但还没明显振荡。然后加一点Ki,比如0.05,让静止误差慢慢消失。最后再加Kd,从0.1到0.5之间试探,观察过冲是否改善。注意积分项一定要做限幅,否则舵机长时间堵转时积分会无限累加,一旦恢复运动就会猛地冲出去,这就是所谓的“积分饱和”。

控制周期也很重要,一般设置10ms到20ms一个周期,也就是50Hz到100Hz。控制周期太快,舵机机械响应跟不上,PID会看到一堆噪声;太慢,系统感觉迟钝,外部扰动无法及时修正。我惯用的做法是让定时器中断每10ms触发一次PID计算,PWM周期保持20ms不变,两者互不干扰。

5. 实测案例:给MG996R加上外部磁编码器做位置闭环

5.1 系统搭建步骤

这一节分享一个我实际跑过的方案:MG996R舵机控制一个轻量云台摆臂,摆臂末端装AS5600磁编码器,STM32通过I2C读取AS5600角度,然后PID闭环控制舵机角度。机械上需要先固定AS5600芯片的位置,确保磁铁随舵机轴旋转时,芯片能稳定读到角度。AS5600的SDA和SCL分别接STM32的PB7和PB6,也就是I2C1,供电接3.3V,注意I2C上拉电阻通常已经在开发板上配好了。

初始化顺序很重要:先初始化I2C并读取一次AS5600角度,把它作为当前角度;然后启动PWM,输出一个和当前角度对应的脉宽;最后进入主循环执行PID。如果启动顺序反了,舵机上电瞬间可能先跳到某个默认角度,造成机械冲击。测试时先用串口把目标角度和反馈角度打印出来,不用急着加PID,先验证角度读数是稳定可靠的。

5.2 核心代码:PID计算和占空比输出

这里给出一份精简的PID计算代码,方便你直接移植:

typedef struct { float kp; float ki; float kd; float integral; float last_error; float out_min; float out_max; } PID_t; void PID_Init(PID_t *pid, float kp, float ki, float kd) { pid->kp = kp; pid->ki = ki; pid->kd = kd; pid->integral = 0.0f; pid->last_error = 0.0f; pid->out_min = -100.0f; pid->out_max = 100.0f; } float PID_Calc(PID_t *pid, float target, float current) { float error = target - current; pid->integral += error; if (pid->integral > pid->out_max) pid->integral = pid->out_max; if (pid->integral < pid->out_min) pid->integral = pid->out_min; float derivative = error - pid->last_error; pid->last_error = error; float output = pid->kp * error + pid->ki * pid->integral + pid->kd * derivative; if (output > pid->out_max) output = pid->out_max; if (output < pid->out_min) output = pid->out_min; return output; }

在主循环里,每10ms执行一次:

float target_angle = 120.0f; // 目标角度 float current_angle = AS5600_GetAngle(); // 读反馈 float adjust_angle = PID_Calc(&pid, target_angle, current_angle); float final_angle = target_angle + adjust_angle; if (final_angle < 0.0f) final_angle = 0.0f; if (final_angle > 180.0f) final_angle = 180.0f; uint32_t ccr = (uint32_t)(500 + (final_angle / 180.0f) * 2000); __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_1, ccr);

这段代码其实是在“角度域”里做PID,输出是角度修正量,最后再和目标角度叠加映射成脉宽。这样写的好处是直观,你打印final_angle、target_angle、current_angle就能看到控制过程,也方便调参。如果你更习惯在CCR域做PID,也就是把角度都先换算成CCR再算PWM,逻辑也完全成立,两个域之间是线性关系,最终效果一样。

5.3 调参过程和实测记录

以下是我在无负载空转情况下的一组调参记录,参考这个起点能省不少时间:

KpKiKd现象结论
0.500响应慢,稳态误差2到3度有静差,需要积分项
1.200响应变快,出现轻微来回振荡P增益接近临界值
1.00.050稳态误差消除,有轻微超调进入可用区间
1.00.050.2过冲明显减小,系统更稳定推荐作为起点

带载测试后你会发现,相同参数下舵机响应会变慢,因为负载增加了转动惯量。此时需要适当增加Kp和Ki,但别一次加太多,否则又会震荡。我实际调到Kp=1.5、Ki=0.08、Kd=0.3时,带一个200g的摆臂能比较干脆地停在目标位置,误差在1度以内。如果角度误差还在2度以上,先检查磁编码器安装和机械回差,不要急着继续加PID参数。

调参过程中最常见的问题就是舵机在目标位置高频抖动。这不是PID参数不行,而是MG996R的齿轮回差太大,加上D项对噪声敏感,导致输出在不断修正。解决办法是降低Kd,或者在反馈角度上做一阶低通滤波,限制单次PID输出的变化幅度。我用的是一个简单限幅:PID输出单步最大只允许改变5度,超过就截断,抖动基本就压下去了。

6. 常见问题与排查技巧实录

6.1 舵机项目十大典型故障速查表

故障现象可能原因排查思路解决方案
一接通电源,STM32就复位舵机供电不足,堵转电流拉低电压万用表测舵机供电端电压,看启动瞬间是否跌到4V以下独立舵机电源,加大电容
舵机抖动、啸叫PWM频率不对、电源纹波大、信号线干扰示波器抓PWM波形和电源电压确认50Hz周期、缩短信号线长度、并联电容
舵机发热严重机械限位、脉宽超范围、负载过大手转舵机臂检查是否顺畅,检查CCR是否超2500限幅脉宽、降低负载、增加辅助散热
上电瞬间舵机乱转GPIO和PWM初始化顺序不对加长PWM启动延时,检查默认电平先配置GPIO为固定电平,再启动PWM
角度不准,误差超过3度脉宽和角度映射偏差、齿轮回差实测0度和180度对应的CCR值标定映射关系,加闭环修正
PWM无输出定时器没启动、CubeMX通道配置错误检查HAL_TIM_PWM_Start是否执行,PA0复用是否正确补全初始化代码
连续旋转舵机无法控制角度买到了360度版本拆开检查内部是否有电位器换标准舵机,或改用速度控制模式
舵机电机飞车控制极性反了、脉宽超过正常范围检查目标角度和CCR的映射增加软件限幅,检查代码逻辑
MG996R堵转后声音异常电位器磨损、齿轮损坏断电后手转输出轴,感受阻尼更换舵机,避免长期堵转

6.2 关于“复位电流”和“PWM故障保护”的补充

“复位电流”这个词值得单独说。它不是一个严格的技术术语,指的是舵机启动或堵转时瞬间抽取的大电流。这个电流如果从STM32开发板的5V引脚里出,很容易把3.3V主控电压拉低,导致复位、看门狗误触发、程序跑飞。我的经验是:舵机电源和MCU电源用电位完全隔离,只需要共地。如果为了调试方便,暂时用同一个电源,至少要在舵机供电线上串一个0欧电阻做测量点,方便用电流探头看波形。

另外,很多工业或者安防项目会考虑“PWM故障保护”。意思是如果PWM信号突然丢失或者异常,舵机不应该维持在一个可能危险的位置。MG996R这类普通模拟舵机对信号丢失的处理方式是:保持最后位置或者停止响应,具体表现因批次而异。如果你在做机械臂或者门锁控制,建议在MCU侧加一个独立的硬件看门狗,一旦程序跑飞,马上让PWM输出回到安全脉宽,同时切断舵机电源。这个安全逻辑别等到出事故再补。

6.3 一个容易混淆的问题:PWM接MOS管发热

热词里出现“PWM接MOS管发热”,这其实和舵机控制不是一回事,但既然有人问,我就顺带说一句。如果你用PWM信号直接驱动MOS管,发热通常不是因为占空比大,而是因为MOS管的栅极电容充放电时间太长,导致开关损耗太大。解决办法是加一个专门的栅极驱动电路,或者提高PWM信号的电平转换速度。回到舵机项目,你只需要用低电平输出直接接信号线,不需要加MOS管,MG996R内部已经自带驱动电路。

写在最后

做MG996R的PWM控制,真正让我受用的是两条经验:第一条是先把开环调稳定再谈闭环,基础都没做好就上PID只会更乱;第二条是硬件上把供电和机械装配搞定,整个系统一半的问题就已经消失了。很多朋友在论坛问为什么舵机抖、为什么角度不准,最后查来查去,不是代码问题,就是舵机供电不稳定或者连杆机构有虚位。你先用万用表测电压、用示波器看PWM波形、用编码器读角度,一步一步验证,比盲目改代码高效得多。

我也踩过不少坑,比如一开始图方便把MG996R直接接到开发板5V,结果舵机一发力就复位;又比如调PID时Kp给得太大,舵机在高频振荡中吱吱叫,齿轮磨损得很快。后来养成一个习惯:每次上电前都会先确认初始脉宽、给PWM加斜坡、给PID输出加限幅。这些看起来不显眼的细节,才是项目稳定运行的关键。如果你也想做机械臂或者云台,不妨先从这套STM32加MG996R的方案练手,等开环和闭环都吃透了,再升级到总线舵机或者更精密的执行器,会顺畅很多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询