Tải bản đầy đủ (.pptx) (18 trang)

Báo cáo môn học : Thiết kế mạch đo nhiệt độ, độ ẩm sử dụng FPGA

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (913.45 KB, 18 trang )

Mạch đo nhiệt độ, độ
ẩm sử dụng FPGA
Nhóm 04
Phạm Hồng Đức : 20173762
Trần Anh Dũng : 20173785
Đào Văn Hào
: 20173838
Vũ Xuân Cừ
: 20173699
Giảng viên hướng dẫn : Ts. Nguyễn Đại Dương


Các nội dung chính
A

B

C

• Tổng quan về phần cứng
• Lưu đồ thuật tốn và
code
• Demo sản phẩm


Tổng quan về phần
cứng


Sơ đồ khối


Cảm
biến
nhiệt độ

Chip điều khiển
(FPGA)

Led cảnh báo

Mạch
hiển thị


Kit FPGA EPM240


Mạch hiển thị
› Sử dụng IC 74LS47
kết hợp vớ led 7
thanh


Cảm biến nhiệt độ DHT22
› Điện áp hoạt động 5V
› Khoảng đo độ ẩm : 0% 100% RH sai số 2% RH
› Khoảng đo nhiệt độ : -40
80 độ C sai số 0.5% độ C


Cách đọc nhiệt độ từ cảm biến DHT22

start

DHT_resp
start_data
wait_DHT_resp

DHT_pullup

trans_bit

trans_bit

start_data

compare : start_data > trans_bit ?
Data format: 8bit integral RH data + 8bit decimal RH data + 8bit integral T
data + 8bit decimal T data + 8bit check sum


Mạch nguyên lý

DHT22


Lưu đồ thuật toán và
code


Lưu đồ thuật toán



Code VHDL
library ieee;
use ieee.std_logic_1164.all;
LIBRARY IEEE;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
entity DemoDHT is
generic (
clk_period_ns : positive := 20; -- 50mhz
data_width: positive:= 8);
port(
clk: in std_logic ;
dht_bus: inout std_logic;
dataout: out std_logic_vector(7 downto 0);
led : out std_logic_vector(3 downto 0);
key_in : in std_logic
);
end entity;


Code VHDL
architecture rtl of DemoDHT is
constant delay_18_ms: positive := 18*10**6/clk_period_ns+1;
constant max_delay : positive := 500*10**6/clk_period_ns+1; -- 500 ms
constant N: integer :=70;
type arr is array (1 to N) of std_logic_vector(7 downto 0);
constant datas : arr := (X"20",X"21",X"22",X"23",X"24",X"25",X"26",X"27",X"28",X"29",
X"30",X"31",X"32",X"33",X"34",X"35",X"36",X"37",X"38",X"39",
X"40",X"41",X"42",X"43",X"44",X"45",X"46",X"47",X"48",X"49",
X"50",X"51",X"52",X"53",X"54",X"55",X"56",X"57",X"58",X"59",

X"60",X"61",X"62",X"63",X"64",X"65",X"66",X"67",X"68",X"69",
X"70",X"71",X"72",X"73",X"74",X"75",X"76",X"77",X"78",X"79",
X"80",X"81",X"82",X"83",X"84",X"85",X"86",X"87",X"88",X"89");
signal input_sync : std_logic_vector(0 to 2);
type state_type is (start,wait_DHT_resp,DHT_resp,DHT_pullup,startdata,prepare,trans_bit,compare,display);
signal state : state_type;
signal delay_counter : natural range 0 to max_delay;
signal delay_counter2 : natural range 0 to max_delay;
signal delay_temp : natural range 0 to max_delay;
signal data_out : std_logic_vector (data_width-1 downto 0);
signal bus_rising_edge, bus_falling_edge : boolean;
signal number_bit : natural range 0 to 24;
signal temp : integer range 0 to 50;
signal dem : integer range 8 to 24;


Code VHDL
begin
edge : process(clk) begin
if rising_edge(clk) then
input_sync <= to_x01(dht_bus)&input_sync(0 to 1);
end if;
end process;
bus_rising_edge <= input_sync(1 to 2) = "10";
bus_falling_edge <= input_sync(1 to 2) = "01";


Code VHDL
DHT22:process (clk)
begin

if rising_edge(clk) then
case(state) is
when start =>
if key_in = '0' then
if dem = 24 then
dem <= 8;
else
dem <= 24;
end if;
end if;
temp <= 0;
if delay_counter = 0 then
number_bit <= dem;
dht_bus <= '0';
delay_counter <= delay_18_ms;
state <= wait_DHT_resp;
else
delay_counter <= delay_counter - 1;
end if;

when wait_DHT_resp =>
if delay_counter = 0 then
dht_bus <= 'Z';
state <= DHT_resp;
else
delay_counter <= delay_counter -1;
end if ;
when DHT_resp =>
if bus_falling_edge then -state <= DHT_pullup;
end if;

when DHT_pullup =>
if bus_rising_edge then
state <= startdata;
end if;
when startdata =>
if bus_falling_edge then
state <= prepare;
end if;


Code VHDL
when prepare =>
if bus_rising_edge then
delay_counter <= delay_temp;
state <= trans_bit;
delay_temp <= 0;
else
delay_temp <= delay_temp + 1;
end if;
if number_bit = 0 then
temp <= CONV_INTEGER(data_out);
state <= display;
end if;
when trans_bit =>
if bus_falling_edge then
delay_counter2 <= delay_temp;
state <= compare;
delay_temp <=0;
else
delay_temp <= delay_temp + 1;

end if;

when compare =>
number_bit <= number_bit - 1;
if(delay_counter > delay_counter2) then
data_out <= data_out(data_width -2 downto 0) & '0';
else
data_out <= data_out(data_width -2 downto 0) & '1';
end if;
state <= prepare;
when display =>
if delay_counter = 0 then
delay_counter <= max_delay;
state <= start;
else
dataout <= datas(temp -19);
delay_counter <= delay_counter - 1;
if temp > 45 then
led <= "0000";
else
led <= "1111";
end if;
end if;
end case;
end if;
end process DHT22;


Demo sản phẩm



/>CoJaazZ0NqYo4Vsn4BApsq8_?usp=sharing



×