基于单片机的温度控制电机转速课程设计剖析.docx
《基于单片机的温度控制电机转速课程设计剖析.docx》由会员分享,可在线阅读,更多相关《基于单片机的温度控制电机转速课程设计剖析.docx(25页珍藏版)》请在冰点文库上搜索。
基于单片机的温度控制电机转速课程设计剖析
6.4仿真模块14
1引言
随着人们生活水平的不断提高,单片机控制无疑是人们追求的目标之一,它所给人带来的方便是不可否定的,各种数字系统的应用也使人们的生活更加舒适。
数字化控制、智能控制为现代人的工作、生活、科研等方面带来方便。
其中温度控制电机转速就是利用单片机实现的典型实例。
测量温度时使用数字温度计,其与传统的温度计相比,具有读数方便、测温范围广、测温精确、功能多样话等优点。
其主要用于对测温要求准确度比较高的场所,或科研实验室使用,该设计使用STC89C51单片机作控制器,数字温度传感器DS18B20测量温度,单片机接受传感器输出,经处理用LCD实现温度值显示。
电机由L298电机驱动芯片控制,实现电机的正反转和加速减速.
2设计要求
2.1设计目的
设计一个基于温度的电动机转速控制电路,在相应的软件控制下可以完成要求的功能,即外部温度大于65C时,直流电动机在L298驱动下加速正转,温度大于75C全速正转,当外部温度小于0C时电动机加速反转,温度小于-10C时电动机全速反转。
温度回到0C-65C时电动机逐渐停止转动。
在液晶显示屏1602LCD上显示当前的温度值。
2.2基本要求
控制电机正反转即加速减速,实现实时温度显示,测温范围-55~1280C,误差50C以内。
画出基于温度的电动机转速控制电路的原理图,通过仿真软件来检测所写程序实现功能的正确与否.
3方案设计
3.1温度传感器方案论证
3.1.1方案一
由于本设计是测温电路,可以使用热敏电阻之类的器件,将随被测温度变化的电压或电流采样,进行A/D转换后就可以用单片机进行数据处理,实现温度显示。
这种设计需要用到A/D转换电路,增大了电路的复杂性,而且要做到高精度也比较困难。
3.1.2方案二
考虑到在单片机属于数字系统,容易想到数字温度传感器,可选用DS18B20数字温度传感器,此传感器为单总线数字温度传感器,起体积小、构成的系统结构简单,它可直接将温度转化成串行数字信号给单片机处理,即可实现温度显示。
另外DS18B20具有3引脚的小体积封装,测温范围为-55~+125摄氏度,测温分辨率可达0.0625摄氏度,其测量范围与精度都能符合设计要求。
以上两种方案相比较,第二种方案的电路、软件设计更简单,此方案设计的系统在功耗、测量精度、范围等方面都能很好地达到要求,故本设计采用方案二。
3.2总体设计框图
本方案设计的系统由单片机系统、DS18B20数字温度传感器、LCD温度显示模块、L298电机驱动模块、电机组成,其总体架构如下图1。
图1系统总体方框图
4硬件设计
4.1单片机系统
1.本设计采用STC89C52单片机作为控制器,完成所有功能的控制,包括:
●DS18B20数字温度传感器的初始化和读取温度值
●LCD显示驱动与控制
●L298电机驱动芯片驱动电机
●温度值的存储和读取
2.单片机系统电路原理图:
图2单片机系统原理图
4.2数字温度传感器模块
4.2.1DS18B20性能
●独特的单线接口仅需一个端口引脚进行通信
●简单的多点分布应用
●无需外部器件
●可通过数据线供电
●零待机功耗
●测温范围-55~+128℃,以1℃递增
●可编程的分辨率为9~12位,对应的可分辨温度分别为0.5℃、0.25℃、0.125℃和0.0625℃
●温度数字量转换时间200ms,12位分辨率时最多在750ms内把温度转换为数字
●应用包括温度控制、工业系统、消费品、温度计和任何热感测系统
●负压特性:
电源极性接反时,传感器不会因发热而烧毁,但不能正常工作
4.2.2DS18B20外形及引脚说明
图3DS18B20外形及引脚
●GND:
地
●DQ:
单线运用的数据输入/输出引脚
●VD:
可选的电源引脚
4.2.3DS18B20接线原理图
单总线通常要求接一个约4.7K左右的上拉电阻,这样,当总线空闲时,其状态为高电平。
图4DS18B20接线原理图
4.2.4DS18B20时序图
主机使用时间隙来读写DS18B20的数据位和写命令字的位。
1.初始化时序如下图:
图5DS18B20初始化时序
2.DS18B20读写时序:
图6DS18B20读写时序
4.2.5数据处理
高速暂存存储器由9个字节组成,其分配如表5所示。
当温度转换命令发布后,经转换所得的温度值以二字节补码形式存放在高速暂存存储器的第0和第1个字节。
单片机可通过单线接口读到该数据,读取时低位在前,高位在后。
图7字节分配
下表为12位转化后得到的12位数据,存储在18B20的两个8比特的RAM中,二进制中的前面5位是符号位,如果测得的温度大于0,这5位为0,只要将测到的数值乘于0.0625即可得到实际温度;如果温度小于0,这5位为1,测到的数值需要取反加1再乘于0.0625即可得到实际温度。
例如+125℃的数字输出为07D0H,
实际温度=07D0H*0.0625=2000*0.0625=125℃。
例如-55℃的数字输出为FC90H,则应先将11位数据位取反加1得370H(符号位不变,也不作运算),
实际温度=370H*0.0625=880*0.0625=55℃。
可见其中低四位为小数位。
图8DS18B20温度数据表
4.3关于L298电机驱动芯片的简介
L298是ST公司生产的一种高电压、大电流电机驱动芯片。
该芯片的主要特点是:
工作电压高,最高工作电压可达46V;输出电流大,瞬间峰值电流可达3A,持续工作电流为2A;内含两个H桥的高电压大电流全桥式驱动器,可以用来驱动直流电动机和步进电动机、继电器、线圈等感性负载;采用标准TTL逻辑电平信号控制;具有两个使能控制端,在不受输入信号影响的情况下允许或禁止器件工作;有一个逻辑电源输入端,使内部逻辑电路部分在低电压下工作;可以外接检测电阻,将变化量反馈给控制电路。
4.4显示电路
LCD显示简单明了,可以直接读出温度值。
图9LCD驱动显示电路
5应用软件介绍
5.1Proteus仿软真件的介绍
Proteus是一款Labcenter出品的电路分析实物仿真系统,可仿真各种电路和IC,并支持单片机,元件库齐全,使用方便,是不可多得的专业的单片机软件仿真系统。
该软件的特点:
(1)全部满足我们提出的单片机软件仿真系统的标准,并在同类产品中具有明显的优势。
(2)具有模拟电路仿真、数字电路仿真、单片机及其外围电路组成的系统的仿真、RS一232动态仿真、1 C调试器、SPI调试器、键盘和LCD系统仿真的功能;有各种虚拟仪器,如示波器、逻辑分析仪、信号发生器等。
③ 目前支持的单片机类型有:
68000系列、8051系列、AVR系列、PIC12系列、PIC16系列、 PIC18系列、Z80系列、HC11系列以及各种外围芯片。
④ 支持大量的存储器和外围芯片。
总之该软件是一款集单片机和SPICE分析于一身的仿真软件,功能极其强大 ,可仿真51、AVR、PIC。
5.2 Keil软件
Keil C51是美国Keil Software公司出品的51系列兼容单片机C语言软件开发系统,与汇编相比,C语言在功能上、结构性、可读性、可维护性上有明显的优势,因而易学易用。
用过汇编语言后再使用C来开发,体会更加深刻。
Keil C51软件提供丰富的库函数和功能强大的集成开发调试工具,全Windows界面。
另外重要的一点,只要看一下编译后生成的汇编代码,就能体会到Keil C51生成的目标代码效率非常之高,多数语句生成的汇编代码很紧凑,容易理解。
在开发大型软件时更能体现高级语言的优势。
6软件设计
6.1主程序模块
主程序流程图:
主程序流程图
6.2读温度值模块
读温度值模块需要调用4个子程序,分别为:
●DS18B20初始化子程序:
让单片机知道DS18B20在总线上且已准备好操作
●DS18B20写字节子程序:
对DS18B20发出命令
●DS18B20读字节子程序:
读取DS18B20存储器的数据
●延时子程序:
对DS18B20操作时的时序控制
1.读温度值模块流
读温度值子程序流程图
2.DS18B20初始化子程序流程图:
N
Y
DS18B20初始化子程序流程图
3.DS18B20写字节和读字节子程序流程图:
DS18B20写字节子程序流程图DS18B20读字节子程序流程图
6.3中断模块
中断采用T0方式1,初始值定时为50ms。
中断模块需调用两个子程序:
●读温度值子程序:
定时读取温度值,实时更新温度值
●记录温度值子程序:
定时记录温度值,供查询使用
把这两个子程序放在中断的原因是,不会因为调整报警温度或查询历史温度值而停止更新温度值和记录温度值。
中断模块流程图:
Y
N
中断模块流程图
6.3中断模块
仿真图
65℃-125℃
0℃-65℃
35℃-0℃
7源程序
#include
#include
#include
#defineINT8Uunsignedchar
#defineINT16Uunsignedint
externINT8UTemp_Value[];
externINT8Uread_Temperature();
externvoiddelay_ms(INT16Ux);
externvoidLCD_Initialise();
externvoidLCD_ShowString(INT8U,INT8U,INT8U*)reentrant;
sbitMA=P1^0;
sbitMB=P1^1;
sbitPWM1=P1^2;
INT8UBack_Temp_Value[]={0xFF,0XFF};
charTemp_Disp_Buff[17];
floatf_Temp=35.0;
voidT0_INT()interrupt1
{
staticINT8Ut_Count=0;
TH0=(INT16U)(-11.0592/12*500)/256;
TL0=(INT16U)(-11.0592/12*500)%256;
if(++t_Count==100)
{
t_Count=0;
if(Read_Temperature())
{
if(Temp_Value[0]!
=Back_Temp_Value[0]||Temp_Value[1]=Back_Temp_Value[1])
{
Back_Temp_Value[0]=Temp_Value[0];
Back_Temp_Value[1]=Temp_Value[1];
f_Temp=(int)(Temp_Value[1]<<8|Temp_Value[0]*0.0625;
sprintf(Temp_Disp_Buff,"TEMP:
%5.1f\xDF\x43",f_Temp);
LCD_ShowString(1,0,Temp_Disp_Buff);
}
}
}
if(f_Temp>=75)f_Temp=75;
if(f_Temp<=0)f_Temp=0;
if(f_Temp>=45)
{
MA=1;MB=0;
#include
#include
#include
#defineINT8Uunsignedchar
#defineINT16Uunsignedint
externINT8UTemp_Value[];
externINT8Uread_Temperature();
externvoiddelay_ms(INT16Ux);
externvoidLCD_Initialise();
externvoidLCD_ShowString(INT8U,INT8U,INT8U*)reentrant;
sbitMA=P1^0;
sbitMB=P1^1;
sbitPWM1=P1^2;
INT8UBack_Temp_Value[]={0xFF,0XFF};
charTemp_Disp_Buff[17];
floatf_Temp=35.0;
voidT0_INT()interrupt1
{
staticINT8Ut_Count=0;
TH0=(INT16U)(-11.0592/12*500)/256;
TL0=(INT16U)(-11.0592/12*500)%256;
if(++t_Count==100)
{
t_Count=0;
if(Read_Temperature())
{
if(Temp_Value[0]!
=Back_Temp_Value[0]||Temp_Value[1]!
=Back_Temp_Value[1])
{
Back_Temp_Value[0]=Temp_Value[0];
Back_Temp_Value[1]=Temp_Value[1];
f_Temp=(int)(Temp_Value[1]<<8|Temp_Value[0])*0.0625;
sprintf(Temp_Disp_Buff,"TEMP:
%5.1f\xDF\x43",f_Temp);
LCD_ShowString(1,0,Temp_Disp_Buff);
}
}
}
bittmpreadbit(void)
{
uinti;
bitdat;
DS=1;
DS=0;i++;i++;
DS=1;i++;
dat=DS;
i=8;while(i>0)i--;
return(dat);
}
uchartmpread(void)
{
uchari,j,dat;
dat=0;
for(i=1;i<=8;i++)
{
j=tmpreadbit();
dat=(j<<7)|(dat>>1);
}
return(dat);
}
voidtmpwritebyte(uchardat)
{
uinti;
ucharj;
bittestb;
for(j=1;j<=8;j++)
{
testb=dat&0x01;
dat=dat>>1;
if(testb)//write1
{
DS=0;
i++;i++;
DS=1;
i=8;while(i>0)i--;
}
else
{
DS=0;
i=8;while(i>0)i--;//write0
DS=1;
i++;i++;
}
}
}
if(f_Temp>=75)f_Temp=75;
if(f_Temp<=0)f_Temp=0;
if(f_Temp>=45)
{
MA=1;MB=0;
if(f_Temp==45)
{PWM1=0;delay_ms(30);return;}
else
if(f_Temp==75)
{PWM1=1;delay_ms(30);return;}
PWM1=1;delay_ms(f_Temp-45);
PWM1=0;delay_ms(75-f_Temp);
}
elseif(f_Temp<=10)
{
MA=0;MB=1;
if(f_Temp==10)
{PWM1=0;delay_ms(10);return;}
else
if(f_Temp==0)
{PWM1=1;delay_ms(10);return;}
PWM1=1;delay_ms(10-f_Temp);
PWM1=0;delay_ms(f_Temp);
}
else{MA=0;MB=0;}
}
voidmain()
{
LCD_Initialise();
LCD_ShowString(0,0,"CurrenTemp:
");
Read_Temperature();delay_ms(800);
TMOD=0x01;
TH0=(INT16U)(-11.0592/12*500)/256;
TL0=(INT16U)(-11.0592/12*500)%256;
IE=0x82;
TR0=1;
while
(1);
}
8总结
此次课程设计中,难点在于DS18B20的使用,即对它的时序控制、初始化以及字节读写方法,任何一个环节出错或是时序控制不到位的话就不能得到正确的数据。
一旦学会了正确的使用方法,就能感觉到它带来的便利是热电偶不能比拟的,以后再次使用的话就能很快上手了。
软件设计中,把程序按功能分模块的话能提高编程效率,把问题一一解决,同时画流程图能帮助理清思路,使问题简单化。
另一方面,取变量名时也要讲究技巧,应尽量使其见名知意,同样地,写程序时加注释确是非常必要的,否则隔一段时间后,想再改进或做扩展的话就比较困难了,因为即使是自己写的程序也变得难读难懂了。
参考文献:
1.徐玮.C51单片机高效入门(第2版).北京:
机械工业出版社,2010.
2.龙脉工作室,刘鲲,孙春亮(修订版).北京:
人们邮电出版社,2010.
3.彭伟,单片机C语言程序设计实训100例(第二版)。
北京:
电子工业出版社,2012.
4.朱清慧,Proteus教程—电子线路设计,制版与仿真.北京:
清华大学出版社,2008.
5.江世明,基于Proteus的单片机应用技术.北京:
电子工业出版社,2009.