Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Методичка MCU

.pdf
Скачиваний:
18
Добавлен:
23.02.2015
Размер:
1.03 Mб
Скачать

Динамическая индикация.

Что такое семиcегментный индикатор (жидкокристаллический(ЖК) или светодиодный(СД) — не важно, пусть СД), Вы знаете из курса радиоэлектроники. Допустим, для вывода на него информации мы хотим подключить каждый сегмент к отдельной ножке нашего микроконтроллера. Ну, для 2х разрядов все еще не так плохо: требуется 2*(7+1) = 16 ножек. Но тут вдруг появляется необходимость отображения чисел вида «101.024». Необходимо 6 разрядов. А 6*8 = 48, а у нашего контроллера всего 40 ножек, да кроме того, часть из них (VCC, VDD, RESET, XTAL1, XTAL2) зарезервировано для других целей. Кроме того, если индикатор находится на удалении от контроллера, придется эти 49 (48+GND) проводов толстым кабелем тянуть между процессором и индикатором. Неудобно.

Для преодоления этого неудобства используется способ динамической индикации. Рассмотрим сначала для простоты матричный индикатор из 8х8=64 светодиодов. Возможно, такие индикаторы Вы видели в устройствах «бегущей строки». Индикаторы серийно выпускаются и доступны по умеренной цене. (на примере KINGBRIGHT TC23 / TA23)

TA и TC отличаются только полярностью подключения светодиодов (см. 2 схемы справа), для определенности смотрим на верхнюю схему.. Светодиоды сгруппированы в строки (ROW) и столбцы (COLumn). Аноды всех диодов столбца m подключены к выводу Cm. Катоды всех диодов строки n подключены к выводу Rn. таким образом, чтобы зажечь светодиод в 5 строке и 7 столбце, нужно подать ток, «+» к выводу С7 (№15 на корпусе индикатора), а «—» к выводу R5 (№1).

Обычно индикатор работает так:

подаем лог. 0 на строку R1, на остальные строки — лог. 1.

31

подаем биты выбранного нами порта индикации (например, PD0-PD7) на выводы столбцов. таким образом, мы можем произвольно зажигать любой светодиод в строке 1.

по прошествии, например, 5мс переключаем строку: подаем лог. 0 на строку R2, на остальные строки — лог. 1. Теперь, выводя информацию в порт D мы можем зажигать любые светодиоды строки 2.

За счет инерционности зрения, если переключение происходит быстро, глаз видит неподвижную картинку из горящих/негорящих светодиодов.

Понятно, что если с обеих сторон светодиода лог. 1 или лог. 0, или напряжение в обратной полярности («+»== лог.1 к катоду, а «-»==лог.0 к аноду) он светиться не будет. С лампочками (для которых полярность не важна) это сделать несколько сложнее: приходилось на каждую лампочку отдельно ставить обычный диод.

Сразу видим достоинство динамической индикации: вместо 64+1 = 65 проводов нам хватило всего 16. На самом деле, поставив специальную микросхему («дешифратор»), которая, взяв 3 бита двоичного числа преобразует это число в лог.0 на одном из 8 выводов, нам хватит всего 8+3=11 выводов.

Правда, есть и недостатки: во-первых, необходимо 100-500 раз в секунду «обращать внимание на индикатор» из программы. Удобно сделать это из обработчика прерывания. Во-вторых, поскольку одна строка светится всего 1/8 времени цикла индикации, ее видимая яркость будет в 8 раз меньше непрерывно горящего светодиода. Для 8 строк это еще не так страшно, а вот для 128 строк — уже неприменимо. Поэтому большие табло разделяют на сегменты — типично, как раз 8х8. Кстати, бегущая строка в трамваях сделана примерно таким образом.

Динамическая индикация может быть реализована и не на квадратных матрицах: расположение светодиодов может быть произвольным. Часто используют 7-сегментные индикаторы:

32

Здесь видим усилитель для каждого индикатора. Кроме того, вместо использования 8 битов порта для управления сегментами, ChaN (ник разработчика, он из Японии) использовал сдвиговый регистр и всего 2 бита. Я пользуюсь регистром 74HC595. Обратите внимание на резисторы R11R18: светодиоды нужно питать от источника тока, а не напряжения, иначе они очень быстро сгорят.

Семисегментные индикаторы также выпускают в исполнении для динамической индикации, например, тот же KINGBRIGHT CC-56 (я такие использую, особенно с суффиксом SURC-E — красные супер-яркие):

Можно комбинировать, например 4шт. 7-сегментных индикатора и 8 светодиодов. Это позволит отображать номер текущего измерительного канала (светодиодами) и, например, температуру в канале.

33

Вот как я реализую работу индикатора в прерывании:

SIGNAL(SIG_OVERFLOW0)

