电子系统设计-温度控制系统实验报告

电子系统设计实验报告

温度控制系统的设计

姓名:杨婷

班级:信息21

学校:西安交通大学

一、问题重述

本次试验采用电桥电路、仪表放大器、AD转化器、单片机、控制通断继电器和烧水杯,实现了温度控制系统的控制,达到的设计要求。

设计制作要求如下:

    1、要求能够测量的温度范围是环境温度到100oC。

    2、以数字温度表为准,要求测量的温度偏差最大为±1oC。

3、能够对水杯中水温进行控制,控制的温度偏差最大为±2oC,即温度波

动不得超过2oC,测量的精度要高于控制的精度。

    4、控制对象为400W的电热杯。

    5、执行器件为继电器,通过继电器的通断来进行温度的控制。

    6、测温元件为铂热电阻Pt100传感器。

7、设计电路以及使用单片机学习板编程实现这些要求,并能通过键盘置入预期温度,通过LCD显示出当前温度。

二、方案论证

1、关于R/V转化的方案选择

    方案一是采用单恒流源或镜像恒流源方式,但是由于恒流源的电路较复杂,且受电路电阻影响较大,使输出电压不稳定。

    方案二是采用电桥方式,由电阻变化引起电桥电压差的变化,电路结构简单,且易实现。

2、关于放大器的方案选择

    方案一是采用减法器电路,但是会导致放大器的输入电阻对电桥有影响,不利于电路的调节。

方案二是采用仪表放大器电路,由于仪表放大器内部的对称,使电路影响较小,调整放大倍数使温度从0到100度,对应的电压为0-5V。

三、电路的设计

1、电桥电路

 通过调节电位器R3使其放大器输出端在0度的时候输出为0实现调零,然

后合理选择R1、R2的阻值配合后面放大器的放大倍数实现热电阻阻值向电压值的转化。

 通过调节电位器R3使其放大器输出端在0度的时候输出为0实现调零,然

后合理选择R1、R2的阻值配合后面放大器的放大倍数实现热电阻阻值向电压值的转化。本次实验中:R1=R2=10KΩ,R3为500Ω的变阻器。

         

2、仪表放大器

   

    本实验中:Rf=R3=R4=R5=10KΩ,R1=R2=10KΩ,Rg为500Ω的变阻器,这个电路放大倍数大概为128倍左右。

3、TLC1549(10位)模拟数字转换器(A/D)

10位分辨率A/D转换器,其引脚图如下:

 

    TLC1549器件有两个数字输入和一个3态输出、片选(CS ),输入输出时钟( I/O时钟)和数据输出(数据)的提供三线接口,串口主机处理器。

VCC (8):正电源电压

4、单片机中的1602液晶显示器

其引脚图如下:

 

1602采用标准的16脚接口,其中:

第1脚:VSS为地电源。

第2脚:VDD接5V正电源。

第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时

        对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K

        的电位器调整对比度。

第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存

        器。

第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS

        和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW

        为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。

第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。

第7~14脚:D0~D7为8位双向数据线。

第15~16脚:空脚。

1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B(41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A”。

1602液晶模块内部的控制器共有11条控制指令,如下表所示。它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)

5、继电器驱动电路、继电器电路、烧水壶

利用单片机输出的控制信号(高低电平),通过继电器驱动电路,控制继电器的通断时间比例,从而控制烧水的温度。

四、测试方案与测试结果

1、实验所需器件表

2、水温控制测量调试方法

 通过铂热电阻Pt100 将温度变化转换为电阻值的变化,再通过电桥间温度变化转换为电压变化,之后通过仪表放大器将电压放大一定的倍数(128倍左右),使输出电压在0-5 V,将输出电压送入A/D转换器(TLC1549)转换为数字信号(10位二进制数)送入单片机,单片机对数字信号进行处理并将其输出至液晶显示屏(1602LCD)上显示。为控制水温使之稳定,我们引用了PID控制算法,通过PID值控制继电器的占空比,继电器连接着电热杯的开关,所以可以使温度稳定在设定值。

(1)PID控制算法:

    在测出目前水温的前提下,采用PID控制算法,即比例微分积分控制算法,

将测得的水温与设定的温度值做差,利用温差做PID算法,产生控制信号,控

制水的温度。增量式PID算法如下:

控制信号u=Kp*E(k)+Ki*[E(k)+E(k-1)+……+E(1)]+Kd*[E(k)-E(k-1)]

控制信号增量△u=Kp*[E(k)-E(k-1)]+Ki*E(k)+Kd*[E(k)-2E(k-1)+E(k-2)]

    利用控制信号的增量不断修改控制信号,实现对温度的控制。这种增量式算法相比位置式算法,没有积分项的长叠加,避免了随着控制时间变长导致的计算时间增加的问题出现。

(2)关于AD转化的数据处理

    由于A/D转换送进来的信号是一个10位的二进制数(0-1023)代表一个温

度为0 oC -100 oC的温度,为了方便数据的处理,我们使0对应0 oC,1000对应

100oC,所以只需要对信号除以10即可得到温度值,由于液晶显示的时候只能一

