2025/12/30 15:07:34
网站建设
项目流程
网站产品详情页怎么做,docker 安装wordpress,虚拟主机网站模板,关键词整站优化本文将详细讲解如何使用STM32F103C8T6单片机驱动五线四相步进电机#xff08;典型型号#xff1a;28BYJ-48#xff09;#xff0c;搭配 ULN2003 驱动模块实现电机的正转、反转、调速和定角度转动控制。教程基于 HAL 库开发#xff0c;步骤清晰、代码可直接复用#xff0c…本文将详细讲解如何使用STM32F103C8T6单片机驱动五线四相步进电机典型型号28BYJ-48搭配 ULN2003 驱动模块实现电机的正转、反转、调速和定角度转动控制。教程基于 HAL 库开发步骤清晰、代码可直接复用适合新手学习和嵌入式步进电机控制项目开发如智能小车、云台、阀门控制、机械臂等场景。一、硬件准备与原理说明1. 硬件清单器件数量备注STM32F103C8T6 最小系统板1核心控制单元28BYJ-48 五线四相步进电机1五线四相结构自带减速箱ULN2003 驱动模块1放大电流驱动步进电机不可直连 STM32 引脚5V 直流电源1给步进电机和 ULN2003 供电可使用 USB5V杜邦线若干电路连接ST-Link 调试器1程序下载与调试提示28BYJ-48 步进电机通常与 ULN2003 驱动板集成在一起一体化模块接线更便捷可直接选用此类模块。2. 核心原理1五线四相步进电机28BYJ-48结构与参数28BYJ-48 是一款常用的减速型五线四相步进电机核心参数与结构绕组相数4 相A、B、C、D 相对应电机的 4 个控制引脚。公共端1 个公共引脚COM通常接 5V 电源总计 5 根线因此称为 “五线四相”。减速比1:64电机内部自带减速齿轮组输出轴转速为电机转子的 1/64。步距角未减速时为 5.625°即每走一步转子转动 5.625°减速后实际步距角为\(5.625°/64≈0.08789°\)输出轴转动一圈需要 4096 步360°/0.08789°≈4096。供电电压5V DC推荐不可接高压否则烧毁电机。2步进电机驱动方式五线四相步进电机的驱动需按固定相序给绕组通电常见驱动方式有 3 种其中八拍驱动转动最平稳本教程采用八拍驱动单四拍A→B→C→D→A4 个节拍转动顿挫感较强步距角大。双四拍AB→BC→CD→DA→AB4 个节拍扭矩更大顿挫感减弱。八拍A→AB→B→BC→C→CD→D→DA→A8 个节拍转动最平稳本教程首选。3ULN2003 驱动模块的作用STM32 单片机的 GPIO 引脚输出电流仅为几毫安无法直接驱动步进电机步进电机工作电流约几十到几百毫安。ULN2003 是一款达林顿管阵列芯片可将 STM32 的弱电信号放大为强电信号最大输出电流 500mA从而驱动步进电机的绕组。二、硬件接线1. 引脚定义说明28BYJ-48 电机引脚通常有 5 根线颜色对应相序不同厂家可能略有差异以实际标注为准公共端COM红色线接 5V。A 相橙色线接 ULN2003 的 IN1。B 相黄色线接 ULN2003 的 IN2。C 相粉色线接 ULN2003 的 IN3。D 相蓝色线接 ULN2003 的 IN4。ULN2003 驱动模块引脚IN1~IN4控制信号输入接 STM32 的 GPIO 引脚。OUT1~OUT4控制信号输出接步进电机的 A~D 相。VCC驱动模块供电接 5V与电机共电源。GND接地与 STM32、电机共地关键。COM电机公共端接口可接 5V部分模块已内部连接 VCC可忽略。2. 整体接线表STM32F103C8T6本教程选用 STM32 的PB0、PB1、PB2、PB3作为控制引脚连接 ULN2003 的 IN1~IN4设备引脚STM32 引脚说明ULN2003-IN1PA0控制步进电机 A 相ULN2003-IN2PA1控制步进电机 B 相ULN2003-IN3PA2控制步进电机 C 相ULN2003-IN4PA3控制步进电机 D 相ULN2003-VCC5V驱动模块与电机供电ULN2003-GNDGND与 STM32、电机共地28BYJ-48-COM红5V电机公共端接 5V28BYJ-48-A橙ULN2003-OUT1电机 A 相28BYJ-48-B黄ULN2003-OUT2电机 B 相28BYJ-48-C粉ULN2003-OUT3电机 C 相28BYJ-48-D蓝ULN2003-OUT4电机 D 相注意事项所有设备必须共地否则控制信号会紊乱电机无法正常工作。若使用一体化的 28BYJ-48ULN2003 模块只需连接模块的 IN1~IN4 到 STM32 的 PB0~PB3VCC 接 5VGND 接共地即可。严禁将步进电机直接接 STM32 的 GPIO 引脚必须通过 ULN2003 驱动。三、软件准备1. 开发环境STM32CubeMX用于配置 STM32 外设自动生成初始化代码。Keil MDK-ARM用于编写、编译代码下载程序到 STM32。ST-Link 调试器用于程序下载与调试或 USB 转串口。2. STM32CubeMX 配置步骤步骤 1新建工程打开 STM32CubeMX点击Access to MCU Selector搜索并选择STM32F103C8T6芯片点击Start Project。配置RCC选择HSE外部高速时钟类型为Crystal/Ceramic Resonator8MHz 晶振。配置SYS调试接口选择Serial WireSWD方便后续调试和程序下载。步骤 2配置 GPIO控制引脚找到GPIO配置项依次选择PA0、PA1、PA2、PA3引脚模式ModeOutput Push Pull推挽输出模式。输出速度SpeedLow低速足够驱动控制信号。上拉 / 下拉Pull-up/Pull-downNo Pull-up and No Pull-down无上下拉。初始电平GPIO Output LevelLow低电平初始状态断电。其余参数保持默认无需修改。步骤 3配置时钟树将 STM32 系统时钟配置为72MHz最大化性能不影响 GPIO 输出HSE8MHz外部晶振→ PLL 倍频 9 倍 → 72MHz系统主时钟。AHB Prescaler172MHz。APB1 Prescaler236MHz。点击Refresh确认时钟配置无误。步骤 4生成代码点击Project Manager设置Project Name如STM32_Stepper_Motor。Project Location选择保存路径无中文、无空格。Toolchain/IDEMDK-ARM。勾选Generate peripheral initialization as a pair of .c/.h files per peripheral分文件生成代码便于管理。点击GENERATE CODE生成代码后点击Open Project打开 Keil 工程。四、代码编写1. 核心驱动代码编写在main.c中添加步进电机的相序定义、延时函数和转动控制函数。本教程采用八拍驱动方式最平稳同时支持正转、反转和调速。1stepmotor.c(部分)void MOTOR_Direction(uint8_t dir,uint8_t num,uint8_t dly) //方向 节拍 频率 { if(dir) { switch(num) { case 0:for(uint8_t i1;i9;i){MOTOR_Rhythm_4_1_8(i,dly);}break; case 1:for(uint8_t i1;i5;i){MOTOR_Rhythm_4_1_4(i,dly);}break; case 2:for(uint8_t i1;i5;i){MOTOR_Rhythm_4_2_4(i,dly);}break; default:break; } } else { switch(num) { case 0:for(uint8_t i8;i0;i--){MOTOR_Rhythm_4_1_8(i,dly);}break; case 1:for(uint8_t i4;i0;i--){MOTOR_Rhythm_4_1_4(i,dly);}break; case 2:for(uint8_t i4;i0;i--){MOTOR_Rhythm_4_2_4(i,dly);}break; default:break; } } }2stepmotor.h/** **************************************************************************************************** * file stepmotor.h * author 送外卖的工程师 * version V1.0 * date 2025-12-14 * brief 步进电机驱动代码 **************************************************************************************************** * attention * * 实验平台:STM32F103C8T6 * CSDN:送外卖的工程师 * 技术指导VX:wmz14026 * 淘宝店铺:小马科技 * 闲鱼店铺:送外卖的工程师 * * 修改说明 * V1.0.0.251214 * 第一次发布 * 注长期接各种项目设计提供仿真、实物、原理图、PCB、代码工程、后期指导、操作视频、 说明文档、各种报告、后期指导等。 **************************************************************************************************** */ #ifndef __STEPMOTOR_H #define __STEPMOTOR_H #include delay.h #include main.h // 步进电机 GPIO宏定义 #define MOTOR_GPIO_RCC_EN __HAL_RCC_GPIOA_CLK_ENABLE(); #define MOTOR_A GPIO_PIN_1 #define MOTOR_B GPIO_PIN_2 #define MOTOR_C GPIO_PIN_3 #define MOTOR_D GPIO_PIN_4 #define MOTOR_PROT GPIOA #define MOTOR_A_LOW HAL_GPIO_WritePin(MOTOR_PROT,MOTOR_A,GPIO_PIN_RESET) #define MOTOR_A_HIGH HAL_GPIO_WritePin(MOTOR_PROT,MOTOR_A,GPIO_PIN_SET) #define MOTOR_B_LOW HAL_GPIO_WritePin(MOTOR_PROT,MOTOR_B,GPIO_PIN_RESET) #define MOTOR_B_HIGH HAL_GPIO_WritePin(MOTOR_PROT,MOTOR_B,GPIO_PIN_SET) #define MOTOR_C_LOW HAL_GPIO_WritePin(MOTOR_PROT,MOTOR_C,GPIO_PIN_RESET) #define MOTOR_C_HIGH HAL_GPIO_WritePin(MOTOR_PROT,MOTOR_C,GPIO_PIN_SET) #define MOTOR_D_LOW HAL_GPIO_WritePin(MOTOR_PROT,MOTOR_D,GPIO_PIN_RESET) #define MOTOR_D_HIGH HAL_GPIO_WritePin(MOTOR_PROT,MOTOR_D,GPIO_PIN_SET) void MOTOR_Init(void); void MOTOR_Rhythm_4_1_4(uint8_t step,uint8_t dly); void MOTOR_Direction(uint8_t dir,uint8_t num,uint8_t dly); void MOTOR_Direction_Angle(uint8_t dir,uint8_t num,uint16_t angle,uint8_t dly); void MOTOR_STOP(void); #endif2. 代码注意事项相序与引脚对应若电机转动方向与预期相反可将step_dir的正反转逻辑调换或修改相序表的顺序。转速调整修改延时的数值单位 ms数值越小转速越快但最小值不能低于 3ms否则电机扭矩不足出现卡顿或不转。步数与角度对应28BYJ-48 输出轴转动一圈需要4096 步八拍因此转动 90°4096/41024 步。转动 180°4096/22048 步。可根据需求计算对应步数。电机发热问题若电机长时间通电但不转动会持续发热因此在转动完成后可调用Set_Stepper_Pins(0,0,0,0)关闭所有引脚电平本代码已添加。驱动方式扩展若需使用单四拍 / 双四拍驱动只需修改相序表如单四拍相序为{1,0,0,0},{0,1,0,0},{0,0,1,0},{0,0,0,1}并调整步数单四拍一圈需要 2048 步。五、下载与测试1. 编译代码在 Keil 中点击Build编译或Rebuild重新编译确保代码无错误。若出现语法错误检查宏定义、函数参数是否正确或是否遗漏头文件。2. 下载程序将 ST-Link 调试器连接到 STM32 的 SWD 接口SWDIO、SWCLK、GND。在 Keil 中点击Download下载将程序烧录到 STM32 中。3. 测试效果给 STM32 和步进电机供电5V此时电机将按照代码逻辑执行正转一圈→暂停 1 秒→反转一圈→暂停 1 秒循环往复。观察电机转动是否平稳若出现卡顿可增大延时的数值如改为 10ms。测试定角度转动修改主函数中的步数如 1024 步观察电机是否转动 90°。六、常见问题解决1. 电机不转检查接线确认 STM32 的 PA0~PA3 与 ULN2003 的 IN1~IN4 连接正确所有设备共地电机的 COM 端接 5V。电源问题确保电机供电为 5V且电源电流足够至少 100mA否则电机扭矩不足。延时过短将延时增大到 10ms重试电机是否转动。相序错误检查相序表的引脚电平是否与硬件接线对应或调换正反转的step_dir参数。2. 电机转动卡顿或抖动转速过快增大延时的数值如从 5ms 改为 10ms降低转速。电源电流不足更换更大电流的 5V 电源如 1A 以上。机械阻力检查电机输出轴是否有卡顿的机械负载移除负载后重试。3. 电机转动方向与预期相反方法 1在调用MOTOR_Direction_Angle时将正转1改为反转0反转改为正转。方法 2修改相序表的顺序将正转相序改为逆序。方法 3调换电机的任意两相引脚如 A 相与 B 相。4. 电机转动步数与角度不匹配确认使用的驱动方式八拍驱动需要 4096 步 / 圈单四拍需要 2048 步 / 圈双四拍需要 2048 步 / 圈。检查Stepper_Motor_Run函数中的步数参数是否正确。七、功能扩展可选本教程实现了基础的步进电机控制可根据需求扩展以下功能按键控制添加按键引脚实现按键触发正转、反转、停止。串口控制通过串口接收指令如 “F1024” 表示正转 1024 步实现远程控制。调速功能通过 PWM 或变量延时实现电机转速的无级调节。角度闭环控制搭配编码器实现步进电机的精准角度定位闭环控制。多电机控制增加 GPIO 引脚实现多个步进电机的同步控制。总结五线四相步进电机28BYJ-48需通过ULN2003 驱动模块与 STM32 连接STM32 的 GPIO 引脚输出固定相序的电平信号控制电机转动。本教程采用八拍驱动方式最平稳核心步骤为硬件接线STM32ULN2003 电机→STM32CubeMX 配置 GPIO→编写相序表与转动控制函数→测试正转 / 反转 / 定角度转动。28BYJ-48 减速后输出轴转动一圈需要4096 步八拍可通过步数控制转动角度通过延时时间控制转速。通过本教程你不仅能掌握 STM32 驱动五线四相步进电机的核心方法还能快速实现步进电机的基础控制适用于智能小车、云台、机械臂、智能家居等嵌入式项目开发。