电子竞赛——温度传感器控制_第1页
电子竞赛——温度传感器控制_第2页
电子竞赛——温度传感器控制_第3页
电子竞赛——温度传感器控制_第4页
电子竞赛——温度传感器控制_第5页
已阅读5页,还剩13页未读 继续免费阅读

下载本文档

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

文档简介

1、 摘 要本作品主要做了一个以51单片机、pt100传感器、威尔逊1mA恒流电流源、差分放大器、pwm驱动电路的温度测量与控制,并能实现温度的测量与显示。首先我们做了硬件部分:威尔逊1mA恒流电流源、差分放大器,并能稳定的输出0.98mA的电流;pt100经过差分放大器放大后输出3.85v的电压。其次我们做了软件部分:用51单片机AD采样模块采样pt100经过放大的电压,根据pt100的特性计算出温度值并用数码管显示;用51单片机发出pwm脉冲控制驱动电路使得陶瓷电阻根据需求发热。 关键字:51单片机 威尔逊电流 差分放大器 pwm驱动电路1.设计方案 1.1系统框图温度测量(采集)陶瓷电阻数据

2、处理(单片机)驱动电路 1.2控制方框图驱动电路陶瓷管温度改变产生控制信号pwm与预设温度比较采集当前温度预设温度值2. 方案论证2.1主控部分方案一:MSP430单片机。MSP430是16位的、低功耗、集成度较高,标准的51单片机没有这些功能,但工作电压偏低,1.8V-3.6V,对于很多5V的系统来说接口电路颇为麻烦。方案二:AVR单片机。AVR速度快,功能强大,种类多,视乎都是优点。不过,就指令系统而言,不如51精简,位操作不如51方便。方案三:51单片机。系列单片机是八位单片机,具有价格低廉、程序编写简、功能强大具有AD模块操作简单等特点。综上分析选择方案三。2.2显示部分方案一:lcd

3、显示屏。省电,不产生高温。但配套的lcd显示不清楚。方案二:数码管显示。优点:亮度高,显示大,驱动部份的软件简单。缺点功耗大一点。综上分析选择方案二。2.3恒流源部分方案一:镜像电流源。优点结构简单,可以提供毫安级的电流,但在测试中电流随负载的变化而变化。方案二:威尔逊电流源。优点输出时电阻无穷大,电流不随负载变化而变化。综上分析选择方案二。2.4放大器部分方案一:同相放大器。能输出高阻抗,除了差模放大器有较大的共模电压,但抗干扰能力差。方案二:差模放大器。抗干扰能力好,能将pt100的微小的阻值变化放大为电压变化。综上分析选择方案二。2.5驱动电路部分方案一:一旦运行20欧的陶瓷电阻就会烧短

4、。方案二: 此方案简单易操作,通过控制pwm的脉冲控制三极管的导通实现对电阻加热的控制。综上分析选择方案二。3硬件电路和软件设计3.1总体硬件电路3.2软件设计3.2.1系统程序流程图将系统程序烧入单片机,完成一系列的初始化,如定时器、IO接口等,用数码管显示传感器温度,如果没达到45°则继续持续升温,否则保持45°恒温不变一分钟,再快速 升温至60°,如果没达到则继续加大驱动电路的输出占空比,否则保持恒温60°不变两分钟,最后利用独立按键指定传感器温度,并保持该温度不变。3.2.2读取电压值程序利用AD读取传感器电压放大后的电压值,根据传感器电压和温度

5、的关系Uo=0.255+T/1000即可得到温度传感器的当前温度,用数码管显示传感器的当前温度值,对温度值进行判断,如果没有达到45°,则给驱动电路一个控制信号,间接给传感器升温,否则保持该温度一分钟不变,在程序中利用延迟与加热的方式进行动态保持温度不变;一分钟过后,加大驱动电路(PWM)输出的占空比,使传感器的温度快速达到60°,同理,如果达到60°,则保持该温度两分钟不变(要求至少一分钟)。程序能实现升温中、保持45°一分钟、保持60°两分钟三个阶段。3.3.3按键指定温度值程序实验要求指定温度值范围在45°到65°之间

