




已阅读5页,还剩25页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于MSP430 launch pad 的水温自动控制系统 摘要 该水温自动控制系统采用现成有的TI公司单片机最小系统板(lanch pad)。单片机软件编程灵活,自由度大,可用软件编程实现各种控制算法和各种功能的实现。本设计的主要特点:1.温度采集部分采用DS18B20单总线数字温度传感器。DS18B20具有微型化,低功耗,高性能,抗干扰能力强的特点。该器件将半导体温敏器件,A/D转换器,存储器等集成在一个芯片上,传感器输出的就是温度信号数字值。使用该器件不仅大大简化了温度采集部分,而且也提高了温度采集部分的抗干扰性。2.控制部分采用固态继电器。 a.固态继电器内部采用光耦合方式,可实现弱电部分与强电部分的完全隔离。 b.固态继电器的反应时间较短(工作频率高)。考虑到加热器件的热惯性, 使用固态继电器在实际温度接近设定温度时可采用调节输出信号占空比的方式(即 PWM方式)来控制继电器的通断,使系统稳定时间缩短。3.设定值可被记忆。通过单片机内部的flash可记录设定的温度值,防止外部干扰导致数据的丢失。4.该系统的人性化设计。在该系统上附带了电源模块,所需电源该系统都能自己提供,供电仅仅只需要一路220V交流电,使用起来更加方便。还附带了LED指示当前状态(红色LED:升温状态;黄色LED:平衡状态;绿色LED:降温状态)、蜂鸣器报警提示、温度调整所需时间的显示等。1 绪论 在现代冶金、石油、化工、生物恒温试验及电力生产过程中,温度是极为重要而又普遍的热工参数之一。在环境恶劣或温度较高等场合下,为了保证生产过程正常安全地进行,提高产品的质量和数量,以及减轻工人的劳动强度、节约能源,要求对加热炉炉温进行测、显示、控制,使之达到工艺标准,以单片机为核心设计的炉温控制系统,可以同时采集多个数据,并将各种数据显示出来加以控制和分析。那么无论是哪种控制,我们都希望水温控制系统能够有很高的精确度,帮助我们实现我们想要的控制,解决身边的问题。该水温自动控制系统性能稳定,可适用于各种场所和环境,且该系统软件编程灵活,能够很方便地修改相关参数来适用于不同的工作环境。该系统可方便地扩展其他相应的功能,例如遥控、上位机、水位检测等,还可以扩展为多点温度检测。2 方案论证与选择1. 控制电路的方案选择方案一:采用运放等模拟电路搭建一个控制器,用模拟方式实现PID控制,对于纯粹的水温控制,这是足够的。但是附加显示、温度设定等功能,还要附加许多电路,稍显麻烦。同样,使用逻辑电路也可实现控制功能,但总体的电路设计和制作比较烦琐。方案二:采用FPGA实现控制功能。使用FPGA时,电路设计比较简单,通过相应的编程设计,可以很容易地实现控制和显示、键盘等功能,是一种可选的方案。但与单片机相比,价格较高,显然大材小用。方案三:采用单片机最小系统同时完成控制、显示、键盘、语音等功能,电路设计和制作比较简单,成本也低,是一种非常好的方案。 综上所述本设计采用方案三作为控制电路,单片机采用低功耗单片机msp430。2.测温电路方案的选择方案一:采用热敏电阻作为测温元件。热敏电阻精度高,需要配合电桥使用,要实现精度测量需要配上精密较高的电阻。此外还需要制作相应的调理电路。方案二:采用半导体集成温度传感器作为测温元件,半导体集成温度传感器应用也很广泛,它的精度、可靠性都不错,价格也适中,使用比较简单,是一个较好的选择。综上所述本设计采用方案二作为测温电路。3.加热控制方案的论证选择加热装置可以采用热得快进行加热,由于热的快的余温较大,通常加热到在与设定温度相差几度时停止加热。具体方案如下。方案一:采用单片机输出pwm作用固态继电器(用作无触点开关,相比电磁继电器,反应更快),通过固态继电器,不同占空比使得热得快产生不同的工作和停止时间之比,从而达到高精确加热的效果,并且易于控制。方案二:在与设定温度相差三度时关闭热得快,但多次试验后发现由于所要设定的温度不同误差较大。方案三:在与设定温度相差一度时关闭热得快,因为在超过所设定温度时启动制冷片进行调节,实际中不好控制,效果不佳。综上所述本设计采用方案一作为加热电路。4.制冷控制方案的论证 方案一:采用通常冰箱所采用的制冷装置压缩机,但由于体积太大成本较高,控制起来较复杂并且一般的氟利昂压缩机对环境有污染,不适合小型电路的制作。方案二:采用风扇进行制冷,但是风扇的相对制冷效果非常低,达不到题目所要求的时间限制并且功率大的风扇体积较大。方案三:采用半导体制冷片进行制冷,半导体制冷片制冷效果相对较好,但是半导体制冷片工作时还要给其散热,总体工作效率不高。方案四:用水泵进行冷水循环降温,制冷速度较快,而且能够节约能源。此外,在实际应用中可方便地运用冷水资源。 综上所述,采用方案四作为降温电路。3 系统硬件设计 该水温自动控制系统分为以下几个单元电路:电源电路、温度采集电路、加热电路、降温电路、显示电路、LED指示电路、蜂鸣器电路和按键电路。电机带动扇叶搅拌电路(搅拌使温度均匀)与单片机隔离,可手动控制。系统框图如下: 电源模块热得快温度采集电路 MCU (lanch pad)固态继电器 电磁继电器按键电路水 泵蜂鸣器报警电路12864显示电路LED指示电路 1.最小系统板lanch pad Lanch pad单片机最小系统同时完成控制、显示、键盘、语音等功能,电路设计和制作比较简单,成本也低。 2.电源模块电路 该电路采用220V18V变压器降压,然后通过整流桥整流,再经电容滤波,最后通过几种电源芯片输出所需的几种电压:+12V、+5V。 变压器是变换交流电压、电流和阻抗的器件,当初级线圈中通有交流电变压器原理图流时,铁芯(或磁芯)中便产生交流磁通,使次级线圈中感应出电压(或电流)。变压器由铁芯(或磁芯)和线圈组成,线圈有两个或两个以上的绕组,其中接电源的绕组叫初级线圈,其余的绕组叫次级线圈。 整流是利用二极管单向导电性,把方向交替变化的交流电变换成单一方向的脉动直流电。 加电容的目的是对脉动直流电进行充放电补充,就是说高电位时电容将电量进行存储,即时电压就降低;在低电位的时候电容把存储的电量释放出来来补充,即时电压就上升,这样就形成了电压基本稳定的直流电。 电源芯片L7812VC可将14.5V27V的直流电压转换成12V直流电压(给水泵供电),然后再通过电源芯片L7805VC将12V电压转换成5V电压,以给单片机供电。 具体电源模块电路如下: 3.温度采集模块DS18B20温度传感器温度测量范围-55+125,电源电压35.5V,在-10+85区间测量精度为0.5。DS18B20在与微处理器连接时仅需要一条口线即可实现微处理器与DS18B20的双向通讯。工作时性能稳定,可适用于多种不同的工作环境。具体连接电路图如下所示: 4.按键电路 该系统设定时间的调整由三个独立按键来完成,其具体电路连接图如下所示: 5.LED指示电路 该电路是通过三种不同颜色的LED来指示当前的状态,电路如下: 6.加热电路 该电路通过固态继电器隔离两路电源,同时IO口输出PWM波控制热得快的导通与断开来控制温度。具体电路图如下: 7.降温电路降温电路中,采用的是冷水循环降温,用电磁继电器隔离电源及控制水泵工作和断开,从而达到控制降温的过程。具体电路图如下所示: 8.12864显示电路显示电路采用的是12864液晶屏串行显示,可显示检测温度、设定温度以及温度达到平衡所用的时间。具体电路图如下所示:9. 蜂鸣器报警电路 蜂鸣器在该系统中可起到报警的作用,温度平衡之后会报警提醒,设定温度时会提示设定生效,系统工作正常。具体电路图如下所示: 4 系统软件设计 程序结构包括:主控程序模块、键盘扫描及处理子程序、采样数据处理子程序、多种算法子程序、显示及蜂鸣指示等子程序几个部分。1.程序流程图如下图所示,实现了对温度值的设定,执行、蜂鸣指示达到指定温度、显示实时温度。 2.附源程序 2.1 lcd12864驱动程序:#include #define uchar unsigned char#define uint unsigned intvoid int_port(void) P2SEL&=BIT5; P2DIR|=BIT5;P2OUT&=BIT5;P2SEL&=BIT4; P2DIR|=BIT4;P2OUT&=BIT4;void delay(uint t) uint i,j;for(i=0; it; i+)for(j=0; j10; j+);void sendbyte(uchar zdata) uchar code_seg7;uchar serial_clk;uchar serial_shift;code_seg7=zdata;serial_shift=0x80;for(serial_clk=0; serial_clk1; void write_com(unsigned char cmdcode)sendbyte(0xf8); sendbyte(cmdcode & 0xf0); sendbyte(cmdcode 4) & 0xf0);delay(2);void write_data(uchar Dispdata)sendbyte(0xfa); sendbyte(Dispdata & 0xf0); sendbyte(Dispdata 0) write_data(*s); s+;delay(50);void LCD_12864_address_set( uchar x,uchar y )uchar Address ;switch( y )case 1 : Address = 0x80 + (x - 1); break;case 2 : Address = 0x90 + (x - 1); break;case 3 : Address = 0x88 + (x - 1); break;case 4 : Address = 0x98 + (x - 1); break;default : break;write_com(Address);void LCD_12864_string( uchar y, uchar x, uchar *pData )LCD_12864_address_set( x, y );while( *pData != 0 )write_data(*pData+);void LCD_12864_2num(uchar y,uchar x,uchar num)uchar num_1, num_2;LCD_12864_address_set(x, y);num_2 = (num/10) + 0x30;num_1 = (num%10) + 0x30;write_data(num_2);write_data(num_1);void LCD_12864_4num(uchar y,uchar x,uint num)uchar num_1, num_2, num_3, num_4 ;LCD_12864_address_set(x, y);num_4 = (num/1000) + 0x30;num_3 = (num%1000)/100) + 0x30;num_2 = (num%1000)%100)/10) + 0x30;num_1 = (num%1000)%100)%10) + 0x30;write_data(num_4);write_data(num_3);write_data(num_2);write_data(num_1);void LCD_12864_numx(uchar y,uchar x,uchar numx)uchar num_l, num_h;LCD_12864_address_set(x, y);num_l = numx & 0x0F; num_h = numx 4; if(num_l 9) num_l = num_l + 0x37;else num_l = num_l + 0x30;if(num_h 9) num_h = num_h + 0x37;else num_h = num_h + 0x30;write_data(num_h);write_data(num_l);void LCD_12864_draw_clear(void)uchar i, j, k;write_com(0x34); for(i=0;i2;i+)for(j=0;j32;j+)write_com(0x80+j); if(i=0)write_com(0x80);elsewrite_com(0x88);write_com(0x36); for(k=0;k16;k+) write_data(0x00);write_com(0x30); void LCD_12864_draw(uchar *p)uchar i, j, k;LCD_12864_draw_clear(); write_com(0x34); for(i=0; i2; i+)for(j=0; j32; j+)write_com(0x80+j); if(i=0)write_com(0x80); elsewrite_com(0x88);write_com(0x36); for(k=0; k16; k+) write_data(*p+); write_com(0x30); void Test() LCD_12864_string(1,2,水温控制系统); LCD_12864_string(2,1,检测温度 .C);LCD_12864_string(3,1,设定温度 .C);LCD_12864_string(4,1,所用时间: s); 2.2 主程序:#include #include lcd12864.h#define DS18B20 BIT3#define DS18B20_H P2OUT |= BIT3#define DS18B20_L P2OUT &= BIT3/#define DQ_l P2OUT &=BIT3;/#define DQ_h P2OUT |=BIT3;#define uchar unsigned char#define uint unsigned intuchar TempBuffer7,table25,buttonsPressed=0,table16,flag1=1,flag3=0,flag2=0; /flag4=0,flag5=0,times=0;uint temperature = 0,TIME1=0,value1=440,value=30;float tem=0.0;uchar * Flash_ptr = (uchar *) 0x01000;void Delay_ms(uint ms) uint j; for(j=0;jms;j+) _delay_cycles(1000);void B20_init(void) P2DIR |= DS18B20; /Delay_us(600); _delay_cycles(600); DS18B20_H; /Delay_us(60); _delay_cycles(60); P2DIR &= DS18B20; while(!(P2IN &(DS18B20); uchar B20_readB(void) uchar i,retd=0; for(i=0;i=1; P2DIR |=DS18B20; /Delay_us(5); _delay_cycles(5); P2DIR &=DS18B20; if(P2IN&DS18B20) retd|=0x80; /Delay_us(50); _delay_cycles(50); return retd; void B20_writeB(uchar wrd) uchar i; for(i=0;i=1; / Delay_us(50); _delay_cycles(50);uint Read_temp(void) uchar templ,temph; uint temp; B20_init(); B20_writeB(0x44); Delay_ms(10); B20_init(); B20_writeB(0xcc); B20_writeB(0xbe); templ=B20_readB(); temph=B20_readB(); temp=templ+temph*256; void temp_to_str() temperature=Read_temp(); tem=temperature*0.0625;/?*0.0625; TempBuffer0=:; TempBuffer1=(unsigned int)tem/10+0; TempBuffer2=(unsigned int)tem%10+0; TempBuffer3=.; TempBuffer4=(unsigned int)(tem*1000.0)%10000%1000/100+0; / TempBuffer5= (unsigned int)(tem*1000.0)%10000%1000%100/10+0; / TempBuffer6= (unsigned int)(tem*1000.0)%10+0; TempBuffer5=0;void wint () P1OUT |=BIT0 +BIT1+BIT2; P1REN |=BIT0 +BIT1+BIT2; P1IN |=BIT0 +BIT1+BIT2; P2DIR |=BIT0 +BIT1+BIT2+BIT6; P2OUT &=(BIT0 +BIT2); P2SEL |=BIT1; P1DIR |=BIT6+BIT7 + BIT3; P1OUT &=BIT3; P1OUT |=BIT7+BIT6; TA1CCR0 = 512-1; / PWM Period TA1CCTL1 = OUTMOD_7; / CCR1 reset/set TA1CCR1 = 511; / CCR1 PWM duty cycle TA1CTL = TASSEL_1 + MC_1; / ACLK, up modevoid key_bee1(void) uchar i; / for(i=0;i20;i+) / / _delay_cycles(1000); / P1OUT &=BIT7; / Delay_ms(400); /P1OUT |=BIT7; / for(i=0;i10;i+) for(i=0;i200;i+) P1OUT &=BIT7; _delay_cycles(400); P1OUT |=BIT7; P1OUT |=BIT7; Delay_ms(100); void key_bee2(void) uchar i; for(i=0;i4;i+) for(i=0;i200;i+) P1OUT |=BIT7; _delay_cycles(400); P1OUT &=BIT7; _delay_cycles(100); P1OUT |=BIT7; Delay_ms(200); void time_process () if(flag3=4)/4 TIME1+;flag3=0; table20=:; table21=TIME1/100+0; table22=TIME1%100/10+0; table23=TIME1%10+0; / TempBuffer5= (unsigned int)(tem*1000.0)%10000%1000%100/10+0; / TempBuffer6= (unsigned int)(tem*1000.0)%10+0; table24=0;void write_SegC(uchar value2) / Initialize Flash pointer FCTL3 = FWKEY; / Clear Lock bit FCTL1 = FWKEY+ERASE; / Set Erase bit *Flash_ptr = 0; / Dummy write to erase Flash seg FCTL1 = FWKEY+WRT; / Set WRT bit for write operation /for (i = 0; i 900) value=250; write_SegC(value/10); TIME1=0;flag3=0; CCTL0 |= CCIE ; TACTL |=TACLR; TACTL |= MC_1+TASSEL_1; / CCR0 interrupt enabled buttonsPressed=0; while (buttonsPressed &BIT1) value=value-10; if(valuetem1) TA1CCR1 =0; P1OUT |=BIT6; P2OUT |=BIT2; P2OUT &=BIT0 ;P1OUT &=BIT3 ;/ else if(value-2tem1) TA1CCR1 =256;P1OUT |=BIT6; P2OUT |=BIT2; P2OUT &=BIT0 ;P1OUT &=BIT3 ;/ else if(value-1tem1) TA1CCR1 =300; P1OUT |=BIT6; P2OUT |=BIT2; P2OUT &=BIT0 ;P1OUT &=BIT3 ;/ /384/ /else TA1CCR1 =480;/ else if(value*10.0)(term*10+1) TA1CCR1 =400; P1OUT |=BIT6; P2OUT |=BIT2; P2OUT &=BIT0 ;P1OUT &=BIT3 ; flag1=1; flag4=1; flag5=0;times=0; / else if(value*10.0)(tem*10+2) P2OUT |=BIT2; P2OUT &=BIT0 ;P1OUT &=BIT3 ; flag1=1; else if(value*1.0)tem1) TA1CCR1 =0; P1OUT |=BIT6; P2OUT |=BIT2; P2OUT &=BIT0 ;P1OUT &=BIT3 ; else if(value/10-2tem1) TA1CCR1 =256;P1OUT |=BIT6; P2OUT |=BIT2; P2OUT &=BIT0 ;P1OUT &=BIT3 ; else if(value/10-1tem1) TA1CCR1 =300; P1OUT |=BIT6; P2OUT |=BIT2; P2OUT &=BIT0 ;P1OUT &=BIT3 ; /else if(value*1.0)(tem*10+3) TA1CCR1 =350; P1OUT |=BIT6; P2OUT |=BIT2; P2OUT &=BIT0 ;P1OUT &=BIT3 ; /384 /else TA1CCR1 =480;銆? else if(value*1.0)(tem*10) TA1CCR1 =320; P1OUT |=BIT6; /340 /else if(value*1.0)(tem*10) P1OUT &=BIT6; TA1CCR1 =511; else TA1CCR1 =500;P1OUT &=BIT6; /450void main()WDTCTL=WDTPW+WDTHOLD; /if (CALBC1_1MHZ =0xFF | CALDCO_1MHZ = 0xFF) while(1); / If calibration constants erased / do not load, trap CPU! BCSCTL1 = CALBC1_1MHZ; / Set DCO to 1MHz DCOCTL = CALDCO_1MHZ;wint ();int_port(); CCR0 =820;/900_EINT();FCTL2 = FWKEY + FSSEL0 + FN1; / MCLK/3 for Flash Timing Generator / initialize valuelcdinit(); value =*Flash_ptr;value=value * 10;while(1) P1IN |=BIT0 +BIT1+BIT2; key (); /copy_C2D(); / Copy segment C to D time_process (); LCD_12864_string(4,5,table2); table10=:; table11=value/100 +48; table12=value%100/10 +48 ; table13= .; table14=value%1
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 村级安全员考试题及答案
- 产科医师考试题库及答案
- 中国新质生产力发展白皮书
- 大学生辩论赛策划方案
- 新质生产力的研究结论
- 税收政策如何促进新质生产力发展
- 新质生产力:提出背景与意义
- 新质生产力:标杆企业解析
- 新质生产力:未来工作岗位新图景
- 新质生产力企业认知框架
- 高三一轮复习课件
- 人教版九年级上册数学全册课件PPT
- 儿科学 第6讲蛋白质-能量营养不良
- 绿色化学与化工技术进展
- 消化道出血的内镜治疗
- GB/T 11275-2007表面活性剂含水量的测定
- PICC置管后常见并发症的处理教育课件
- 视网膜静脉阻塞课件整理
- 督查督办培训课件
- 多媒体技术复习题及参考答案
- 北师大版义务教育小学数学教材知识体系整理
评论
0/150
提交评论