基于FPGA的VHDL语言温度控制_第1页
基于FPGA的VHDL语言温度控制_第2页
基于FPGA的VHDL语言温度控制_第3页
基于FPGA的VHDL语言温度控制_第4页
基于FPGA的VHDL语言温度控制_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

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

文档简介

1、基于FPGA的恒温控制系统孵化器是一种最新的孵化禽蛋的机器,通过人工制造适合禽蛋孵化的恒温环境,来以较小的经济投入孵化禽蛋,通过调查,市面上的孵化器多数是以模拟电路的方式制造恒温环境,如下图这种模拟电路控制在实际应用中很难做到恒温控制,温度会在最终归的预设值附近上下浮动,影响禽蛋的孵化。而且,孵化器的温度设置也是模拟电路,这样是完全达不到精准的温度设置。通过学习FPGA,我设想运用数字电路来对禽蛋孵化器内部温度进行控制,来实现可控,可调,温度恒定的禽蛋孵化器。具体的设计框架如下 通过前向温度采集电路,采集当前孵化器内部的温度信号,将采集到的模拟信号通过ADC0809模数转换芯片,转变为FPGA

2、可控的数字信号,FPGA芯片根据输入的当前实际温度,控制输出合理的数字信号,再由DAC0832转换为模拟信号,输入到后向加热执行电路,以此来完成对整个孵化器的温度控制。整个系统中,带有温度传感器的前向温度采集电路作为系统的反馈环节,实时反映当前环境的具体温度,具体的电路图如下。 前向温度采集电路图此电路设计以AD590作为温度触感器,通过添加相应的调节电阻,让温度与输出电压保持一个相对线性的关系其中: 为调零电阻 为调满度电阻最终得到的温度与输出电压的关系式为: 模数转换芯片采用的是ADC0809,具体的连接电路图如下 IN0IN7管角中任选一路作为前向温度采集电路的输入,VCC与同时接+5V

3、电压,与GND接地,OUT1OUT8数据输出端连接FPGA,START,OE,EOC,ADDA-C均连接FPGA,根据ADC0809的工作时序图,由FPGA给出相应的信号控制ADC0809。数模转换部分采用的是DAC0832,具体连接图如下 DI0-DI7分别于FPGA的8位数据输出端相连,因为DAC0832工作在连续的负反馈电路中,故采用直通的工作方式,将WR1与WR2直接与地相连,ILE与CS,Xfer引脚均接至FPGA,有FPGA发送控制信号来控制DAC0832的工作。输出引脚Iout1与Iout2连接一个流压转换器,将输出的电流信号转换为需要的电压信号,并进行适当的放大。最后输出到孵化

4、器的加热电路。FPGA模块控制ADC0809的工作状态,并接收来自ADC0809的数字信号,与键盘输入的预设信号进行比较后,将控制信息传送给DAC0832,经由数模转换器转换后加在发热装置两端,对整个孵化器内部温度进行控制。整个的FPGA模块分为以下几个部分;分频模块:由于外界的时钟源一般都较高,而ADC0809以及键盘扫描模块需要的时钟频率较低,故需要对外界时钟源进行分频,这里外界输入时钟源为20MHz,对其进行64分频。波形仿真图如下:从波形图可以看出,clk每经过64个脉冲,clk1跳转一次。分频模块工作正常;统计报告图如下:分频模块的VHDL文件见附录1. 键盘模块:键盘模块的脉冲输入

5、来自分频模块。其中,输入端口为两位二进制数,分别接两个按键,来对预设温度进行加减调控。输出有两个端口,xianshi端口作为保留端口,存储着当前预设温度的数值,可外接显示设备。zhi端口为信息传送端口,其存储值为当前预设温度值经由采集电路温度电压公式换算后的十进制数值。换算公式如下: 例:38摄氏度对应的ADC0809输出数据为5*38*256/100/5,得到十进制值为97;波形仿真图如下: 图(1) 图(2)图中,shuru(1)为温度减按键,shuru(0)为温度加按键,相应的预设温度对应相应的ADC0809输出值,由图2得,当预设温度为38摄氏度时,对应换算后的ADC0809输出数据为