6、,程序中利用八个独立按键输入两位数,按键K1K8分别对应数字07,该程序能够随意键入两个值并在数码管上显示所键入值。3.3.4读取程序与案件程序的结合出现的问题为了能够整体实现读取温度同时能修改温度,让传感器的温度能够保持在指定的温度值上,将电位器读取到的电压值程序与独立按键程序相结合,利用count2计K1K7键人已被按下的次数,count3计K8键被按下的次数,在八个独立按键中K8将作为“开始”(第一次按下)和“确定”(第二次按下)键,其余七个按键作为指定传感器温度所用到的赋值键,在while(1)循环语句中首先扫描按键是否按下,接着是判断按下的键是哪一个键,如果是K7键同时K7键按下的次

7、数是第一次,则开始运行获取传感器电压放大后的值的程序,再将所获得的电压值进行缩小到传感器的实际没放大的电压值,最后利用传感器的电压与温度的关系式,得出温度值,利用数码管显示当前温度值。保持传感器60°不变两分钟后,突然设置传感器的指定温度值,则需中断读取电压值程序,转而实行按键程序,如果count2=2 && count3=2,则根据当前传感器温度与指定温度进行比较,如果指定温度高于当前传感器的温度,则对传感器升温处理,否则进行降温处理,使其达到指定的温度值。出现的问题是不知道怎么才能控制传感器的温度的分辨率为0.2°和1°,而且将整个程序烧进去后

8、有时出现数码管能亮,但现实的值并不对,而且按键也不能控制,有时数码管不亮和按键不能键入值的情况。当时两个程序单独的情况下没有问题。4. 功能测试4.1测试仪器测试仪器名称用 途Pc机下载烧写程序万用表测电压、电流稳压电源提供电压4.2功能测试4.2.1基本功能测试实验内容第一次情况第二次情况第三次情况第四次情况1mA恒流电流源用镜像电流随负载的变化而变化没有正确测量电流值改用威尔逊电流获得稳定的0.983mA的电流正常工作放大器用同相放大器不能取得pt100的电压差改用差模放大器,正确的放大到3.85v正常工作驱动电路仿真的时候,有电阻短路不能为陶瓷电阻提供电压还是不能正常工作不能正常工作AD

9、采样与显示用lcd,显示的不清楚改用数码管,能正确的获取和显示正常工作Pwm脉冲的输出用马达仿真,0到40度正常,40度后就一直加热程序还是不能正常运行,陷入死循环找出问题正常工作4.2.2发挥部分 没有测试。总结:虽然这次比赛完成的并不好,与之前没有经过培训和相关的赛前准备,完全是对所学的和网上现学现用的运用。我们能坚持完三天对于我们也是一种胜利吧!通过这次比赛学到最多的就是理想和现实差距是很大的,仿真做的很好而不管自己怎么搭电路就是和仿真不一样。我们大学时间也不多了,希望以后能多参加这类比赛。附录:#include<reg51.h>#include <intrins.h&

10、gt;#include "i2c.c"/-定义使用的IO-/#define GPIO_KEY P3 /独立键盘用P3口#define GPIO_DIG P0sbit LSA=P22;sbit LSB=P23;sbit LSC=P24;/-定义使用的IO口-/sbit PWM=P10;/-定义PCF8591的读写地址-/#define WRITEADDR 0x90 /写地址#define READADDR 0x91 /读地址/-定义全局变量-/unsigned char code DIG_CODE17=0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x

11、07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71;/0、1、2、3、4、5、6、7、8、9、A、b、C、d、E、F的显示码unsigned char DisplayData8;/用来存放要显示的8位数的值/-定义一个全局变量-/unsigned char timer1; unsigned int adNum;int count2=0;/计数 int count=0;int count3 = 0;unsigned char decimal = 0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF;unsigned char keyNum;int

