Примеры из Шпаковой книги
Вывод некоторого числа по нажатию
кнопки (UARTout)
Индикатор, мигающий каждую
секунду
Переключение индикаторов по
нажатию кнопки
ШИМ Управление яркостью свечения светодиода с помощью ШИМ. ШИМ
Когда на вывод некоторого порта с постоянной частотой
подается и снимается напряжение, получается последовательность импульсов,
подобная импульсам системной синхронизации. Обычно при равномерных импульсах
первую половину такта на выводе присутствует напряжение, а вторую —
отсутствует. Такое распределение называется 50%-м рабочим циклом (рис. 4.2).
Мы можем варьировать распределением нагрузки от 0% рабочего цикла (напряжение
постоянно отсутствует) до 100% (напряжение постоянно подается).
Если сохранить частоту импульсов неизменной, но при этом
снижать или увеличивать время использования светодиода за один такт,
тем самым можно управлять мощностью, потребляемой светодиодом, и, в конечном
итоге, — яркостью его свечения. Человеческий глаз воспринимает мигающие с
большой частотой светодиоды так, как будто они постоянно включены. Кроме
того, мы воспринимаем яркость быстро пульсирующего света как промежуточную между пиковой и средней. Это означает, что
интенсивные импульсы с низким рабочим циклом выглядят ярче.
Благодаря таким особенностям восприятия можно обеспечить свечение,
которое кажется более ярким, задействовав широтно-импульсную модуляцию (ШИМ).
К примеру, в случае таймера/счетчика Т/С1 для перехода в режим ШИМ следует
установить разряды PWM10
и PWM11 регистра TCCR1A. В этом режиме Т/С1 работает как суммирующий и вычитающий счетчик, осуществляя
циклические переходы от 0x0000 к максимальному значению и затем
снова возвращаясь к 0x0000. Когда значение счетного регистра совпадает со
значением регистра OCR1A, то на выводе
микроконтроллера ОС1А устанавливается высокий или низкий
уровень сигнала (определяется состоянием разрядов СОМ1А1 и СОМ1А0 регистра
TCCR1
А).
Таким образом, если к выводу ОС1А подсоединить светодиод,
то в режиме ШИМ "интенсивностью" его свечения можно
управлять, изменяя значение в регистре сравнения OCR1.
Реализация циклического увеличения и уменьшения
"интенсивности" свечения светодиода,
подсоединенного к выводу ОС1А, представлена ниже. В
этом примере продемонстрировано использование директив препроцессора #if, #elif и #endif, а также библиотечного
макроса _BV, используемого для
установки того или иного разряда в лог. 1.
Измерение периода (длительности
импульса)
Измерение скорости вращения
двигателя с отображением результата на ЖК-дисплее.
Для измерения скорости вращения можно
воспользоваться оптопрерывателем — прибором, в
котором между эмитирующим инфракрасное излучение диодом и транзистором-детектором
имеется воздушная прослойка (например, прибор Н21А1 производства FAIRCHILD).
Если между диодом и детектором поместить непрозрачный объект, транзистор
разомкнет цепь и тем самым "прервет" сигнал. Подключив такое
устройство к выводу ICP микроконтроллера,
можно в режиме ШИМ регистрировать частоту вращения диска с вырезом,
закрепленного на оси двигателя. Всякий раз, когда вырез будет находиться в щели
оптопрерывателя, транзистор будет замыкать цепь, а
как только вырез будет уходить из щели, транзистор будет ее размыкать. Если
выполнять подсчет раз в секунду, то будет получено количество оборотов вала в 1
с, то есть, частоту вращения в герцах.
Используем микроконтроллер с тактовой частотой 8 МГц (например, AT90S8535).
Используя коэффициент деления 8 получаем частоту тактирования Т/С1 равной 1 МГц (период такта — 1 мкс). Каждый раз, когда на
выводе ICP микроконтроллера (для устройства AT90S8535 — вывод PD6) появляется ниспадающий фронт сигнала, возникает
прерывание по захвату на входе, и вычисляется количество тактовых импульсов
между предыдущим и текущим моментом захвата (хранится в регистре ICR1). На основании этого значения вычисляется
скорость вращения вала двигателя (в оборотах в минуту) по формуле:
U = 60-106/T,
где Т — длительность одного оборота в мкс (1 секунда = 106мкс).
Полученный результат будем отображать на ЖК-дисплее. Выберем, к примеру,
для этой цели ЖК-модуль DMC2048 производства OPTREX.
Модуль DMC2048 работает
в четырехразрядном режиме. Это означает, что все поступающие на устройство
данные передаются с помощью четырех линий данных (в случае рассматриваемой
микросхемы они обозначены как DB4-DB7).
Используется три управляющих сигнала:
Е — стробирующий сигнал для подтверждения
передачи данных, предназначенных к отображению на дисплее;
RD (R/W) — определяет
текущую операцию: чтение данных из ЖК-модуля (RD=1) или запись данных в ЖК-модуль
(RD=0);
RS — определяет
характер передаваемых данных: команда (RS=0), влияющая на режим работы дисплея, или данные (RS=1), которые следует отобразить.
В нашем примере линия Е ЖК-модуля будет подсоединена к выводу 0 порта В микроконтроллера, линия RS — к выводу 1, а линия RD — к выводу 2 того же порта. Линии данных будут соединены с выводами 0-3 порта С микроконтроллера.
Контроль скорости вращения вентилятора с учетом
показаний датчика температуры
Самый простой способ замера температуры — с помощью термистора (терморезистора).
Такие устройства выпускаются для широкого диапазона температур и, при правильном
подборе, не требуют специального усиления или предварительной обработки
сигналов.
Существует также и множество других температурных сенсоров, включая биметаллические,
термопары и резистивные температурные устройства (RTD, Resistive Temperature Device). Стоит также упомянуть о специальных микросхемах,
наподобие LM35 от компании
National Semiconductor, — калиброванные, стабильные в измерениях
устройства, выдающие определенный уровень напряжения на градус Цельсия.
Например, для LM35 выходное значение
составляет 10 мВ/°С. Тем не менее, несмотря на все
свои достоинства, подобные устройства более дорогостоящие и требуют
дополнительных схем.
Для опроса температуры в нашей программе выберем термистор с
отрицательным температурным коэффициентом (NTC, Negative Temperature Coefficient). Поскольку термистор выдает значения в виде процентов сопротивления
на градусы Цельсия, для измерения температуры можно воспользоваться резистивным
делителем. Диапазон выходных напряжений делителя также можно приспособить к
диапазону АЦП, обеспечив таким образом наилучшее
разрешение.
В микроконтроллерах AVR ко входу АЦП обычно подключают цепи с небольшим выходным
импедансом (около 5 кОм или ниже). Выберем резистор на 4,7 кОм для формирования
делителя с термистором 2 кОм (приблизительное сопротивление при 25°С) (рис.
4.4).
Выбранный термистор изменяет величину на 3,83% на
каждый 1°С. Это обеспечивает диапазон напряжения в АЦП от 0,84 В при -40°С до
4,5 В при 61°С. Термистор размещен в верхнем плече делителя, поскольку его
отрицательный импеданс изменяется с температурой. В результате
с повышением температуры будет повышаться и напряжение на входе АЦП.
Разрешение АЦП составляет 10 разрядов, поэтому измеренные значения температуры
соответствуют следующим пределам:
- 40°С = 0x000=0;
Отсюда получаем формулу для вычисления текущей температуры:
t=101°C - ADCW/1023 -
где ADCW — текущее
содержимое регистра данных интегрированного АЦП.
В нашем примере в качестве аналогового входа, к
которому подключен выход резистивного делителя с термистором, будем
использовать вывод 3 порта А. Для приведения в действие вентилятора охлаждения
воспользуемся, к примеру, электродвигателем на 9 В, схема подключения которого представлен на рис. 4.5.
Исходя из этой схемы, управлять скоростью вращения
можно в режиме ШИМ Т/С1. Напомним, что в этом режиме
Т/С1 работает как суммирующий и вычитающий счетчик,
осуществляя циклические переходы от 0x0000 к максимальному значению и затем
снова возвращаясь к 0x0000. Когда значение счетного регистра совпадает со
значением регистра OCR1A, то на выводе микроконтроллера ОС1А
устанавливается высокий или низкий уровень сигнала (определяется состоянием
разрядов СОМ1А1 и СОМ1А0 регистра TCCR1A). Таким образом, чем меньше значение хранится в
регистре сравнения OCR1A, тем реже поступают управляющие импульсы,
включающие двигатель. Примем, что температуре 30ºС и ниже двигатель вообще отключен (OCR1A = 0), а при
температуре 60ºС — вращается с максимальной
скоростью (OCR1A = 1022). Отсюда, формула для определения текущего
значения регистра OCR1А в
зависимости от температуры имеет вид:
OCR1А = (t - 30) * 1022 / 30°С.
Данные о текущей температуре и относительной скорости вращения вентилятора
будут отображены на ЖК-дисплее (выберем для этой цели модуль DMC2048 рассмотренный в предыдущей главе).