51单片机-驱动直流电机模块教程
本章概述思维导图:
51单片机驱动直流电机模块
直流电机简介
直流电机是指能将直流电与机械能相互转换的核心设备,其结构复杂且精密。通俗来说有两大板块:1、直流电能转换为机械能(直流电动机);2、机械能转换为直流电能(直流发电机);直流电机实物图如下:
以下从定子、转子、辅助系统及励磁方式四个维度,对直流电机关键元器件进行系统性介绍:
一、定子系统(静止部分)
1、主磁极
结构:由铁芯(硅钢片叠压)和励磁绕组组成,极靴宽于极身以优化磁场分布。
材料:铁芯用0.5-1.5mm厚硅钢片,绕组为绝缘铜线。
作用:产生主磁场,与电枢电流相互作用形成转矩。
2、换向极
结构:铁芯(整块钢或硅钢片)与绕组(铜线)组成,位于主磁极间。
作用:通过产生反向磁场抵消电枢反应,减少换向火花。
3、机座
材料:铸钢或钢板焊接。
作用:固定磁极、支撑电机,并作为磁路的一部分(磁轭)。
4、电刷装置
组成:电刷(石墨/金属石墨)、刷握(金属)、弹簧(恒压/可调式)、刷杆及刷杆座。
作用:将电流引入或引出电枢绕组,确保与换向器稳定接触。
二、转子系统(旋转部分,电枢)
1、电枢铁芯
材料:0.5mm硅钢片叠压,表面涂绝缘漆。
作用:嵌放电枢绕组,减少涡流损耗(铁损)。
2、电枢绕组
结构:高强度漆包线或玻璃丝包扁铜线绕制,嵌入铁芯槽后用槽楔固定。
作用:产生感应电动势和电磁转矩,实现能量转换。
3、转向器
结构:梯形铜片与云母绝缘层组成圆柱体,与电枢绕组端头连接。
作用:周期性切换电流方向,维持转矩方向恒定。
4、转轴
材料:优质碳钢(如45#钢),经调质处理。
作用:支撑转子,传递机械转矩。
三、辅助系统
1、轴承
类型:滚动轴承(球轴承或滚子轴承)与滑动轴承(含油轴承)。
作用:减少摩擦,支撑转子旋转。
2、风扇
类型:离心式或轴流式,材质为塑料或铝合金。
作用:冷却电机,防止过热。
3、端盖
材料:铸铁或铝合金。
作用:封闭电机内部,固定轴承,部分设计含观察窗以检查电刷状态。
四、励磁系统
1、 励磁绕组
连接方式:
他励式:独立电源供电,适用于精密调速场景。
并励式:绕组与电枢并联,电压稳定性好。
串励式:绕组与电枢串联,启动转矩大(如电车驱动)。
复励式:结合并励与串励,兼具高启动转矩与稳压特性。
材料:高强度漆包线,绝缘等级通常为F级(155℃)。
2.、励磁电源
类型:独立直流电源(他励)或电枢回路取电(并励/串励)。
控制:通过调节励磁电流可调整电机转速(他励式调速范围可达1:20)。
直流电机工作原理
能量转换:定子磁场与电枢电流相互作用,产生洛伦兹力驱动转子旋转。
换向机制:换向器随转子旋转,动态切换电枢绕组电流方向,确保转矩方向恒定。
调速控制:通过改变励磁电流或电枢电压,实现宽范围无级调速。
ULN2003芯片简介
ULN2003是一款高压大电流达林顿晶体管阵列芯片,由七个独立的NPN达林顿管单元组成,专为驱动高电压、大电流负载设计。其核心功能是将低电平逻辑信号(如TTL/CMOS)转换为高功率输出,广泛应用于继电器、步进电机、LED显示等场景。ULN2003芯片实物图如下:
ULN2003芯片的特点
ULN2003的每一对达林顿都串联一个2.7K的基极电阻,在5V的工作电压下它能与TTL和CMOS电路 直接相连,可以直接处理原先需要标准逻辑缓冲器来处理的数据。
ULN2003 工作电压高,工作电流大,灌电流可达500mA,并且能够在关态时承受50V的电压,输出还 可以在高负载电流并行运行。
ULN2003 采用DIP—16或SOP—16塑料封装。
ULN2003芯片核心特性
特性 | 参数 |
通道数 | 7通道(达林顿阵列) |
最大输出电流 | 单通道500mA,峰值600mA(多通道并联可提升) |
工作电压 | 5V至50V(COM引脚需接负载电源正极) |
输入电平 | 兼容TTL/CMOS(3.3V/5V逻辑) |
饱和压降 | 约1V(集电极-发射极) |
内置保护 | 反电动势吸收二极管(续流二极管) |
封装 | DIP-16(直插式)或SOP-16(贴片式) |
工作温度 | -40℃至85℃(工业级) |
ULN2003芯片引脚配置与功能
引脚说明:
1、输入引脚(编号1~7)
接收微控制器(如Arduino、单片机)的逻辑信号,高电平触发输出导通。
每个输入引脚串联2.7kΩ基极电阻,可直接与TTL/CMOS接口连接。
2、输出引脚(编号10~16)
集电极开路输出,低电平时导通(吸收电流),高阻态时断开。
单个通道最大灌电流500mA,多通道并联可提升至1A。
3、COM引脚(编号9)
关键功能:连接感性负载(如电机、继电器)的电源正极,形成续流回路,吸收反电动势。
VCC:通过COM引脚间接供电(负载电源),无需单独供电。
电阻负载:可悬空不接。
4、地GND(编号8)
GND(引脚8):芯片参考地,需与微控制器共地。
直流电机硬件电路原理图分析
分析电路原理图:
ULN2003芯片的IN输入脚分别连接MCU的IO引脚,IN1-P10、IN2-P11、IN3-P12、IN3-P13、IN5-P25;
ULN2003芯片的OUT输出脚分别引出座子和连接蜂鸣器引脚,OUT1~OUT4引出座子,OUT5连接蜂鸣器(本章不考虑此引脚);
ULC2003芯片的GND引脚连接公共地,COM引脚连接开发板的VCC电源引脚;
这直流电机元器件中有两个引脚用杜邦线与ULN2003芯片的VCC引脚和OUT1引脚进行连接;
这里有小伙伴会有疑问:
为什么不可以让直流电机的两个引脚与ULN2003芯片的OUT引脚进行连接,还要其中一个引脚特意连接VCC?
这是因为:ULN2003的每个输出脚(OUT)内部藏着一个达林顿晶体管。当输入为低电平时,达林顿晶体管会断开,让OUT引脚变成悬空状态。无法与电机形成电流回路。当输入为高电平时,达林顿晶体管会闭合,相当于OUT输出引脚接地;小伙伴们就简单记住ULN2003芯片的输出脚是个单向开关,当输入为高电平时,对应输出引脚接地。当输入为低电平时,对应输出引脚断开;
小伙伴们还有有一个疑问,为什么ULN2003芯片可以通过小电流(如3.3V和5V逻辑信号)控制大电流负载(如继电器、电机)呢?
这是因为:ULN2003的输入引脚(IN1-IN7)兼容3.3V/5V TTL/CMOS逻辑电平,接受微控制器(如STM32、Arduino)的低压控制信号。输出引脚(OUT1-OUT7)为集电极开路结构,通过外部电源(如5V、12V)为负载供电,输出电压由负载电源决定,而非芯片内部转换。而ULN2003芯片就相当于一个单向开关啦!
驱动直流电机软件编程设计
我们做两个实验:第一个实验直流电机驱动5秒后自动关闭;第二个实验独立按键控制直流电机工作
这里我们直流电机为单向转动模式,我们就无需刻意区分电机正负啦。实现直流电机独立驱动5秒后自动关闭控制实验
代码示例:
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
void Delay_ms(u16 ms) //毫秒延时函数:输入1大概延时时间为1ms
{u16 i,j;for(i=ms;i>0;i--){for(j=110;j>0;j--){}}
}
sbit FS=P1^0; //ULN2003输入控制脚
int main()
{u8 KEY=0;FS=0; //直流电机初始化,为静止状态FS=1; //直流电机开始工作Delay_ms(5000); //延时时间为5秒FS=0; //关闭直流电机while(1){}
}
这里我们直流电机为单向转动模式,我们就无需刻意区分电机正负啦。实现直流电机独立按键控制实验
第一步:实现独立按键检测功能;
第二步:实现直流电机驱动功能;
第三步:在主函数中实现独立按键控制直流电机驱动和静止;
代码示例:
#include "reg52.h"
typedef unsigned char u8;
typedef unsigned int u16;
void Delay_10us(u16 us)//延时函数:输入1大概延时时间为10us
{while(us--);
}
#define KEY_matrix P1
sbit KEY1=P3^1;//定义检测独立按键的各个引脚输入状态
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;
#define KEY1_return 1//定义检测独立按键函数检测的状态变量返回值,按键按下分别返回1,2,3,4;没有按键按下返回0;
#define KEY2_return 2
#define KEY3_return 3
#define KEY4_return 4
#define KEY_return 0
u8 KEY_detect(u8 mode)//按键检测函数,返回值为判断是否有按键按下:有按键按下返回值为1-4,无按键按下返回值为:0;
{ static u8 flag=1;if(mode){flag=1;}if((!KEY1 || !KEY2 || !KEY3 || !KEY4) && flag==1)//一次判断是否有按键按下{flag=0;Delay_10us(1000);//延时消抖if(!KEY1) return KEY1_return;//二次判断else if(!KEY2) return KEY2_return;else if(!KEY3) return KEY3_return;else if(!KEY4) return KEY4_return;}else if(KEY1 && KEY2 && KEY3 && KEY4)//判断所有按键是否松开{flag=1;}return KEY_return;
}
sbit FS=P1^0;
int main()
{u8 KEY=0;FS=0; //直流电机初始化,为静止状态while(1){KEY=KEY_detect(0);if(KEY == 1){FS=1;//按键一按下,直流电机驱动}else if(KEY == 2){FS=0;//按键二按下,直流电机停止工作} }
}
独立按键控制直流电机驱动效果展示
独立按键控制直流电机效果展示
制作不易!喜欢的小伙伴给个小赞赞!喜欢我的小伙伴点个关注!有不懂的地方和需要的资源随时问我哟!