{

TCNT0 = 255-10; // таймер считает до 11.

switch (LEDN) // LEDN — номер индикатора

{

case 0: PORTD &= ~0x80; break; case 1: PORTD &= ~0x40; break; case 2: PORTD &= ~0x20; break; case 3: PORTD &= ~0x10; default:;

}

LED_flash &= 0xF0; // это — мигание разрядов. «Если четверть-секунды нечетная — гасим разряды, для которых установлено мигание».

if ((f100hz / 25) & 1) PORTD |= LED_flash;

LEDN++; LEDN %= 4; // следующий индикатор. Для следующего раза.

PORTB = LED[LEDN]; //выводим на индикатор биты из массива LED[]

//считаем время:

if ((f100hz++) == ONE_SEC) // ++f100hz

{

if ((timer++)==100) timer = 0; flags |= ONCEASEC;

f100hz = 0;

}

//здесь я опрашиваю клавиатуру и делаю некоторые другие полезные вещи.

}

Подумайте, как реализовать динамическую индикацию на нашем стенде.

Самостоятельная работа:

Модифицировать программу светофор так, чтобы на цифровом индикаторе отображалось количество секунд, оставшееся до переключения светофора (некоторые светофоры в нашем городе уже имеют такие индикаторы!)

34

Исполнительные устройства.

При автоматизации эксперимента или решении какой-либо другой задачи, часто требуется, чтобы «контроллер» мог управлять устройствами во внешнем мире. Эти воздействия могут быть тепловыми (включили нагреватель), механическими (различные двигатели, заслонки, клапаны), световыми (лампочки, светодиоды, лазеры).

Светодиод (если он не супер-мощный) можно подключить сразу к выводу контроллера (естественно, соблюдая полярность и через резистор, порядка 100-150 Ом). Причем подключить его можно как минимум двумя способами:

Чтобы светодиод засветился, нужно пропустить через его pn-переход ток.

Чтобы ток потек, нужно создать разность потенциалов.

D1 будет светиться при активном лог.0 на выводе PA0 (DDRA |= 1; PORTA &= ~1; )

D2 будет светиться при активном лог.1 на выводе PA4 (DDRA |= 0x10; PORTA &= ~0x10; )

Если включить «подтяжку» на PA4 и PA0, то светиться будет только D2, и то очень слабо.

Вопрос: Как определить ток, протекающий через светодиод (при активном уровне на ножке)?

На самом деле, все очень просто: Типичное падение

на светодиоде зависит от материала светодиода и цвета его свечения. Так, для ИК светодиодов это примерно 1.1-1.2V, для красных ~1.5V, для зеленых ~2.1V, для синих и белых ~3.5-4V. Для расчета тока применим закон Ома: I = (5V—1.5V) / 150 Ohm =~23mA.

Нагревательный элемент.

Теперь рассмотрим нагревательный элемент. С точки зрения схемотехники, он выглядит как мощное сопротивление. Верно и

обратное: на любом сопротивлении выделяется тепло. Нагреватель характеризуется мощностью и напряжением питания (а так же максимальной допустимой температурой, инерционностью, конструктивными особенностями и пр.)

Чаще всего промышленные нагреватели рассчитаны на 220V AC (переменного тока) — 1 фаза промышленной сети. Мощные нагреватели могут быть рассчитаны и на межфазное напряжение 380В. Самый удобный способ управления ими — использовать так называемый оптореле. Оно состоит из светодиода (ИК) и управляемого им оптосимистора (или каскада из 2х). Типичные представители — KSD203, S

35

Также аналог оптосимистора

можно создать из дискретных деталей, например, слаботочного управляющего оптосимистора MOC3052 и силового симистора BT138. Схема подключения очень простая: вместо батарейки соответствующим образом подключаем микроконтроллер, LOAD — это нагрузка, AC Power — это провод к розетке (не забывайте ставить предохранители и надежно изолировать соединения)

Стоит отметить следующие особенности:

Симистор можно включить (перевести в проводящее состояние), но чтобы его выключить, нужно прервать ток через него. Поэтому он используется преимущественно в цепях переменного тока.

Далее, Если включить его на «верхушке» синусоиды, ток будет возрастать очень быстро. Это приведет к возникновению помех в питающей сети. Особенно, если нагрузка мощная (не редкость 40-50 кВт нагреватели).

Чтобы этого не происходило (для некоторых видов нагрузки это не критично), разработана так называемый схема контроля перехода через 0 (Zero-crossing circuit). Она позволяет «включение» только если напряжение на симисторе меньше 30 вольт. Такие оптосимисторы пропускают ток только целыми полупериодами переменного тока. Не для любых нагрузок это применимо, но эффективно уменьшает помехи.

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

36

Двигатели.

Существует огромное множество различных типов электродвигателей. Самые эффективные (имеют максимальный КПД) — асинхронные 3-фазные двигатели переменного тока. При включении их в промышленную сеть 3ф. 380В они начинают вращаться с определенной частотой, порядка 750, 1500, 3000 или 6000 об/мин (зависит от намотки статора). Их основная частота вращения привязана к частоте питающей сети (50 Гц). Существуют устройства, позволяющие менять частоту питающей сети, тем самым регулируя обороты — называется «частотный преобразователь» (frequency inverter).

Если потребуется, ограничимся пока просто включением-выключением, и будем делать это при помощи 3-фазного пускателя, обмотку которого будем коммутировать к одной из фаз при помощи реле (заодно посмотрим, как управлять реле). В промышленности часто используются так называемые «частотные преобразователи», которые могут точно регулировать скорость вращения, осуществлять плавный старт двигателя, защищать двигатель от перегрузок.

