news 2026/4/9 7:16:07

【stm32简单外设篇】- 28BYJ-48 步进电机(配 ULN2003 驱动板)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【stm32简单外设篇】- 28BYJ-48 步进电机(配 ULN2003 驱动板)

一、适用场景
适用场景:小车差速/定位、微型机械臂关节、门栓/阀门微调、以步进精度做角度控制的低速场合、嵌入式 PWM/GPIO/驱动练习与教学。

二、器材清单

28BYJ-48 步进电机(常见 5V 带减速箱)×1

ULN2003 驱动板(或等效达林顿阵列驱动)×1

stm32f103(或其它 STM32)开发板 ×1

稳定 5V 电源(电机供电)×1

若干杜邦线

三、工作原理(要点)

电机与减速比:28BYJ-48 通常为单极四相步进电机,电机本体步距角常为 5.625°,电机轴每转需 360 / 5.625 = 64 步;电机带一级减速箱(典型标称 64:1),因此输出轴每转步数约 64 × 64 = 4096 步(不同厂家有细微差异,实际以传动箱标注/测量为准)。

推导(数位检算):360 / 5.625 = 64;64 × 64 = 4096;输出角度 = 360 / 4096 ≈ 0.087890625°/步。

驱动方式:ULN2003 板是 NPN 达林顿阵列,按输入 IN1..IN4 对应线圈缠绕的通电次序做开闭即可驱动。ULN2003 为下拉(SINK)驱动:板子将线圈另一端接到电源正极,IN 引脚接高时导通到地流过线圈。板上通常带有反向二极管/保护。

常用驱动序列:常见有三种序列——单相激励(wave drive,4 步)、双相激励(full step,4 步但两相同时通电)、半步(half-step,8 步,兼顾扭矩和平滑)。半步常用于平衡分辨率与扭矩。

步进控制思想:通过改变步序索引(加/减)并在步与步之间等待适当延时来产生转速;在启动/停止时做加减速(ramp)可避免漏步。

四、接线示意

VCC → +5V

GND → GND

标准库

HAL库
IN1-4--PA4-7

五、示例代码

标准库

#include "stm32f10x.h" #include "oled.h" #include "bsp_SysTick.h" void emGPIO_Init(void); unsigned int z_step[8]={0x0070,0x0030,0x0050,0x0090,0x00d0,0x00c0,0x00e0,0x0060}; unsigned int f_step[8]={0x0060,0x00e0,0x00c0,0x00d0,0x0090,0x0050,0x0030,0x0070}; int main() { int step=0; SysTick_Init(); emGPIO_Init(); while(1) { if(step>=8) step=0; GPIO_Write(GPIOD,z_step[step]); Delay_us(1850); step++; } // return 0; } void emGPIO_Init(void) { GPIO_InitTypeDef PD; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE); PD.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7; PD.GPIO_Mode = GPIO_Mode_Out_PP; PD.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD, &PD); }

HAL库

/* USER CODE BEGIN Header */ /** ****************************************************************************** * @file : main.c * @brief : Main program body ****************************************************************************** * @attention * * Copyright (c) 2025 STMicroelectronics. * All rights reserved. * * This software is licensed under terms that can be found in the LICENSE file * in the root directory of this software component. * If no LICENSE file comes with this software, it is provided AS-IS. * ****************************************************************************** */ /* USER CODE END Header */ /* Includes ------------------------------------------------------------------*/ #include "main.h" /* Private includes ----------------------------------------------------------*/ /* USER CODE BEGIN Includes */ /* USER CODE END Includes */ /* Private typedef -----------------------------------------------------------*/ /* USER CODE BEGIN PTD */ /* USER CODE END PTD */ /* Private define ------------------------------------------------------------*/ /* USER CODE BEGIN PD */ /* USER CODE END PD */ /* Private macro -------------------------------------------------------------*/ /* USER CODE BEGIN PM */ /* USER CODE END PM */ /* Private variables ---------------------------------------------------------*/ /* USER CODE BEGIN PV */ /* USER CODE END PV */ /* Private function prototypes -----------------------------------------------*/ void SystemClock_Config(void); static void MX_GPIO_Init(void); /* USER CODE BEGIN PFP */ /* USER CODE END PFP */ /* Private user code ---------------------------------------------------------*/ /* USER CODE BEGIN 0 */ unsigned int z_step[8]={0x0070,0x0030,0x0050,0x0090,0x00d0,0x00c0,0x00e0,0x0060}; unsigned int f_step[8]={0x0060,0x00e0,0x00c0,0x00d0,0x0090,0x0050,0x0030,0x0070}; int step=0; /* USER CODE END 0 */ /** * @brief The application entry point. * @retval int */ int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Infinite loop */ /* USER CODE BEGIN WHILE */ while (1) { if(step>=8) step=0; GPIOA->ODR = z_step[step]; HAL_Delay(2); step++; /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ } /* USER CODE END 3 */ }

六、讲解视频

https://www.bilibili.com/video/BV1AkmcB8Ep9/?spm_id_from=333.1387.upload.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

https://www.bilibili.com/video/BV1pwmcBoEJU/?spm_id_from=333.1387.upload.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

https://www.bilibili.com/video/BV1pwmcBoE4m/?spm_id_from=333.1387.upload.video_card.click&vd_source=f7dfe1b14f260b9cc3a146d2dbfd0719

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/8 18:42:42

Qwen3-VL-8B:80亿参数掀起多模态AI实用化革命

Qwen3-VL-8B:80亿参数掀起多模态AI实用化革命 【免费下载链接】Qwen3-VL-8B-Instruct 项目地址: https://ai.gitcode.com/hf_mirrors/Qwen/Qwen3-VL-8B-Instruct 导语 阿里通义千问团队推出的Qwen3-VL-8B多模态模型,以80亿参数规模实现"小…

作者头像 李华
网站建设 2026/4/7 13:38:02

终极指南:5分钟掌握Etcher镜像烧录工具

Etcher是一款革命性的开源镜像烧录工具,专门用于将操作系统镜像文件安全可靠地写入SD卡和USB驱动器。这款跨平台工具通过直观的图形界面,让复杂的系统安装过程变得像复制文件一样简单。无论您是嵌入式开发者部署树莓派系统,还是普通用户制作W…

作者头像 李华
网站建设 2026/3/29 0:40:28

Rufus实战手册:打造完美启动盘的进阶技巧

Rufus实战手册:打造完美启动盘的进阶技巧 【免费下载链接】rufus The Reliable USB Formatting Utility 项目地址: https://gitcode.com/GitHub_Trending/ru/rufus 还在为系统重装而头疼?或者因为兼容性问题导致启动盘制作失败?别担心…

作者头像 李华
网站建设 2026/4/3 4:43:26

AgileBoot全栈开发框架:从入门到精通的完整指南

AgileBoot全栈开发框架:从入门到精通的完整指南 【免费下载链接】AgileBoot-Back-End 🔥 规范易于二开的全栈基础快速开发脚手架。🔥 采用Springboot Vue 3 Typescript Mybatis Plus Redis 更面向对象的业务建模 面向生产的项目&#x…

作者头像 李华
网站建设 2026/3/28 22:25:42

银行测试人--最近行情,吐槽一下

怎么说,最近大环境银行,各种大神,5年 经验压榨的,还是临近年关,大家都不是苟着动,等着明年憋个大的,怎么说了 对于银行测试,对于应届生,相关专业 计算机科学 &#xff0…

作者头像 李华