Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- uart 통신
- hc-sr04
- behavioral modeling
- prescaling
- LED
- gpio
- half adder
- atmega 128a
- ATMEGA128A
- KEYPAD
- soc 설계
- Algorithm
- test bench
- ring counter
- pwm
- Edge Detector
- FND
- vivado
- verilog
- java
- dataflow modeling
- Linked List
- D Flip Flop
- Recursion
- Pspice
- structural modeling
- i2c 통신
- BASYS3
- stop watch
- DHT11
Archives
- Today
- Total
거북이처럼 천천히
Verilog RTL 설계(7월 23일 - 1, DHT 기초) 본문
1. DHT11 (Digital Humidity Temperature 11)
- 이번에는 온도와 습도를 측정하는 디지털 센서, DHT11을 이용하여 온도와 습도 센서를 측정해보도록 하겠다.
- 이를 통해 FSM(Finite State Machine) 구현와 통신 방식에 대해서 공부하도록 하겠다.
- DHT11와 basys3을 연결하여 DHT11으로 부터 온도와 습도 데이터를 전달받기 위해서 DHT11의 DataSheet를 보고, 통신에 필요한 과정 및 데이터가 필요하다.
- 따라서 DHT11로 부터 온도, 습도를 전달 받는 과정부터 살펴보도록 하겠다.
2. DHT11으로 온도, 습도 데이터를 전달 받는 방법
- DHT11와 MCU 간에 연결 및 회로도는 다음과 같이 연결된다.
- 위 그림을 통해 알 수 있듯이 MCU와 DHT11간에 연결은 단일선으로 연결되어 있으며, 이 선은 양방향 통신이 가능한 1bit data bus이다.
- 따라서 한 번에 양방향으로 데이터 송신 및 수신이 불가능하며, 한쪽에서 데이터를 보낸다면 다른 한쪽에서는 임피던스 상태로 만들어 회로를 끊어 다른 한쪽에서 보내는 데이터를 읽을 수 밖에 없다.
- 따라서 MCU 측에서는 DHT11 측에서 온도와 습도 데이터를 전송한다면 MCU 측에서 회로를 끊어 임피던스 상태로 만든 뒤, DHT11 측에서 보내는 온도와 습도 데이터를 읽어야 한다.
- Q) 5K Ohm 저항의 역활은 무엇인가?
- A) 데이터 선이 아무 것도 연결되어 있지 않은 임피던스 상태일 때, 선을 강제로 High 상태로 유지시켜준다.
즉, MCU나 DHT11이 데이터 선을 능동적으로 제어하지 않을 때, 기본 상태를 정의한다.
2.1. DHT11 측에서는 어떤 형식으로 온도, 습도 데이터를 전송하는가?
- 이에 대한 정보는 DHT11의 데이터 시트를 통해 확인할 수 있다.
- MCU와 DHT11간에 데이터 통신은 단일 버스 형식으로 전송되며, 한 번의 통신에는 4ms 시간이 소요된다.
- 데이터는 소수부와 정수부로 크게 나뉘며, 온도, 습도, Check sum으로 구성된다.
- 데이터 형식은 다음과 같다.
- 8bit 습도 데이터의 정수부
- 8bit 습도 데이터의 소수부
- 8bit 온도 데이터의 정수부
- 8bit 온도 데이터의 소수부
- 8bit check Sum - Q) Check Sum 데이터는 어떤 데이터이며, 어떤 역활을 수행하는가?
A) 데이터를 송수신하는 과정에서 오류를 발생했는지 여부를 확인하는 식별자라고 할 수 있다. 시리얼 통신에서 송수신되는 데이터의 오류를 검출하기 위해서 사용되는 일종의 오류 식별자인 Parity bit와 유사한 역활을 수행한다.
Check Sum 데이터는 이전에 전송된 8bit 온도, 습도 4개의 데이터를 더한 뒤, 덧셈 과정에서 발생한 Carry는 버리고, 덧셈 결과를 8bit 데이터로 만들어 송신 측(DHT11)에서 보낸다.
수신 측(MCU)에서 이전에 전송했던 데이터들을 모두 받은 뒤, 받은 데이터를 합산하여 마지막에 송신된 Check Sum과 합산한 결과를 비교한다. 그래서 합산한 결과값과 Check Sum이 일치할 경우, "문제 없이 데이터가 잘 왔네."라고 확인할 수 있게 되는 것이다.
반대로 수신 측에서 합산한 결과값과 Chekc Sum이 일치하지 않을 경우, "데이터 전송 간에 데이터 손실이 발생했네"라고 확인하고, 이에 대한 조치가 가능해지는 것이다.
2.2. DHT11측으로 부터 온도, 습도 데이터를 받기 위해서는 어떠한 과정을 거쳐야 하는가?
- 위 그림은 DHT11 과 MCU간에 통신 과정을 신호의 전압 레벨과 시간을 기준으로 설명하고 있다.
- 전체적인 통신과정에 대해서 간략하게 설명하면 다음과 같다.
- MCU측에서 DHT11측으로 "통신 연결이 잘 되었는지?" 등을 확인하는 Start 신호를 보낸다.
- DHT11측에서는 해당 신호를 받고, "통신 잘 연결되었다." 의미를 담고 있는 Responsec 신호를 MCU측으로 보낸다.
- 양측에서 통신 연결이 잘 되었는지 여부를 확인 했으면 DHT11측에서 온도, 습도 데이터를 담고 있는 40bit 크기의 데이터를 MCU 측으로 전송한다.
- 이때, MCU와 DHT11간에 데이터 연결선은 1bit 크기의 데이터 버스이기 때문에 MCU는 임피던스 상태로 만들어 전송되는 데이터를 읽는 모드로 전환해야 한다.
- 데이터 수집이 완료되면 DHT11은 다시 MCU로부터 시작 신호를 받을 때까지 저전력 소비 모드로 전환된다. - 이번에는 단계에 대해서 좀 더 자세히 살펴보도록 하겠다.
2.2.1. MCU Sends out Start Signal to DHT
- 위 사진은 MCU와 DHT11 간에 통신 연결이 되었는지 여부를 확인하기 위해 Start 신호와 이에 대한 Response 신호를 주고 받는 과정을 나타내고 있다.
- 1 단계에서 MCU는 DHT11측으로 Start Signal을 보내게 되는데, 이 때, 보내지는 Start Signal은 Data Single-bus의 전압 레벨을 Low level이다. 이 과정에서 DHT11측에서 해당 신호를 감지하기 위해서는 최소한 18ms 동안은 MCU 측에서 유지시켜 줘야 한다.
- 2 단계에서는 MCU측에서 보낸 Start Signal에 대한 Response Signal을 받기 위해 MCU의 volate을 20 ~ 40us 동안 고임피던스 상태로 만들어 준다.
- 3 단계에서는 DHT11은 Start Signal에 대한 Response Signal을 보내기 위해 DHT11측에서 Data Single-bus의 전압 레벨을 대략 80us 동안 Low Level로 만들어 준다.
- 4 단계에서는 데이터 전송 시작 전, 앞으로 전송해야 데이터와 Response Signal 을 구분하기 위해 DHT11측에서 volate를 Pull-up시키고, 이 상태를 80us 동안 유지시켜 준다.
- 5 단계에서는 DHT11측과 MCU간에 통신 연결이 확인 되었으면 DHT11측에서 온도, 습도에 관한 40bit 크기의 데이터를 MCU 측으로 전송하게 된다.
2.2.2. 어떻게 데이터를 표현하는가?
- 이는 이미 사전에 정의된 데이터 신호에 따라 전송하게 되면 0과 1을 구분지어 송신 및 수신이 가능하다.
- 먼저, 데이터 0을 표현하는 방법부터 살펴보도록 하겠다.
- 위 그림은 데이터 0을 표현하기 위해서 어떻게 신호를 줘야하는지에 대해서 설명하고 있다.
- 먼저, DHT11측에서 50us 동안 Single-bus에 전압 레벨을 0으로 만들어 준다.
- 그리고, 26 ~ 28us 동안 Single-bus에 전압 레벨을 1으로 만들어 준 뒤, 다시 전압 레베을 0으로 만들어 주면 해당 DHT Signal은 데이터 0을 표현하게 된다.
- 따라서 MCU측에서는 DHT11로부터 해당 신호를 받게 될 경우, "아! 현재 데이터 0이 들어왔구나."를 알고, 이해할 수 있게 되는 것이다.
- 위 그림은 데이터 1을 표현하기 위해서 어떻게 신호를 줘야하는지에 대해서 설명하고 있다.
- 먼저, DHT11측에서 50us 동안 Single-bus에 전압 레벨을 0으로 만들어 준다. (이는 데이터 0과 동일하다.)
- 그리고, 70us 동안 Single-bus에 전압 레벨을 1으로 만들어 준 뒤, 다시 전압 레베을 0으로 만들어 주면 해당 DHT Signal은 데이터 1을 표현하게 된다.
- 위에서 보았던 데이터 0의 Signal과 비교하였을 때, 전압 레벨이 High 상태를 유지시켜주는 시간이 상대적으로 긴 것을 확인할 수 있다.
- 따라서 MCU측에서는 DHT11로부터 해당 신호를 받게 될 경우, "아! 현재 데이터 1이 들어왔구나."를 알고, 이해할 수 있게 되는 것이다.
2.3. 데이터 전송이 끝나면 어떻게 되는가?
- DHT11측은 데이터 전송이 끝나면 다시 처음 단계로 돌아가 이전에 거쳐왔던 단계를 반복적으로 수행하게 된다.
- 따라서 DHT11은 다시 MCU로부터 시작 신호를 받기 위해 저전력 모드로 전환하게 된다.
3. DHT11과 MCU간에 데이터 전송 과정을 상태도로 표현하자.
- 데이터를 읽는 과정에서 50us 동안 Low-Level한뒤, 26 ~ 28us 동안 High-Level이면 0, 70us 동안 High-Level이면 1로 판별할 수 있지만, DHT11는 오차 범위가 크기 때문에 정확한 Timing을 통한 분류는 힘들다.
- 따라서 정확한 유지 시간을 통한 데이터 분류 보다는 Negative-edge 와 Positive-edge를 이용하여 지속 시간을 Counting한 뒤, Negaive-edge가 발생하기 전까지 Counting한 값이 45us보다 작으면 0, 45us보다 크면 1로 판별하는 것이 상대적으로 데이터를 정확하게 분류할 수 있다.
- 따라서 실제 구현에서도 Counter가 Counting한 값을 토대로 데이터를 0인지 1인지를 분류할 예정이다.
'RTL Design > Verilog RTL 설계' 카테고리의 다른 글
Verilog RTL 설계(7월 24일 - 3, HC-SR04 구현) (0) | 2024.07.25 |
---|---|
Verilog RTL 설계(7월 24일 - 2, HC-SR04 기초) (1) | 2024.07.25 |
Verilog RTL 설계(7월 22일 - 2, FSM 형식으로 Keypad 재구현) (2) | 2024.07.23 |
Verilog RTL 설계(7월 22일 - 1, 4X4 Matrix Keyboard - 1) (4) | 2024.07.23 |
Verilog RTL 설계(7월 18일 - 5, Stop Watch - 4) (0) | 2024.07.22 |