基于msp430超低功耗单片机温度控制器设计说明_第1页
基于msp430超低功耗单片机温度控制器设计说明_第2页
基于msp430超低功耗单片机温度控制器设计说明_第3页
基于msp430超低功耗单片机温度控制器设计说明_第4页
基于msp430超低功耗单片机温度控制器设计说明_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 PAGE18 / NUMPAGES19开放实验报告课 题 名 称基于msp430单片机的超低功耗智能护眼灯的设计 学 生 姓 名系、年级专业信息工程系、11、12级电子信息指 导 教 师 于建坤 2014年 6月 20日基于msp430单片机的超低功耗智能护眼灯的设计实验目的1、了解pwm控制灯光亮度的原理,设计基于单片机的智能护眼灯控制装置。2、学习电子电路、PCB板设计,产品制作与调试。实验容本智能护眼灯以MSP43G2553为核心,完成护眼灯的照明,电源管理,环境采集和中央处理与控制功能。灯珠采用高亮白光LED,恒流驱动,无频闪,不伤害眼睛,保护视力。电源管理,由专用电源管理方案,管理

2、系统充电和用电。环境采集,用光传感器采集光照强度,根据光照强度控制灯珠亮度,用人体热释红外检测人远近。 三系统方案设计 系统整体方框图如下:高亮LED驱动显示部分电源供电环境采集和人距感应部分MSPG2553控制图2.1 系统方框图( 1 ) 环境采集用光敏电阻采集环境亮度,人距感应部分采用热释红外。当人靠近台灯,产生信号给MCU控制器,打开台灯。光敏电阻采集当前亮度值,根据使用者选择的模式作出调整。( 2 ) MCU控制亮度和环境采集采用闭环控制,具体算法用PID算法的增量式模式。具体函数如下:typedef struct PIDdouble SetPoint; /设定目标double Pr

3、oportion;/比例常数double Integral; /积分常数double Derivative;/微分常数double LastError;/Error-1double PrevError;/Error-2double SumError;/Sums of Errors PID;double PIDCalc(PID *pid, double NextPiont)double dError, Error, rOUT;Error = pid-SetPoint - NextPiont; / 偏差 pid-SumError += Error; / 积分 dError = pid-LastEr

4、ror - 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个

5、I/O口转为8个I/O口,用8个LED显示,在整体控制上,简单明了。四硬件设计高亮LED驱动模块:传统的大功率LED电源,大部分是用220V ACDC后面再用LM358或者三极管来做恒流,此电路恒流精度低,并且过温,短路等保护功能没有,输出的可变性不强.故在此设计中高亮LED采用,大电流,高压DC/DC升压恒流XL6004恒流驱动,其具有宽电压输入,大电流输出,且其效率可以达到92%,原理图如下:图3.1 高亮LED驱动模块 无影的实现:无影灯原理参照手术无影灯通过多个光源实现无影效果的,手术无影灯用来照明手术部位,以最佳地观察处于切口和体腔中不同深度的小的、对比度低的物体。并能将色彩失真降到

6、最低程度。此外,无影灯还要求在工作过程中不散发出过量的热。手术无影灯如下: 图3.2 手术无影灯布局本设计也采用多个光源实现无影效果,其特点是照度高,因为采用恒流驱动,使高亮灯能长时间工作,由于在设计中能充分散热,故不会发出过量的热量影响使用者的使用。光照采集:采用可见光光敏电阻作为光照采集器件,其工作原理方框图如下图所以:光照减小低加PWM降低低加电阻减小光照增加电压减小图3.3 光照采集原理方框图(4)人体感应:人体感应采用热式红外采集,其工作方框图如下:人远离开始工作有人体靠近待机图3.4人体感应原理方框图(5)电源:电源由变压器、整流桥、和滤波电路组成,再由开关电源器件LM2596构成

7、,设计较简单,不再叙述。程序设计程序流程图如图5.1所示。系统流程图如下:系统创新灯珠亮度自动可控,使台灯发出亮度与环境亮度之和保持一固定值,无需人为频繁操作。多模式选择,不同情景用不同模式。灯盘设计模拟手术室用的无影灯,避免写字时手得遮挡引起照明度不足,保护视力。环境探测,解决用户强光久照伤眼,弱光久视伤眼,用眼过度。突然离 开忘记关灯费电情况等各种情况。优秀的电池管理方案,更高效率,增长电池和灯珠寿命。自动调节亮度,更加有效利用电源,更加节能。图5.1产品性能测试实物作品放大部分数据(放大68倍)电桥输出电压(mv)5101520253035404550放大输出(mv)3456881023

