【51单片机练习3——智能电梯控制系统1】

本文介绍了2019年安徽省机器人大赛中关于智能电梯控制系统的任务需求,包括系统显示、楼层选择、步进电机控制、LCD12864显示、互锁功能及记忆功能等。通过测试步进电机旋转、按键扫描等功能,逐步实现电梯模拟控制,并探讨了实践中遇到的问题与解决方法。

任务需求

2019年安徽省机器人大赛单片机与嵌入式系统应用技能竞赛试题

  1. 设计并制作智能电梯控制系统,开机后屏幕第一行显示"ZNDTKZQ",第二行显示四位数字,并自下而上滚动,3秒后停止滚动。
  2. 使用4x4矩阵键盘模拟电梯轿厢内的楼层选择按钮。当按键按下时,电梯控制系统记录对应楼层(建筑共9层楼高)。
  3. 使用步进电机驱动模块控制步进电机的转动,顺时针转动表示电梯上升,逆时针表示电梯下降。电机每转一圈表示电梯升降一个楼层。
  4. 使用LCD12864显示电梯所在的楼层信息。
  5. 当电梯空闲时(3秒内键盘未有按键按下),电梯停留到5楼。
  6. 当电梯启动前和电梯停止后,使用LED灯和蜂鸣器实现1S声光提示。
  7. 设置电梯具有互锁功能(运行时,门开不了;门开状态,不能运行)。使用继电器模块模拟电梯门状态互锁。门开时,LED灯亮电机停止;电梯门关闭,LED灯灭,电机运行。
  8. 设置电梯按键具有记忆功能。电梯在运行时可以及时响应各楼层按键的呼叫信号,以先方向后距离的优先原则(即当电梯在5楼到6楼的过程中同时按下3楼和9楼的按键,电梯到达6楼后运行方向不变,会继续上升到9楼后再下降到达4楼)进行判断,自动优化运行路径,运行过程具备不可逆响应功能,任何反方向的呼叫均无效。应符合实际电梯的运行模式。

硬件环境介绍

1. 开发平台套件介绍

本练习所采用的开发套件为单片机与嵌入式系统竞赛实训平台。
单片机嵌入式系统竞赛实训平台
单片机与嵌入式竞赛实训平台拥有丰富的板载资源,一共分为公共资源去和四个实训场景,实训场景分别为智慧农业、智能音箱、智能小车以及工业互联网。在每个场景中都有丰富的传感器以及执行器,例如温湿度传感器、超声波测距传感器、步进电机以及直流电机等。
同时,该竞赛实训平台提供了三种不同的核心板——STC51核心板、STM21核心板以及FPGA核心板,可以通过核心板的插拔实现不同单片机核心的切换,大大提高利用率。
该实训平台的场景切换只需要拨动核心板上的拨码开关到对应的编码即可实现元器件的链接和切换,不需要再使用杜邦线进行连接,更加美观简洁。
本次项目练习为51单片机为核心的联系项目,因此所采用的是STC51核心板作为实训平台的核心控制模块。

2. 主控制单片机介绍

STC51核心板的核心芯片采用的是宏晶科技的STC15W4K56S4,板载256Kb外置SRAM存储器以及2个100P BTB高速连接器用于和底板连接。
在本实训平台中所使用的晶振值为24MHz。
在本次练习实验中,串口测试波特率为9600。
STC51核心板

3. 相关元器件介绍

3.1 LCD12864液晶显示屏

LCD12864液晶显示屏是一种具有4位/8位并行、2线或3线串行多种接口方式的点阵图形液晶
显示模块,这里使用的是8位并行总线驱动。
引脚连接:
数据端(D0~7) --------------------> P0
RS --------------------------------------> P20
RW -------------------------------------> P21
EN --------------------------------------> P22
电路原理图如下:
12864电路原理图
对于LCD的操作指令以及时序图,可以看一下51单片机练习1中的介绍,更为详细,在此就不再赘述。

