Книжная полка Сохранить
Размер шрифта:
А
А
А
|  Шрифт:
Arial
Times
|  Интервал:
Стандартный
Средний
Большой
|  Цвет сайта:
Ц
Ц
Ц
Ц
Ц

Лабораторная работа №2. Программирование LCD, АЦП и 1-Wire в CodeVision и Proteus для микроконтроллеров AVR.

Покупка
Основная коллекция
Артикул: 620030.01.99
Борисевич, А. В. Лабораторная работа №2. Программирование LCD, АЦП и 1-Wire в CodeVision и Proteus для микроконтроллеров AVR [Электронный ресурс] / А. В. Борисевич. - Москва : Инфра-М, 2014. - 19 с. - Текст : электронный. - URL: https://znanium.com/catalog/product/470093 (дата обращения: 29.03.2024). – Режим доступа: по подписке.
Фрагмент текстового слоя документа размещен для индексирующих роботов. Для полноценной работы с документом, пожалуйста, перейдите в ридер.
Лабораторная работа №2.
Программирование LCD, АЦП и 1-Wire в CodeVision и Proteus для 

микроконтроллеров AVR.

Ход работы
1. Изучить теоретические сведения к лабораторной работе.
2. Выполнить практическую часть лабораторной работы.
3. Модифицировать программу в соответствии со своим вариантом.
4. Подготовить отчет по работе.
5. Ответить на контрольные вопросы.

Теория

1. Индикатор HD44780
Жидкокристаллический индикатор (LCD) на контроллере HD44780 стал 

промышленным стандартом де-факто на рынке цифро-буквенных дисплеев. 
Он всегда доступен в продаже, имеет небольшую стоимость, а также под него 
написана большое количество кода, выложенного в интернете. Часто этот 
индикатор называется 16x2 по стандартному числу строк и количеству 
символов в строке. Контроллер полностью берет на себя все действия по 
обслуживанию индикатора, программисту необходимо только записывать 
коды выводимых символов.

LCD на базе HD44780 подключается к микроконтроллеру напрямую к 

портам  Есть два способа подключения: шиной 8 бит и 4 бита. В 

восьмибитном режиме проще записывать байты — не нужно сдвигать байт, 
зато в четырех битном экономится четыре ножки контроллера. Есть еще одна 
особенность работы в 8-битном режиме — к некоторым контроллерам можно 
подключить этот дисплей как внешнее ОЗУ и засылать данные простыми 
командами пересылки. 

Сигналы индикатора:
DB7…D

B0 

Шина данных/адреса.

E 
Стробирующий вход. Импульсом (фронтом) 

напряжения на этой линии сообщается дисплею, что 
нужно забирать/отдавать данные с/на шину данных.

RW 
Определяет в каком направлении передаются 

данные. Если 1- то на чтение из дисплея, если 0 то на 
запись в дисплей.

RS 
Определяет что передается: команда (RS=0) или 

данные (RS=1). Данные будут записаны в память по 
текущему адресу, а команда исполнена 
контроллером.

Схема подключения вместе с выводами питания:

Контроллер имеет свой блок управления, который обрабатывает команды и 

память. Она делится на три вида:

DDRAM — память дисплея. Все что запишется в DDRAM будет выведено 

на экран. То есть, например, если записать туда код 0×31 — на экране 
выскочит символ 1 т.к. 0х31 это ASCII код цифры 1

CGROM — таблица символов. Когда мы записываем в ячейку DDRAM 

байт, то из таблицы берется символ и рисуется на экране. CGROM нельзя 
изменить, поэтому важно, чтобы она имела на борту русские буквы. Если, 

конечно, планируется русскоязычный интерфейс.

CGRAM — тоже таблица символов, но ее мы можем менять, создавая свои 

символы. Адресуется она линейно, то есть вначале идет 8 байт одного 
символа, построчно, снизу вверх — один бит равен одной точке на экране. 