8、1361171020382380272730653409理论值(mv)34068010201360170020402380272030603400(2)总个系统的测试数据AD采样(mv)626924112213191509170719112101229526932884307732753458公式温度34.441.145.449.854.158.563.167.471.780.784.989.393.897.9修正公式温度27.735.440.245.149.654.559.864.269.079.487.589.494.398.3实测温度27.835.440.145.149.754.559.

9、864.469.179.587.589.494.498.5总结从放大部分所测得数据可以看出,放大部分基本和理论值相对应,有些误差可能的来源有:仪用放大器本身的误差、人工测量误差、万用表的误差等。从总个系统的测试数据看,特别是看附表的曲线图,实际和理论有比较大的误差,这个是无法避免的,通过人为的修改后,取得了很好的效果。总而言之,本系统实现了题目的基本要求的全部、发挥部分的大部!附录#include #define uint unsigned int#define uchar unsigned char#define ulong unsigned long#define CS BIT0#defi

10、ne SID BIT1#define SCLK BIT2#define LCDPORT P2OUT#define SID_1 LCDPORT |= SID#define SID_0 LCDPORT &= SID#define SCLK_1 LCDPORT |= SCLK#define SCLK_0 LCDPORT &= SCLK#define CS_1 LCDPORT |= CS#define CS_0 LCDPORT &= CS#define CLK BIT3#define SH_LD BIT4#define QH BIT5/#define KEYPORT P2OUT#define CLK_

11、1 LCDPORT |= CLK#define CLK_0 LCDPORT &= CLK#define SH_LD_1 LCDPORT |= SH_LD#define SH_LD_0 LCDPORT &= SH_LD#define CPU_F (double)1000000) #define delay_us(x) _delay_cycles(long)(CPU_F*(double)x/1000000.0) #define delay_ms(x) _delay_cycles(long)(CPU_F*(double)x/1000.0)unsigned char a= 欢迎使用 ;unsigned

12、 char b=当前按键:;unsigned char c=实时温度:;unsigned char d=0123456789.V;unsigned char e=当前电压:; uint key,value,key_shu;float temperature;float IntDegC;long temp_IntDegc;long IntDegC_1;long temp_set = 30;void delay(unsigned char ms);void write_cmd(uchar cmd);void write_dat(uchar dat);void lcd_pos(uchar x,uch

13、ar y);void LCD_init(void);void ADC10_init(void);void LCD_show(void);void temp_collect(void);void pwm_control(uchar pwm_type);void temp_control();uint keyscan();uint keyvalue(uint key_value);int main( void ) / Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; ADC10_init(); P2SEL

14、= 0 x00; 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 = 0 x01; P1OUT = BIT0; delay_ms(50); ADC10CTL0 |= ENC + ADC10S

15、C; /ADC10 Enable _bis_SR_register(CPUOFF + GIE); / LPM0 with interrupts enabled /temp_collect(); temp_control(); void delay(unsigned char ms) unsigned char i,j; for(i=ms;i0;i-) for(j=120;j0;j-);void write_cmd(uchar cmd) uchar i,high4bits,low4bits; ulong lcdcmd; high4bits = cmd & 0 xf0; low4bits = cm

16、d & 0 x0f; lcdcmd=(ulong)0 xf816)+(ulong)high4bits8)+(ulong)low4bits4); CS_1; SCLK_0; for(i=0;i24;i+) SID_0; if(lcdcmd & 0 x00800000) SID_1; lcdcmd =1; delay(3); SCLK_1; delay(3); SCLK_0; CS_0;void write_dat(uchar dat) uchar i,high4bits,low4bits; ulong lcddat; high4bits = dat & 0 xf0; low4bits = dat

17、 & 0 x0f; lcddat=(ulong)0 xfa16)+(ulong)high4bits8)+(ulong)low4bits4); CS_1; SCLK_0; for(i=0;i24;i+) SID_0; if(lcddat & 0 x00800000) SID_1; lcddat =1; delay(3); SCLK_1; delay(3); SCLK_0; CS_0;void lcd_pos(uchar x,uchar y) uchar pos; switch(x) case 1:pos=0 x80;break; case 2:pos=0 x90;break; case 3:po

