一颗51单片机+ULN2003+定时器查表,把步进电机调速、方向与数码管显示一次搞定
步进电机把电脉冲转换成精确的角位移,控制脉冲个数即可定位、控制脉冲频率即可调速,是低成本开环定位的首选执行机构。本文基于《用单片机控制步进电机》一文整理,以电子爱好者常用的 35BY48S03 永磁式步进电机为例,详解三类步进电机的选型差异、ULN2003 达林顿驱动电路、用定时器 T1 中断实现 25~100 转/分无级调速的原理、转速与定时常数的查表法(11.0592MHz 晶振),并给出完整的 51 汇编程序与转速定时表,适用于物联网设备、教学实验与小型自动化机构的定位控制设计。
步进电机是机电控制中常用的执行机构,作用是把电脉冲转化为角位移:驱动器每收到一个脉冲,电机就按设定方向转过一个固定角度(步进角)。因此控制脉冲个数即可控制角位移量实现准确定位,控制脉冲频率即可控制转速与加速度实现调速。很多初学者以为调速靠"延时"就能解决,但延时法会阻塞 CPU、影响按键与显示等其它功能——正确做法是用定时器中断产生脉冲节拍,本文即围绕这一思路展开。
常见步进电机分三种:永磁式(PM)、反应式(VR)和混合式(HB)。永磁式一般为两相,转矩和体积较小,步进角一般为 7.5° 或 15°,适合小负载、低成本场合;反应式一般为三相,可实现大转矩输出,步进角一般为 1.5°,但噪声和振动都很大,在欧美发达国家 80 年代已被淘汰;混合式综合了永磁式与反应式的优点,又分两相和五相:两相步进角一般为 1.8°,五相一般为 0.72°,应用最为广泛(数据来源:用单片机控制步进电机)。
| 类型 | 相数 | 典型步进角 | 转矩 | 噪声/振动 | 典型应用 |
|---|---|---|---|---|---|
| 永磁式(PM) | 两相 | 7.5° / 15° | 较小 | 中等 | 低成本小负载、教学实验 |
| 反应式(VR) | 三相 | 1.5° | 大 | 很大(已淘汰) | 早期大转矩场合 |
| 混合式(HB) | 两相/五相 | 1.8° / 0.72° | 大且平稳 | 小 | 工业定位、3D打印、数控 |
以电子爱好者业余制作中常用的 35BY48S03 型永磁步进电机为例,电机共有四组线圈,四组线圈的一个端点连在一起引出,共 5 根引出线(COM 端 + A、A'、B、B' 四相)。要驱动电机转动,只需轮流给各引出端通电:将 COM 端接正电源,用开关元件(如三极管)将 A、A'、B、B' 轮流接地即可。该电机典型参数如表 2 所示。
| 型号 | 步距角 | 相数 | 电压 | 电流 | 电阻 | 最大静转矩 | 定位转矩 | 转动惯量 |
|---|---|---|---|---|---|---|---|---|
| 35BY48S03 | 7.5° | 4 | 12V | 0.26A | 47Ω | 180g·cm | 65g·cm | 2.5g·cm² |
因其工作电压 12V、最大电流 0.26A,用一块开路输出达林顿驱动器 ULN2003 即可驱动:ULN2003 内含 7 路达林顿管,每路可承受 500mA 集电极电流、50V 耐压,内置续流二极管可直接驱动感性负载,是驱动 5V/12V 小功率步进电机的经典选择。单片机 P1.4~P1.7 分别接 ULN2003 的四个输入,输出端接电机四相线圈(COM 接 +12V)。开机时 P1.4~P1.7 均为高电平,依次将 P1.4~P1.7 切换为低电平即可驱动电机运行,注意切换前先把前一个输出引脚恢复为高电平。改变两次接通之间的时间即可调速,改变各线圈接通顺序即可改变转向。
驱动要求:开机后电机不转,按下启动键电机旋转,初始速度 25 转/分;按"加1"键速度增加、"减1"键速度降低,最高 100 转/分、最低 25 转/分;按停止键电机停转;速度值在数码管上实时显示。
调速的关键是计算每个脉冲的间隔时间。35BY48S03 步距角 7.5°,即每 48 个脉冲转一周(360°÷7.5°=48)。最低转速 25 转/分对应 25×48=1200 脉冲/分,即 50ms/脉冲;最高转速 100 转/分对应 100×48=4800 脉冲/分,即 12.5ms/脉冲。用 11.0592MHz 晶振、定时器 T1 方式 1(16 位)定时,按"定时初值=65536-定时时间×晶振频率÷12"计算各转速对应的 TH1/TL1,结果如表 3 所示。
| 速度(转/分) | 单步时间(µs) | TH1 | TL1 | 实际定时(µs) |
|---|---|---|---|---|
| 25 | 50000 | 76 | 0 | 49996.8 |
| 26 | 48077 | 82 | 236 | 48074.18 |
| 27 | 46296 | 89 | 86 | 46292.61 |
| 28 | 44643 | 95 | 73 | 44640.155 |
| … | … | … | … | … |
| 100 | 12500 | 211 | 0 | 12499.2 |
表中不仅算出了 TH1 和 TL1,还给出了在该定时常数下的真实定时时间,可据此估算真实速度与理论速度的误差(数据来源:用单片机控制步进电机)。把这些初值分别存入 DjH、DjL 两张表,运行时按当前速度查表装载即可。
程序由键盘程序、显示器程序、步进电机驱动程序三部分组成。主程序初始化变量、消隐显示器高位、将电机驱动引脚置高,然后循环扫描键盘;有键按下则调用键盘处理程序(启动/停止、加1/减1),否则将当前转速转成 BCD 码送入显示缓冲区;接着判断 StartEnd 位变量决定开启或关闭定时器 T1——关闭时把 P1.0~P1.3 全部置高,防止某相线圈长期通电。
步进电机的驱动在定时器 T1 的中断服务程序中实现。变量 DjCount 初值 11110111B,进入中断后左移并取反,与 P1 相"与/或",使 P1.4~P1.7 依次输出低电平,驱动四相线圈轮流通电;当数据变为 01111111B 后重新恢复为 11110111B 开始下一轮循环。定时初值采用查表法:把速度值 Speed 减去基数 25 后作为查表偏移,分别查 DjH、DjL 表装入 TH1、TL1,实现每档速度的定时初值重置。核心代码如下。
; 定时器T1中断:步进电机驱动(51汇编,11.0592MHz)
DjZd:
PUSH ACC
PUSH PSW
MOV A, Speed
SUBB A, #MinSpd ; 减基数25,从0开始计数
MOV DPTR, #DjH
MOVC A, @A+DPTR ; 查表取TH1
MOV TH1, A
MOV A, Speed
SUBB A, #MinSpd
MOV DPTR, #DjL
MOVC A, @A+DPTR ; 查表取TL1
MOV TL1, A
MOV A, DjCount
CPL A
ORL P1, A ; 先关断上一相
MOV A, DjCount
RL A ; 左移切换到下一相
MOV DjCount, A
ANL P1, A ; 接通当前相
POP PSW
POP ACC
RETI
; 转速→定时初值表(25~100转/分)
DjH: DB 76,82,89,95,100,106,110,115,119,123,127,131,134,138,141,144,147,150,153,156,159,161,164,167,169,172,174,177,179,181,184,186,188,190,193,195,197,199,201,203,205,207,209,211
DjL: DB 0,236,86,73,212,0,214,96,163,165,112,12,123,203,0,36,152,58,25,140,68,201,80,219,131,56,247,199,152,105,59,14,225,180,136,92,49,6,220,179,138,97,57,0
键盘处理中,S1 为启动/停止键、S2 为停止键、S3 为加1键、S4 为减1键:按加1键时 Speed 加 1,到最大值 100 时保持;按减1键时 Speed 减 1,到最小值 25 时保持。数码管显示用动态扫描,显示缓冲区 DispBuf 存放 BCD 码,定时器 T0 每 3ms 中断刷新一位。
本程序的关键在于把"调速"从阻塞式延时中解放出来:定时器 T1 中断按查表得到的节拍切换绕组通电顺序,CPU 主循环只负责键盘与显示,互不干扰。三点值得注意:一是关闭电机时把 P1.0~P1.3 全部置高,避免某相长期通电导致线圈过热;二是查表法用空间换时间,44 档速度的初值全部预存,中断内只做两次查表,实时性极佳;三是程序未做高位"0"消隐,速度 10 转/分时显示"010",可自行加入消隐逻辑。
在此基础上可扩展:把 S1 定义为"启动/停止"、S2 定义为"方向"(按下切换旋转方向);把调速范围扩展到 1~100 转/分;实现首位无效零消隐;或改用定时器自动重装载模式(方式 2)简化初值装载。若需更高精度与更平滑的加减速,可引入梯形/S 形加减速曲线,逐档改变定时初值。
| 实现方式 | 调速精度 | CPU占用 | 实现复杂度 | 适用场景 |
|---|---|---|---|---|
| 软件延时调速 | 低(受延时影响) | 高(阻塞) | 最低 | 单任务、无显示/按键 |
| 定时器中断+查表(本文) | 中(查表档位) | 低(中断驱动) | 中 | 调速+显示+按键并存 |
| 定时器+加减速曲线 | 高(连续变速) | 低 | 较高 | 高速启停、防失步 |
| 专用驱动IC/模块 | 高(硬件细分) | 极低 | 低 | 量产产品、高精度定位 |
单片机控制步进电机设计清单
- ① 选型:小负载低成本选永磁式(PM),工业定位选混合式(HB,1.8°/0.72°);
- ② 驱动:12V/0.26A 级小电机用 ULN2003(500mA/路、内置续流二极管),COM 接正电源、四相轮流接地;
- ③ 调速:用定时器中断产生脉冲节拍,勿用阻塞式延时;
- ④ 查表:按"初值=65536-定时时间×晶振÷12"预存各档 TH1/TL1,中断内查表装载;
- ⑤ 停转:关闭定时器时把四相全部置高,防止线圈长期通电;
- ⑥ 扩展:可加方向键、加减速曲线与高位消隐。
总结:步进电机调速的本质是控制脉冲节拍,用定时器中断+查表法把调速从阻塞式延时中解放出来,使 51 单片机在驱动电机的同时还能处理按键与数码管显示;35BY48S03 配 ULN2003 是低成本入门组合,7.5° 步距角、48 脉冲/周,25~100 转/分对应 50ms~12.5ms/脉冲,查表即可实现无级调速;掌握这一思路后,无论换用混合式电机还是引入加减速曲线,都能快速迁移。
本文基于《用单片机控制步进电机,硬件电路及源码》等资料整理优化。
沧州艾诺威电子 — 国家高新技术企业,20+项国家专利
嵌入式系统开发 · 物联网方案 · AI智能硬件 · 一站式交付
电话:13930711029 | 邮箱:tech@czinv.com | 24小时内响应