12、 sw = 0;int gw = 0;float value;float cvalue;float tvalue;int i=0;int j=0; /-声明全局函数-/void getDisplayData(unsigned int adNum);void setDisplayData(unsigned int adNum);void DigDisplay(); /动态显示函数void Pcf8591SendByte(unsigned char channel);unsigned char Pcf8591ReadByte();void Pcf8591DaConversion(unsigned

13、char value);void DigDisplay();void Delay(unsigned int d);void Time1Config();void Speed(int t);float getTemp();void accerTemp();unsigned char Key_Scan();void DigDisplay();void setKey1();void setKey2();void setKey3();void setKey4();void setKey5();void setKey6();void setKey7();/* 函 数 名 : main* 函数功能 : 主

14、函数* 输 入 : 无* 输 出 : 无*/void main()Time1Config();while(1)IntConfiguration();keyNum = Key_Scan(); /扫描键盘/检测所按的按键号testKeyNum(keyNum);/显示AD读取到传感器放大后的电压值对应的温度值accerTemp(); /检测按下的按键是K1K7中的哪一个,执行相应的操作即数字设置void testKeyNum(unsigned int keyNum) if (keyNum != 0 && keyNum != 0xFB) /有按键按下count2+;switch (ke

15、yNum)case(0xFE) : /返回按键K1的数据setKey1();break;case(0xFD) : /返回按键K2的数据setKey2();break;case(0xFB) : /返回按键K3的数据setKey3();break;case(0xF7) : /返回按键K4的数据setKey4();break;case(0xEF) : /返回按键K5的数据setKey5();break;case(0xDF) : /返回按键K6的数据setKey6();break;case(0xBF) : /返回按键K7的数据setKey7();break;default:break;DigDispl

16、ay(); /显示AD读取到传感器放大后的电压值对应的温度值void accerTemp()if(count3=1)adNum = getTemp()*100;/保留两位小数getDisplayData(adNum);if(getTemp()>=0 && getTemp()<45) while(getTemp()<45) for(i=0;i<100;i+)Speed(30);adNum = getTemp() * 100; /保留两位小数getDisplayData(adNum); if(getTemp()>=45 && getTe

17、mp() < 47)for(i=0;i<60;i+)Delay(30);for(j=0;j<100;j+)Speed(30);adNum = getTemp() * 100; /保留两位小数getDisplayData(adNum);count+; if(count = 60 && getTemp()>=45 && getTemp() < 47)while(getTemp()<60) for(i=0;i<100;i+)Speed(80);adNum = getTemp() * 100; /保留两位小数getDisplay

