线阵LED图文显示装置论文Word下载.docx
《线阵LED图文显示装置论文Word下载.docx》由会员分享,可在线阅读,更多相关《线阵LED图文显示装置论文Word下载.docx(22页珍藏版)》请在冰点文库上搜索。
1.3电机驱动电路比较与选择
中功率三级管直接搭建。
在电机驱动要求不高的地方可以由三极管直接搭建一个驱动电路,使用三级关搭建的电机驱动电路电路简单,但功率和性能一般。
对输入信号要求较高,输出性能只能满足一般要求。
使用单片机MSP430G2553控制电机驱动芯片L298N。
L298N的驱动能力强,输入电压可变化范围大,是一块专用直流电机驱动芯片。
其各项性能都较好,但价格较高,在电机要求驱动器较高的地方使用较佳。
在该系统中,带动旋转平台的直流电机使用L298N驱动模块,很容易实现对电机较稳的控制,故采用方案二。
1.4亮度自动调节电路比较与选择
采用线性较好的光敏电阻,将光敏电阻串入控制电路的输出端再接入线阵LED灯,当光亮度变化时即可改变电流大小,从而达到亮暗调节。
但是电路不稳定,故不采取此方案。
方案二:
采用光敏电阻与TLC555搭建电路。
用TLC555、电容、电位器组成振荡电路产生稳定的PWM波输出。
而光敏电阻的变化引起输出PWM波占空比的变化,从而改变显示亮度。
电路简单,且易于控制,因此选定此方案作为环境亮度变化调节电路。
2理论分析与参数计算
2.1线状点阵LED驱动参数分析与计算
该线状点阵中LED驱动方法为普通的LED与电阻串联的方式来驱动点亮LED,该限流电阻计算公式如下:
根据设计要求,
,
可求得限流电阻:
经计算采用
电阻与LED串联即可。
2.2线阵LED运动参数分析与计算
在电机的带动下,线阵LED依靠旋转平台进行旋转,设电机周期为
,LED完成需要时间为
,软件延时为
,它们之间存在下列关系:
只要保证
,经计算由
得
,线阵LED就能很好的地显示图文。
2.3指针式秒表分析与计算
指针秒表完全通过软件来控制显示,设电机周期为
、
,存在下列关系:
保证
成立,确定LED完成需要时间为
,线阵LED就能很好的地显示秒表计时。
2.4显示亮度自动调节分析与计算
采用TI的TLC555、电容
、电阻
和光敏电阻
等组成振荡电路产生稳定的PWM波输出。
则产生PWM波的周期、高电平及其占空比的计算公式如下:
光敏电阻的变化引起输出PWM波占空比的变化,从而改变显示亮度,即电流控制。
控制电流大小计算如下:
3电路与程序设计
3.1电路设计
3.1.1系统总体方案设计
本系统将外接的12V电源给电机供电,4.2V电源为控制器供电,通过电源调压芯片LP2950-33LPR为系统提供3.3V电压。
单片机按照一定的算法控制电机的转动,使电机转动稳定以完成各种控制动作,总体设计框图如图1。
图1
3.1.2系统电源设计
系统需要12V、3.3V电源,采用12V开关电源给直流电机供电,需要的3.3V电压则从4.2V锂电池通过TI公司的电源调压芯片LP2950-33LPR位系统提供3.3V电压,系统电源电路图见附图一。
3.1.3单片机G2553控制电路的设计
控制电路主要有单片机MSP430G2553、串并转换芯片74HC164、16个限流电阻和16个LED组成的。
单片机很好地利用软件程序发送串行数据,通过串并转换芯片把从单片机发出的数据通过限流电阻并行送到16个LED,控制线阵LED显示图文,单片机G2553控制电路图见附图二。
3.1.4亮度自动调节电路设计
通过采用TI公司的芯片TLC555与光敏电阻搭建电路。
而光敏电阻的变化引起输出PWM波占空比的变化,从而改变显示亮度,实现亮度随外界环境变化而自动调节,亮度自动调节电路图见附图三。
`3.1.5起始标志杆检测电路设计
本电路采用霍尔传感器采集数据并检测标志杆,把霍尔传感器固定到旋转平台,一块小磁铁固定到标志杆上,并与霍尔传感器水平一条线放置。
当旋转平台边缘上网霍尔传感器经过标志位的小磁铁时,传感器感应到磁场发生变化,同时产生输出电压脉冲,并将此脉冲送入单片机。
起始标志杆检测电路图见附图四。
3.2程序设计
3.2.1主程序设计
当系统上电后单片机初始化后,先进行LED检测,按键触发计数选择显示不同的图文,程序则按照相应部分的程序算法执行,主程序流程图如图2。
图2
4测试结果
4.1测试仪器
示波器DS1302CA、万用表DT-9205
4.2测试结果完整性
1.完成制作一个由16只LED构成的线状点阵及其控制电路,安装于可旋转的平台上,在平台的中心设置一个按键,用于功能的切换,电机带动平台以合适速度旋转。
2.开机时装置完成显示自检,能对点阵中16只LED逐个点亮,每只LED显示时间约为1秒,此时平台不旋转。
3.通过按键切换,实现16个同心圆图形分别顺序(由大到小)和逆序(由小到大)显示,每个同心圆图形显示时间为0.3秒左右。
4.LED显示亮度能依据环境亮度变化自动调节。
5.通过按键切换,显示字符“TI杯”,要求字符显示较稳定,无明显漂移。
6.通过按键切换,显示一个指针式秒表,该秒表以标志杆为起始标志,秒针随时间动态旋转,旋转一周的时长为60±
1秒。
4.3测试结果分析
经过测试,可以确定系统构架设计比较合理,可以很好确定旋转平台的中心,电路功能实现基本符合设计要求。
5结束语
经过多日的辛勤努力,系统架构设计合理,功能电路实现较好,系统性能优良、稳定,较好地达到了题目要求的各项指标,在硬件调试的过程中,我们遇到很多问题。
由于时间紧,工作量大,系统还存在许多可以改进的地方。
本次竞赛锻炼了我们各方面的能力,虽然我们遇到了很多困难和障碍,但总体上成功与挫折交替,困难与希望并存,我们将继续努力争取更大的进步。
参考文献:
[1]秦龙编著.《MSP430单片机常用模块与综合系统实例精讲》.北京:
电子工业出版社,2007.7
[2]沈建华等.《MSP430系列16位超低功耗单片机实践与系统设计》.北京:
清华大学出版社,2005.4
[3]郁有文等.《传感器原理及工程应用》.西安:
西安电子科技大学出版社.2008.6
[4]张剑平编著.《模拟电子技术教程》.北京:
清华大学出版社.2011.3
[5]龙治红、谭本军编著。
《数字电子技术》.北京:
北京理工大学出版社.2010.7
附录一:
1.系统电源电路图(见附图一)
附图一
2.单片机G2553控制电路图见附图二
附图二
3.亮度自动调节电路图(见附图三)
附录三
4.起始标志杆检测电路图(见附图四)
附图四
5.电机驱动电路图(见附图五)
附图五
附录二:
#include<
msp430g2553.h>
//单片机头文件
#defineCPU_F((double)1000000)
#definedelay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))//调用delay_ms(2000);
延时2000MS
#definedelay_ms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))//调用delay_us(x);
延时Xus
#defineL_WRP1OUT&
=~BIT5
#defineH_WRP1OUT|=BIT5
#defineL_CLKP2OUT&
=~BIT0
#defineH_CLKP2OUT|=BIT0
#defineL_DAT0P2OUT&
=~BIT1
#defineH_DAT0P2OUT|=BIT1
#defineL_DAT1P2OUT&
=~BIT2
#defineH_DAT1P2OUT|=BIT2
#defineL_ENP2OUT&
=~BIT3
#defineH_ENP2OUT|=BIT3
//#defineKEYP1;
//霍尔传感器A04E设置中断标志位
unsignedcharconstzimu[],aa[];
unsignedchart=0;
unsignedcharm=0;
unsignedcharx=0,y=0;
/*********************************************************************************************
函数名:
关闭所有LED灯(操作硬件)
结果:
所有LED灯熄灭
**********************************************************************************************/
voidDISPLAY_OFF(void)
{
delay_us(50);
//显示停留
L_WR;
H_WR;
}
/**********************************************************************************************/
参数:
16位显示数据(下高位)(d:
上面8位,e:
下面8位)
voiddisplay(unsignedcharconstd,unsignedcharconste)//第1列横向显示程序
{
unsignedchari,a,b;
L_EN;
a=d;
b=e;
for(i=0;
i<
8;
i++)
{
L_CLK;
if((a&
0x80)==0x80)
H_DAT0;
else
L_DAT0;
if((b&
H_DAT1;
L_DAT1;
H_CLK;
a<
<
=1;
b<
}
H_EN;
DISPLAY_OFF();
}
voiddisplay1(unsignedcharconstd,unsignedcharconste)//第1列横向显示程序
a=e;
b=d;
/****************************************************************************
时钟初始化
***************************************************************************/
voidOSCILLATOR_Init(void)
if(CALBC1_1MHZ==0xFF||CALDCO_1MHZ==0xFF)
{while
(1);
}//Ifcalibrationconstantserased,trapCPU!
!
BCSCTL1=CALBC1_1MHZ;
//Setrange
DCOCTL=CALDCO_1MHZ;
//SetDCOstep+modulation
BCSCTL3|=LFXT1S_2;
//SetLFXT1
IFG1&
=~OFIFG;
//ClearOSCFaultflag
BCSCTL2|=SELM_1+SELS+DIVM_0;
//SetMCLK
IO初始化程序
voidinit(void)//初始IO接口状态
P1DIR=0xff;
P2DIR=0xff;
P1OUT=0xff;
P2OUT=0xff;
/*****************************************************************************
定时器初始化
*************************************************************************/
voidTIMER()
TACTL=TASSEL_2+MC_1;
//SMCLK,Contmode使计数模式为增计数
CCTL0=CCIE;
//CCR0interruptenabled
CCR0=14000;
//初始值为14000相当于1s
/*************************************************************************
扫描中断初始化函数
******************************************************************************/
voidZ_init()
P1DIR&
=~BIT4;
=~BIT0;
P1SEL&
P1IFG&
P1IE|=BIT4;
P1IE|=BIT0;
P1IES&
P1IES|=BIT0;
/******************************************************************************/
voidLDE_0()//16个LED逐个亮1S
unsignedchari=0;
32;
i+=2)
display1(aa[i],aa[i+1]);
delay_ms(1000);
//P2OUT|=BIT2;
//启动电机
delay_ms(10);
_EINT();
//开中断
/***************************************************************************/
voidLED_1()//同心圆从大到小0.3S
delay_ms(300);
}
voidLED_2()//同心圆从小到大0.3S
unsignedchari;
for(i=32;
i>
0;
i-=2)
display1(aa[i-2],aa[i-1]);
/*****************************************************************************/
voidLED_3()//TI杯显示
unsignedchara;
unsignedintc=0;
//数据指针
for(a=0;
a<
55;
a++)
display(zimu[c],zimu[c+1]);
c=c+2;
//产生显示一列移位
delay_ms(25);
delay_us(700);
/****************************************************************************/
voidLED_4()//指针式秒表
y++;
if(y==30)
y=0;
x++;
if(x==60)x=0,y=0;
for(i=61-x;
1;
i--)
delay_us(1000);
display(0xff,0xff);
//TIMER();
主函数
voidmain(void)
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;
OSCILLATOR_Init();
//时钟初始化
init();
//IO初始程序
Z_init();
//中断初始化
LDE_0();
//启动自检开中断
while
(1)
{}
/**************************************************************************/
#pragmavector=PORT1_VECTOR//霍尔中断
__interruptvoidport_1(void)
if(P1IFG&
BIT0)
{
delay_ms
(1);
t++;
if(t==5)t=1;
=~(BIT0);
BIT4)
//delay_ms
(1);
=~(BIT4);
if(t==1)LED_1();
if(t==2)LED_2();
if(t==3)LED_3();
if(t==4)LED_4();
//TimerA0interruptserviceroutine
#pragmavector=TIMER0_A0_VECTOR
__interruptvoidTimer_A0(void)
m++;
if(m>
60)m=0;
/******************************************************************************
字幕数组
*******************************************************************************/
unsignedcharconstaa[]={//从外到内,一次点亮
0x00,0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,
0x01,0x00,0x02,0x00,0x04,0x00,0x08,0x00,0x10,0x00,0x20,0x00,0x40,0x00,0x80,0x00,
};
unsignedcharconstzimu[]={//(取码:
从上到下从左到右,纵向8位下高位)
//TI杯