2. АЦП микроконтроллера AVR
Довольно часто возникает потребность измерять напряжения, которые 

могут принимать любое значение в диапазоне от 0 до напряжения питания. 
Для этих целей в составе микроконтроллеров AVR есть аналого-цифровой 
преобразователь (АЦП).

Не вдаваясь в подробности внутреннего устройства АЦП, представим его в 

виде черного ящика. На вход АЦП подается непрерывный аналоговый сигнал, 
а на выходе получается последовательность цифровых значений. АЦП имеет 
много характеристик, но в качестве основных можно назвать  разрешающую 
способность, абсолютную точность, предельную частоту дискретизации и 
диапазон входных напряжений.

Разрешающая способность (разрешение)  – это способность АЦП различать 

два значения входного сигнала. Определяется как величина обратная 
максимальному числу кодовых комбинаций на выходе АЦП. У AVRа АЦП 10ти разрядный. Максимальное число кодовых комбинаций будет равно 210 = 
1024. Разрешающая способность равна 1/1024 от всей шкалы допустимых 
входных напряжений.

Для работы АЦП необходим источник опорного напряжения (ИОН). Для 

него это эталон, по отношению к которому он измеряет входные сигналы. 
Микроконтроллеры AVR позволяют в качестве ИОНа использовать 
напряжение питания, внутренний опорный источник на 2,56 В и напряжение 
на выводе AREF (внешний ИОН). 

Напряжение питания в нашей схеме 5 В, тогда 1/1024 от всей шкалы это 5 * 

1/1024 = 0,0048 В или примерно 5 мВ. С таким шагом (это называется шаг 
квантования) АЦП будет измерять входное напряжение. Если два ближайших 
значения сигнала на входе АЦП будут отличаться между собой на величину < 

мВ, АЦП воспримет их как одинаковые. На практике разрешающая 
способность АЦП ограничена его шумами.

Абсолютная точность – отклонение реального преобразования от 

идеального. Это составной результат нескольких погрешностей АЦП. 
Выражается в количестве младших значащих разрядов (LSB - least significant 
bit) АЦП. Для AVRа абсолютная погрешность АЦП  =  ±2LSB. Для нашего 
примера абсолютная точность будет равна 2 * 5 мВ = ±10 мВ.

Предельная частота дискретизации определяет быстродействие АЦП и 

измеряется в герцах или количестве выборок в секунду (SPS – samples per 
second). Для микроконтроллеров AVR эта величина равна 15 kSPS (килло 
семплов в секунду). Практически АЦП AVRа работает и быстрее, но при этом  
его точность ухудшается.

Теорема Котельникова (теорема Найквиста-Шеннона, теорема о выборке) 

гласит, что аналоговый сигнал имеющий ограниченный спектр, может быть 
восстановлен однозначно и без потерь по своим дискретным отсчѐтам, если 
частота выборки (дискретизации) превышает максимальную частоту спектра  
сигнала более чем в 2 раза. Выражаясь по-простому - если вам нужно 
оцифровать аналоговый сигнал с полосой спектра 0 - 7 КГц, то в идеальном 
случае частота дискретизации должна быть > удвоенной максимальной 
частоты спектра этого сигнала, то есть > 14 КГц. На практике все намного 
сложнее. Перед входом АЦП всегда ставят НЧ фильтр, чтобы ограничить 
спектр сигнала, а частота дискретизации выбирается еще более высокой. 

Диапазон входных напряжений – это минимальное и максимальное 

значение напряжения, которое можно подавать на вход АЦП. Для 
микроконтроллера AVR он равен 0 – Vcc (напряжение питания).

По внутренней структуре, АЦП представляет собой преобразователь 

последовательного приближения:

3. Шина 1-Wire
Шина 1-wire (еще называют MicroLAN, dallas-wire) называется так, потому 

что для передачи данных в обе стороны используется только 1 провод. Среди 
самых популярных устройств, работающих на этой шине можно выделить 
термодатчик DS18B20 и электронный ключ DS1990 (которым вы в подъезде 
двери открываете):