18、s=0 x88;break; case 4:pos=0 x98;break; default:pos=0 x80; pos += y; write_cmd(pos);void LCD_init(void) write_cmd(0 x30); delay(5); write_cmd(0 x0c); delay(5); write_cmd(0 x01); delay(5); write_cmd(0 x02); delay(5);uint keyscan() uint temp,temp_1 = 0 x00; uchar i,num_1,num_2,temp_2 =0 x00; /num来接受输出1

19、65的值(读取P2.5的值) SH_LD_0; /将165外部端口数据(键盘)装入部寄存器 delay_us(10); SH_LD_1; /抬高为移位准备 delay_us(10); for(i = 0;i 8;i+) temp_1 = 5; temp_1 |= num_1; CLK_1; delay_us(10); for(i = 0;i 8;i+) temp_2 = 5; temp_2 |= num_2; CLK_1; delay_us(10); temp_1 = 8; temp = temp_1 + temp_2; return temp;uint keyvalue(uint key_v

20、alue) switch(key_value) case 0 xfffe:value=13;break; /0 按下相应的键显示相对应的码值 case 0 xfffd:value=14;break; /1 case 0 xfffb:value=15;break; /2 case 0 xfff7:value=16;break; /3 case 0 xffef:value=9;break; /4 case 0 xffdf:value=10;break; /5 case 0 xffbf:value=11;break; /6 case 0 xff7f:value=12;break; /7 case 0

21、 xfeff:value=5;break; /8 按下相应的键显示相对应的码值 case 0 xfdff:value=6;break; /9 case 0 xfbff:value=7;break; /10 case 0 xf7ff:value=8;break; /11 case 0 xefff:value=1;break; /12 case 0 xdfff:value=2;break; /13 case 0 xbfff:value=3;break; /14 case 0 x7fff:value=4;break; /15 return value;void ADC10_init(void) AD

22、C10CTL1 = CONSEQ_0 + INCH_1; /单通道单次采样 + 选模拟输入通道A1 ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + REF2_5V + ADC10ON + ADC10IE; /参考电压源VR+ = VREF+ = 2.5V ,VR- = AVSS +采集定时器分频系数N=4(Tsample=4 x Tadc12clk x N) +部参考电压发生器开+开ADC10核+ADC10中断允许 _EINT(); /开总中断 TACCR0 = 30; TACCTL0 |=CCIE; TACTL = TASSEL_2 + MC_1; /选择

23、SMCLK + 增计数模式 LPM0; /进入低功耗0,等待中断 TACCTL0 &= CCIE; /关闭中断 _DINT(); /关总中断 ADC10AE0 |= 0 x02; /P1.1(A1)为ADC10输入用,非I/O口用void LCD_show(void) lcd_pos(1,0); for(int i=0;i16;i+) write_dat(ai); lcd_pos(2,0); for(int i=0;i10;i+) write_dat(bi); lcd_pos(3,0); for(int i=0;i10;i+) write_dat(ci); lcd_pos(4,0); for(

24、int i=0;i10;i+) write_dat(ei);void temp_collect(void) uchar bai,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.

25、4 & IntDegC =26.5 & IntDegC =31.9 & IntDegC =36 & IntDegC =37.5 & IntDegC =39.7 & IntDegC =44.8 & IntDegC =55 & IntDegC =65 & IntDegC 73 & 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(dbai);

26、 write_dat(dshi); write_dat(d12); write_dat(dge); write_dat(d10); write_dat(d11); bai_1 = temp_IntDegc /100; shi_1 = temp_IntDegc %100/10; ge_1 = temp_IntDegc %100%10; lcd_pos(4,5); write_dat(dbai_1); write_dat(d12); write_dat(dshi_1); write_dat(dge_1); write_dat(d13); _no_operation(); / SET BREAKPOINT HEREvoid temp_control() temp_set = temp_set*10; temp_collect(); if(temp_set - IntDegC_1 100) pwm_control(2); delay_ms(20); temp_collect(); if(temp_set - IntDegC_1 50 & temp_set - IntDegC_1 =0 & temp_set - IntDegC_1 10 &

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论