位位显示,所以将信号的百、十、个位分别取出来放入数组中,方便液晶显示输

出。

(3)继电器控制水温的方法

    PID算法的输出值这里设定为一个0-100的数字,不超过最大值100,超过使其等于100,然后利用单片机内部的定时器控制单片机的一个端口的通断占空比,PID的控制量值越大,端口通的时间越长。将此端口与一个继电器相连,控制继电器的开断,继电器连接在烧水壶的电源线上,继电器的开端比决定了烧水壶的通断电时间比,从而控制了烧水壶的烧水功率。实现了对水温的控制。

(4)零度和满度校准的问题

    实验中我们采用24度室温和65度高温两个温度下校准,低温时调整电桥的

电位器,高温时调整放大器的电位器,在数字测温计示数稳定的前提下,将单片

机的目前温度与数字测温计读数调为一致,反复调整几次,即可达到最佳状态。

3、测试结果分析

    在单片机键盘输入设定温度65度,在单片机控制下烧水杯开始烧水,当单

片机的实测温度低于设定温度大约5度左右,即60度左右,继电器开始通断,

并且随着实测温度的升高,继电器的通断比越来越小,最终温度稳定在设定温度

65度左右,达到的实验要求。

五、结束语

    通过本次实验,我对控制系统有了更加真实的体会,了解到要控制一个系统,

并且达到一定的精度要求,要充分考虑到多个方面的影响因素,了解现有器材的

缺陷,尽可能利用较小误差的测量方法。另外,通过本次试验对于单片机液晶屏

显示的应用,我也更加的熟悉单片机的原理和编程方法。最后,感谢老师的辛勤

指导,我也深刻体会到自己通过理论与实际的结合,学到不少实际设计中的知识,

但是也深刻感受到自己的不足,今后仍需努力。

 

第二篇:电子系统设计实验报告

实验报告格式要求

一.实验题目名称:可编程串行接口芯片

二.实验目的、任务和要求:

  本实验要求设计SCI串行接口芯片,其功能包括串行及并行数据的接收和互相转换。

三.实验系统结构设计分析

1.模块划分思想和方法:

该芯片需根据功能分为串并转换电路和并串转换电路两部分。实现串并转换的关键器件就是移位寄存器,其功能可以使串行输入的数据先寄存到一个位矢量中,等到一组数据全部输入完毕后再一起处理,并行输出。而实现并串转换的关键器件是锁存器,它可以将并行输入的数据先锁存起来,再一位一位的转化成串行数据。计数器在这一芯片中也起到了重要作用,因为计数器可以产生时间脉冲的分频,用于配合时间脉冲控制各器件的工作。

2.各模块引脚定义和作用.

串并电路:

输入:rxd读入数据,clk系统时钟,reset计数器复位端,rd读入控制

四进制计数器:

C4四分频

十进制计数器:

Count_10计数分量,C10四十分频(c4的十分频)

移位寄存器:

Read读入数据,d0~d9并行输出(d0起始端,d1~d8数据端,d9校验位(本实验中不起作用))

锁存器:

K0~k7数据位

状态发生器:

RdST读入状态(0为读入,1为寄存器已满)

四.实验代码设计以及分析:

1.给出模块层次图;

2.按模块完成的代码及注释.

USE IEEE.STD_LOGIC_1164.ALL;

ENTITY SCI IS

   PORT(cs,rxd,clk,SCIrd,reset,SCIwr,in7,in6,in5,in4,in3,in2,in1,in0: IN STD_LOGIC;

        rdFULL,tdEMPTY,c4:buffer std_logic;

        e7,e6,e5,e4,e3,e2,e1,e0,wxd:OUT STD_LOGIC

                        );

END SCI;

ARCHITECTURE WORK OF SCI IS

SIGNAL wr,rd,read,c10,d9,d8,d7,d6,d5,d4,d3,d2,d1,d0,k7,k6,k5,k4,k3,k2,k1,k0,mid: STD_ULOGIC;

SIGNAL wri : STD_LOGIC_vector(7 downto 0);

SIGNAL count_10 ,counter_8:std_logic_vector(3 downto 0);

