이 프로젝트에서 우리는 온도 측정을위한 회로를 설계 할 것입니다. 이 회로는 선형 전압 센서 인 “ LM35 ”를 사용하여 개발되었습니다. 온도는 일반적으로 "섭씨"또는 "화씨"로 측정됩니다. “LM35”센서는 섭씨 눈금에 따라 출력을 제공합니다.
LM35는 장치와 같은 3 핀 트랜지스터입니다. VCC, GND 및 OUTPUT이 있습니다. 이 센서는 온도에 따라 출력에서 가변 전압을 제공합니다.
위의 그림에서 볼 수 있듯이 온도가 +1 섭씨 상승 할 때마다 + 10mV 더 높은 출력이 발생합니다. 따라서 온도가 섭씨 0 °이면 센서 출력은 0V가되고, 온도가 섭씨 10 °이면 센서 출력은 + 100mV가되고, 온도가 섭씨 25 °이면 센서 출력은 + 250mV가됩니다.
따라서 지금은 LM35를 사용하여 가변 전압의 형태로 온도를 얻습니다. 이 온도 의존 전압은 ATMEGA32A의 ADC (Analog to Digital Converter)에 대한 입력으로 제공됩니다. 얻은 변환 후 디지털 값은 온도로 16x2 LCD에 표시됩니다.
필요한 구성 요소
하드웨어: ATMEGA32 마이크로 컨트롤러, 전원 공급 장치 (5v), AVR-ISP PROGRAMMER, JHD_162ALCD (16x2LCD), 100uF 커패시터 (2 개), 100nF 커패시터, LM35 온도 센서.
소프트웨어: Atmel studio 6.1, progisp 또는 flash magic.
회로도 및 설명
회로에서 ATMEGA32의 PORTB는 LCD의 데이터 포트에 연결됩니다. 여기서 PORTC를 일반 통신 포트로 사용하려면 퓨즈 바이트를 변경하여 PORTC 또는 ATMEGA에서 JTAG 통신을 비활성화해야합니다. 16x2 LCD에는 백라이트가 있으면 전체적으로 16 개의 핀이 있고, 백라이트가 없으면 14 개의 핀이 있습니다. 백라이트 핀에 전원을 공급하거나 남겨 둘 수 있습니다. 이제 14 핀에는 8 개의 데이터 핀 (7-14 또는 D0-D7), 2 개의 전원 공급 장치 핀 (1 & 2 또는 VSS & VDD 또는 gnd & + 5v), 대비 제어를위한 3 번째 핀 (VEE- 문자의 두께 제어)이 있습니다. 그림), 3 개의 제어 핀 (RS & RW & E).
회로에서 더 나은 이해의 유연성을 제공하기 때문에 두 개의 제어 핀만 사용했음을 알 수 있습니다. 대비 비트와 READ / WRITE는 자주 사용되지 않으므로 접지로 단락 될 수 있습니다. 이렇게하면 LCD가 가장 높은 명암비 및 읽기 모드가됩니다. ENABLE 및 RS 핀을 제어하여 문자와 데이터를 적절하게 전송하면됩니다.
LCD에 대해 수행되는 연결은 다음과 같습니다.
PIN1 또는 VSS ------------------ 접지
PIN2 또는 VDD 또는 VCC ------------ + 5v 전원
PIN3 또는 VEE --------------- ground (초보자에게 최상의 대비를 제공)
PIN4 또는 RS (등록 선택) --------------- uC의 PD6
PIN5 또는 RW (읽기 / 쓰기) ----------------- 접지 (LCD를 읽기 모드로 설정하여 사용자의 통신을 용이하게 함)
PIN6 또는 E (사용) ------------------- uC의 PD5
PIN7 또는 D0 ----------------------------- uC의 PB0
PIN8 또는 D1 ----------------------------- uC의 PB1
PIN9 또는 D2 ----------------------------- uC의 PB2
PIN10 또는 D3 ----------------------------- uC의 PB3
PIN11 또는 D4 ----------------------------- uC의 PB4
PIN12 또는 D5 ----------------------------- uC의 PB5
PIN13 또는 D6 ----------------------------- uC의 PB6
PIN14 또는 D7 ----------------------------- uC의 PB7
회로에서는 8bit 통신 (D0-D7)을 사용하였으나 필수는 아니고 4bit 통신 (D4-D7)을 사용할 수 있지만 4bit 통신 프로그램은 약간 복잡 해져서 8bit를 선택했습니다. 통신.
따라서 위의 표에서 관찰 한 것만으로도 LCD의 10 핀을 컨트롤러에 연결하고 있는데 8 핀은 데이터 핀이고 2 핀은 제어용입니다. 센서가 제공하는 전압 출력은 완전히 선형이 아닙니다. 시끄러울 것입니다. 노이즈를 걸러 내려면 그림과 같이 커패시터를 센서 출력에 배치해야합니다.
계속 진행하기 전에 ATMEGA32A의 ADC에 대해 이야기해야합니다. ATMEGA32A에서는 PORTA의 8 개 채널 중 하나에 아날로그 입력을 제공 할 수 있습니다. 모든 채널이 동일하므로 어떤 채널을 선택하든 상관 없습니다. PORTA의 채널 0 또는 PIN0을 선택하겠습니다. ATMEGA32A에서 ADC는 10 비트 분해능이므로 컨트롤러는 Vref / 2 ^ 10의 최소 변화를 감지 할 수 있으므로 기준 전압이 5V이면 5 / 2 ^ 10 = 5mV마다 디지털 출력 증분을 얻습니다.. 따라서 입력이 5mV 증가 할 때마다 디지털 출력에서 1 씩 증가합니다.
이제 다음 용어에 따라 ADC 레지스터를 설정해야합니다.
1. 먼저 ADC에서 ADC 기능을 활성화해야합니다.
2. 실내 온도를 측정하고 있기 때문에 100도 이상의 값은 필요하지 않습니다 (LM35의 1000mV 출력). 따라서 ADC의 최대 값 또는 기준을 2.5V로 설정할 수 있습니다.
3. 컨트롤러에는 트리거 변환 기능이 있습니다. 즉, ADC가 연속 자유 실행 모드에서 실행되도록 레지스터를 설정할 필요가 없기 때문에 외부 트리거 후에 만 ADC 변환이 발생합니다.
4. 모든 ADC의 경우 변환 빈도 (아날로그 값에서 디지털 값으로)와 디지털 출력의 정확도는 반비례합니다. 따라서 디지털 출력의 정확도를 높이려면 더 낮은 주파수를 선택해야합니다. 더 작은 ADC 클럭의 경우 ADC 사전 판매를 최대 값 (128)으로 설정합니다. 1MHZ의 내부 클럭을 사용하고 있으므로 ADC 클럭은 (1000000/128)이됩니다.
ADC를 시작하기 위해 알아야 할 4 가지 사항은 이것뿐입니다. 위의 네 가지 기능은 모두 두 개의 레지스터로 설정됩니다.
빨간색 (ADEN): ATMEGA의 ADC 기능을 활성화하려면이 비트를 설정해야합니다.
BLUE (REFS1, REFS0):이 두 비트는 기준 전압 (또는 우리가 제공 할 최대 입력 전압)을 설정하는 데 사용됩니다. 기준 전압 2.56V를 원하기 때문에 REFS0과 REFS1은 모두 표에 따라 설정되어야합니다.
연녹색 (ADATE):이 비트는 ADC가 지속적으로 실행되도록 설정해야합니다 (자유 실행 모드).
PINK (MUX0-MUX4):이 5 비트는 입력 채널을 알리기위한 것입니다. ADC0 또는 PIN0을 사용할 것이므로 테이블과 같이 비트를 설정할 필요가 없습니다.
BROWN (ADPS0-ADPS2):이 세 비트는 ADC의 프리 스칼라를 설정하기위한 것입니다. 128의 프리 스칼라를 사용하고 있으므로 세 비트를 모두 설정해야합니다.
DARK GREEN (ADSC): ADC가 변환을 시작하도록이 비트를 설정합니다. 이 비트는 변환을 중지해야 할 때 프로그램에서 비활성화 할 수 있습니다.
Arduino로이 프로젝트를 만들려면이 튜토리얼: Arduino를 사용하는 디지털 온도계를 참조하십시오.
프로그래밍 설명
온도 측정의 작업은 아래에 주어진 C 코드의 단계별로 가장 잘 설명됩니다.
핀에 대한 데이터 흐름 제어를 활성화하는 #include // header
#define F_CPU 1000000 // 텔링 컨트롤러 크리스탈 주파수 부착
#포함
#define E 5 // LCD Enable 핀에 연결되어 있으므로 PORTD의 5 번째 핀에 "enable"이라는 이름을 부여합니다.
#define RS 6 // LCD RS 핀에 연결되어 있으므로 PORTD의 6 번째 핀에 "registerselection"이라는 이름을 부여합니다.
void send_a_command (unsigned char 명령);
void send_a_character (unsigned char character);
void send_a_string (char * string_of_characters);
int main (void)
{
DDRB = 0xFF; // 포트 B와 포트 D를 출력 핀으로 설정
DDRD = 0xFF;
_delay_ms (50); // 50ms 지연 제공
DDRA = 0; // 포트 A를 입력으로 사용합니다.
ADMUX-= (1 <
ADCSRA-= (1 <0)
{
send_a_character (* 문자열 _ 문자 ++);
}
}