Примеры из Шпаковой книги

 

SOS

Вывод некоторого числа по нажатию кнопки (UARTout)

Бегающие глаза

Индикатор, мигающий каждую секунду

Переключение индикаторов по нажатию кнопки

 

RS-232-in_UART-out

 

 

АЦП

SPI-in_&_out

 

ШИМ Управление яркостью свечения светодиода с помощью ШИМ. ШИМ

Когда на вывод некоторого порта с постоянной частотой подается и снимает­ся напряжение, получается последовательность импульсов, подобная импульсам системной синхронизации. Обычно при равномерных импульсах первую полови­ну такта на выводе присутствует напряжение, а вторую — отсутствует. Такое рас­пределение называется 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, Resis­tive 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; 61°C = 0x3FF - 1023.

Отсюда получаем формулу для вычисления текущей температуры:

t=101°C - ADCW/1023 - 40°C,

где 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 рассмотренный в предыдущей главе).

 

Часы

 

Putchar

 

Hosted by uCoz