6、97,与计算相符。键盘输入模块工作正常。统计报告图如下:键盘模块的VHDL文件见附录2.ADC0809控制模块:经查阅资料,DAC0832需采用直通式,故,将DAC0832的控制语句直接写在了ADC0809的控制语句块内。ile为输出到ADC0832的输入锁存允许信号,cont为ADC0832WR1,WR2,CS等引脚。Wendu为预设温度的输入引脚。din为ADC0809转换后的输出信号,dout为受FPGA控制的输出到DAC0832的控制信号。clk8为来自为频器的时钟信号。根据ADC0809的时序图,总结出相应的状态转移图,一次来编写控制ADC0809的VHDL语言文件,状态转移图如下:

7、具体波形仿真图如下:波形仿真建立在预设温度为38摄氏度的条件下。前面提到,38摄氏度对应的ADC0809输出值为97,VHDL程序中设定,当ADC0809输入值大于或等于97时(当前温度大于或等于预设温度),FPGA输出到DAC0832的控制信号为0,即停止加热。当ADC0809输入值小于92(即36摄氏度,与设定温度相差大于两度)时,FPGA输出到DAC0832的控制信号为255,即以最大功率加热。当ADC0809输入值小于92时,将会细分为5个阶段,即以逐次递减的功率加热。由图可知,ADC0809工作正常。统计报告图如下:ADC0809模块的VHDL仿真文件见附录3. 最后,将三个模块运用

8、元件例化语句连接在一块,并进行电路观察,生成相应的逻辑电路,如下图:总体波形仿真如下图波形分析: 刚开始,FPGAjia置1,预设温度逐渐增加,如下图 当温度到达38摄氏度后停止增加,即将38摄氏度作为预设温度,随后,观察FPGAin与FPGAout。当预设温度为38摄氏度时,输入为97时,对应输出为0,当为92时,对应输出为5,当为96时,对应输出为1,当输入不在92-97之间,输入大于97时,输出为0,输入小与92时,输出为255.观察上图波形仿真,完全符合程序设计。后面给FPGAjian置1,预设温度会随之降低。统计报告图如下:总体的VHDL程序见附录4.附录1:LIBRARY IEEE