У сети 1-wire есть одно ведущее устройство (Master) и несколько (или 1) 

подчиненных (Slave). Бывают сети с несколькими ведущими. Передачу 
данных начинает ведущий, только он может посылать сигнал сброса (Reset), 
остальные устройства могут только отвечать на его запросы. Все устройства 
подключаются к шине параллельно, то есть, линию данных с каждого 
устройства (она обозначается DATA, DQ или OW_DQ), включая линию 
ведущего. Линия данных должна быть подтянута к питанию через резистор 
2,2-4,7 кОм.

Каждое устройство имеет свой индивидуальный 64-битный адрес, который 

устанавливается при изготовлении устройства (прямо на заводе).

Подключение 1-wire устройства к микроконтроллеру показано ниже

Существует два варианта питания: паразитное, когда устройство питается 

от шины данных DQ и выделенное, когда используется отдельный провод 
питания. Таким образом, шина 1-wire состоит из двух (DQ, GND) или трех 
(DQ, GND, VCC) проводов.

4. Термодатчик DS18B20

Микросхема DS18B20 это термометр с цифровым вводом/выводом, 

работающий с точностью ±0.5°C. Данные считываются через 1-проводную 
последовательную шину в дополнительном от 9 до 12 битном 
(программируется пользователем) коде с ценой младшего разряда от 0.5°C до 
0.0625°C.

При использовании в качестве термостата, DS18B20 отличается наличием 

во внутренней энергонезависимой памяти (EEPROM) программируемых 
пользователем уставок по превышению температуры (TH) и по понижению 
температуры (TL). Внутренний регистр флага будет выставлен, когда уставка 
пересечена. Это будет исполнено, когда измеренная температура больше чем 
TH или меньше чем TL. Если термостатирование не требуется, два байта 
энергонезависимой памяти (EEPROM) зарезервированные для уставок могут 
быть использованы для энергонезависимого хранения информации общего 
назначения.

Каждая микросхема DS18B20 имеет уникальный и неизменяемый 64
битный серийный номер, который используется как узловой адрес датчика. 
Это позволяет множеству микросхем DS18B20 сосуществовать на одной 1проводной шине. Микросхема DS18B20 может быть локально запитана от 
3.0В до 5.5В или она может быть сконфигурирована таким образом, чтобы 
быть запитанной посредством 1-проводной линии данных.

Существует также датчик DS18S20 - младшая модификация DS18B20, 

выдающий температуру 9-битным числом с шагом в 0,5°С. Имеет 
возможность программно уменьшить шаг выдачи температуры до 0,1°С. 
Длительность замера температуры - около 0.8 сек.

Практическая часть. 
Цель: с помощью микроконтроллера AVR ATMega16 необходимо измерить 

напряжение, подаваемое с переменного резистора, а также измерить с 
помощью датчика DS18B20 (или DS18S20) и показать результаты измерений 
на LCD индикаторе 16x2.

Измерить напряжение довольно просто. Микроконтроллер ATMega16 имеет 

8 входов аналого-цифрового преобразователя (АЦП). Сам АЦП имеет 
разрядность 10 бит, что дает 1024 ступени измерения. Например, если 
измерения проводить в интервале 0-10 вольт, то результат можно получить с 
точностью примерно до 0,01.

Температуру можно измерить подключив к одному из входов АЦП 

терморезистор или термопару. Но тут могут возникнуть сложности с 
программной реализацией, ведь нужно будет по каким-либо формулам 
пересчитывать полученное значение напряжения в температуру.

К счастью, можно воспользоваться датчиком DS18S20, внутри которой 

содержится цифровой датчик температуры с точностью до 0,1С и диапазоном 
от -55 до +125 С.

Подключение к микроконтроллеру осуществляется по интерфейсу 1-wire , 

позволяющему объединить по одной линии данных практически 
неограниченное количество периферии. 