BEGIN 

      PROCESS(cs)

      BEGIN

      rd<=cs OR SCIrd;

      wr<=cs OR SCIwr;

      END PROCESS;

     //注释:片选输入,cs=1时,串入并出为“写”,并入串出为“读”;cs=0时,串入并出为“读”,并入串出为“写”;

      PROCESS(rxd)

      BEGIN

      read<=rxd;

          

      END PROCESS;

      PROCESS(clk)

        VARIABLE count_4 : STD_LOGIC_VECTOR(1 DOWNTO 0);

        BEGIN

        IF(clk'EVENT AND clk='1')THEN

            IF(count_4="00")THEN

            count_4 := "01";c4 <= '1';

            ELSIF(count_4="01")THEN

            count_4 := "11";c4 <= '1';

            ELSIF(count_4="11")THEN

            count_4 := "10";c4 <= '0';

            ELSIF(count_4="10")THEN

            count_4 := "00";c4 <= '0';

            END IF;

        END IF;

      END PROCESS;

        

      PROCESS(c4)

        BEGIN

        IF(c4'EVENT AND c4='1')THEN

          IF(rd='1')THEN

            d0<=read;

            d1<=d0;

            d2<=d1;

            d3<=d2;

            d4<=d3;

            d5<=d4;

            d6<=d5;

            d7<=d6;

            d8<=d7;

            d9<=d8;

           END IF;

        END IF;

        END PROCESS;

     

      PROCESS(c4,reset,rd)

        BEGIN

        IF(reset='0' OR rd='0')THEN count_10<="0000";c10 <= '0';

       

        ELSIF(c4'EVENT AND c4='1')THEN

                IF(count_10="0000" AND rxd='1' AND rdFULL='0')THEN

                count_10 <= "0001";c10 <= '0';

                ELSIF(count_10="0001")THEN

                count_10 <= "0010";c10 <= '0';

                ELSIF(count_10="0010")THEN

                count_10 <= "0011";c10 <= '0';

                ELSIF(count_10="0011")THEN

                count_10 <= "0100";c10 <= '0';

                ELSIF(count_10="0100")THEN

                count_10 <= "0101";c10 <= '0';

                ELSIF(count_10="0101")THEN

                count_10 <= "0110";c10 <= '0';

                ELSIF(count_10="0110")THEN

                count_10 <= "0111";c10 <= '0';

                ELSIF(count_10="0111")THEN

                count_10 <= "1000";c10 <= '0';

                ELSIF(count_10="1000")THEN

                count_10 <= "1001";c10 <= '0';

                ELSIF(count_10="1001")THEN

                count_10 <= "1010";c10 <= '0';

                ELSIF(count_10="1010")THEN

                count_10 <= "1011";c10 <= '1';

                END IF;

             

         END IF;

        

       END PROCESS;

     PROCESS(c10)

        BEGIN

        IF(c10'EVENT AND c10='1')THEN

        k7<=d8;

        k6<=d7;

        k5<=d6;

        k4<=d5;

        k3<=d4;

        k2<=d3;

        k1<=d2;

        k0<=d1;

        END IF;

     END PROCESS;

    

     PROCESS(rd)

     BEGIN

     IF(rd='0')THEN

        e7<=k7;

        e6<=k6;

        e5<=k5;

        e4<=k4;

        e3<=k3;

        e2<=k2;

        e1<=k1;

        e0<=k0;

      END IF;

     END PROCESS;

     PROCESS(rd,c10)

     BEGIN

     IF(rd='0')THEN rdFULL<='0';

    

     ELSIF(c10='1')THEN

     rdFULL<='1';  

     ELSE rdFULL<='0';

     END IF;

     END PROCESS;

process(wr)

begin

   if(wr='0')then

     wri(0)<=in0;

     wri(1)<=in1;

     wri(2)<=in2;

     wri(3)<=in3;

     wri(4)<=in4;

     wri(5)<=in5;

     wri(6)<=in6;

     wri(7)<=in7;   

   end if;

end process;

process(c4)

begin

    if(c4'event and c4='1')then

      if(wr='0')then

      counter_8<="0000";

      elsif(wr='1' and counter_8="0000")then counter_8<="0001";     

      elsif(counter_8="0001")then counter_8<="0010";         

      elsif(counter_8="0010")then counter_8<="0011";          

      elsif(counter_8="0011")then counter_8<="0100";       

      elsif(counter_8="0100")then counter_8<="0101";                  

      elsif(counter_8="0101")then counter_8<="0110";       

      elsif(counter_8="0110")then counter_8<="0111";   

      elsif(counter_8="0111")then counter_8<="1000";

      elsif(counter_8="1000")then counter_8<="1001";

      end if;

    end if;

end process;

process(wr,counter_8)

begin

    

        if(wr='1' and counter_8="1001")then

           mid<='1';tdEMPTY<='1';

        elsif(wr='0')then

           mid<='0';tdEMPTY<='0';

        end if;

  

end process;

process(counter_8)

begin

           if(wr='0' or mid='1')then

          wxd<='0';

       elsif(wr='1' and mid='0')then

           if(counter_8="0001")then

               wxd<=wri(0);   

           elsif(counter_8="0010")then

               wxd<=wri(1);

           elsif(counter_8="0011")then

               wxd<=wri(2);

           elsif(counter_8="0100")then

               wxd<=wri(3);

           elsif(counter_8="0101")then

               wxd<=wri(4);   

           elsif(counter_8="0110")then

               wxd<=wri(5);  

           elsif(counter_8="0111")then

               wxd<=wri(6);   

           elsif(counter_8="1000" )then

               wxd<=wri(7);   

          

           end if; 

       end if;

  

   end process;

END WORK;

五.仿真图(输入输出波形)以及分析:

六.实验问题分析和经验总结:

在该实验的设计中,我们发现时序逻辑中最重要的部分就是时间信号对各进程的控制,因为为了保持各进程在时间上的同步性和正确性,需要用一个或几个相关联的时间信号来控制各进程。而在并串数据的转化上,这一点尤为重要,因为在数据的处理过程中,判断一组数据的开始和结束是非常重要的,而实现这一判断依靠的就是时间信号。

相关推荐