3.2 28BYJ-48 型步进电机

28BYJ-48型步进电机是一款4相永磁减速步进电机,其内部结构示意图如下图所示。其中中间带有0~5数字标号的为“转子”,外侧连接导线标有ABCD的为“定子”,其中“定子”一般与外壳固定,对定子上的线圈通电和断电即可通过产生的磁场吸引转子转动。
步进电机内部结构图

3.2.1 步进电机转动原理

28BYJ-48 型步进电机的接线一共有红、橙、黄、粉、蓝五根,其中红色线为公共端用于外接5V电源,橙、黄、粉、蓝则是对应A、B、C、D四相,如果需要其中一相导通只需要将其对应的那根线接地即可。通过各相的不断导通、关闭从而产生对应的磁场用来“吸”和“推”动转子转动,为了使步进电机处于最佳工作模式发挥其最大工作性能,一般使用八拍模式来驱动步进电机工作。
八拍模式的绕组控制顺序表如下:

1 2 3 4 5 6 7 8
P1-红 VCC VCC VCC VCC VCC VCC VCC VCC
P2-橙 GND GND GND
P3-黄 GND GND GND
P4-粉 GND GND GND
P5-蓝 GND GND GND

因此只需要按照上表中的八拍模式,不断的将对应的相位控制线进行置低操作,即可保证步进电机的旋转。由于单片机的IO引脚输出的电流较小,一般仅为几mA,而步进电机的驱动电流会高达几百mA。为了保证步进电机的稳定工作,在本实训平台中加入了ULN2003驱动芯片用来放大驱动电流,通过ULN2003与单片机的IO口相连,引脚连接如下表所示:

ULN2003 单片机IO口
ULN-O1 P11
ULN-O2 P12
ULN-O3 P13
ULN-O4 P14

由八拍绕组控制顺序表可知,想要使步进电机转动起来就需要按照顺序对所对应相位的单片机IO口进置低操作,由于在本实训平台中,各相的控制端口为P11~14,那个口输出低电平则导通对应的相位,所以对步进电机的八拍节拍的IO控制代码数组如下:

unsigned char code BeatCode1[8] = {
   
    //步进电机反转节拍对应的 IO 控制代码
		0x1C, 0x18, 0x1A, 0x12, 0x16, 0x6, 0xE, 0xC
	};

只要按照上述数组按照一定的频率进行输出,即可驱动步进电机旋转。各位可以针对自己的步进电机控制引脚修改。

3.2.2 28BYJ-48 型步进电机相关参数解读

在3.2.1中说到如果想驱动步进电机旋转,需要按一定频率对IO口进行控制代码数组的输出,那这个“一定频率”是多少呢?此时要借助一位“古人”所言,“有疑问?那就读手册!”,是的,你想知道的一切都在厂商所给的手册当中,作为一个嵌入式工程师,手册就是你的“新华字典”。
28BYJ-48 型步进电机的参数如下图所示:
步进电机参数
在上图中我们可以看到启动频率所给的参数为 ≥550P.P.S,P.P.S即每秒脉冲数。按照厂商所给参数,那只要保证每秒至少给出550个步进脉冲就可以启动步进电机,那通过一些列初中除法运算就换算得出单节拍持续时间大于1.8毫秒的情况下就能保证有550P.P.S以上的输出,那我们只要保证输出间隔为2ms,那步进电机就一定可以转起来。
在解释了启动频率之后,接下来最重要的一个参数就是减速比。各位如果真的参考我下面所写的各模块测试中的步进电机旋转一周测试,并且真的编码测试后你会发现步进电机转一圈的时间比较长,大概在7-8秒左右,但按照我们八拍的工作模式来看,转子转动一圈所需要的节拍数只有8*8 = 64拍,而刚刚我们算了一个节拍只要2ms,那就是说其实转一圈只要64 * 2 = 128ms就够了,但实际上我们肉眼看到的是7-8秒才转了一圈。此时就是“减速比”干的好事了。
我们先看一下25BYJ-48步进电机的内部拆解图:
在这里插入图片描述
如图所示,我们看到中间红色方框框起来的才是真的转子,而我们在外面肉眼所看到的是经过多级齿轮传动后所连接的一个传动轴,因此实际上我们所看到的步进电机转一圈是在经过多级齿轮进行降速后的一圈。那按照厂商所给参数来看,减速比为1:64,即红色框中的转子转动64圈后外面的大传动轴才转动一圈,即需要64 *64 = 4096个节拍才行,那所要的时间就是转子转动一圈的时间就是128ms * 63 = 8192ms,差不多就是8秒左右。另外在减速比参数旁还有一个参数叫步进角度的参数,其值为5.625/64,将这个值分子分母各乘64就会发现是360/4096,刚好是一个节拍转动的角度,这个角度就叫步进角度
这样与我们本次练习实验相关的步进电机参数也就介绍完毕。
在本次实验中,步进电机驱动原理图如下图所示:
步进电机原理图