Возьмем датчик DS18S20 и подключим его к микроконтроллеру 

стандартным образом (без использования паразитного питания).

Для вывода результатов измерения можно взять LCD дисплей на основе 

контроллера HD44780.

Также воспользуемся функцией таймера Watchdog (дословно - сторожевой 

пес), или, так называемый, сторожевой таймер. Предназначен он для того, 
чтобы сбрасывать МК при зависании программы.

Он имеет свой собственный тактовый генератор на 1 МГц и предделитель, 

который позволяет выставить интервал времени от 0,016 до 2,048 секунды. 
При переполнении этого таймера происходит принудительный сброс МК. 
Этот таймер нужно периодически сбрасывать в каком-либо месте программы, 
не допуская его переполнения при нормальном исполнении программы.

Рассмотрим процесс создания заготовки для программы в Code Wizard. 

Создим новый проект в CodeVision AVR и запустим Code Wizard.

Указываем тип и частоту МК.

Настраиваем порты A, B, D.

Теперь на вкладке LCD выбираем порт для подключения дисплея.

А на вкладке 1 Wire указываем вывод для подключения датчиков и ставим 

галочки Enabled (включено), и Multiple Devices (множество устройств), чтобы 
включить использование датчиков DS18S20.

Переходим на вкладку ADC и включаем аналого-цифровой 

преобразователь.

И еще заходим на вкладку Timers -> Watchdog и выставляем следующее:

Генерируем, сохраняем и приступаем к анализу полученного кода.

Эта часть кода 

// 1 Wire Bus functions
#asm

.equ __w1_port=0x12;PORTD
.equ __w1_bit=0

#endasm

указывает компилятору, какой вывод МК должен использоваться для 

интерфейса 1wire.

Фрагмент кода записан на ассемблере.

Ассемблерные вставки можно делать так:

#asm(“sei”)

Команда ассемблера пишется в кавычках. Удобно, если нужно выполнить 

только одну команду.

―sei‖ – команда разрешения всех прерываний
А если необходимо выполнить несколько команд, написанных на 

ассемблере, их удобнее будет вставить между директивами #asm (начало кода) 
и #endasm (конец кода).

#include <1wire.h>
// DS1820 Temperature Sensor functions
#include <ds1820.h>

Подключение файлов с функциями, необходимыми для работы с 

интерфейсом 1wire и датчиками DS18S20.

// maximum number of DS1820 devices
// connected to the 1 Wire bus
#define MAX_DS1820 8

Константа, определяющая максимальное число датчиков, подключенных к 

МК.

// number of DS1820 devices
// connected to the 1 Wire bus
unsigned char ds1820_devices;

Переменная, в которую записывается число найденных датчиков.

// DS1820 devices ROM code storage area,
// 9 bytes are used for each device
// (see the w1_search function description in the 

help)

unsigned char ds1820_rom_codes[MAX_DS1820][9];

Переменная, в которой хранятся идентификационные коды найденных 

датчиков.

// Alphanumeric LCD Module functions
#asm

.equ __lcd_port=0x15;PORTC

#endasm
#include <lcd.h>

Тут определяется порт, используемый для дисплея, и подключается 

библиотека для работы с ним.

#define ADC_VREF_TYPE 0xC0

Эта переменная указывает на источник опорного напряжения для АЦП. У 

нас это внутренний стабилизатор 2,56 В. Следовательно, одно деление АЦП 
будет равно 0,0025В

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input 

voltage

delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

Функция, возвращающая результат аналого-цифрового преобразования для 

указанного входа.

// Determine the number of DS1820 devices
// connected to the 1 Wire bus
ds1820_devices=w1_search(0xf0,ds1820_rom_codes);

Запуск функции поиска 1wire устройств и запись их количества в 

переменную ds1820_devices.

// LCD module initialization
lcd_init(16);

Инициализация дисплея

// Global enable interrupts
#asm("sei")

Разрешение прерываний.

Теперь будем добавлять свой код.