(схема с контактором)

Обратите внимание на защитный диод: если его не ставить, при отключении реле в ее катушке возникнет ЭДС самоиндукции, которая может достигать 100 В. Такое напряжение может запросто вывести транзистор из строя.

Двигатели постоянного тока:

Для использовании в конструкциях, не требующих значительной мощности, удобно использовать низковольтные двигатели постоянного тока. Они безопасные и легко управляемые, правда, для определения положения их вала приходится применять различные ухищрения, да и заставить их работать на небольших оборотах сложно. Чаще всего такие двигатели подключают либо просто через ключ (если нужно только включатьвыключать вращение), либо через так называемый мостовую схему (если нужен реверс):

37

«открыв» T1 и T4 получим вращение в одну сторону, открыв T2 и T3 — в другую сторону,

закрыв все 4 получим режим «свободной остановки»,

открыв T3 и T4 — режим быстрой остановки (по сути, «закорачиваем» выводы двигателя)

Положение ротора определяют либо по датчику вращения, либо по «конечникам» - конечным выключателям, которые срабатывают в каких-то положениях исполнительного устройства. Выключатели могут быть заменены оптопрерывателями.

Шаговые двигатели:

Чем же хорош шаговый двигатель?

угол поворота ротора определяется числом импульсов, которые поданы на двигатель

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

прецизионное позиционирование и повторяемость. Хорошие шаговые двигатели имеют точность 3-5% от величины шага. Эта ошибка не накапливается от шага к шагу

возможность быстрого старта/остановки/реверсирования

высокая надежность, связанная с отсутствием щеток, срок службы шагового двигателя фактически определяется сроком службы подшипников

однозначная зависимость положения от входных импульсов обеспечивает позиционирование без обратной связи

возможность получения очень низких скоростей вращения для нагрузки, присоединенной непосредственно к валу двигателя без промежуточного редуктора

может быть перекрыт довольно большой диапазон скоростей, скорость пропорциональна частоте входных импульсов

38

Но не все так хорошо...

шаговым двигателем присуще явление резонанса

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

потребление энергии не уменьшается даже без нагрузки

затруднена работа на высоких скоростях

невысокая удельная мощность

относительно сложная схема управления

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

ШД можно купить и в магазине, но гораздо проще взять старый дисковод или принтер, и там эти двигатели обнаружатся в значительном количестве.

Внутреннее устройство типичного

дисководного двигателя представлено на рисунке.

Как правило, на обмотки достаточно подавать однополярные импульсы, таким образом, подключение такого

двигателя к микропроцессору производится так: точки 1 и 2 к +12В (питание), а точки a,b,c,d — к коллекторам (или стокам) ключевых элементов. В качестве ключей для маломощных двигателей удобно использовать микросхему ULN2003 — она содержит и ключи, и защитные диоды для индуктивной нагрузки:

И все это в количестве 7 экземпляров и по цене < 10 руб.

Снизу представлена принципиальная схема каждого канала. Видим, что она достаточно непростая.

Микросхема допускает подключение нагрузки, питаемой напряжением до 50В и током до 0,5А.

Возвращаемся к двигателю.

Вспомните двигатель постоянного тока: подаем напряжение — он вращается. Не подаем — не вращается. Регулируем напряжение питания: меняются обороты. Все просто.

С шаговым двигателем все не так просто: при подаче напряжения он вращаться сам по себе не будет. Для поворота вала необходимо подключать к питанию разные фазы. Сменив их в последовательности a-b-c-d получим поворот на 4 шага в одном направлении, переключив в d-c-b-a — 4 шага в другом. Чаще всего встречаются двигатели, делящие оборот на 200 шагов, таким образом 1 шаг = 1.8 градуса.

Есть возможность включать фазы попарно: этим можно достичь уменьшения шага в 2 раза: a-ab-b-bc-c-cd-d-da — те же 4*1.8 градуса разбили на 8 шагов. Иногда это удобно — можем построить диаграмму с шагом 0.9 градуса.

При программировании удобно определить глобальную volatile переменную, содержащую текущее положение двигателя. А потом реализовать 3 функции: StepCW(), StepCCW(), SetStpPosition():

volatile charStpPos;

void SetStpPosition()

{

char c;

switch (StpPos)

{

case 0: c = 0x01;break;// 0001 case 1: c = 0x03;break;// 0011 case 2: c = 0x02;break;// 0010 case 3: c = 0x06;break;// 0110 case 4: c = 0x04;break;// 0100 case 5: c = 0x0С;break;// 1100 case 6: c = 0x08;break;// 1000 case 7: c = 0x09;break;// 1001 default: StpPos = 0; c = 1;

}

PORTB &= 0xF0; PORTB |= c;

}

void StepCW()

{

if (StpPos < 7) StpPos++; else StpPos=0; SetStpPosition();

}

void StepCCW()

{

if (StpPos > 0) StpPos--; else StpPos=7; SetStpPosition();

40