3.3 继电器模块

在本实训平台中,继电器模块电路由三极管控制并驱动继电器,继电器模块控制原理图如下图所示。其中三极管的基极与单片机的IO口相连接。
继电器的控制引脚为P12。
继电器模块控制原理图

3.4 4X4矩阵键盘

4x4矩阵键盘电路原理图:
4x4矩阵键盘原理图
引脚分配图:
引脚分配图

3.5 LED灯&蜂鸣器

LED的电路原理图如下所示,LED与单片机P53引脚连接。
LED电路原理图
蜂鸣器的电路原理图如下说是,蜂鸣器与单片机的P55引脚连接。
蜂鸣器电路原理图

4.硬件连接示意图

本次练习实验所需要的元器件与单片机的引脚连接示意图如下图所示,以此可以参考元器件的引脚连接。
硬件连接示意图

5.软件流程图

对于完成任务需求,软件的大致流程如下图所示:
软件流程图

6.各模块测试

在完成一个完整的练习项目前,需要对构成整个项目的各部分元器件模块进行单独测试,在此基础上进行融合以及综合调试,就能诞生一个完整的单片机项目。因此进行各模块测试是完成一个项目开发的基础,也是重中之重。

6.1 步进电机旋转一周测试

在3.2章节中,我们对步进电机的启动和旋转一周进行了理论分析。通过厂家所给出的参数来看,我们要让步进电机旋转我们所要的一圈需要4096个节拍,那这次的任务需求也对我们旋转一周有要求,那刚好可以进行测试。
测试代码如下,测试效果是让步进电机转10圈(因为任务要求最多转9圈即可,那10圈不出问题,9圈也就不会有什么问题),看停止位置与开始位置是否重合:

#include "stc15f2k60s2.h"

/****************************
*****电机控制引脚为P11-14*****
*****************************/

unsigned long beats = 0;	//电机转动节拍总数

void InitTimer0();
void StartMotor(unsigned long angle);

void main()
{
   
   
	InitTimer0();
	StartMotor(360 * 10);
	while(1);
}

//初始化T0
void InitTimer0()
{
   
   
    TMOD = 0x01;	//设置T0为模式1
    TH0 = 0xF0;		//赋初值 定时2ms
    TL0 = 0x60;
    EA = 1;			//开启总中断
    ET0 = 1;		//开启T0中断
    TR0 = 1;		//启动T0
}

//启动电机
void StartMotor(unsigned long angle)
{
   
   
	EA = 0;							//在计算前先把中断关闭
	beats = (angle * 4096) / 360;	//按照厂商所给参数为4096拍转动一圈
	EA = 1;
}

//电机转动控制函数
void TurnMotor()
{
   
   
	unsigned char tmp;
	
	static unsigned char index = 0;		//节拍输出索引
	
	unsigned char code BeatCode[8] = {
   
    //步进电机节拍对应的 IO 控制代码
		0x1C, 0x18, 0x1A, 0x12
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值