第13章 直流电机实验
第十三章 直流电机实验
1. 导入
51 单片机应用中, 电机控制的应用也非常多。 所以有必要先来了解下电机相关的知识以及如何使用 51 单片机控制电机, 在未学习 PWM(脉冲宽度调制) 之前, 我们先简单使用 GPIO 来控制电机的旋转和停止。 不能直接使用 GPIO 来驱动电机, 而需要相应的驱动芯片来驱动电机, 开发板板载了一个 ULN2003 驱动芯片, 该芯片是一个单片高电压、 高电流的达林顿晶体管阵列集成电路。 不仅可以用来驱动我们的直流电机, 还可用来驱动五线四相步进电机, 比如 28BYJ-48 步进电机。 本章使用的是 ULN2003 芯片来驱动, 本章所要实现的功能是: 直流电机工作约 5S 后停止。
2. 直流电机介绍
它是能实现直流电能和机械能互相转换的电机。 当它作电动机运行时是直流电动机, 将电能转换为机械能; 作发电机运行时是直流发电机, 将机械能转换为电能。
直流电机没有正负之分, 在两端加上直流电就能工作。 需要知道直流电机的额定电压和额定功率, 不能使之长时间超负荷运作。 在交换接线后, 可以形成正反转。
外观实物图如下:
其内部结构:
关于电机我们不必了解深刻,毕竟到大二或者大三我们会学习一门专业课就是关于电机的。如想要了解更多,可以参考:直流电机_百度百科 (baidu.com)
无刷直流电机最强科普(收藏版) - 知乎 (zhihu.com)
3. ULN2003芯片介绍
通过前面的学习我们知道,单片机最大的特色不是用来驱动,而是控制,比如要驱动电机我们就必须搭建驱动电路。
开发板上板载的驱动芯片是 ULN2003,该芯片是一个单片高电压、 高电流的达林顿晶体管阵列集成电路。 不仅可以用来驱动直流电机, 还可用来驱动五线四相步进电机, 比如 28BYJ-48 步进电机。 本章我们使用 ULN2003 来驱动直流电机, 下面来具体介绍下 ULN2003 芯片的使用:
ULN2003 是一个单片高电压、 高电流的达林顿晶体管阵列集成电路。 它是由7 对 NPN 达林顿管组成的, 它的高电压输出特性和阴极箝位二极管可以转换感应负载。 单个达林顿对的集电极电流是 500mA。 达林顿管并联可以承受更大的电流。此电路主要应用于继电器驱动器, 字锤驱动器, 灯驱动器, 显示驱动器( LED 气体放电) , 线路驱动器和逻辑缓冲器。 ULN2003 的每对达林顿管都有一个 2.7k串联电阻, 可以直接和 TTL 或 5V CMOS 装置相连。
从上图可以很容易理解该芯片的使用方法, 其内部相当于非门电路, 即输入高输出为低, 输入为低输出是高, 这里要注意: 因为 ULN2003 的输出是集电极开路, ULN2003 要输出高电平, 必须在输出口外接上拉电阻。 这也就能解释在后面连接直流电机时为什么不能直接将 ULN2003 的 2 个输出口接电机线, 而必须一根线接电源, 另一个才接 ULN2003 输出口。
若使用该芯片驱动直流电机, 只可实现单方向控制, 电机一端接电源正极,另一端接芯片的输出口。 若想控制五线四相步进电机, 则可将四路输出接到步进电机的四相上, 电机另一条线接电源正。
芯片的详细介绍可以参考目录下的开发板芯片资料或者【常用芯片】ULN2003工作原理及中文资料(实例:STM32驱动28BYJ48步进电机)-CSDN博客
4. 硬件设计
本实验使用到硬件资源如下:
-
步进电机驱动模块
-
直流电机
开发板上的步进电机驱动模块电路如下图所示:
从上图中可以看出, 该电路是独立的, 芯片的输入通过 J46 端子提供, 芯片的输出由 J47 端子引出。 J46 输入对应 J47 输出, 而 J47 则是提供给外部连接电机的接口, 可以支持直流电机、 五线四相步进电机 28BYJ-48 连接。
由于该模块电路是独立的, 所以使用任意单片机管脚都可以, 为了与我们例程程序配套, 这里使用 P1.0 管脚来控制 ULN2003 输出, 即将 P1.0 管脚连接到J46 的 IN1, 直流电机的两根线接 J47 端子的 1、 2 脚即 5V 和 OUT1。
因此可通过单片机 P1.0 口输出高电平来控制电机旋转, 输出低电源控制电机停止。 注意: 单片机 P1.0 输出低电平时, ULN2003 的 OUT1 并不会输出高电平导致停止, 而是因为集电极开路, 导致电机无电流流入致使停止。
5. 软件设计
本章所要实现的功能是: 直流电机工作约 5S 后停止。
#include <REGX52.H>
//定义直流电机控制管脚
sbit DC_Motor = P1^0;
//ms延时函数,ms=1时,大约延时1ms
void delay_ms(unsigned int ms)
{
int i,j;
for(i=ms;i>0;i--)
for(j=110;j>0;j--);
}
int main()
{
DC_Motor = 1; // 給高电平-开启电机
delay_ms(5000); // 延时
DC_Motor = 0;// 给低电平-关闭电机
while(1)
{
}
}
6. 小结
经过点阵屏比较难的章节,这电机稍微简单了。代码很简单,就是使电机工作大约5秒然后关闭,怎么实现:
-
把电机控制引脚设为P1端口,再写一个ms延时函数
-
通过前面知道,对于直流电机,给它输出端口赋1就工作(高电平),0就关闭(因为集电极开路)
这一章还是简单,下一章的步进电机可能有难度了。
2024.6.27第一次修订
2024.7.19第二次修订,后期不再维护