模拟路灯控制系统1组液晶Word文件下载.docx
《模拟路灯控制系统1组液晶Word文件下载.docx》由会员分享,可在线阅读,更多相关《模拟路灯控制系统1组液晶Word文件下载.docx(23页珍藏版)》请在冰豆网上搜索。
这种方案单元控制器电路相当简单,支路控制器电路较为复杂,MCU工作负荷大,I/O资源紧张。
整体方案成本较低,易于实现,但不符合实际情况,不满足题意。
主从机协同控制法。
支路控制器、单元控制器各采用1片MCU进行控制,支路控制器的主MCU与单元控制器的从MCU之间采用串口通信进行数据交换。
支路控制器只用于人机界面、开关灯时间设定、自动亮度识别、道路通过检测及故障报警等,而各个LED恒流源及其控制、数据采集电路均集成到单元控制器电路中,并由其内部的从MCU通过串口接收主MCU的指令进行控制。
此方案各MCU分工合理,协同工作,负荷不高,电路、程序都较简单。
同时采用工业串口,传输距离远,可推广到实际应用中,故本系统采用该方案。
2理论分析与计算
2.1功率数据采集原理分析
单元控制器采集当前LED的输出功率数据分两步进行:
一、采集通过LED的电流值。
由于本系统采用压控恒流源,故通过LED的电流即为通过采样电阻的电流,因为采样电阻阻值为1Ω,所以电流等同于采样电阻上的电压。
又因为前级运放OP07接成电压跟随器,该值即为D/A输出的电压值,在单元控制器在设定LED输出功率时已知。
二、采集LED两端的电压值。
该值由LM358接成减法器直接在LED两端取得,经A/D转换送给从机。
将这两个值相乘,即得到当前LED的功率值。
2.2功率调节原理分析
设定功率时,单元控制器并不能一步到位。
必须先通过D/A输出一个初始的LED电流值,然后通过A/D把LED两端电压读回来,将电流与电压相乘得到的功率值与需设定值进行比较,如果小于设定值,则增加D/A的输出;
如果大于,则减小D/A的输出。
通过这种闭环系统,使当前输出功率值逐步逼近设定功率值。
2.3调节误差分析
D/A设定恒流源电流值、A/D采集电压数据都将带来转换误差,这是A/D、D/A器件本身硬件带来的,不可避免。
A/D、D/A位数越高,转化误差越小,调节误差也越小。
本系统采用12位的A/D、D/A器件,转换误差小于0.1%,而功率误差由电流转化误差与电压转换误差共同决定,由于他们之间是乘积关系,因此误差的数量级不会上升,总的调节误差小于0.5%,精度完全符合题目要求。
3电路设计
3.1系统框图
系统框图如图1所示。
图1系统框图
3.2显示器模块电路
该模块采用1个1602液晶模块构成,数据线控制线接单片机I/O,电路如图2所示。
图21602液晶显示电路图3光传感器电路
3.3光传感器模块
采用光敏电阻作为敏感元件,当环境亮度较高时,光敏电阻R1阻值很小,P17为低电平;
当环境亮度较低时,光敏电阻R1阻值很大,P17为高电平。
电路如图3所示。
3.4时钟电路
时钟模块用于给MCU提供精确时间数据,从而使支路控制器能够准确控制LED的开关灯时间。
该模块采用具有I2C接口的PCF8563来进行设计,只占用MCU2个I/O,该模块电路如图4所示。
图4PCF8563时钟电路
3.5反射式红外传感器检测电路
系统采用反射式红外传感器实现道路通过情况的检测。
反射式红外传感器使用起来非常方便,只需三条线(电源、地和数据线)就可以进行控制。
当该传感器接上电源后,如果没有物体通过,数据线保持高电平;
如果有物体通过时,其反射回来的红外信号将被传感器接收,数据线电平将被拉低。
3.6声光报警电路
采用一个普通发光二极管加一个蜂鸣器实现,当LED出现故障时的声光报警提示功能。
如图6所示为声光报警电路。
图6声光报警电路
3.7A/D电路
该模块采用TI公司双通道12位串行ADCTLC2552实现,用于采集LED上电压值到从机。
其电路如图7所示:
图7A/D转换电路
3.8D/A转换电路
该模块采用Linear公司12位串行DACLTC2622实现,用于设定恒流源的输出电流及功率。
电路如图8所示:
图8D/A转换电路
3.9串口接口电路
本系统采用工业串口485进行主机与从机间的通信,其接口电路如图9所示:
图9串口接口电路
4程序设计
4.1定时开关灯的实现
支路控制器通过不停的读取时钟芯片中的时间值,并将其与开关灯设定时间做比较,如果达到开灯或关灯时间,主机将产生中断,将开灯或关灯指令通过485串口发到相应的单元控制器,单元控制器一旦发现串口有数据送来,立即产生串口中断,并从串口数据中获取开灯或关灯指令,再通过控制继电器的闭合与断开实现该功能。
4.2功率调节的实现
当调节功率时,单元控制器并不能一步到位,立即使当前功率值等于设定功率值。
4.3程序流程图
主机的主程序流程图、从机程序流程图、从机中断程序流程图分别如图10、11、12所示。
图10主机主程序流程图
图11从机主程序流程图图12从机中断服务程序流程图
5系统测试
5.1测试仪器
DS-1双通道直流稳压源、C31-A型高精度指针式毫安表、C31-V型高精度指针式电压表
5.2测试方案
功能逐项测试法:
根据题目要求,依次逐项测试系统功能。
数据实测计算法:
使用精密毫伏表、电压表,实时测试通过LED的电流及其两端的电压,再计算出LED的输出功率,并将其与控制器设定的功率值进行比较,以计算出调节误差。
5.3测试结果
1)功能完成情况
经测试,系统可完成题目的基本及发挥部分全部功能。
2)指标完成情况
本题的指标主要是恒流源输出功率的调节误差。
经测试,测试数据及计算结果如表1所示:
表1恒流源的功率数据及调节误差表
设定功率百分比
仪器测量电流值(mA)
仪器测量电压值(V)
实际功率计算值(W)
调节误差
20%
64.99
2.81
0.1826
1.74%
55%
180.18
2.99
0.5387
1.13%
76%
240.13
3.11
0.7468
1.32%
100%
307.86
3.21
0.9882
1.18%
5.4结果分析
通过测试、计算和分析,系统完成题目的基本及发挥部分全部功能,并在设定调节LED输出功率的指标上达到题目发挥部分要求,整体性能达到题目发挥部分要求。
6总结
支路控制器接显示器和键盘组成人机界面,可通过外部时钟模块进行开关灯定时控制,可通过光敏传感器和电压比较器检测环境明暗程度,可通过发射式红外传感器检测交通情况,控制LED的亮灭。
支路控制器与单元控制器之间采用485工业串口进行通信,可推广到实际应用中。
所有功能和指标均达到或部分超过赛题要求。
参考文献
[1]宋文绪,杨帆.自动检测技术.北京:
高等教育出版社,2008.
[2]高吉祥.全国大学生电子设计竞赛培训系列教程.北京:
电子工业出版社,2007.
[3]周坚.单片机C语言轻松入门.北京:
北京航空航天出版社,2006.
[4]孙传友等.测控电路及装置.北京:
北京航空航天大学出版社,2002.
[5]李朝青著.单片机原理及接口技术.北京航空航天大学出版社,2005.
附件1:
支路控制器单片机电路图
附件2:
单元控制器单片机电路图
附件3:
恒流源电路图
附件4:
主要PCB图
1)恒流源PCB图
2)主控电路PCB
3)从机电路PCB
附件5:
主要元器件清单
序号
元器件名称
型号、规格
数量
1
单片机
AT89S51
3
2
路灯LED
1W
ADC
TLC2552
4
DAC
LTC2622
5
液晶显示器
1602
6
74LS138
7
LM358
8
OP-07
9
晶振
11.0592M
10
按键
11
大功率电阻
1欧5W
12
继电器
13
场效应管
IRFZ44N
14
三端稳压器
7809
15
各类电阻
若干
16
各类电容
附件6:
部分程序清单
(1)主机部分程序
#include<
reg52.h>
intrins.h>
#defineUINT8unsignedchar
#defineUINT16unsignedint
sbitRS=P2^5;
sbitRW=P2^6;
sbitE=P2^7;
//sbitout1=P1^0;
sbitin1=P1^7;
//sbitout2=P1^1;
sbitSpeaker=P3^7;
sbitRENENABLE=P3^2;
sbitNo1=P1^0;
sbitNo2=P1^1;
sbitNo3=P1^2;
sbitNo4=P1^3;
sbitNo5=P1^4;
sbitNo6=P1^5;
sbitNo7=P1^6;
sbitISDA=P3^4;
//IO口冲突
sbitISCL=P3^3;
#defineDataP0
#defineS10xfe//1号键
#defineS20xfd//2号键
#defineS30xfb//3号键
#defineS40xf7//4号键
#defineS50x7e//长按键
UINT8codetab[]={'
0'
'
1'
2'
3'
4'
5'
6'
7'
8'
9'
};
//字符变量数组
UINT8idataText1[16]="
**-RealTime-**"
;
//字符变量数组
UINT8idataText2[16]="
*---:
:
---*"
//字符变量数组00:
00:
00
UINT8idataText3[16]="
**-OpenTime-**"
UINT8idataText4[16]="
**CloseTime-**"
UINT8codeText5[16]="
**Test1**"
UINT8codeText6[16]="
**Test2**"
UINT8codeText7[16]="
**Test3**"
UINT8codeText8[16]="
**Normal**"
UINT8idataText9[16]="
Power0is%"
UINT8idataText10[16]="
Power1is%"
UINT8codeText11[16]="
Led0wasbroken."
UINT8codeText12[16]="
Led1wasbroken."
UINT8codeText13[16]="
Welcome..."
UINT8Time=0;
UINT8Sec=00,Min=00,Hou=00;
UINT8Mod=0,Set=0;
UINT8OpenHou0,OpenMin0,OpenSec0,CloseHou0,CloseMin0,CloseSec0;
UINT8OpenHou1,OpenMin1,OpenSec1,CloseHou1,CloseMin1,CloseSec1;
UINT8TextModNum=0;
UINT8PowerA=70,PowerB=70;
UINT8AdjustN=0;
UINT8Hypotaxis=0;
bitLedFlag0=0;
bitLedFlag1=0;
bitLed1=0,Led2=0,Led3=0,Led4=0,Led5=0,Led6=0;
bitNum=0;
bitTimeFlag0=0;
bitTimeFlag1=0;
bitLedFlag2=1;
bitReadFlag=0;
bitAdjustFlag=0;
bitAdjustPowerFlag=0;
bitL1BFlag=0,L2BFlag=0;
bitTestLedFlag=0;
bitLedFlagLight1=0;
bitLedFlagLight2=0;
/******************通讯协议***********************/
#defineADDR10x01
#defineADDR20x02
#defineLedLight0x03
#defineLedDrown0x04
#defineLedTest0x05
#defineLedBro0x06
#defineLedRight0x07
/*************************************************/
/**********************函数声明*******************/
voidAdjust(void);
voidDelayms(unsignedintcount)
{
unsignedinti;
for(i=0;
i<
count;
i++);
}
voidDelay_ms(UINT16t)
UINT16i,j;
t;
i++)
for(j=0;
j<
124;
j++);
voidWriteCommand(unsignedcharCom)
E=0;
RS=0;
E=1;
RW=0;
Data=Com;
RS=0;
voidWriteData(unsignedcharDat)
RS=1;
Data=Dat;
voidInit1602()
Delayms(500);
WriteCommand(0x38);
Delayms(200);
Delayms(1400);
//显示模式设置,开始要求每次检测忙信号
WriteCommand(0x08);
//关闭显示
WriteCommand(0x01);
//显示清屏
WriteCommand(0x06);
//显示光标移动设置
WriteCommand(0x0C);
//显示开及光标设置
voidShow_Text(char*Text,charrow)//显示行
unsignedchari;
if(row==0)
{
WriteCommand(0x80);
Delayms(1400);
for(i=0;
16;
{
WriteData(Text[i]);
}
}
else
WriteCommand(0xC0);
}
(2)从机部分程序
#include<
math.h>
UINT16ADCDat[2];
UINT8Power;
UINT16codetable[9]={1,30,80,90,130,160,190,220,260};
sbitDA_CS=P1^3;
sbitDA_SCK=P1^4;
sbitDA_SDI=P1^5;
sbitADCS=P1^2;
sbitADCLK=P1^1;
sbitADSDO=P1^0;
sbitRENENABLE=P1^6;
sbitBUTTON=P2^0;
floatA=100;
floatErrorData=65536;
floatRealPower=0;
UINT16AnsK=0;
UINT16k=0,Temp2=100;
bitflag;
bitLedBroken=0;
bitLedFlag=0;
/********************通讯协议********************/
#defineAddr0x01
/************************************************/
/*********************函数声明*******************/
voidWrite_LTC2622(UINT16Data);
voidRead_TLC2552(void);
/********************系统初始化******************/
voidSysInit()
RENENABLE=0;
SCON=0xf0;
TMOD=0x20;
TH1=0xfd;
TL1=0xfd;
TR1=1;
EA=1;
ES=1;
/******************功率调节**********************/
voidAdjustPower(UINT8P)
UINT8temp1;
UINT16Add=0;
floattemp=0;
floattt=0;
bitFlag1=0;
temp1=P/10;
switch(temp1)
case2:
k=table[0];
break;
case3:
k=table[1];
case4:
k=table[2];
case5:
k=table[3];
case6:
k=table[4];
case7:
k=table[5];
case8:
k=table[6];
case9:
k=table[7];
case10:
k=table[8];
while
(1)
Write_LTC2622(k);
Delay_ms
(1);
Read_TLC2552();
tt=(5000/4096)*ADCDat[0];
RealPower=((2500*k)/4096)*tt;
if(tt>
=3500)
LedBroken=1;
else
LedBroken=0;
temp=(P*10-RealPower);
if(temp<
0)