STM32F103C8T6 驱动 180° 舵机SG90超详细教程一、教程前言1. 教程定位本教程面向嵌入式入门学习者以最常用的 STM32F103C8T6最小系统板 SG90 180° 舵机为例从零讲解舵机驱动原理、硬件接线、HAL 库代码开发全流程代码可直接复制使用适配 Keil MDK 开发环境。2. 核心知识点舵机控制原理PWM 信号STM32 定时器输出 PWM 配置180° 舵机角度精准控制3. 准备物料表格物料名称数量备注STM32F103C8T6 最小系统板1 块-SG90 180° 舵机1 个区分 360° 连续旋转舵机杜邦线若干公对公、公对母5V 电源模块可选1 个舵机单独供电更稳定USB 转串口模块可选1 个程序下载 / 调试二、舵机驱动核心原理1. 180° 舵机控制逻辑SG90 180° 舵机通过50Hz PWM 信号周期 20ms控制角度脉宽与角度的对应关系脉宽 1ms → 0°极限左位脉宽 1.5ms → 90°中位脉宽 2ms → 180°极限右位脉宽线性变化如 1.25ms→45°、1.75ms→135°2. STM32 实现思路利用 STM32 定时器生成 50Hz PWM 信号通过修改 PWM 脉宽改变舵机角度STM32F103C8T6 的 TIM1/TIM2/TIM3/TIM4 均支持 PWM 输出本教程选用 TIM4_CH3PB8 引脚。三、硬件接线1. 舵机引脚定义SG90表格舵机线颜色功能对应接线棕色 / 黑色GND地STM32 GND共地红色VCC电源5V优先外接 5V避免单片机供电不足橙色 / 黄色SIGNAL信号STM32 PB8TIM4_CH32. 接线注意事项必须共地STM32 的 GND 与舵机 GND 接在一起否则信号紊乱供电建议舵机启动电流较大优先用外接 5V 电源给舵机供电仅信号线接 STM32若直接接 STM32 5V可能导致单片机复位引脚可选若 PA6 被占用可替换为其他 PWM 引脚如 TIM2_CH1PA0、TIM3_CH1PA7。四、软件开发HAL 库1. 前期准备开发环境Keil MDK5.36固件库STM32CubeMX 生成 HAL 库工程STM32F103C8T6工具STM32CubeMX配置定时器、ST-Link下载程序2. STM32CubeMX 配置步骤步骤 1新建工程打开 STM32CubeMX选择 “Access to MCU Selector”搜索 “STM32F103C8T6”选择对应型号并创建工程配置 RCC选择 “HSE-Crystal/Ceramic Resonator”外部高速晶振配置 SYSDebug 选择 “Serial Wire”SWD 下载节省引脚。步骤 2配置定时器TIM3点击 “TIM3”→ 选择 “Clock Source” 为 “Internal Clock”内部时钟配置 “Channel1” 为 “PWM Generation CH1”PWM 输出通道 1配置定时器参数生成 50Hz PWM时钟树APB1 时钟 36MHzSTM32F103 默认 72MHz 主频APB1 预分频后为 36MHzTIM3 预分频器Prescaler72-1自动重装值Counter Period20000-1→ PWM 周期 200/10kHz20ms50Hz计数模式Up向上计数PWM 模式PWM Mode 1默认高电平有效。配置 GPIOPB8 自动设为 “Alternate Function Push Pull”复用推挽输出。步骤 3生成工程点击 “Project Manager”设置工程名、保存路径选择 “Toolchain/IDE” 为 “MDK-ARM”点击 “Code Generator”选择 “Generate peripheral initialization as a pair of .c/.h files per peripheral”点击 “Generate Code”打开生成的 Keil 工程。3. 核心代码编写步骤 1添加舵机控制函数在tim.c中已自动生成定时器初始化代码无需修改在tim.c中添加 舵机控制函数void door_crtl(uint8_t index) { switch (index) { case 0: __HAL_TIM_SetCompare(htim4,TIM_CHANNEL_3,500);//0 break; case 45: __HAL_TIM_SetCompare(htim4,TIM_CHANNEL_3,1000);//45 break; case 90: __HAL_TIM_SetCompare(htim4,TIM_CHANNEL_3,1500);//90 break; case 135: __HAL_TIM_SetCompare(htim4,TIM_CHANNEL_3,2000);//135 break; case 180: __HAL_TIM_SetCompare(htim4,TIM_CHANNEL_3,2500);//180 break; default: break; } }步骤 2主函数测试在main.c的main()函数中编写测试逻辑舵机往复转动door_crtl(0); HAL_Delay(3000); door_crtl(45); HAL_Delay(3000); door_crtl(90); HAL_Delay(3000); door_crtl(135); HAL_Delay(3000); door_crtl(180); HAL_Delay(3000);五、下载与测试1. 编译下载在 Keil 中编译工程确保无错误连接 ST-Link 到 STM32 最小系统板点击 “Download” 下载程序给舵机和 STM32 供电优先外接 5V 给舵机。2. 预期效果舵机上电后先回到 0° 位然后从 0° 缓慢转到 180°再从 180° 转回 0°循环往复每个角度停留 3000ms转动平稳无卡顿。六、常见问题排查1. 舵机无反应检查接线电源是否 5V、GND 是否共地、信号线是否接 PB8供电不足舵机启动电流大改用外接 5V 电源不要仅靠 STM32 5V 引脚供电。2. 舵机角度不准角度限幅确保输入角度不超过 180°避免机械卡死。3. 舵机抖动电源纹波给舵机电源端并联 100uF 电解电容减少干扰PWM 频率确认定时器配置为 50Hz20ms 周期频率错误会导致抖动代码优化避免在主循环中添加耗时操作保证 PWM 信号稳定。七、拓展应用按键控制角度添加独立按键通过按键切换舵机角度如短按 10°、长按 - 10°串口控制角度通过串口接收上位机指令如发送 “90”舵机转到 90°传感器联动结合 DS18B20 温度传感器温度超阈值时舵机触发报警如打开风扇多路舵机控制扩展 TIM3 其他通道如 CH2PA7驱动多个舵机构建机械臂。八、教程总结STM32 驱动 180° 舵机的核心是生成 50Hz PWM 信号通过调整脉宽1~2ms控制角度本教程选用 TIM4_CH3PB8实现 PWM 输出代码模块化设计可直接移植供电是关键舵机需 5V 稳定供电优先外接电源避免单片机供电不足角度不准时可微调脉宽参数适配不同品牌舵机的个体差异。本教程代码已实测验证适配 STM32F103C8T6SG90 180° 舵机新手可直接复刻进阶学习者可基于此拓展多路控制、传感器联动等功能。