基于msp超低功耗单片机温度控制器设计.docx
- 文档编号:24176891
- 上传时间:2023-05-25
- 格式:DOCX
- 页数:26
- 大小:228.49KB
基于msp超低功耗单片机温度控制器设计.docx
《基于msp超低功耗单片机温度控制器设计.docx》由会员分享,可在线阅读,更多相关《基于msp超低功耗单片机温度控制器设计.docx(26页珍藏版)》请在冰豆网上搜索。
基于msp超低功耗单片机温度控制器设计
开放实验报告
课题名称基于msp430单片机的超低功耗智能护眼灯的设计
学生姓名
系、年级专业信息工程系、11、12级电子信息
指导教师于建坤
2014年6月20日
基于msp430单片机的超低功耗智能护眼灯的设计
1.实验目的
1、了解pwm控制灯光亮度的原理,设计基于单片机的智能护眼灯控制装置。
2、学习电子电路、PCB板设计,产品制作与调试。
2.实验内容
本智能护眼灯以MSP43G2553为核心,完成护眼灯的照明,电源管理,环境采集和中央处理及控制功能。
灯珠采用高亮白光LED,恒流驱动,无频闪,不伤害眼睛,保护视力。
电源管理,由专用电源管理方案,管理系统充电和用电。
环境采集,用光传感器采集光照强度,根据光照强度控制灯珠亮度,用人体热释红外检测人远近。
三.系统方案设计
系统整体方框图如下:
图2.1系统方框图
(1)环境采集用光敏电阻采集环境亮度,人距感应部分采用热释红外。
当人靠近台灯,产生信号给MCU控制器,打开台灯。
光敏电阻采集当前亮度值,根据使用者选择的模式作出调整。
(2)MCU控制亮度和环境采集采用闭环控制,具体算法用PID算法的增量式模式。
具体函数如下:
typedefstructPID{
doubleSetPoint;//设定目标
doubleProportion;//比例常数
doubleIntegral;//积分常数
doubleDerivative;//微分常数
doubleLastError;//Error[-1]
doublePrevError;//Error[-2]
doubleSumError;//SumsofErrors
}PID;
doublePIDCalc(PID*pid,doubleNextPiont)
{
doubledError,Error,rOUT;
Error=pid->SetPoint-NextPiont;//偏差
pid->SumError+=Error;//积分
dError=pid->LastError-pid->PrevError;//当前微分
pid->PrevError=pid->LastError;//Error[-2]=Error[-1]
pid->LastError=Error;//Error[-1]=Error
rOUT=pid->Proportion*Error+pid->Integral*pid->SumError+pid->Derivative*dError;
//比例项//积分项//微分项
return(rOUT);
}
(3)显示部分因为管脚不足,若用液晶或点阵屏或OLED,则需要串转并器件,在速度上对整体控制不利。
故用74LS138器件,简单的将3个I/O口转为8个I/O口,用8个LED显示,在整体控制上,简单明了。
四.硬件设计
7、高亮LED驱动模块:
传统的大功率LED电源,大部分是用220VAC~DC后面再用LM358或者三极管来做恒流,此电路恒流精度低,并且过温,短路等保护功能没有,输出的可变性不强.故在此设计中高亮LED采用,大电流,高压DC/DC升压恒流XL6004恒流驱动,其具有宽电压输入,大电流输出,且其效率可以达到92%,原理图如下:
图3.1高亮LED驱动模块
8、无影的实现:
无影灯原理参照手术无影灯通过多个光源实现无影效果的,手术无影灯用来照明手术部位,以最佳地观察处于切口和体腔中不同深度的小的、对比度低的物体。
并能将色彩失真降到最低程度。
此外,无影灯还要求在工作过程中不散发出过量的热。
手术无影灯如下:
图3.2手术无影灯布局
本设计也采用多个光源实现无影效果,其特点是照度高,因为采用恒流驱动,使高亮灯能长时间工作,由于在设计中能充分散热,故不会发出过量的热量影响使用者的使用。
9、光照采集:
采用可见光光敏电阻作为光照采集器件,其工作原理方框图如下图所以:
图3.3光照采集原理方框图
(4)人体感应:
人体感应采用热式红外采集,其工作方框图如下:
图3.4人体感应原理方框图
(5)电源:
电源由变压器、整流桥、和滤波电路组成,再由开关电源器件LM2596构成,设计较简单,不再叙述。
4、程序设计
程序流程图如图5.1所示。
系统流程图如下:
系统创新
1、灯珠亮度自动可控,使台灯发出亮度与环境亮度之和保持一固定值,无需人为频繁操作。
2、多模式选择,不同情景用不同模式。
3、灯盘设计模拟手术室用的无影灯,避免写字时手得遮挡引起照明度不足,保护视力。
4、环境探测,解决用户强光久照伤眼,弱光久视伤眼,用眼过度。
突然离开忘记关灯费电情况等各种情况。
5、优秀的电池管理方案,更高效率,增长电池和灯珠寿命。
6、自动调节亮度,更加有效利用电源,更加节能。
图5.1
5、产品性能测试
实物作品
(1)放大部分数据(放大68倍)
电桥输出电压(mv)
5
10
15
20
25
30
35
40
45
50
放大输出(mv)
345
688
1023
1361
1710
2038
2380
2727
3065
3409
理论值(mv)
340
680
1020
1360
1700
2040
2380
2720
3060
3400
(2)总个系统的测试数据
AD采样(mv)
626
924
1122
1319
1509
1707
1911
2101
2295
2693
2884
3077
3275
3458
公式
温度
34.4
41.1
45.4
49.8
54.1
58.5
63.1
67.4
71.7
80.7
84.9
89.3
93.8
97.9
修正公式温度
27.7
35.4
40.2
45.1
49.6
54.5
59.8
64.2
69.0
79.4
87.5
89.4
94.3
98.3
实测
温度
27.8
35.4
40.1
45.1
49.7
54.5
59.8
64.4
69.1
79.5
87.5
89.4
94.4
98.5
10、总结
从放大部分所测得数据可以看出,放大部分基本和理论值相对应,有些误差可能的来源有:
仪用放大器本身的误差、人工测量误差、万用表的误差等。
从总个系统的测试数据看,特别是看附表的曲线图,实际和理论有比较大的误差,这个是无法避免的,通过人为的修改后,取得了很好的效果。
总而言之,本系统实现了题目的基本要求的全部、发挥部分的大部!
附录
#include
#defineuintunsignedint
#defineucharunsignedchar
#defineulongunsignedlong
#defineCSBIT0
#defineSIDBIT1
#defineSCLKBIT2
#defineLCDPORTP2OUT
#defineSID_1LCDPORT|=SID
#defineSID_0LCDPORT&=~SID
#defineSCLK_1LCDPORT|=SCLK
#defineSCLK_0LCDPORT&=~SCLK
#defineCS_1LCDPORT|=CS
#defineCS_0LCDPORT&=~CS
#defineCLKBIT3
#defineSH_LDBIT4
#defineQHBIT5
//#defineKEYPORTP2OUT
#defineCLK_1LCDPORT|=CLK
#defineCLK_0LCDPORT&=~CLK
#defineSH_LD_1LCDPORT|=SH_LD
#defineSH_LD_0LCDPORT&=~SH_LD
#defineCPU_F((double)1000000)
#definedelay_us(x)__delay_cycles((long)(CPU_F*(double)x/1000000.0))
#definedelay_ms(x)__delay_cycles((long)(CPU_F*(double)x/1000.0))
unsignedchara[]={"欢迎使用"};
unsignedcharb[]={"当前按键:
"};
unsignedcharc[]={"实时温度:
"};
unsignedchard[]={"0123456789℃.V"};
unsignedchare[]={"当前电压:
"};
uintkey,value,key_shu;
floattemperature;
floatIntDegC;
longtemp_IntDegc;
longIntDegC_1;
longtemp_set=30;
voiddelay(unsignedcharms);
voidwrite_cmd(ucharcmd);
voidwrite_dat(uchardat);
voidlcd_pos(ucharx,uchary);
voidLCD_init(void);
voidADC10_init(void);
voidLCD_show(void);
voidtemp_collect(void);
voidpwm_control(ucharpwm_type);
voidtemp_control();
uintkeyscan();
uintkeyvalue(uintkey_value);
intmain(void)
{
//Stopwatchdogtimertopreventtimeoutreset
WDTCTL=WDTPW+WDTHOLD;
ADC10_init();
P2SEL=0x00;
P2DIR=BIT0+BIT1+BIT2;
P2DIR|=CLK+SH_LD;//P2.3,P2.4为输出
P2DIR&=~QH;//P2.5为输入
LCD_init();
delay(40);
LCD_show();
while
(1)
{
key=keyscan();
key_shu=keyvalue(key);
lcd_pos(2,5);
write_dat(key_shu+48);
if(key_shu==8)
{
P1DIR=0x01;
P1OUT^=BIT0;
delay_ms(50);
}
ADC10CTL0|=ENC+ADC10SC;//ADC10Enable
__bis_SR_register(CPUOFF+GIE);//LPM0withinterruptsenabled
//temp_collect();
temp_control();
}
}
voiddelay(unsignedcharms)
{
unsignedchari,j;
for(i=ms;i>0;i--)
for(j=120;j>0;j--);
}
voidwrite_cmd(ucharcmd)
{
uchari,high4bits,low4bits;
ulonglcdcmd;
high4bits=cmd&0xf0;
low4bits=cmd&0x0f;
lcdcmd=((ulong)0xf8<<16)+((ulong)high4bits<<8)+((ulong)low4bits<<4);
CS_1;
SCLK_0;
for(i=0;i<24;i++)
{
SID_0;
if(lcdcmd&0x00800000)SID_1;
lcdcmd<<=1;
delay(3);
SCLK_1;
delay(3);
SCLK_0;
}
CS_0;
}
voidwrite_dat(uchardat)
{
uchari,high4bits,low4bits;
ulonglcddat;
high4bits=dat&0xf0;
low4bits=dat&0x0f;
lcddat=((ulong)0xfa<<16)+((ulong)high4bits<<8)+((ulong)low4bits<<4);
CS_1;
SCLK_0;
for(i=0;i<24;i++)
{
SID_0;
if(lcddat&0x00800000)SID_1;
lcddat<<=1;
delay(3);
SCLK_1;
delay(3);
SCLK_0;
}
CS_0;
}
voidlcd_pos(ucharx,uchary)
{
ucharpos;
switch(x)
{
case1:
pos=0x80;break;
case2:
pos=0x90;break;
case3:
pos=0x88;break;
case4:
pos=0x98;break;
default:
pos=0x80;
}
pos+=y;
write_cmd(pos);
}
voidLCD_init(void)
{
write_cmd(0x30);
delay(5);
write_cmd(0x0c);
delay(5);
write_cmd(0x01);
delay(5);
write_cmd(0x02);
delay(5);
}
uintkeyscan()
{
uinttemp,temp_1=0x00;
uchari,num_1,num_2,temp_2=0x00;//num来接受输出165的值(读取P2.5的值)
SH_LD_0;//将165外部端口数据(键盘)装入内部寄存器
delay_us(10);
SH_LD_1;//抬高为移位准备
delay_us(10);
for(i=0;i<8;i++)
{
temp_1<<=1;
CLK_0;
delay_us(10);
num_1=P2IN&0x20;//接受最高位数
num_1>>=5;
temp_1|=num_1;
CLK_1;
delay_us(10);
}
for(i=0;i<8;i++)
{
temp_2<<=1;
CLK_0;
delay_us(10);
num_2=P2IN&0x20;//接受最高位数
num_2>>=5;
temp_2|=num_2;
CLK_1;
delay_us(10);
}
temp_1<<=8;
temp=temp_1+temp_2;
returntemp;
}
uintkeyvalue(uintkey_value)
{
switch(key_value)
{
case0xfffe:
value=13;break;//0按下相应的键显示相对应的码值
case0xfffd:
value=14;break;//1
case0xfffb:
value=15;break;//2
case0xfff7:
value=16;break;//3
case0xffef:
value=9;break;//4
case0xffdf:
value=10;break;//5
case0xffbf:
value=11;break;//6
case0xff7f:
value=12;break;//7
case0xfeff:
value=5;break;//8按下相应的键显示相对应的码值
case0xfdff:
value=6;break;//9
case0xfbff:
value=7;break;//10
case0xf7ff:
value=8;break;//11
case0xefff:
value=1;break;//12
case0xdfff:
value=2;break;//13
case0xbfff:
value=3;break;//14
case0x7fff:
value=4;break;//15
}
returnvalue;
}
voidADC10_init(void)
{
ADC10CTL1=CONSEQ_0+INCH_1;//单通道单次采样+选模拟输入通道A1
ADC10CTL0=SREF_1+ADC10SHT_2+REFON+REF2_5V+ADC10ON+ADC10IE;//参考电压源VR+=VREF+=2.5V,VR-=AVSS+采集定时器分频系数N=4(Tsample=4xTadc12clkxN)+内部参考电压发生器开+开ADC10内核+ADC10中断允许
_EINT();//开总中断
TACCR0=30;
TACCTL0|=CCIE;
TACTL=TASSEL_2+MC_1;//选择SMCLK+增计数模式
LPM0;//进入低功耗0,等待中断
TACCTL0&=~CCIE;//关闭中断
_DINT();//关总中断
ADC10AE0|=0x02;//P1.1(A1)为ADC10输入用,非I/O口用
}
voidLCD_show(void)
{
lcd_pos(1,0);
for(inti=0;i<16;i++)
write_dat(a[i]);
lcd_pos(2,0);
for(inti=0;i<10;i++)
write_dat(b[i]);
lcd_pos(3,0);
for(inti=0;i<10;i++)
write_dat(c[i]);
lcd_pos(4,0);
for(inti=0;i<10;i++)
write_dat(e[i]);
}
voidtemp_collect(void)
{
ucharbai,shi,ge,bai_1,shi_1,ge_1;
temperature=ADC10MEM;
IntDegC=(3250*temperature-1)/(34443.48-0.49*temperature);
temp_IntDegc=(long)(250*temperature/1023);
//IntDegC=49.5*temperature-13.2;
//IntDegC_1=(long)(IntDegC*10);
if(IntDegC<21.4)
{
IntDegC_1=(long)(1.22*IntDegC*10-8.56*10);
}
if(IntDegC>=21.4&&IntDegC<26.5)
{
IntDegC_1=(long)(1.27*IntDegC*10-9.56*10);
}
if(IntDegC>=26.5&&IntDegC<31.9)
{
IntDegC_1=(long)(1.17*IntDegC*10-6.92*10);
}
if(IntDegC>=31.9&&IntDegC<36)
{
IntDegC_1=(long)(1.2*IntDegC*10-7.9*10);
}
if(IntDegC>=36&&IntDegC<37.5)
{
IntDegC_1=(long)(1.47*IntDegC*10-17.63*10);
}
if(IntDegC>=37.5&&IntDegC<39.7)
{
IntDegC_1=(long)(IntDegC*10);
}
if(IntDegC>=39.7&&IntDegC<44.8)
{
IntDegC_1=(long)(1.24*IntDegC*10-9.55*10);
}
if(IntDegC>=44.8&&IntDegC<55)
{
IntDegC_1=(long)(1.17*IntDegC*10-6.4*10);
}
if(IntDegC>=55&&IntDegC<65)
{
IntDegC_1=(long)(1.2*IntDegC*10-8*10);
}
if(IntDegC>=65&&IntDegC<73)
{
IntDegC_1=(long)(1.47*IntDegC*10-25.51*10);
}
if(IntDegC>73&&IntDegC<80)
{
IntDegC_1=(long)(1.27*IntDegC*10-10.9*10);
}
if(IntDegC>=80)
{
IntDegC_1=(long)(1.22*IntDegC*10-6.92*10);
}
bai=IntDegC_1/100;
shi=IntDegC_1%100/10;
ge=IntDegC_1%100%10;
lcd_pos(3,5);
write_dat(d[bai]);
write_dat(d[shi]);
write_dat(d[12]);
write_dat(d[ge]);
write_dat(d[10]);
write_dat(d[11]);
bai_1=temp_IntDegc/100;
shi_1=temp_IntDegc%100/10;
ge_1=temp_IntDegc%100%10;
lcd_pos(4,5);
write_dat(d[bai_1]);
write_dat(d[12]);
write_dat(d[shi_1]);
write_dat(d[ge_1]);
write_dat(d[13]);
__no_operation();//SETBREAKPO
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 基于 msp 功耗 单片机 温度 控制器 设计
![提示](https://static.bdocx.com/images/bang_tan.gif)