世界上第一台电梯是由美国的奥的斯公司制造的。自从这第一台电梯于 1987 年问世以来,对生活在城市的楼宇中特别是高楼大厦中的人们的生活和工作带来了巨大的便利。随着社会经济的飞速发展,电梯与人们的生活越来越密不可分
本设计的电梯系统采用的是stm32 微处理器。STM32处理器是基于 Cortex-M3 架构的嵌入式微处理器MCU,其中 Cortex-M3 架构是 ARM 公司推出的。STM32 处理器具有高速、高集成度、低功耗、高可靠性等优点。正是由于 STM32 处理器具有这些优点,它正适合运用于电梯控制。本设计中的电梯控制系统主要运用了 STM32处理器 GPIO 口操作和其精确地定时功能。该电梯系统一共分6个部分,它们是 STM32处理器、电源系统、oled显示屏、键盘、LED 小灯、直流电机驱动模块。这些部分是直接与 STM32的GPIO 口连接的,所以它们占用的 GPIO 口较多。
STM32处理器;Cortex-M3 架构:直流电机驱动模块
电梯是一种由电动机作为驱动力的竖直升降设备,装有立方体吊舱并设有电梯门用于多层建筑乘人或载运货物。它的轿厢运行在至少两列平行竖直的或近似平行竖直的刚性轨道之间,一般服务与超过规定高度的楼宇内。轿厢尺寸与结构形式使于乘客出入或装卸货物。而自从第一台电梯在美国问世 100 多年以来,由于社会科学与经济的不断前进以及人们物质生活状况的不断改善,电梯与人们的生活越来越息息相关,已成为人们工作和生活中不可或缺的一项十分重要的垂直交通运输工具。
自 20 世纪以来,企球科学技术获得了飞速的发展,尤其是计算机技术、电子技术自动控制技术、网络技术、等都得到了质的飞跃,并迅速转换为先进的生产力,渗透到了社会的各个领域和各个方面,深刻的影响了人们日常的工作方式及生活方式电梯行业在科学技术飞速发展过程中也同样获益颇多。电梯的控制方式以及拖动方式均发生了很大的变化。
100 多年来,中国的电梯行业发展经历了下面儿个阶段 :@依赖电梯进口阶段(1950 年以前),在这一阶段我国的电梯全部来源于进口,仅仅拥有大约 1101台电梯;2自主研发生产阶段 (1950~1980 年),在这个阶段我国可以自主的研发、设计和生产电梯。在这个阶段我国一共生产和安装电梯大约1 万台的电梯,@建立合资企业整个行业飞速发展阶段(自 1980 年改革开放至今),这个阶段我国总制造和安装了多达 40 万台电梯。现在,我国已成为全球最大的电梯制造国和最庞大的新装电梯市场。2006 年,在我国大陆的电梯总产量达到 16.8 万台,全国正在用的电梯达到了770314 台。在如此庞大的电梯市场需求的推动下电梯行业获得了广阔的发展舞台。20 世纪80 年代初,日本三菱公司首次在电梯拖动控制系统中变压变频调速(VWFVariable VoltageVariable Frequency),这导致了电梯的拖动方式的一次重大变革,与之前的交流调压调速驱动、交流双速电机驱动等方式相比,WVF 驱动方式具有电机发热量小、高效率、节能、污染小、高性能等优点。而近些年来,交流永磁同步电机的问世,被认为是在变压变频调速技术出现以后,电梯拖动技术的又一项十分重大的技术变革。这是因为交流永磁同步电机具有基本无需维护,结构紧凑,更加安全可靠、节能、传动效率高、更高的性价比的优点,并减少了对环境的污染。同样是在上个世纪 80 年代,微计算机技术被应用于电梯控制系统中,单片机等微处理器及可编程逻辑控制器的出现把电梯控制技术推进了·个全新高速的发展时期,电梯控制系统的网络化、智能化开始进入了人们的视野,并且成为研究的新热点。
随着社会的发展,利用坚固耐用的金属梁作为建筑支撑物,建筑师和工程师可以建成数百米高、直冲云霄的摩天大楼。在如今各种高楼大厦已经数不胜数,如果没有电梯,这些高楼大厦基本上将无法使用。因此乘坐电梯也必然成为众生活中的一部分而作为电梯的大脑一一电梯控制器,它的高效运行和智能化已经成为电梯运行中必不可少的重要器件。本设计的电梯控制器是基于 STM32 来设计的。随着信息化技术的发展,嵌入式系统已经成为当前 IT 产业界一个非常热门的话题。因其高效、低成本、高可靠性、丰富的代码以及应用程序可扩展性、可移植性等一系列优点,越来越多地应用在信息化产品中。本设计以一个实际的应用实例,从开发板、集成开发环境的构建方式和作业方式、嵌入式系统的硬件和软件设计、JTAG调试方法,掌握嵌入式系统开发方法。
电梯是标志现代物质文明的垂直运输工具、是机电一体化的复杂运输设备。它涉及电子技术、机械工程、电力电子技术、微电脑技术、电力拖动系统和土建工程等多个科学领域。尽管电梯的品种繁多,但目前使用的电梯绝大多数为电力拖动、钢丝绳曳引式结构。从电梯各构件部分的功能上看,可分为八个部分:曳引系统、导向系统、轿厢、门系统、重量平衡系统、电力拖动系统、电气控制系统和安全保护系统。作为高层建筑物上下交通运输的重要设备,越来越多的机电专业将参与电梯技术方面的工作,为了掌握电梯的结构和控制技术就有必要把这庞大的集机械、电气、传感器于一体的产品模拟化,用 PLC、单片机、微机、变频器等控制手段去开发多功能应用软件,对提高学生的综合应用程序设计能力也将是非常有益和非常有效的。因此设计了一套完整的电梯控制系统,该系统可以和任何自动控制单元相连接作为下位机,也可以单独使用作为一般主控系统,验证各种电梯调度算法。
1.3 实施过程
本设计通过 ARM 微控制器模拟实现电梯的控制。
(1)需研究ARM Cortex-M3 微控制器结构,基ARM Cortex-M3 的 stm32开发板及相关键盘控制模块、GPIO 模块等,keil 集成开发环境:
(2) 研究单部电梯调度算法,并选择或设计一个合适的算法;
(3)了解实验开发板上和关使件电路设计;
(4)用 c 语言完成系统软件设计,并在实验开发板上调试,完成电梯的上行、下行、停止、开门、关门、等动作,要求每一个动作在规定时问内完成。
该电梯控制系统由 stm32 开发板、电源系统、键盘、LED 指示小灯、4位8段数码管、电机驱动模块、语音播报模块等组成。如图 2.1
图2.1 系统的硬件结构
各功能模块简介:
(1)电源系统:为整个系统提供+5V 电源;
(2)按键:每个键位互不影响用以控制电梯运行状态;
(3)LED 指示小灯:用以指示小健是否被按下和电梯门开关状态;
(4)电机驱动模块:用于驱动电机和控制电机正反转及转速;
(5)STM32 开发板:通过写入程序代码来控制电梯的运行状态;
(6)oled显示屏:用于显示每层电梯外部电梯所在的层数。
(7)语音模块:用于播放提示每层电梯外部电梯所在的层数。
(1)显示:本设计要求实现5层控制,电梯运行时应有相应指示灯亮,以示电梯正在上行或下行,实时显示电梯所在楼层位置。(2)升降控制:当某层有呼叫有相应呼叫信号显示。电梯模型作相应的运动,并准确平层,当有多人同时进行电梯请求时,需要对请求信号排序.
(3)平层时呼叫信号消失,并进行开门、关门操作,平层结束时给出提示信号。要求平均每层运行时间不超过5秒。
(4)具备不可逆响应的功能:电梯上升途中只响应上升呼叫,下降途中只响应下降呼叫,任何反方向呼叫均无效。电梯门不关上,启动电梯运行无效。
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。Keil提供了包括C编译器、宏汇编、链接器、库管理和一个功能强大的仿真调试器等在内的完整开发方案,通过一个集成开发环境(μVision)将这些部分组合在一起。运行Keil软件需要WIN98、NT、WIN2000、WINXP等操作系统。如果你使用C语言编程,那么Keil几乎就是你的不二之选,即使不使用C语言而仅用汇编语言编程,其方便易用的集成环境、强大的软件仿真调试工具也会事半功倍。
STM32F103C8T6是一款由意法半导体公司(ST)推出的基于Cortex-M3内核的32位微控制器,硬件采用LQFP48封装,属于ST公司微控制器中的STM32系列。除了被我们熟知的STM32,ST公司还有SPC5X系列、STM8系列等,具体参数如下:
OLED(Organic Light-Emitting Diode),又称为有机电激光显示、有机发光半导体(Organic Electroluminescence Display,OLED)。OLED属于一种电流型的有机发光器件,是通过载流子的注入和复合而致发光的现象,发光强度与注入的电流成正比。OLED在电场的作用下,阳极产生的空穴和阴极产生的电子就会发生移动,分别向空穴传输层和电子传输层注入,迁移到发光层。当二者在发光层相遇时,产生能量激子,从而激发发光分子最终产生可见光。
IIC oled屏幕驱动原理:
处理器和芯片间的通信可以形象的比喻成两个人讲话:
1、你说的别人得能听懂:双方约定信号的协议。
2、2、你的语速别人得能接受:双方满足时序要求。
IIC总线的信号类型:
开始信号:
处理器让SCL时钟保持高电平,然后让SDA数据信号由高变低就表示一个开始信号。同时IIC总线上的设备检测到这个开始信号它就知道处理器要发送数据了。
停止信号:
处理器让SCL时钟保持高电平,然后让SDA数据信号由低变高就表示一个停止信号。同时IIC总线上的设备检测到这个停止信号它就知道处理器已经结束了数据传输,我们就可以各忙各个的了,如休眠等。
当机械触点断开、闭合时,由于机械触点的弹性作用,一个按键开关在闭合时不会马上就稳定的接通,在断开时也不会一下子彻底断开,而是在闭合和断开的瞬间伴随了一连串的抖动;
按键时间:按键稳定闭合时间长短是由操作人员决定的,通常都会在 100ms 以上,刻意快速按的话能达到 40-50ms 左右,很难再低了;大致时间可以通过在1s时间正常可按多少次来计算;
当检测到按键状态变化时,不是立即去响应动作,而是先等待闭合或断开稳定后再进行处理,即为按键消抖。
按键消抖:可分为硬件消抖和软件消抖。
在按键模块上我们选择软件消抖。
最简单的消抖原理,就是当检测到按键状态变化后,先等待一个 10ms 左右的延时时间,让抖动消失后再进行一次按键状态检测,如果与刚才检测到的状态相同,就可以确认按键已经稳定的动作了。
“STM32F1 的通用定时器是一个通过可编程预分频器(PSC)驱动的 16 位自动装载计数器 (CNT)构成。STM32 的通用定时器可以被用于:测量输入信号的脉冲长度(输入捕获)或者产 生输出波形(输出比较和 PWM)等。 使用定时器预分频器和 RCC 时钟控制器预分频器,脉冲长 度和波形周期可以在几个微秒到几个毫秒间调整。STM32 的每个通用定时器都是完全独立的, 没有互相共享的任何资源。”
简单说就是这个定时器就是定时器,可以理解为计时用的。
详细讲呢就是它其实是一个计数器,就是用来数数的,结合了你的芯片工作频率和你可以自己设置的预分频数,设置后就可以作为定时器使用。举个例子哈,我之前用的STM32F103设置的的频率是72MHz,就是72 * 10 ^ 6 Hz。这个数字代表啥子咧,Hz你很熟悉呗,你可以超级简单地理解为它1s之内可以工作这么多次。而不同的定时器可能在不同的总线上面,APB1总线的频率是36MHz,APB2的频率是72MHz,假设我设置一个在APB1总线上的定时器,预分频数设置成为36,那么我的这个定时器就被设置成了36 * 10 ^ 6 / 36 Hz的这么一个 计数器 ,1s之内可以数1000000个数。然后是“重装载值”,就是说计数值达到这个重装载值后就把计数值归零。假设我设置为1000哈,那么我们一起来看,用我设好的这个定时器数到1000需要几秒钟?结果是1000/1000000=1*10 ^-3 s,也就是0.001s,1ms。
然后是占空比了,设置占空比需要设定一个“比较值”,当计数器计数到这个值的时侯我们就可以做一个操作,比如输出高电平,然后在计数值没达到的时候输出低电平,或者反着来也行,都是可以通过代码实现的,那么显而易见哈,这个比较值必须要比重装载值要小才可以。接着看一下这个图就容易明白了。
就是说信号在计数值达到比较值之后电信号发生变化。
本模块是一款高集成度的语音合成模块,可实现中文、英文、数字的语音合成;并且支持用户的命令词或提示音的定制需求。控制简单,使用 UART 接口直接和主板通信。支持多种方式查询芯片的工作状态,包括:查询状态管脚电平、通过读芯片自动返回的回传、发送查询命令获得芯片工作状态的回传。芯片支持 Power Down 模式。使用控制命令可以使芯片进入 Power Down 模式。复位芯片可以使芯片从 Power Down 模式恢复到正常工作模式。
系统框架图
最小系统包括:控制器模块、 SYN6288 语音合成芯片、功放模块和喇叭。主控制器和 SYN6288 语音合成芯片之间通过 UART 接口连接,控制器可通过通讯接口向 SYN6288 语音合成芯片发送控制命令和文本, SYN6288 语音合成芯片把接收到的文本合成为语音信号输出,输出的信号经功率放大器进行放大后连接到喇叭进行播放。
语音播报模块连接到工业派或者专家版车,串口使用UART5,电压是3.3V,注意电源的的电压和方向,引脚不对应可能会烧坏器件。具体线序如表5-1
语音播报模块 工业派 专家版车
3V3 J12-5脚 J23-7脚
GND J12-7脚 J6-2脚
RXD J5-14脚 J6-3脚
TXD J5-13脚 J6-4脚
表5-1
1)将TTL转USB转口线连接板卡的J1和PC机的USB口,串口线序如表5-2
黑 J1-G脚
白 J1-T脚
绿 J1-R脚
红 不接
程序流程图:
(1)定时器PWM初始化(timer.c)
驱动电机函数
TIM_SetCompare1(TIM3,400); //预装载值1000与400比较,占空比40%
本设计以STM32F103单片机为核心控制器,加上其他的模块一起组成基于单片机的电梯控制模拟的整个系统,其中包含中控部分、输入部分和输出部分。中控部分采用了STM32F103单片机,其主要作用是获取输入部分数据,经过内部处理,控制输出部分。内机输入由四部分组成,
第一部分是OLED模块,通过该模块显示当前的电梯层数;
第二部分是电机驱动模块ULN2003步进电机及驱动模块,该模块用于模拟电梯的上下行,控制电梯的上升和下降;
第三部分是独立按键,通过八个独立按键开关门、选择楼层、呼叫报警;
第四部分是供电电路,给整个系统进行供电。
第五部分是语音模块,复杂播报电梯当前所在的层数。
我本来对 stm32一点不了解,但是经过一个学期的努力我从零开始逐渐了解了stm32 开发板的结构和功能,特别是 stm32的 GPIO 功能,精确的定时功能,以及中断功能。我通过看视频,查资料,做实验最终掌握了 stm32 开发板的程序下载和使用。在做课程设计过程中,我发现stm32的GPIO口的功能很强大。stm32一共有 AB、C、D四种 56个GPIO 口,每个GPIO 口一共有7个寄存器控制,有8种工作模式这给我的毕业设计带了很大的便利。同时 stm32 的定时功能相对51 单片机及arm7等其他平台具有更精确的定时功能,这就使我设计的电梯控制系统在时间控制上能够更加精确。
电梯我以前天天都在乘坐,但从来都没有去了解过,通过这次毕业设计我对电梯控制系统的工作原理、运行方式、发展历史都有了更加深入的了解。电梯是一个复杂的电路系统,它涉及到了层数的算法、电机正转反转的控制、电梯门的控制,电梯安全系统等。虽然在设计这个电梯控制系统过程中碰到了很多困难,但我没有被这些困难吓倒,而是通过查资料,向老师和同学请教,再结合自己的思考探索,最终一一解决了这难题,完成了课程设计。
1、《8051 单片机实践与应用》无金戊、沈庆阳、郭庭吉编著:清华大学出版社
2、《MCS-51 单片机实验指导》张友德、杨胜球编著: 复旦大学出版社
3、何斌.电梯群控系统设计与应用[ D ].南京理工大学,2006
4、王君明,电梯模型控制系统设计[I。湖北水利水电职业技术学院学报,200645
5、余兆棠,叶远呈,萧仁理.电梯控制系统改良与实现[J]. 电子测试,2006.
6、张汉杰,王锡仲,朱学莉.现代电梯控制技术[M].哈尔滨工业大学出版社,2001.
7、架延东.电梯控制技术[M]. 北京: 中国建筑工业出版社.1997
8、《单片机原理及应用技术》余发山,王福忠:中国矿业大学,2003
9、《北方工业大学学报》第10 卷第1期1998年3 月
10、《全国大学生电子设计竞赛获奖作品选编》(1994-1995)
11、《实用遥控电路》肖景和,赵健著:人民邮电出版社
12、《单片机应用系统设计》何立民: 北京航空航天大学出版社
#include "stm32f4xx.h"
#include "oled.h"
#include "bmp.h"
#include "LED.h"
#include "stdio.h"
#include "elevator.h"
#include "stdlib.h"
#define LOW '0'
#define HIGH '9'
static uint8_t floor_now='1';
static uint8_t floor_request='0';
static uint8_t floor_end='0';
static int check=0;
void USART1_IRQHandler(void)
{
uint8_t data;
if(USART_GetFlagStatus(USART1,USART_IT_RXNE)==SET)
{
data = USART_ReceiveData(USART1);
if(!(floor_end>=LOW&&floor_end<=HIGH)&&!(floor_request>=LOW&&floor_request<=HIGH))
check=1;
else
{
if(floor_end=='0' )
{
floor_end = data;
PFout(9)=0;
PFout(10) = 1;
}
else if(floor_request==0&&floor_request>=LOW&&floor_request<=HIGH)
{
floor_request=data;
PFout(9)=1;
PFout(10) = 0;
}
USART_ClearITPendingBit(USART1,USART_IT_RXNE);
}
}
}
int main(void)
{
LED_Config();
OLED_Init();
OLED_Clear();
USART1_Init(9600);
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
printf("当前:%c楼\r\n",floor_now);
while(1)
{
if(check==1)
{
printf("请输入正确楼层\r\n");
check=0;
}
else if(floor_end!='0')
{
//floor_end=floor_end-48;
if(floor_now!=floor_end)
{
while(floor_now<floor_end)
{
//显示上升过程
floor_now++;
printf("上升中---当前:%c楼,目的:%c楼\r\n",floor_now,floor_end);
OLED_ShowChar(63,40,floor_now,16);
//OLED_Clear();
OLED_ShowCHinese(63,2,0);
OLED_ShowCHinese(80,2,1);
OLED_ShowNum( 46, 2, floor_now, 1, 9);
Delay_ms(400);
}
while(floor_now>floor_end)
{
//显示下降过程
printf("下降中---当前:%c楼,目的:%c楼\r\n",floor_now,floor_end);
floor_now--;
OLED_ShowNum( 46, 2, floor_now, 1, 2);
Delay_ms(400);
}
if(floor_request!='0')
floor_end=floor_request;
printf("目的%c楼\r\n",floor_end);
}
}
floor_end='0';
floor_request='0';
}
}