18、Data(adNum);if(getTemp()>=60 && getTemp()<62) for(i=0;i<140;i+)Delay(30);for(j=0;j<100;j+)Speed(30);adNum = getTemp() * 100; /保留两位小数getDisplayData(adNum); elsefor(i=0;i<7;i+)if(DisplayData2 = decimali)sw = i;if(DisplayData3 = decimali)gw = i; tvalue= sw*10+gw;/如果指定温度大于当前温度if(t

19、value>getTemp()while(getTemp()<tvalue) for(j=0;j<100;j+)Speed(20);if(getTemp()>=tvalue && getTemp()<tvalue+1)for(i=0;i<100000000;i+)Delay(30);for(j=0;j<100;j+)Speed(20);else if(tvalue<getTemp()/如果指定温度小于当前温度while(tvalue<getTemp()Delay(30);if(getTemp()>=tvalue &am

20、p;& getTemp()<tvalue+1)for(i=0;i<100000000;i+)Delay(30);for(j=0;j<100;j+)Speed(20);/获取当前温度值float getTemp() /-显示电位器电压-/Pcf8591SendByte(3); /外部输入接受命令adNum = Pcf8591ReadByte()*2;/将转换结果读走/-我们8591每读取到一个1就表示5/256V,所以要知道电压值就乘以0.01953-/value = adNum / 2 * 0.01953; /转为电压值cvalue = value/36.45;tva

21、lue=(cvalue-0.255)*1000;return tvalue;/设置显示LCDvoid getDisplayData(unsigned int adNum)setDisplayData(adNum);/-DA输出-/Pcf8591DaConversion(adNum/2); /DAC 数模转换void setDisplayData(unsigned int adNum)DisplayData0 = DIG_CODEadNum / 1000; /发送显示数据DisplayData1 = DIG_CODEadNum % 1000 / 100 | 0x80; /或上0x80是加小数点D

22、isplayData2 = DIG_CODEadNum % 100 / 10;DisplayData3 = DIG_CODEadNum % 10;DisplayData4 = DisplayData0;DisplayData5 = DisplayData1;DisplayData6 = DisplayData2;DisplayData7 = DisplayData3;DigDisplay();/ 写入一个控制命令void Pcf8591SendByte(unsigned char channel)I2C_Start();I2C_SendByte(WRITEADDR, 1); /发送写器件地址I

23、2C_SendByte(0x40|channel, 0); /发送控制寄存器I2C_Stop();/读取一个转换值unsigned char Pcf8591ReadByte()unsigned char dat;I2C_Start();I2C_SendByte(READADDR, 1);/发送读器件地址dat=I2C_ReadByte(); /读取数据I2C_Stop(); /结束总线 return dat;/PCF8591的输出端输出模拟量void Pcf8591DaConversion(unsigned char value)I2C_Start();I2C_SendByte(WRITEAD

24、DR, 1);/发送写器件地址I2C_SendByte(0x40, 1); /开启DA写到控制寄存器I2C_SendByte(value, 0); /发送转换数值I2C_Stop();/ 数码管显示void DigDisplay()unsigned char i;unsigned int j;for(i=0;i<8;i+)switch(i) /位选,选择点亮的数码管,case(0):LSA=0;LSB=0;LSC=0; break;/显示第0位case(1):LSA=1;LSB=0;LSC=0; break;/显示第1位case(2):LSA=0;LSB=1;LSC=0; break;/

25、显示第2位case(3):LSA=1;LSB=1;LSC=0; break;/显示第3位case(4):LSA=0;LSB=0;LSC=1; break;/显示第4位case(5):LSA=1;LSB=0;LSC=1; break;/显示第5位case(6):LSA=0;LSB=1;LSC=1; break;/显示第6位case(7):LSA=1;LSB=1;LSC=1; break;/显示第7位 GPIO_DIG=DisplayDatai;/发送段码j=50; /扫描间隔时间设定while(j-);GPIO_DIG=0x00;/消隐/设置定时器void Time1Config()TMOD|=

26、 0x10; /设置定时计数器工作方式1为定时器/-定时器赋初始值,12MHZ下定时0.5ms-/ TH1 = 0xFE; TL1 = 0x0C;ET1 = 1; /开启定时器1中断EA = 1;TR1 = 1; /开启定时器/定时器1的中断函数void Time1(void) interrupt 3 /3 为定时器1的中断号TH1 = 0xFE; /重新赋初值TL1 = 0x0C;timer1+; void Delay(unsigned int c) /误差 0us unsigned char a, b; for (;c>0;c-)for (b=38;b>0;b-)for (a=

27、130;a>0;a-); void Speed(int t)if(timer1>100) /PWM周期为100*0.5mstimer1=0;else if(timer1 < t)/改变30这个值可以改变直流电机的速度PWM=1;elsePWM=0;unsigned char Key_Scan()unsigned char keyValue = 0 , i; /保存键值if (GPIO_KEY != 0xFF)/检测按键K1是否按下Delay(1);/消除抖动if (GPIO_KEY != 0xFF)/再次检测按键是否按下keyValue = GPIO_KEY;i = 0;while (i<50) && (GPIO_KEY != 0xFF) /检测按键是否松开Delay(1);i+;return keyValue; /将读取到键值的值返回/设置按键1在数码管显示的对应数值void setKey1()if(count2=1)DisplayData3 =

温馨提示

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

评论

0/150

提交评论