采用PLC可编程控制器电梯设计方案 论文.docx
《采用PLC可编程控制器电梯设计方案 论文.docx》由会员分享,可在线阅读,更多相关《采用PLC可编程控制器电梯设计方案 论文.docx(50页珍藏版)》请在冰豆网上搜索。
采用PLC可编程控制器电梯设计方案论文
1、电梯模型的总体构架
1.1电梯模型控制系统方案论证
方案一:
采用PLC,可编程控制器(ProgrammableLogicalController),在现代工程控制当中占有重要的地位,优点:
PLC控制系统运行可靠、编程简单、维修方便,抗干扰性强、运算速度快,是现代实际电梯中常用的控制方式,缺点:
价格十分昂贵。
方案二:
采用多片AT89S51芯片作为主控芯片。
优点:
对于51内核单片机,有较多的相关开发经验,且51编程调试起来较为简易,速度方面,对于电梯这种对运算速度要求不高的控制系统来讲,完全能够胜任,且价格较为便宜。
缺点:
IO口资源较少,且没有内置AD,PWM等功能,很多东西都要依靠设计算法或者外接其他硬件来辅助实现,在这一点是不是很方面。
方案三:
采用stm32作为主控芯片,采用目前流行的嵌入式开发技术。
优点:
接口资源多,能够满足按键,led,数码管、电机等模块的需求。
内部功能较为完善,有内置AD,PWM发生器等,便于对传感器和电机等的控制。
缺点:
价格较为昂贵,且编程开发难度较51大,调试起来也比51麻烦。
经过我们的分析比较论证,最终决定采用方案三,用stm32完成按键,红外。
数码管、电机等的控制。
1.2各种功能的实现概述
根据题目要求,系统可以划分为逻辑控制部分、拖动控制部分。
其中,逻辑控制部分包括主控制器模块、电梯按键和楼层显示模块;拖动控制模块包括直流电机驱动模块、红外平层检测模块两部分;后台监测控制包括了语音播报模块、轿厢测重模块、应急保护模块。
1、各个本模块方案论证及其原理
2.1总模块原理图
2.2直流电机驱动模块
电梯采用专用芯片L298N作为电机驱动芯片。
L298N是一个具有高电压大电流的全桥驱动芯片,它相应频率高,一片L298N可以分别控制两个直流电机,而且还带有控制使能端。
用该芯片作为电机驱动,操作方便,稳定性好,性能优良。
并加入续流二极管可防止电流逆流进芯片,以保护芯片。
可以直接使用单片机产生脉宽调制信号(PWM)控制电机运动,改变输出脉冲宽度,相当于改变供给电动机绕组的平均电压,从而控制其转速和转矩,还可以通过改变控制信号来控制直流电机的运动方式。
电路图如下
2.3应急保护模块
应急电源采用干电池模拟现实中断电时候使用的电源,一节9V电池用于驱动电机,4节5V电池用于对主控芯片进行供电,且能够保证在主控芯片由于短暂断电而复位的时候仍能正常运行。
切换电路采用的是电磁继电器4100F,原理图如下:
2.4红外平层检测模块
本次设计中使用的光电传感器相当于一个光电开关,就是通过把光强度的变化转换成电信号的变化来实现控制。
2.4.1反光板型光电开关
把发光器和收光器装入同一个装置内,在它的前方装一块反光板,利用反射原理完成光电控制作用的称为反光板反射式光电开关。
正常情况下,发光器发出的光被反光板反射回来被收光器收到;一旦光路被检测物挡住,收光器收不到光时,光电开关就动作,输出一个开关控制信号。
2.4.2扩散反射型光电开关
它的检测头里也装一个发光器和一个收光器,但前方没有反光板。
正常情况下发光器发出的光收光器是找不到。
当检测物通过时挡住了光,并把光部分反射回来,收光器就收到光信号,输出一个开关信号
本次我们选择的是扩散放射型光电开关。
我们选用的是TCRT5000
红外对管信号稳定且容易检测,准确度高,而反射型管易出现误判情况,故用对管型传感器可以安装在每一层楼的一边,可以检测很方便的检测轿厢的位置,适合于用于楼层的检测。
红外一体式发射接收器检测的原理为,,当红外发射管发出的光照反射的部分较小,接收管接收到的红外线也就较少,表现为电阻比较大通过外接的电路就可以读出检测的状态,同理如果反射回来红外线比较多,表现为接收管的电阻就比较小,然后通过LM393放大可以检测到电压的电话,然后就可以通过IO口检测到变化。
电路图如下
2.5楼层显示模块
每层楼一个小模块,由于我们这次设计的是五层楼,所以我们做了五个相同的显示模块。
每一个显示模块包括两个电梯上下选择按键、两个按键提示灯、一个显示轿厢位置的数码管和显示电梯方向的双箭头数码管;为降低控制难度和减少导线使用,电梯上下选择按键为共地形式连接,控制线接主机,每一个按键接一个IO口,可以直接在STM32中检测按键在哪里按下;数码管为共阴接法,给高电平时数码管接,为了简化单片机端口接线,其中电梯方向指示灯和数码管和两个按键提示灯阳极为共用引脚,共用接线先每层连接,再与单片机接通,不用直接接单片机,可大大缩短导线长度。
然后分别为数码管和按键分配一个IO口控制它们的阴极,从而达到控制它们显示的目的。
电路图如下
2.6轿厢测重模块
我们使用称重传感器,安装在电梯顶部,一边固定在板上,另一边通过滑轮和绳子与轿厢连接。
重力传感器采用双孔梁结构的桥式电阻应变电桥。
加载重物(模拟乘客进入)时,重力压在应变电桥上,使应变片发生形变而改变自身电阻,从而使电桥失去平衡而输出电压信号。
系统所用的双孔梁传感器机械结构如图所示:
当重物加载到轿厢时,传感器将受到拉力作用,重力传递到双孔梁架上,产生形变。
由于应变电阻桥紧贴着安装于双孔梁架表面,也随着发生形变,从而改变自身阻值。
而双孔梁结构可以改善传感器的线性,使输出信号更易处理。
称重传感器输出信号比较弱,单片机难以直接处理,因此我们用μA741芯片设计了一个同相比例器电路将电压放大,再通过用tlc549ad芯片把电压转化为数字量以供单片机检测。
轿厢测重电路如下图所示:
2.6语音播放模块
方案一:
采用ISD2560语音芯片,这种类型的芯片能录音和放音,外部电路较简单,但是音质和放音的局限较大。
方案二:
采用ISD1700系列的语音芯片,这种类型的芯片是在ISD2560语音芯片的基础上研制的。
各种性能指标均比ISD2560的要好。
而且可以软件和手动录音,音质好。
基于上述的分析,我们采用方案二。
ISD1760芯片片提供多项新功能,包括内置专利的多信息管理系统,新信息提示(vAlert)双运作模式(独立&嵌入式),以及可定制的信息操作指示音效。
芯片内部
自动增益控制、麦克风前置扩大器、扬声器驱动线路、振荡器与内存等的全方位整合系统功能。
有两种可以控制方式,按键和SPI控制方式。
我们先通过按键把我们需要的录音录进去芯片,然后通过SPI对芯片进行播放操作,这样节省了很多IO口。
语音模块的原理图如下
3、软件编程部分
3.1电梯运行逻辑
本次设计中电梯上电后通过时间中断相隔几毫秒就进行一个扫描信息,并储存起来。
然后采用了逐层判断法,首先判断当前运行方向是向上还是向下,如果向上运行,则目标层数小的先响应,如果向下运行,则目标层数大的先响应。
主要过程是对当前已经设置的目标层和新请求的目标层之间比较,然后判断是否调换位置,暂时不使用的目标层压栈。
等目标层响应过后再出栈。
在每一层楼再判断这一层楼是否有按键请求,然后根据向上和向下运动的情况判断是否响应按键请求,如果电梯是向上运动,则只响应向上按键的请求,不响应向下按键的请求。
3.2程序流程图
3.3按键部分总流程
3.3.1按键提示灯的子程序流程图
图3.3响应按键提示灯子程序流程图
4、源代码
文件一:
main.c
#include
#include
#defineSMS_SIZE8
#defineTI_SIZE8
#defineMB_SIZE5
#defineXB_SIZE13
vu32louceng[SMS_SIZE]={0,0,0,0,0,0,0,0};
staticvu32tim[TI_SIZE]={0,0,0,0,0,0,0,0};
vu32dat[XB_SIZE]={0,0,0,0,0,0,0,0,0,0,0,0,0};
vu32mubiaolc[MB_SIZE]={0,0,0,0,0};
inti;
ints;
inta;
intb;
uint16das;
/**********************************************************************
*名称:
TIM3_Configuration()
*功能:
定时器3配置
*入口参数:
*出口参数:
-----------------------------------------------------------------------*说明:
定时1ms***********************************************************************/voidTIM3_Configuration(void)
{
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_TimeBaseStructure.TIM_Prescaler=1;//2分频22.1184M
TIM_TimeBaseStructure.TIM_ClockDivision=0;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数模式
TIM_TimeBaseStructure.TIM_Period=2211.84;//自动装载
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);
TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM3,ENABLE);
}
/**********************************************************************
*名称:
NVIC_Configuration()
*功能:
中断优先级设置
*入口参数:
*出口参数:
-----------------------------------------------------------------------
*说明:
设置Tim3优先级
***********************************************************************/
voidNVIC_Configuration(void)
{
NVIC_InitTypeDefNVIC_InitStructure;
#ifdefVECT_TAB_RAM
/*SettheVectorTablebaselocationat0x20000000*/
NVIC_SetVectorTable(NVIC_VectTab_RAM,0x0);
#else/*VECT_TAB_FLASH*/
/*SettheVectorTablebaselocationat0x08000000*/
NVIC_SetVectorTable(NVIC_VectTab_FLASH,0x0);
#endif
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//抢占式优先级别,无抢占优先级
/*EnabletheTIM3Interrupt*/
NVIC_InitStructure.NVIC_IRQChannel=TIM3_IRQChannel;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/*********PWM定时器配置**************/
voidTIM1_Configuration(void)
{
TIM1_TimeBaseInitTypeDefTIM1_TimeBaseStructure;
TIM1_OCInitTypeDefTIM1_OCInitStructure;
TIM1_DeInit();
TIM1_TimeBaseStructure.TIM1_Prescaler=0x0;//时钟预分频得CK_INT时钟提供给计数器APB2时钟/(n+1)n=1~65536
TIM1_TimeBaseStructure.TIM1_CounterMode=TIM1_CounterMode_Up;//向上计数模式
TIM1_TimeBaseStructure.TIM1_Period=0xffff;//自动重装载值
TIM1_TimeBaseStructure.TIM1_ClockDivision=TIM1_CKD_DIV1;//时钟倍频因子,输出时钟供给死区发生器等
TIM1_TimeBaseStructure.TIM1_RepetitionCounter=0x0;//周期计数器值0~255
TIM1_TimeBaseInit(&TIM1_TimeBaseStructure);//初始化
TIM1_OCInitStructure.TIM1_OCMode=TIM1_OCMode_PWM2;//PWM2模式
TIM1_OCInitStructure.TIM1_OutputState=TIM1_OutputState_Enable;//信号输出到对应的输出引脚
TIM1_OCInitStructure.TIM1_OutputNState=TIM1_OutputNState_Enable;//互补信号输出到对应的输出引脚
TIM1_OCInitStructure.TIM1_Pulse=0;//脉冲宽度
TIM1_OCInitStructure.TIM1_OCPolarity=TIM1_OCNPolarity_High;//互补输出高电平有效\
TIM1_OCInitStructure.TIM1_OCNPolarity=TIM1_OCNPolarity_High;//互补输出高电平有效
TIM1_OCInitStructure.TIM1_OCIdleState=TIM1_OCIdleState_Set;//输出空闲状态为1
TIM1_OCInitStructure.TIM1_OCNIdleState=TIM1_OCIdleState_Reset;//互补输出空闲状态为0
TIM1_OC1Init(&TIM1_OCInitStructure);//OC1通道初始化
TIM1_Cmd(ENABLE);//使能定时器1
TIM1_CtrlPWMOutputs(ENABLE);//使能PWM输出
}
/**********************************************************************
*名称:
PWMSet()
*功能:
设置PWM基波宽度,占空比
*接口参数:
base_wide基波宽度
pulse_wide脉冲宽度
*全局变量:
-----------------------------------------------------------------------
*说明:
***********************************************************************/
voidPWMSet(uint16base_wide,uint16pulse_wide)
{
TIM1_SetAutoreload(base_wide);
TIM1_SetCompare1(pulse_wide);
}
/**********************************************************************
*名称:
Delay()
*功能:
延时
*入口参数:
cnt
*出口参数:
-----------------------------------------------------------------------
*说明:
***********************************************************************/
voidDelay(u32nCount)
{
for(;nCount!
=0;nCount--);}
/**********************************************************************
*名称:
dianjitz()
*功能:
命令电机停止
*说明:
***********************************************************************/
dianjitz()//电机停止函数
{
GPIO_WriteBit(GPIOA,GPIO_Pin_11,(BitAction)0);//
GPIO_WriteBit(GPIOA,GPIO_Pin_10,(BitAction)0);
Delay(0xffffff);
Delay(0xeeffff);
}
/**********************************************************************
*名称:
dianjixiajaing()
*功能:
命令电机下降运动
*说明:
***********************************************************************/
dianjixiajiang()//电机下降函数
{
GPIO_WriteBit(GPIOA,GPIO_Pin_11,(BitAction)1);//置1电梯下降
GPIO_WriteBit(GPIOA,GPIO_Pin_10,(BitAction)0);
}
/**********************************************************************
*名称:
dianjishangs()
*功能:
命令电机上升运动
*说明:
***********************************************************************/
dianjishangs()//电机上升函数
{
GPIO_WriteBit(GPIOA,GPIO_Pin_11,(BitAction)0);//置0电梯上升
GPIO_WriteBit(GPIOA,GPIO_Pin_10,(BitAction)1);
}
/**********************************************************************
*名称:
anjian()
*功能:
外部按键请求检测函数
*说明:
***********************************************************************/
anjian()
{
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0x00)//一楼按键上请求,对louceng[0]赋值1
{dat[0]++;
if(dat[0]>=10)
{
dat[0]=0;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==0x00)
{
louceng[0]=1;
}
}
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0x00)//二楼按键上请求,对louceng[1]赋值1
{dat[1]++;
if(dat[1]>=10)
{
dat[1]=0;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0x00)
{
louceng[1]=1;
}
}
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0x00)//二楼按键下请求,对louceng[2]赋值1
{
dat[2]++;
if(dat[2]>=10)
{
dat[2]=0;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_15)==0x00)
{
louceng[2]=1;
}
}
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==0x00)//三楼按键上请求,对louceng[3]赋值1
{
dat[3]++;
if(dat[3]>=10)
{
dat[3]=0;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_10)==0x00)
{
louceng[3]=1;
}
}
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0x00)//三楼按键下请求,对louceng[4]赋值1
{
dat[4]++;
if(dat[4]>=10)
{
dat[4]=0;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0x00)
{
louceng[4]=1;
}
}
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_12)==0x00)//四楼按键上请求,对louceng[5]赋值1
{
dat[5]++;
if(dat[5]>=10)
{
dat[5]=0;
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pi