9、;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity fenpin isport(clk :in std_logic; -外部输入时钟源 clk1: out std_logic);end fenpin; -分频后的时钟源architecture b of fenpin is signal count : std_logic_vector(7 downto 0); -信号定义 signal clk2 : std_logic; beginprocess(clk

10、) beginif(clk'event and clk='1') then -计数脉冲上升沿if(count="01000000") thencount<=(others=>'0');clk2<=not clk2; -当达到64个脉冲时count置0,clk2取反else count<=count+1; -未达到64脉冲时继续计数; end if;end if;clk1<=clk2; 将产生的分频信号给输出端口end process;end b;附录2: library ieee;use ieee.std

11、_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity jianpan isport(clk:in std_logic; -分频后的时钟输入 shuru:in std_logic_vector(1 downto 0); -输入端,按键加0位,按键减1位 zhi :out integer; -预设温度转化为ADC0809输出值 xianshi :out integer); -当前预设温度 end entity;architecture beha of jianpan is signal

12、 x:integer range 0 to 200; -定义信号beginprocess(clk)begin if(clk'event and clk='1') then case shuru is -检测是否有输入 when "01"=>x<=x+1; -按键加按下,温度+1 when "10"=>if(x=0)then x<=0; -按键减按下,判断温度是否为0 else x<=x-1; -若为0,则依旧为0,否则,温度-1 end if; when others=>x<=x; -其他

13、按键情况,温度不变 end case; end if; xianshi<=x; -将温度赋给显示输出端zhi<=x*5*256/100/5; -将温度转化后赋给输出端end process;end beha; 附录3:library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity ADC0809 isport(din :in std_logic_vector(7 downto 0); -ADC0809输出的采样数据 clk8 :i

14、n std_logic; -时钟信号 eoc :in std_logic; -ADC0809转换结束指示,高电平有效 ale :out std_logic; -ADC0809地址锁存次信号 ile: out std_logic; -DAC0832数据锁存允许 cont: out std_logic; -DAC0832控制信号(WR1,WR2,CS,Xfer) start :out std_logic; -ADC0809转换启动信号 oe :out std_logic; -ADC0809数据输出允许信号 wendu:in integer; -温度显示 adda :out std_logic; -

15、ADC0809信号通道控制位 addb :out std_logic; -ADC0809信号通道控制位 addc :out std_logic; -ADC0809信号通道控制位 lock0 :out std_logic; -ADC0809观察数据锁存时钟 dout :out std_logic_vector(7 downto 0); -输出到DAC0832的8位数据end ADC0809;architecture beha of ADC0809 is type states is(st0,st1,st2,st3,st4); -定义ADC0809工作状态 signal current_state

16、,next_state:states:=st0; -定义信号 signal regl :std_logic_vector(7 downto 0); signal shuchu :std_logic_vector(7 downto 0); signal lock :std_logic; signal count :std_logic_vector(7 downto 0);begin adda<='1' -地址输入001,选择IN1 addb<='0' addc<='0' dout<=shuchu; -将处理后的数据传输到输出

17、端口 lock0<=lock; -数据传输 ile<='1' -DAC0832的控制信号 cont<='0' com:process(current_state,eoc) -状态转移 begin case current_state is when st0=>ale<='0'start<='0'lock<='0'oe<='0'next_state<=st1; when st1=>ale<='1'start<=&#

18、39;1'lock<='0'oe<='0'next_state<=st2; when st2=>ale<='0'start<='0'lock<='0'oe<='0'next_state<=st1; if(eoc='1')then next_state<=st3; else next_state<=st2; end if; when st3=>ale<='0'start<=

19、9;0'lock<='0'oe<='1'next_state<=st4; when st4=>ale<='0'start<='0'lock<='1'oe<='1'next_state<=st0; when others=>next_state<=st0; end case; end process com;reg:process(clk8) begin if(clk8'event and clk8='1'

20、;) then current_state<=next_state; -在时钟上升沿改变状态 end if; end process reg;latch1:process(lock) begin if lock='1'and lock'event then regl<=din; -将输入数据赋给中间变量 end if;end process latch1;kongzhi:process(regl) begin if(regl<wendu) then -判断输入数据与预设温度的大小 case wendu-regl is -判断输入数据与预设温度的 whe

21、n "00000101"=>shuchu<="00000101" -差值为5时输出控制信号5 when "00000100"=>shuchu<="00000100" -差值为4时输出控制信号4 when "00000011"=>shuchu<="00000011" -差值为3时输出控制信号3 when "00000010"=>shuchu<="00000010" -差值为2时输出控制信号2

22、 when "00000001"=>shuchu<="00000001" -差值为1时输出控制信号1 when others=>shuchu<="11111111" -差值大于5时输出255 end case; else shuchu<="00000000" -当前温度大于预设温度,输出0 end if;end process kongzhi; end beha;附录4:library ieee;use ieee.std_logic_1164.all;use ieee.std_logi

23、c_unsigned.all;use ieee.std_logic_arith.all;entity FPGA isport(clkin:in std_logic; -定义外部时钟端口 FPGAeoc:in std_logic; FPGAin :in std_logic_vector(7 downto 0); FPGAout:out std_logic_vector(7 downto 0); FPGAale :out std_logic; FPGAjia :in std_logic; FPGAjian :in std_logic; FPGAwendu:out integer; FPGAile:

24、 out std_logic; FPGAcont: out std_logic; FPGAstart :out std_logic; FPGAoe :out std_logic; FPGAadda :out std_logic; FPGAaddb :out std_logic; FPGAaddc :out std_logic);end entity;architecture beha of FPGA iscomponent ADC0809 is -元件例化声明port(din :in std_logic_vector(7 downto 0); clk8 :in std_logic; eoc :

25、in std_logic; ale :out std_logic; ile: out std_logic; cont: out std_logic; start :out std_logic; wendu:in integer; oe :out std_logic; adda :out std_logic; addb :out std_logic; addc :out std_logic; lock0 :out std_logic; dout :out std_logic_vector(7 downto 0); end component;component fenpin is -元件例化声明

26、 port(clk :in std_logic; clk1: out std_logic);end component;component jianpan is port(clk:in std_logic; shuru:in std_logic_vector(1 downto 0); zhi :out integer; xianshi:out integer);end component; signal c:std_logic; -定义中间变量signal n:integer; beginU0:fenpin port map(clk=>clkin,clk1=>c); -元件例化U1

27、:ADC0809 port map(clk8=>c,wendu=>n,din=>FPGAin,eoc=>FPGAeoc,dout=>FPGAout,ale=>FPGAale,ile=>FPGAile, cont=>FPGAcont,start=>FPGAstart,oe=>FPGAoe,adda=>FPGAadda,addb=>FPGAaddb,addc=>FPGAaddc);U2:jianpan port map(clk=>c,shuru(1)=>FPGAjian,shuru(0)=>FPGAji

28、a,zhi=>n,xianshi=>FPGAwendu);end beha;LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;entity fenpin isport(clk :in std_logic; -外部输入时钟源 clk1: out std_logic);end fenpin; -分频后的时钟源architecture b of fenpin is signal count : std_logic_vector(7 do

29、wnto 0); -信号定义 signal clk2 : std_logic; beginprocess(clk) beginif(clk'event and clk='1') then -计数脉冲上升沿if(count="01000000") thencount<=(others=>'0');clk2<=not clk2; -当达到64个脉冲时count置0,clk2取反else count<=count+1; -未达到64脉冲时继续计数; end if;end if;clk1<=clk2; 将产生的分

30、频信号给输出端口end process;end b; library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity jianpan isport(clk:in std_logic; -分频后的时钟输入 shuru:in std_logic_vector(1 downto 0); -输入端,按键加0位,按键减1位 zhi :out integer; -预设温度转化为ADC0809输出值 xianshi :out integer); -当前预设

31、温度 end entity;architecture beha of jianpan is signal x:integer range 0 to 200; -定义信号beginprocess(clk)begin if(clk'event and clk='1') then case shuru is -检测是否有输入 when "01"=>x<=x+1; -按键加按下,温度+1 when "10"=>if(x=0)then x<=0; -按键减按下,判断温度是否为0 else x<=x-1; -若为

32、0,则依旧为0,否则,温度-1 end if; when others=>x<=x; -其他按键情况,温度不变 end case; end if; xianshi<=x; -将温度赋给显示输出端zhi<=x*5*256/100/5; -将温度转化后赋给输出端end process;end beha; library ieee;use ieee.std_logic_1164.all;use ieee.std_logic_arith.all;use ieee.std_logic_unsigned.all;entity ADC0809 isport(din :in std_l

33、ogic_vector(7 downto 0); -ADC0809输出的采样数据 clk8 :in std_logic; -时钟信号 eoc :in std_logic; -ADC0809转换结束指示,高电平有效 ale :out std_logic; -ADC0809地址锁存次信号 ile: out std_logic; -DAC0832数据锁存允许 cont: out std_logic; -DAC0832控制信号(WR1,WR2,CS,Xfer) start :out std_logic; -ADC0809转换启动信号 oe :out std_logic; -ADC0809数据输出允许信

34、号 wendu:in integer; -温度显示 adda :out std_logic; -ADC0809信号通道控制位 addb :out std_logic; -ADC0809信号通道控制位 addc :out std_logic; -ADC0809信号通道控制位 lock0 :out std_logic; -ADC0809观察数据锁存时钟 dout :out std_logic_vector(7 downto 0); -输出到DAC0832的8位数据end ADC0809;architecture beha of ADC0809 is type states is(st0,st1,s

35、t2,st3,st4); -定义ADC0809工作状态 signal current_state,next_state:states:=st0; -定义信号 signal regl :std_logic_vector(7 downto 0); signal shuchu :std_logic_vector(7 downto 0); signal lock :std_logic; signal count :std_logic_vector(7 downto 0);begin adda<='1' -地址输入001,选择IN1 addb<='0' add

36、c<='0' dout<=shuchu; -将处理后的数据传输到输出端口 lock0<=lock; -数据传输 ile<='1' -DAC0832的控制信号 cont<='0' com:process(current_state,eoc) -状态转移 begin case current_state is when st0=>ale<='0'start<='0'lock<='0'oe<='0'next_state<=st1; when st1=>ale<='1'start<='1'lock<='0'oe<='0'next_state<=st2; when st2=>ale<='0'start<='0'lock<='0'oe<='0'next_state<=st1; if(eoc='1')then next_sta

温馨提示

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

评论

0/150

提交评论