В этом проекте мы собираемся разработать схему для измерения температуры. Эта схема разработана с использованием линейного датчика напряжения « LM35 ». Температура обычно измеряется в градусах Цельсия или Фархейта. Датчик «LM35» выдает выходной сигнал по шкале Цельсия.
LM35 представляет собой трехконтактное транзисторное устройство. Он имеет VCC, GND и OUTPUT. Этот датчик обеспечивает переменное напряжение на выходе в зависимости от температуры.
Как показано на рисунке выше, на каждое повышение температуры на +1 градус по Цельсию выходная мощность будет на + 10 мВ выше. Таким образом, если температура составляет 0 ° по Цельсию, выходной сигнал датчика будет 0В, если температура 10 ° по Цельсию, выходной сигнал датчика будет + 100 мВ, если температура 25 ° по Цельсию, выходной сигнал датчика будет + 250 мВ.
Итак, пока с LM35 мы получаем температуру в виде переменного напряжения. Это зависящее от температуры напряжение подается на вход АЦП (аналого-цифровой преобразователь) ATMEGA32A. Полученное цифровое значение после преобразования отображается на ЖК-дисплее 16x2 в виде температуры.
Необходимые компоненты
Аппаратное обеспечение: микроконтроллер ATMEGA32, блок питания (5 В), ПРОГРАММАТОР AVR-ISP, JHD_162ALCD (16x2LCD), конденсатор 100 мкФ (две штуки), конденсатор 100 нФ, датчик температуры LM35.
Софт: Atmel studio 6.1, прогисп или flash magic.
Принципиальная схема и объяснение
В схеме PORTB ATMEGA32 подключен к порту данных ЖК-дисплея. Здесь следует не забыть отключить связь JTAG в PORTC или ATMEGA, изменив байты предохранителя, если вы хотите использовать PORTC в качестве обычного коммуникационного порта. В ЖК-дисплее 16x2 всего 16 контактов, если есть подсветка, если нет подсветки, будет 14 контактов. Можно включить или оставить контакты подсветки. Теперь в 14 контактах 8 контактов данных (7-14 или D0-D7), 2 контакта источника питания (1 и 2 или VSS и VDD или gnd & + 5v), 3- й контакт для контроля контрастности (VEE-контролирует толщину символов. показано), 3 управляющих контакта (RS, RW и E).
В схеме вы можете заметить, что я взял только два контрольных контакта, так как это дает гибкость для лучшего понимания. Бит контраста и READ / WRITE используются нечасто, поэтому их можно замкнуть на массу. Это переводит ЖК-дисплей в режим максимальной контрастности и чтения. Нам просто нужно управлять контактами ENABLE и RS, чтобы отправлять символы и данные соответственно.
Подключения, которые выполняются для ЖК-дисплея, приведены ниже:
PIN1 или VSS ------------------ заземление
PIN2 или VDD или VCC ------------ + 5В питание
PIN3 или VEE --------------- земля (дает максимальный контраст лучше всего для новичков)
PIN4 или RS (выбор регистра) --------------- PD6 uC
PIN5 или RW (чтение / запись) ----------------- земля (переводит ЖК-дисплей в режим чтения, упрощает коммуникацию для пользователя)
PIN6 или E (включить) ------------------- PD5 uC
PIN7 или D0 ----------------------------- PB0 uC
PIN8 или D1 ----------------------------- PB1 uC
PIN9 или D2 ----------------------------- PB2 uC
PIN10 или D3 ----------------------------- PB3 uC
PIN11 или D4 ----------------------------- PB4 uC
PIN12 или D5 ----------------------------- PB5 uC
PIN13 или D6 ----------------------------- PB6 uC
PIN14 или D7 ----------------------------- PB7 uC
В схеме вы можете видеть, что мы использовали 8-битную связь (D0-D7), однако это не обязательно, мы можем использовать 4-битную связь (D4-D7), но с 4-битной коммуникационной программой становится немного сложнее, поэтому я выбрал 8-битную общение.
Итак, исходя из простого наблюдения из приведенной выше таблицы, мы подключаем 10 контактов ЖК-дисплея к контроллеру, в котором 8 контактов являются контактами данных и 2 контакта для управления. Выходное напряжение, обеспечиваемое датчиком, не является полностью линейным; это будет шумно. Для фильтрации шума на выходе датчика необходимо разместить конденсатор, как показано на рисунке.
Прежде чем двигаться дальше, нужно поговорить об АЦП ATMEGA32A. В ATMEGA32A мы можем подавать аналоговый вход на любой из восьми каналов PORTA, неважно, какой канал мы выберем, поскольку все они одинаковы. Мы собираемся выбрать канал 0 или PIN0 PORTA. В ATMEGA32A, АЦП имеет разрешение 10 бит, так что контроллер может определить смысл как минимум смена Vref / 2 ^ 10, поэтому, если опорное напряжение 5V мы получаем цифровой приращение выходного сигнала для каждого 5/2 ^ 10 = 5mV. Таким образом, на каждые 5 мВ приращения на входе у нас будет приращение на единицу на цифровом выходе.
Теперь нам нужно настроить регистр АЦП исходя из следующих условий:
1. Прежде всего нам нужно включить функцию ADC в ADC.
2. Поскольку мы измеряем комнатную температуру, нам не нужны значения, превышающие 100 градусов (выходная мощность 1000 мВ LM35). Таким образом, мы можем установить максимальное значение или ссылку АЦП на 2.5V.
3. Контроллер имеет функцию преобразования триггера, что означает, что преобразование АЦП происходит только после внешнего триггера, поскольку мы не хотим, чтобы нам нужно было настраивать регистры для работы АЦП в непрерывном автономном режиме.
4. Для любого АЦП частота преобразования (аналоговое значение в цифровое значение) и точность цифрового выхода обратно пропорциональны. Поэтому для большей точности цифрового вывода мы должны выбирать меньшую частоту. Для меньшей частоты АЦП мы устанавливаем предварительную продажу АЦП на максимальное значение (128). Поскольку мы используем внутренние часы с частотой 1 МГц, частота АЦП будет (1000000/128).
Это единственные четыре вещи, которые нам нужно знать, чтобы начать работу с ADC. Все перечисленные выше четыре функции устанавливаются двумя регистрами.
КРАСНЫЙ (ADEN): этот бит должен быть установлен для включения функции ADC ATMEGA.
СИНИЙ (REFS1, REFS0): Эти два бита используются для задания опорного напряжения (или максимальное входное напряжение, мы собираемся дать). Поскольку мы хотим иметь опорное напряжение 2.56V, REFS0 и REFS1 оба должны быть установлены, с помощью таблицы.
СВЕТЛО-ЗЕЛЕНЫЙ (ADATE): этот бит должен быть установлен для непрерывной работы АЦП (режим автономной работы).
РОЗОВЫЙ (MUX0-MUX4): эти пять битов предназначены для указания входного канала. Поскольку мы собираемся использовать ADC0 или PIN0, нам не нужно устанавливать какие-либо биты, как указано в таблице.
КОРИЧНЕВЫЙ (ADPS0-ADPS2): эти три бита предназначены для установки предскалярного значения для АЦП. Так как мы используем предскаляр 128, мы должны установить все три бита.
ТЕМНО-ЗЕЛЕНЫЙ (ADSC): этот бит устанавливается для АЦП, чтобы начать преобразование. Этот бит можно отключить в программе, когда нам нужно остановить преобразование.
Чтобы сделать этот проект с Arduino, см. Это руководство: Цифровой термометр с использованием Arduino
Объяснение программирования
Работу по ИЗМЕРЕНИЮ ТЕМПЕРАТУРЫ лучше всего объяснить пошагово с помощью кода C, приведенного ниже:
#include // заголовок для включения управления потоком данных на выводах
#define F_CPU 1000000 // сообщаем, что частота кристалла контроллера подключена
#включают
#define E 5 // присвоение имени «enable» 5- му выводу PORTD, так как он подключен к выводу включения ЖК-дисплея
#define RS 6 // присвоение имени «выбор регистра» 6- му выводу PORTD, так как он подключен к выводу RS LCD
void send_a_command (команда unsigned char);
void send_a_character (символ без знака);
void send_a_string (char * string_of_characters);
int main (пусто)
{
DDRB = 0xFF; // помещаем portB и portD в качестве выходных контактов
DDRD = 0xFF;
_delay_ms (50); // выдаем задержку 50 мс
DDRA = 0; // Принимаем портA в качестве входного.
ADMUX - = (1 <
ADCSRA - = (1 <0)
{
send_a_character (* строка_символов ++);
}
}