尧图精选

第一次控制舵机:固定周期脉宽控制原理与接线验证

🕒 发布时间:2026/9/14 16:12:34 📁 来源:尧图网络
第一次控制舵机固定周期脉宽控制原理与接线验证这篇内容适合第一次接触单片机、想看懂一个硬件动作的零基础读者。看完后你能沿真实接线和信号顺序复述工作原理并用文中的仪器步骤完成验证。先说结论这篇从零开始不要求你学过电路或编程。先看按钮、电线和小灯怎么变化技术名词会在用到时再用白话解释。舵机不是靠调电压转动而是接收固定周期(20ms)脉冲脉宽决定转动角度定时器产生PWM波从GPIO输出1ms对应0°、1.5ms对应90°、2ms对应180°示波器验证周期20ms和脉宽范围检查堵转电流是否正常必须独立电源供电并与MCU共地先用认知反差纠正“PWM是调电压”的错误直觉再通过“每隔固定时间递不同宽度命令票”的生活类比建立直觉逐项映射到定时器配置、GPIO输出、舵机信号线和电源系统最后用示波器验证波形并观察堵转电流先纠正一个错误直觉PWM不是调电压很多人第一次看到舵机转动时会直观地认为舵机转动是因为电压被调低了。这其实是错的。舵机里面是一个小电机加减速齿轮再加一个电位器组成闭环。但从控制信号的角度看它根本不关心电压是多少。它只关心一件事有没有收到一个固定周期的脉冲信号。PWM的中文是脉宽调制。关键不在“调电压”而在“脉宽”两个字。每个脉冲仍然是全高(3.3V或5V)或全低(0V)没有中间值。真正决定舵机转多远的是高电平持续的时间长短。生活类比每隔固定时间递一张不同宽度的命令票想象一个送信的卡通角色。他每20毫秒必须递出一张票。第一下票很窄只有一个小豁口——接收的人轻轻点头。第二下票变宽几乎占满手掌——接收的人转到中间位置。第三下票最宽都快拿不住了——接收的人转到最大角度。回到电路送信角色 定时器每20毫秒一次 PWM周期固定为20ms票的宽度 脉冲的高电平持续时间(1ms-2ms)接收的人点头/转身 舵机转到对应角度这个类比的关键是送信的时间间隔必须固定不能这次快下次慢。舵机只认这个固定间隔内的宽度变化。真实硬件链路定时器→GPIO→舵机信号线在STM32上这个过程分三步走。第一步定时器产生PWM波定时器内部有一个计数器从0数到自动重装载值(ARR)然后清零重新开始。在这个循环过程中输出引脚的电平会根据比较寄存器(CCR)的值发生变化——计数器小于CCR时输出高大于CCR时输出低。一个周期内高电平持续的时间 CCR值 / 计数器频率。第二步GPIO引脚导出信号定时器的输出通道(TIM_CH1等)映射到具体的GPIO引脚。这些引脚平时是普通IO配置成复用功能后定时器的PWM波就能从引脚送出去。第三步舵机接收信号舵机只有三根线电源正、电源负、信号线。信号线接收到GPIO送出的PWM波后内部芯片测量高电平宽度然后驱动电机转到对应角度。标准对应关系是1ms高电平 → 0°1.5ms高电平 → 90°2ms高电平 → 180°不同品牌可能略有差异但1ms到2ms这个范围是通用的。电路连接独立供电与共地舵机需要单独供电不能直接从MCU的供电引脚取电。原因很简单舵机转动时电流可能达到几百毫安甚至安培级别MCU的供电引脚带不动。典型的接线方式MCU的GND → 电源负极 → 舵机GND三者必须接到同一点(共地)独立电源(5V-6V)正极 → 舵机VCCMCU的GPIO引脚 → 舵机信号线(通常标SIG或DATA)共地是最容易踩的坑如果MCU和舵机没有共地信号参考点不一致舵机可能完全不动作或者动作乱跳。最小代码定时器PWM配置与输出以STM32F103为例用HAL库配置定时器2的通道1输出PWM。// 定时器2通道1 PA0输出PWMvoidServo_Init(void){GPIO_InitTypeDef GPIO_InitStruct{0};TIM_HandleTypeDef htim2{0};TIM_OC_InitTypeDef sConfig{0};// 使能GPIOA和定时器2时钟__HAL_RCC_GPIOA_CLK_ENABLE();__HAL_RCC_TIM2_CLK_ENABLE();// 配置PA0为复用推挽输出GPIO_InitStruct.PinGPIO_PIN_0;GPIO_InitStruct.ModeGPIO_MODE_AF_PP;GPIO_InitStruct.SpeedGPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA,GPIO_InitStruct);// 定时器基础配置20ms周期// 计数器时钟72MHz预分频7200ARR200// 72MHz / 7200 10kHz10kHz / 200 50Hz 20mshtim2.InstanceTIM2;htim2.Init.Prescaler7200-1;htim2.Init.CounterModeTIM_COUNTERMODE_UP;htim2.Init.Period200-1;htim2.Init.ClockDivisionTIM_CLOCKDIVISION_DIV1;HAL_TIM_PWM_Init(htim2);// PWM通道配置sConfig.OCModeTIM_OCMODE_PWM1;sConfig.Pulse0;// 初始脉宽sConfig.OCPolarityTIM_OCPOLARITY_HIGH;HAL_TIM_PWM_ConfigChannel(htim2,sConfig,TIM_CHANNEL_1);// 启动PWM输出HAL_TIM_PWM_Start(htim2,TIM_CHANNEL_1);}// 设置舵机角度(0-180度)voidServo_SetAngle(uint16_tangle){// 映射角度到脉宽0°5(1ms)90°15(1.5ms)180°25(2ms)// CCR 5 (angle / 180.0) * 20uint16_tccr5(angle*20/180);__HAL_TIM_SET_COMPARE(htim2,TIM_CHANNEL_1,ccr);}这段代码的核心是定时器周期固定为20ms(50Hz)通过改变CCR寄存器的值改变高电平持续时间从而控制舵机角度。示波器验证测周期、测脉宽、观察堵转电流验证方法一测周期和脉宽把示波器探头接到GPIO引脚和GND上。正常应该看到周期20ms(50Hz)脉宽1ms-2ms之间变化如果周期不对检查定时器的预分频和ARR值是否算对了。验证方法二观察堵转电流舵机转到极限位置并用手挡住时电流会明显上升。用万用表的电流档串联到电源线中观察空载几十毫安堵转可能达到500mA以上如果电流异常大或完全不转可能是电源不够、共地没接好、或者PWM参数不对。适用边界与常见问题什么时候适合直接用GPIO接舵机舵机数量少(1-2个)对角度精度要求不高有独立电源供电什么时候需要加驱动或换方案舵机数量多 → 考虑用PCA9685等PWM扩展芯片需要更精确的角度 → 用带编码器的直流电机闭环电源可能不稳定 → 加滤波电容和TVS保护常见问题排查表现象可能原因检查点舵机完全不动没共地/电源不够/PWM没输出示波器看信号、测电源电压舵机抖动PWM周期不对/信号干扰确认20ms周期、加滤波转不到最大角度脉宽范围不对/电源压降调高CCR上限、加大电源记住这一条舵机转动的本质是固定周期脉冲信号脉宽决定转动角度——不是电压调节而是时间控制。给想继续学的人STM32定时器PWM官方手册https://www.st.com/resource/en/application_note/an4776-generalpurpose-timer-cookbook-for-stm32-microcontrollers-stmicroelectronics.pdf不同舵机的脉宽范围可能略有差异使用前查阅具体型号数据手册进阶可以学习舵机内部的电位器闭环控制原理理解它如何把角度反馈变成电压信号
上一篇/下一篇内容由系统自动关联 返回资讯列表 →