Text
                    ю прантичесних устройств на AVR - микроконтпоппеиах \!.Олвчвито

ББК 32.973-04 УДК 004.312 К78 Кравченко А. В. К78 10 практических устройств на AVR-микроконтроллерах. Книга 1 - М.: Издательский дом “Додэка-ХХГ, К. “МК-Пресс”, 2008. - 224с , ил ISBN 978-5-94120-205-8 (Изд. дом “Додэка-XXI”) ISBN 978-966-8806-41-4 (“МК-Пресс”) Данная книга открывает серию сборников с практическими примерами применения микроконтроллеров В-ней рассмотрены десять завершенных устройств на базе микрокон- троллеров AVR, которые можно легко собрать в домашних условиях и применять в быту или профессиональной деятельности генератор световых эффектов, счетчик событий, музыкальный звонок, индикатор уровня звука, повышающий преобразователь, схема управления шаговым двигателем, цифровой термометр и др. Благодаря подробному анализу аппаратной и программной части устройств, книга будет интересна и полезна как начинающим, так и опытным радиолюбителям, желающим изучить методы эффективного применения микроконтроллеров. ББК 32.973-04 ISBN 978-5-94120-205-8 (Изд дом “Додэка-XXI”) ISBN 978-966-8806-41-4 (“МК-Пресс”) © Кравченко А.В., текст, 2007 © “МК-Пресс”, оформление, 2008
3 Содержание Введение............................................5 Глава 1. Программатор STK200.........................7 Глава 2. Шар со световыми эффектами для новогодней елки.. 16 Программа..........................................20 Глава 3. Верхушка новогодней елки...................24 Программа..........................................27 Плата..............................................34 Глава 4. Счетчик событий............................39 Программа..........................................41 Плата..............................................56 Глава 5. Музыкальный звонок.........................58 Программа..........................................60 Плата..............................................67 Настройка схемы....................................68 Глава 6. Индикатор уровня звукового сигнала.........69 Программа..........................................71 Плата..............................................75 Настройка схемы....................................75 Глава 7. Электромассажер............................79 Программа..........................................80 Конструкция........................................89 Нас тройка.........................................92 Эксплуатация.......................................94 Глава 8. Повышающий преобразователь 3 В - 5 В на микроконтроллере.....................................95 Расчет элементов схемы и методов стабилизации напряжения... 99 Программа.........................................100 Плата.............................................119 Настройка.........................................122 Вывод.............................................123 Глава 9. Шаговый двигатель для транспортера........124 Принципы работы шагового двигателя................127 Схема управления шаговым двигателем...............131 Программа.........................................134 Плата.............................................147
4 Настройка..........................................149 Глава 10. Бытовой цифровой термометр.................151 Температурный датчик...............................151 Схема термометра...................................157 Программа..........................................160 Плата..............................................177 Настройка..........................................179 Глава 11. Автомат ночного освещения..................189 Физика света.......................................193 Схема автомата ночного освещения...................195 Программа..........................................198 Плата..............................................207 Настройка..........................................209 Эксплуатация.......................................215 Экономия...........................................215 Список литературы....................................216 Содержимое прилагаемого к книге компакт-диска........218
5 Введение Одна из целей радиолюбительства — стать хорошим профессиона- лом, воплотить фантазии в реальность. В практике радиолюбителя все- гда бывают неожиданные повороты судьбы. С развалом страны Советов огромная армия инженеров стала никому не нужна. Подростковые орга- низации перестали существовать. Радиолюбительство оказалось на гра- ни вымирания. К счастью, этот период совпал с рассветом микрокон- троллерной техники и всеобщей компьютеризации во всем мире. Разви- тие Internet и мобильной связи дали новый толчок в общении человече- ства. Новые технологии и стремительное развитие компьютерной тех- ники дали возможность быстро, профессионально, и качественно во- площать в жизнь сложные радиоэлектронные проекты. В современном мире микроконтроллеры окружают нас со всех сто- рон. Сложные задачи, на которые в прошлом тратились немалые интел- лектуальные силы, теперь решаются небольшим числом программистов, инженеров электроники, менеджеров... Сегодня развитие любой страны определяется даже не количеством полезных ископаемых, а наличием интеллектуалов, людей, мыслящих прогрессивно и современно, умею- щих зарабатывать в любых условиях. Армия ненужных инженеров в развивающихся государствах понадобилась, в первую очередь, ком- мерческим структурам. Возник повсеместный спрос на знания радио- любителей — особенно практиков, умеющих быстро и эффективно ре- шать технические задачи. В современных радиолюбительских разработках все чаще исполь- зуется искусственный интеллект микроконтроллеров. Сегодня микро- контроллеры управляют машинами, заменяют тяжелый человеческий труд, облегчают условия жизни. И все же, автоматизация, компьютери- зация, контроль на высоком уровне — задачи, решаемые не столько компьютерами, сколько отдельными профессионалами. Мобильная связь, цифровые, информационные, телекоммуникационные технологии теперь подвластны вчерашним радиолюбителям. Глубокое понимание основ микроконтроллерной техники позволяет своевременно опреде- лять ошибки, недостатки промышленных образцов, исправлять эти ошибки, создавать собственные модели. Небольшие устройства, представленные автором в этой книге, пока- зывают, как идеи воплощаются в жизнь и начинают работать. Основной акцент сделан на моделировании несложных задач на основе экспери- ментальных исследований возможностей и ресурсов микроконтролле- ров AVR. Собрать и настроить рассмотренные в книге устройства смо-
6 жет любой радиолюбитель — и не только профессионал, но и новичок. Подробно описаны все этапы создания микроконтроллерной модели и программ, начиная со структуры и блок-схемы, и заканчивая самой программой и готовым рабочим кодом прошивки. Все программы были протестированы автором на реальных сборках, а работоспособность ал- горитмов многократно проверена с помощью симулятора AVR Studio 4. Книга начинается с простейших примеров и заканчивается матема- тическим моделированием. Другими словами, материал изложен в ло- гической последовательности “от простого к сложному”. Поэтапное по- вторение рассмотренных вопросов позволит радиолюбителю постепен- но охватить все аспекты конструирования разнообразных моделей. Если читатель найдет неточности в работе каких-либо узлов уст- ройств, то автор с благодарностью примет любые замечания. Модерни- зируйте схемы, доводя их до промышленных образцов! Помните: упор- ство и трудолюбие — неотъемлемые составляющие успешного освое- ния микроконтроллерной техники. Дерзайте! Я верю: вы станете про- фессионалами! Кравченко А.В.
Глава 1 Современные микроконтроллеры образуют целые семейства, они настолько разнообразны и функционально насыщены, что возникает не- обходимость в выборе специализированных программаторов. На нашем рынке хорошо обосновались недорогие микроконтроллеры PIC от ком- пании Microchip, а также AVR (серии AT, Tiny и Mega) от компании Atmel. Хотя автор неоднократно работал с микроконтроллерами Sie- mens, Philips, Renesas, Toshiba, и др. [1], к сожалению, эти компании не так заботятся о пользователях, как Microchip и Atmel. Разрабатывая микроконтроллерные устройства, автор столкнулся с проблемой программирования микроконтроллеров. Дело в том, что эта сфера бурно развивается, а программаторы зачастую имеют собствен- ные программы управления. Для радиолюбителя каждая копейка доро- га, а характеристики микроконтроллеров, предлагаемых поставщиками, далеко не всегда совпадают с информацией на страницах журналов. Для семейства микроконтроллеров Tiny от Atmel автор нашел вы- ход, прочитав книгу [2] и собрав за 40 минут очень дешевый програм- матор, представленный на рис. 1.1, — аналог STK.200 (на сегодняшний день компания Atmel выпускает и поддерживает только программатор версии STK500, но он значительно дороже). Рис. 1.1. Программатор STK200 от компании Atmel
8 Глава 1 Для работы с STK200 существует специальная DOS-программа, ко- торая достаточно проста и надежна, хотя и имеет некоторые особенно- сти. Ее можно найти в Internet или на компакт-диске, прилагаемом к книге [2]. На основании своего опыта работы с STK200 автор немного изме- нил оригинальную схему, а так же выявил некоторые недостатки про- граммы: • работа только в MS DOS или максимум в система Windows 98 в режиме эмуляции DOS; • ввод функции программирования вручную, что на сегодняшний день очень несовременно; • плохая организация перезаписи микроконтроллера. Для перезаписи лучше использовать файлы .bat, указанные в книге [2]. При нали- чии всех ключей перезапись происходит с ошибками, поэтому не- обходимо очистить микроконтроллер, затем проверить и после со- общения об ошибке записать заново. Привыкнув к специфике запи- си/перезаписи, радиолюбители обретут хороший опыт для работы с разными программаторами. Состав программатора: • микросхема IC1- 74НС244 (или аналог); • R1 — 7 кОм; • R2 — 910 Ом; • С1 — 47 мкФ х 16 В; • С2 — 0,1 мкФ х 16 В (рекомендуется установить блокировочный конденсатор по питанию поближе к микросхеме); • D1—КД522; • SV1 — любой для питания бытовой аппаратуры; • XI — IDC 10 (при желании, плоский разъем); • Х2 — DB25. Монтажные схемы программатора представлены на рис. 1.2. Плату можно собрать навесным монтажом и поместить в корпус разъема DB25 (рис. 1.3). Для этого плату необходимо вырезать строго по внутренним размерам разъема и поместить между выводами DB25. Монтаж выпол- няется навесным способом (рис. 1.4). Разъем питания устанавливается на корпус программатора. Автор использовал два разъема на выходе из программатора: • стандартный согласно оригинальной плате STK200 фирмы Atmel (разводка — табл. 1.1); • нестандартный Е1ка22 (табл. 1.2, рис. 1.5).
Программатор STK200 9 Рис. 1.2. Монтажные схемы программатора Таблица 1.1. Стандартный разъем для платы STK200 SV1 AVR signal SV1 AVR signal 1 SCK 2 GND 3 MISO 4 УСС § 5 nRESET 6 не используется 5 7 не используется 8 XTAL1 9 MOSI 10 GND
10 Глава 1 Рис. 1.3. Размещение платы в корпусе разъема DB25 Рис. 1.4. Монтаж навесным способом
Программатор STK200 11 Таблица 1.2. Нестандартный разъем Е1ка22 Е1ка22 AVR signal 1 MOSI 2 SCK 3 GND 4 VCC 5 MISO 6 nRESET ключ не используется Рис. 1.5. Разъем Е1ка22 От программатора с платы монтажа лучше пустить шлейф неболь- шой длины (не более 15 см) для подключения непосредственно к про- граммируемой плате. Можно создать отдельную плату для программи- рования любого микроконтроллера, используя при этом только про- грамматор STK200 (рис. 1.6). Со временем на этой отдельной плате для “прошивки”. микроконтроллера можно реализовать любые варианты программирования на панельках. После сборки и проверки программатора STK200 необходимо вы- полнить следующие действия. 1. Подключить шлейфом программатор к порту LPT компьютера. 2. Подать питание от внешнего источника. 3. Перейти в режим DOS (для этого автор, например, использовал программу Volkov Commander). 4. Найти файл . ехе программатора (автор использовал eal.exe) и запустить его с указанием названия программируемого микрокон- троллера, имени порта LPT, названия программатора, ключей опе- рации, байта в Flash-коде, имени файла “прошивки”.
12 Глава 1 Рис. 1.6. Использование программатора STK200 Если все введено правильно, то программа сразу же начинает рабо- тать и в течение нескольких секунд запишет данные в микроконтроллер. В случае возникновения ошибок их необходимо расшифровать, прове- рить правильность введенной фразы и исправить. Внимание! Файл . ехе и файл “прошивки” должны находится в одной папке (и на диске С). Примеры сообщений в режиме DOS показаны на рис 1.7. Команды перевода выходов программатора в высокоимпедансное состояние: eal.exe +tinyl2 -р378 -az -ebvw+ -с elka22.hex Command: +tinyl2 -p378 -az -ebvw+ -c elka22.hex Can’t resync Reset pin released LPT outputs -> Hi-Z state
Программатор STK200 13 Command: Г . +tinyl2 -р378 -as -ebvw -c elka.hex Device connected, „TINY12 detected Device erased Device connected, TINY12 detected Fuses OSCCAL = 49 BODEN = 1 BLEV = 0 CKSEL = 2 RSTDSBL = 1 SPIEN = 0 Code: .. done blank Data: .. done blank Programming code memory done Verifying code memory done passed Reset pin released Рис. 1.7. Примеры сообщений в процессе программирования микроконтроллера Во время попытки перезаписать микроконтроллер с помощью клю- чей, не прошла программа: eal.exe +tinyl2 -р378 -as -ebvw+ -с elka22.hex Command: +tinyl2 -p378 -as -ebvw+ -c elka22.hex Device connected, TINY12 detected Device erased Device connected, TINY12 detected Fuses OSCCAL =49 BODEN = 1 BLEV = 0 CKSEL = 2 RSTDSBL = 1 SPIEN = 0 Code: done not blank Data: .. done blank Reset pin released
14 Глава 1 Попытка записать микроконтроллер без питания. Нет питания на плате и на программаторе:________________________________________ eal.exe +tinyl2 -р378 -as -ebvw+ -с elka22.hex Command: +tinyl2 -p378 -as -ebvw+ -c elka22.hex Not connected Can’t continue Reset pin released ______________________________________________ Программирование микроконтроллера прошло успешно:____________ eal.exe +tinyl2 -p378 -as -w+ -c elka22.hex Command: +tinyl2 -p378 -as -w+ -c elka22.hex Device connected, TINY12 detected Fuses OSCCAL =49 BODEN = 1 BLEV = 0 CKSEL = 2 RSTDSBL = 1 SPIEN = 0 Programming code memory done Reset pin released Для выбора типа программатора устанавливаются ключи: • -ab — работа через Altera ByteBlaster; • -as — работа через адаптер Atmel STK*00 (рассматриваемый про- грамматор); • -аа — автоматический выбор ByteBlaster/STK; • -az — пытаться переводить выходы LPT в Z-состояние для “от- ключения” программатора от схемы (“byte-blaster для ленивых”, ра- ботает в режиме “FBPRG”); • -аг — инверсия полярности сброса (например, для подачи его че- рез резистор на базу присутствующего в схеме транзистора); • -ai# — установить время неактивного сигнала Reset после стира- ния равным # мс; • -ар — подавать питание кристалла через свободные выходы дан- ных LPT (несовместимо с -ab и -as). Для управления программой существуют ключи, которые записы- ваются после фразы eal. ехе +tinyl2 -р378 -as. Порядок программирования “прошитой” микросхемы, предложен- ный автором:
Программатор STK200 15 1. -е — стереть содержимое микросхемы; 2. -v — проверить на совпадение с файлом; 3. -w+ — записать файл в микросхему. Остальные ключи имеют следующие функции: • -Ь — проверить микроконтроллер на наличие данных в памяти; • -г — прочитать данные с кристалла в файл; • -1 — установить уровень защиты (при разработке лучше не исполь- зовать); • -f — список предохранителей для тех кристаллов, в которых они “прошиваются” по ISP (используется при перенастройке микрокон- троллера); • -с — как байт в Flash-коде. С остальными ключами можно ознакомится, прочитав книгу [2]. Программатор можно успешно применять для внутрисхемного про- граммирования, но при этом необходимо отслеживать выводы его под- ключения к программируемой схеме. В такой схеме не должно быть пе- ремычек или выключателей “на ноль”, а так же активных элементов, подключенных к питанию или “земле”. В случае накоротко программа- тор выйдет из строя.
_______________Глава 2 _______ Шар со световыми эффектами для новогодней елки На Новый год елка наряжается игрушками, гирляндами, бегущими огнями... Световые эффекты очень украшают елку, делают ее роман- тичной, незабываемой. В этой главе рассмотрено простое световое уст- ройство, которое можно вмонтировать в любую старую звезду или шар для украшения елки. Схема (рис. 2.1) состоит из микроконтроллера AVR семейства Tiny от компании Atmel [3], дешифратора двоично- десятичного кода в десятичный, десяти светодиодов и резисторов, огра- ничителей тока. Рис. 2.1. Схема для создания световых эффектов для новогодней елки Микроконтроллер IC1 ATtinyl2 через равные промежутки времени формирует на выводах порта В РВ2-РВ5 двоичный код (согласно зало- женному в программе алгоритму). Дешифратор VI преобразует двоич- ный код в десятичный, и тем самым открывает выходные буферы в оп- ределенной последовательности.
Шар со световыми эффектами для новогодней елки 17 Светодиоды подключены к “плюсовой” шине и при нулевом со- стоянии на выходах дешифратора через них протекает ток, и они излу- чают свет. На выводах порта В микроконтроллера присутствует один внешний подтягивающий резистор R11 (это связано с альтернативным включением выводов). Внимание! В процессе разработки этого устройства автор допустил ошибку при составлении схемы И хотя ошибка не повлияла на работу устройства, после программирования микроконтроллера и ввода альтернативной функции вывода RESET микрокон- троллер стало невозможно перепрограммировать обычным программатором. Если ошибку схемы не исправить, то модернизировать программу не получится. В основе схемы управления использован очень простой и дешевый микроконтрол- лер ATtmyl 2. Особенность ошибки заключается в альтернативной функции вывода RESET. Компания Atmel утверждает, что первый вывод микросхемы выполняет две функции: RESET — сброс и РВ5 — пятый вывод порта В (при условии подключе- ния внешнего резистора). В симуляторе AVR Studio 4 при проверке программы, со- ставленной автором, этот вывод выполняет все функции линии 5 порта В в полном объеме Однако после программирования программатором STK200 и сброса функ- ции RESET дальнейшее перепрограммирование микросхемы невозможно Ошибку удалось исправить, изменив подключение вывода 6 микроконтроллера к выводу 15 дешифратора 7442 и изменив соответствующим образом программу. Вывод DIP переключателя S1 необходимо отсоединить. Сборка показана на рис. 2.2, монтажная схема — на рис. 2.3, а раз- водка платы с двух сторон — на рис. 2.4. Рис. 2.2. Сборка для создания световых эффектов для новогодней елки
18 Глава 2 Рис. 2.3. Монтажная схема устройства
Шар со световыми эффектами для новогодней елки 19 Рис. 2.4. Разводка платы устройства Плату можно изготовить путем травления или использовать макет- ную заготовку. Светодиоды на макетной заготовке необходимо расста- вить в том же порядке, что и на плате-оригинале. Необходимо соблю- дать порядок подключения к дешифратору. Питание схемы — от источ-
20 Глава 2 ника +5 В (200 мА), подключение — проводами в центр платы (квад- ратные пистоны). Включение схемы на плате — DIP-переключателем. Светодиоды — любые с током до 20 мА. Программа имеет упрощенную структуру с тремя светоэффектами и простым алгоритмом работы. Рассмотрим алгоритм. 1. При включении питания происходит обнуление всех параметров. 2. Опрашиваются выводы порта В микроконтроллера. 3. Анализ введенной константы для задержки включения. 4. Последовательно выполняются подпрограммы задержки включе- ния, выбора светоэффекта и выбора светодиода. 5. Переход в начало программы. Первый светоэффект — бегущая единица, второй — мигание про- тивоположных светодиодов по окружности, третий — реверс вращения. В памяти программ микроконтроллера осталось много свободного места, поэтому можно придумать больше светоэффектов, которые реа- лизованы в программе как статические переключения с частотой 2 Гц. В данном случае выбран микроконтроллер с внутренней тактовой час- тотой 1,6 МГц. В случае использования микроконтроллера с другой так- товой частотой частота светоэффектов изменится. При поднятии часто- ты выше 25 Гц светоэффекты будут иметь характер динамических, с подсветкой всех светодиодов. Программа Код программы на ассемблере представлен в листинге 2.1, а шест- надцатеричный код — в листинге 2.2. Настройка схемы не требуется — светодиоды должны сразу замигать. Листинг 2Л. Ассемблерная программа для создания светоэффектов .include "C:\Program Files\Atmel\AVR Studio\Appnotes\tnl2def.inc” def tmp = Г16 def coc = rl7 def vih = rl8 def tempo = rl9 def pir = r22 def pur = r23 def par = r20 def Y = r29 def X = r21 def W = r2 6
Шар со световыми эффектами для новогодней елки 21 Листинг 2.1. Продолжение .def adr = rO .def prgl r24 .def prg2 = r25 . cseg . org 0 nop ;rjmp RESET nop ;rjmp EXT_INT0 прерывание не йспользуется nop ;rjmp EXT_PIN прерывание не используется nop ;rjmp TIME_OVFC 1 прерывание от таймера nop ;rjmp EEJRDY прерывание от таймера nop ;rjmp ANA_COMP прерывание не используется .org 20 ;настройка порта В clr tmp out DDRB, tmp out PORTB, tmp ;обнулить порт В clr pir clr pur clr prgi clr prg2 clr adr ;Начало программы ;сброс ^всех значений nStart: nop /начало программы Idi coc, $1E ;РВ1,РВ2, РВЗ,РВ4-выходы out DDRB, coc nop in vih, PORTB cpi vih, $01 breq nul Idi tempo, $64 rjmp ser nul: Idi tempo, $34 nop ser: nop rcall zader nop rcall opros nop rjmp nStart ;Подпрограмма задержки включения светодиодов zader: nop wdr clr W
22 Глава 2 clr clr Idi Idi X Y W, $05 X, $F0 dm: nop dv: nop wdr mov Y, tempo dx: dec Y brne dx dec X brne dv dec W brne dm ret /Подпрограмма опроса светодиодов opros: nop cpi pir, $14 breq prn2 Idi ZH, high(2*progl) Idi ZL, Low(2*progl) Add ZL, pir LPM mov prgl, adr out PORTB, prgl inc pir rjmp got prn2: nop cpi pur, $14 breq prn3 Idi ZH, high(2*prog2) Idi ZL, Low(2*prog2) Add ZL, pur LPM mov prg2, adr out PORTB, prg2 inc pur rjmp got prn3: nop cpi par, $14 breq nasv Idi ZH, high(2*prog3) Idi ZL, Low(2*prog3) Add ZL, par
Шар со световыми эффектами для новогодней елки 23 Л истинг 2 Л / Окончание LPM mov out inc rjmp prg2, adr PORTB, prg2 par got nasv: clr pir clr pur clr par clr adr got: nop ret .org $100 progl: .DB $00, $02, $12, $18, $1A, $04, $10, $06 .DB $08, $0A prog2: .DB $0A, $08, $06, $10, $04, $1A, $18,' $12 .DB $02, $00 prog3: .DB $00, $04, $02, $10, $12, $06, $18, $08 .DB $1A, ’$0A .EXIT iiieiglM :020000020000FC :0C000000000000000000000000000000F4 :10002800002707ВВ08ВВ662777278827992700245Е :1000380000001EE117BB000028B3213011F034E6A0 :1000480002C034E30000000004D0000014D0000017 :10005800EFCF0000A895AA275527DD27A5E050EF88 :1000680000000000A895D32FDA95F1F75A95C9F743 :10007800AA95B1F708950000643141F0F2E0E0E09C :10008800E60FC895802D88BB63951AC000007431AF :1000980041F0F2E0EAE0E70FC895902D98BB739520 :1000A8000FC00000443141F0F2E0E4E1E40FC895EC :1000B800902D98BB439504C06627772744270024D2 :0400С8000000089597 :10020000000212181А041006080А0А080610041А36 :0Е0210001812020000040210120618081А0А42 :00000001FF ©Исходные файлы проектов AVR Studio 4 для создания светоэффектов можно найти на прилагаемом к книге компакт-диске в папке программы\02 - Свето- вой шар.
___________Глава 3___________ Верхушка новогодней едки Верхушка — один из наиболее примечательных элементов ново- годней елки. Ее можно сделать более привлекательной, применив эле- менты светоэффектов [4]. Схема (рис. 3.1) собрана на микроконтроллере Mega8-P семейства AVR от компании Atmel. Основной идеей конструкции является ис- пользование бегущих светоэффектов в дополнении с вращающимися мигающими огнями. В центре конструкции установлен двигатель, кото- рый может останавливаться или менять направление вращения. На валу двигателя прикреплены светодиоды, которые мигают в зависимости от сигналов управления. Микроконтроллер имеет три порта ввода-вывода, которые были полностью задействованы. Синхронизация микроконтроллера осущест- вляется от кварцевого резонатора Q1 на 4 МГц. Во время работы микро- контроллера порты С и D выдают сигнал, а усилители выходного тока IC2, IC3 усиливают и инвертируют сигнал управления светодиодами LED2-LED17. Светодиод LED1 показывает присутствие напряжения источника питания. Для управления двигателем постоянного тока пре- дусмотрена микросхема драйвера DD1, которая позволяет устанавли- вать режим реверса. Схема питается от выносного источника питания 4,5 В с максимальным током потребления 250 мА. Программа аналогична [4], но переформатирована для микрокон- троллера Mega8-P. В начале программы настраиваются порты ввода- вывода на вывод сигналов управления. Альтернативные функции выво- дов РВ6, РВ7, РС6 не используются. Выводы РВЗ, РВ4, РВ5 подключе- ны к последовательному интерфейсу SPI. В ядре программы использу- ются две подпрограммы: первая реализует задержку времени на 273 мс, а вторая — опрос таблицы “прошивки” кода и вывод в порты соответст- вующего значения. По окончанию вывода последнего кода цикл повто- ряется сначала. В конце программы, согласно табл. 3.1, прописан код последовательности вывода сигналов управления. На прилагаемом к книге компакт-диске в папке ПрограммыХОЗ - Елка автор представляет различные варианты программ “прошивки” микроконтроллера и соответствующие таблицы для каждого варианта.
Верхушка новогодней елки 25 Рис. 3.1. Схема для создания светоэффектов для верхушки новогодней елки
bJ Таблица 3.1. Последовательности вывода сигналов управления Порядок построения светодиодов по часовой стрелке, начиная с 12 00 - 14/15-13-12-11-10-9-7/1-4-5-6-8-16 Порты PORTC PORTD PORTB Коды прошивки порт Светодиоды 8 7 6 5 4 3,2,17 9 10 11 12 13 14 15 16 pro g1 ,4,7 ргод2;5,8 Программа Шаг РС5 РС4 РСЗ РС2 РС1 РСО PD7 PD6 PD5 PD4 PD3 PD2 PD1 PD0 РВ5 РВ4 РВЗ РВ2 РВ1 РВО PORTC PORTD 1 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 1 00 06 1 2 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 1 00 08 1 3 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 1 00 10 1 4 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 1 00 20 1 5 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 1 00 40 1 6 0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 1 00 80 1 7 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 11 00 1 8 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 03 00 1 9 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 05 00 1 10 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 09 00 1 11 1 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 21 00 1 12 0 0 0 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 01 01 2 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 00 06 2 2 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 00 01 2 3 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 20 00 2 4 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 08 00 2 5 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 04 00 2 6 0 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 02 00 2 7 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 1 11 00 2 8 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 01 80 2 9 0 0 0 0 0 1 0 1 0 0 0 0 0 0 0 0 0 0 0 1 01 40 2 10 0 0 0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0 0 1 01 20 2 11 0 0 0 0 0 1 0 0 0 1 0 0 0 0 0 0 0 0 0 1 01 10 2 12 0 0 0 0 0 1 0 0 0 0 1 0 0 0 0 0 0 0 0 1 01 08 3 1 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0 0 0 0 1 0 00 06 3 2 0 0 0 0 0 0 0 0 0 0 1 1 1 1 0 0 0 0 1 0 00 OF 3 3 1 0 0 0 0 0 0 0 0 1 1 1 1 1 0 0 0 0 1 0 20 1F 3 4 1 0 1 0 0 0 0 0 1 1 1 1 1 1 0 0 0 0 1 0 28 3F 3 5 1 0 1 1 0 0 0 1 1 1 1 1 1 1 0 0 0 0 1 0 58 >7F 3 6 1 0 1 1 1 0 1 1 1 1 1 1 1 1 0 0 0 0 1 0 2Е FF Глава 3
Верхушка новогодней елки 27 Программа Код программы на ассемблере представлен в листинге 3.1, а шест- надцатеричный код — в листинге 3.2. Листинг 3.1. Ассемблерная программа для создания светоэффектов для верхушки новогодней елки .include "C:\Program Files\Atmel\AVR Studio\Appnotes\m8def.inc" ;Программа для верхушки новогодней елки def tmp = rl6 def coc = rl7 def vih = rl8 def tempo = rl9 def pir = r22 def pur = r23 def par = r20 def Y = r29 def X — r21 def Wa = r2 6 def adr — rO def prgl = r24 def prg2 = r25 def tmp2 = r27 def per — r28 . cseg /Начало области памяти, вектор прерывания . org О nop ; r jmp RESET nop ; r jmp EXT_INTO прерывание не используется nop ;rjmp EXT_PIN прерывание не используется nop ; r jmp TIME_OVFC I прерывание от 1 таймера nop ; r jmp EE_RDY прерывание от 1 таймера nop ; r jmp ANA_COMP прерывание не используется Начало всей программы без вектора прерывания org 20 'настройка портов В, C, D clr tmp clr coc Idi coc, $3F /Порт В,- выходы out DDRB, coc out PORTB, tmp /обнулить порт В Idi coc, $3F /Порт С-выходы out DDRC, coc
28 Глава 3 Листинг 3.1. Продолжение out Idi out out Idi out /сброс всех cli clr clr clr clr clr clr PORTC, tmp /обнулить порт coo, $FF /Порт D-выходы DDRD, coc PORTD, tmp . /обнулить порт tmp, low(RAMEND) SPL, tmp значений pir pur prgl prg2 adr per С D ;Начало программы nStart: nop nop Idi tempo, $28 nop rjmp za.der nop ss: nop rjmp opros nop ее: nop rjmp nStart /начало программы ;Подпрограмма задержки /и привода двигателя zader: nop wdr clr Wa nop dm: nop clr X clr Y dv: nop wdr mov Y, tempo dx: dec Y brpl dx cln cis inc X cpi x, $0E включения светодиодов
Верхушка новогодней елки 29 brio inc cpi brio nop rjmp dv Wa wa, $F0 dm ss ;Подпрограмма опроса светодиодов opros: nop nop progo: nop /Первая подпрограмма светоэффектов cpi nop pir, $0C breq prn2 Idi ZH, high(2*progl) Idi ZL, Low(2*progl) Add LPM ZL, pir mov prgl, adr ;Включение верхней половины схемы светодиодов out nop PORTC, prgl Idi ZH, high(2*prog2) Idi ZL, Low(2*prog2) Add LPM ZL, pir mov prgl, adr ;Включение нижней половины схемы светодиодов out nop PORTD, prgl Idi ZH, high(2*prog3) Idi ZL, Low(2*prog3) Add LPM ZL, pir mov prgl, adr ;Включение привода двигателя out nop PORTB, prgl inc pir inc nop tempo rjmp prn2: nop got
30 Глава 3 Листинг 3.1. Продолжение /Вторая подпрограмма светоэффектов cpi pur, $0C пор breq prn3 Idi ZH, high(2*prog4) Idi ZL, Low(2*prog4) Add ZL, pur LPM mov prg2, adr ;Включение верхней половины схемы светодиодов out PORTC, prg2 nop Idi ZH, high(2*prog5) Idi ZL, Low(2*prog5) Add ZL, pur LPM mov prgl, adr ;Включение нижней половины схемы светодиодов out PORTD, prgl nop Idi ZH, high(2*prog6) Idi ZL, Low(2*prog6) Add ZL, pur LPM mov prgl, adr ;Включение привода двигателя out PORTB, prgl nop inc pur dec tempo nop rjmp got prn3 : nop /Третья подпрограмма светоэффектов cpi par, $0C nop breq prn4 Idi ZH, high(2*prog7) Idi ZL, Low(2*prog7) Add ZL, par LPM mov prg2, adr /Включение верхней половины схемы светодиодов
Верхушка новогодней елки 31 Листинг 3.1. Продолжение out PORTC, prg2 пор Idi ZH, high(2*prog8) Idi ZL, Low(2*prog8) Add ZL, par LPM mov prgl, adr ;Включение нижней половины схемы светодиодов out PORTD, prgl nop Idi ZH, high(2*prog9) Idi ZL, Low(2*prog9) Add ZL, par LPM mov prgl, adr ;Включение привода двигателя out PORTB, prgl nop inc par nop rjmp got prn4 : nop /Четвертая подпрограмма светоэффектов cpi per, $0C nop breq nasv Idi ZH, high(2*progl0) Idi ZL, Low(2*progl0) Add ZL, per LPM mov prg2, adr ;Включение верхней половины схемы светодиодов out PORTC, prg2 nop Idi ZH, high(2*progll) Idi ZL, Low(2*progll) Add ZL, per LPM mov prgl, adr ;Включение нижней половины схемы светодиодов out PORTD, prgl nop Idi ZH, high(2*progl2) Idi ZL, Low(2*progl2)
32 Глава 3 Лйстй|ИЗ.^Л^ Add LPM mov ;Включение out nop inc nop rjmp ZL, prgl, г привода PORTB, per got per idr двигателя prgl nasv: nop clr pir clr pur clr par clr adr clr per rjmp progo nop got: nop nop rjmp ее ,org $100 progl: . DB $01, $00, $01, $00, $01, $10, $11, $03 .DB $05, $09, $21, $01 prog2: .DB $0F, $1C, $38, $70, $E0, $C0, $00, $00 .DB $00, $00, $00, $01 prog3: .DB $01, $00, $01, $00, $01, $00, $01, $03 .DB $00, $00, $00, $00 prog4: .DB $00, $00, $20, $08, $04, $02, $11, $01 .DB $01, $01, $01, $01 prog5: .DB $06, $01, $00, $00, $00, $00, $00, $80 .DB $40, $20, $10, $08 prog6: ,DB $00, $00, $00, $00, $00, $00, $01, $01 .DB $01, $01, $01, $01 prog7: .DB $01, $01, $21, $29, $2D, $2E, $3F, $3F •DB $2E, $1F, $17, $01 prog8:
Верхушка новогодней елки 33 Листинг 3.1. Окончание . : . DB $06, $0F, $1F, $3F, $7F, $FF, $FF, $F9 .DB $F0, $E0, $C0, $00 prog9: .DB $02, $00, $02, $00, $02, $00, $02, $03 •DB $00, $00, $00, $00 proglO: .DB $00, $28, $0C, $06, $12, $10, $00, $00 .DB $00, $00, $10, $10 progll: .DB $06, $00, $00, $00, $00, $80, $C0, $60 .DB $30, $18, $0C, $06 prog!2: .DB $02, $00, $02, $00, $02, $00, $02, $03 .DB $00, $00, $00, $00 EXIT Листинг 3.2. Шестнадцатеричный код для создания светоэффектов для верхушки новогодней елки ' :020000020000FC :0C000000000000000000000000000000F4 : 10002800002711271FE317BB08BB1FE314BB05BB41 :100038001FEF11BB02BB0FE50DBFF89466277727АА :10004800882799270024СС270000000038Е2000008 :1000580006C0000000-0019C000000000F5CF000035 :10006800A895AA27000000005527DD270000A895BD :10007800D32FDA95F2F7A894C89453955E30B0F36D :10008800A395A03F80F30000E5CF0000000000002A :100098006C300000C9F0F2E0E0E0E60FC895802D72 :1000A80085BB0000F2E0ECE0E60FC895802D82BB2E :1000B8000000F2E0E8E1E60FC895802D88BB00005B :1000C8006395339500005DC000007C300000C9F0E6 :1000D800F2E0E4E2E70FC895902D95BB0000F2E04E :1000E800EOE3E70FC895802D82BBQOOOF2EOECE367 :1000F800E70FC895802D88BB000073953A950000DE :1001080040C000004C300000C1FOF2EOE8E4E40F29 :10011800С895902D95BB0000F2E0E4E5E40FC89582 :10012800802D82BB0000F2E0E0E6E40FC895802D48 :1001380088ВВ00004395000024С00000СС300000ВС :1OO148OOC1FOF2E0ECE6ECOFC8959O2D95BBOO0OED :10015800F2E0E8E7EC0FC895802D82BB0000F2E0E2 :10016800E4E8EC0FC895802D88BB0000C39500001B :1001780008C000006627772744270024CC2787CFAC :0801880000000000000069CF37 :100200000100010001101103050921010F1C3870C4
34 Глава 3 Листинг 3.2. Окончание :10021000ЕОС00000000000010100010001000Ю336 :10022000000000000000200804021101010101018А :1002300006010000000000804020100800000000BF :100240000000010101010101010121292D2E3F3F83 :10O25OOO2E1F17O1O6OF1F3F7FFFFFF9FOEOCOOOCO :1002600002000200020002030000000000280С0649 :100270001210000000001010060000000080С06096 :1002800030180С0602000200020002030000000009 :00000001FF Изменение “прошивки” программы — задача не столько програм- миста, сколько дизайнера. По субъективным оценкам скорость пере- ключения светодиодов можно уменьшить, светоэффект — повторять несколько раз, количество шагов светоэффекта — увеличить. Все это легко сделать в представленной схеме и программе. Плата Монтажная схема представлена на рис 3.2, а схема разводки с двух сторон — на рис. 3.3. Рис. 3.2. Монтажная схема платы, задействованной для верхушки новогодней елки
Верхушка новогодней елки 35 Рис. 3.3. Схема разводки
36 Глава 3 Автор собрал модель на макетной плате (рис. 3.4), однако для чита- телей разработана монтажная схема на основе двухстороннего тексто- лита. Рис. 3.4. Модель на макетной плате Предлагается следующий дизайн конструкции: плата имеет вид ок- ружности диаметром 90 мм и внутренней площадкой для двигателя диаметром 30 мм (рис. 3.5). На плате присутствуют два разъема: для пи- тания и для перезаписи микроконтроллера — а так же контактные пло- щадки для подключения двигателя. Двигатель крепится с помощью рас- порочной пластины, привинченной шпильками по бокам. Резисторы R1, R2, R3 и светодиоды LED 17, LED2, LED3 на плату не устанавливают- ся— эти элементы монтируются на изолированный вал. На изолиро- ванный вал двигателя накладываются четыре токосъемных кольца. Кольца изготавливаются из листовой латунной фольги, и к ним прижи- маются токопроводящие пружинные проводники. Эти проводники рас-
Верхушка новогодней елки 37 правляются из растянутой пружины, сгибаются в Г-образную форму и впаиваются в плату на места катодов LED 17, LED2, LED3 и к одному из плюсовых полюсов питания гасящих резисторов Rl, R2, R3. Рис. 3.5. Рабочая конструкция на двухстороннем текстолите Резисторы Rl, R2, R3 и светодиоды LED 17, LED2, LED3 припаива- ются к токосъемным кольцам на изолированном валу. При изготовле- нии изолированного вала, автор использовал трансформаторную бума- гу, смотанную в рулон. Внутри такого рулона вмонтированы резисторы, соединенные вместе с одной стороны (отвод от соединения подается на токосъемное кольцо) и с анодами LED 17, LED2, LED3 с другой сторо- ны. Основа изолированного вала — использованный стержень от шари- ковой ручки, на которую намотана бумага (шов намазывается клеем ПВА). Катоды LED 17, LED2, LED3 присоединяются к токосъемным кольцам. После соединения с токосъемными кольцами поверх вала на- тягивается ПВХ термотрубка и нагревается. В местах токосъемных ко- лец ПВХ трубка обрезается, для контакта с пружинными проводниками.
38 Глава 3 Рис. 3.6. Примерный вид конструкции верхушки новогодней елки Светодиоды на валу лучше устанавливать разных цветов. Если вращать засвеченный красный, зеленый и синий светодиоды, то в сумме полу- чится белый цвет. При остановке и вращении вала в режиме реверса цвет будет иметь разнообразную палитру. Остальные светодиоды уста- навливаемые на плате можно подобрать красного цвета. Эффект уси- лится, если плату расположить немного под наклоном. В таком случае зрителю будут видны все светоэффекты. Перед сборкой конструкции необходимо проверить работоспособность схемы. Примерный вид конструкции верхуш- ки новогодней елки показан на рис. 3.6. Ее элементы: • плата управления с двигателем; • полупрозрачная колба сверху (можно использовать верхушку пластиковой бутылки, слегка раскрашенную изнут- ри гуашью); * • полупрозрачная колба снизу (анало- гично верхней); • нижнее крепежное трубчатое кольцо, подогнанное под диаметр ствола елки. Скрепить все части конструкции по- может герметик, аккуратно выложенный по краям. Колбы могут иметь диаметр не- много больше диаметра платы. В этом случае внутри колб плату можно накло- нить, а под двигатель подложить клин. Плату необходимо прикрепить к колбам, поскольку она во время работы вибрирует. В месте крепежа для маскировки следует приклеить декоративную звездочку из фольги. Питание схемы можно организо- вать от стационарного источника напря- жения 4,5-6 В (ток потребления 250 мА) или от переносного батарейно- го отсека, закрепленного между ветками елки. Для быстрого программирования микроконтроллера с помощью технологии передачи данных по последовательному интерфейсу SPI ав- тор предусмотрел на плате разъем SV2. Во время дополнения програм- мы светоэффектами достаточно дополнить табл. 3.1, исправить про- грамму, подсоединить программатор STK200-STK500 к схеме и пере- программировать микросхему микроконтроллера.
______Глава 4____ Счетчик событий Счетчик событий предназначен для считывания нажатий кнопки и отображения в десятичной форме количества таких нажатий на экра- не. Счетчик можно использовать для регистрации посетителей в любом небольшом заведении, а так же — событий в электронике или в цифро- вой технике (например, для подсчета импульсов в лентопротяжных ме- ханизмах или метража в механизмах намотки провода). Цель главы — ознакомить читателей с современными технологиями вывода информа- ции на семисегментные индикаторы в случае ограниченного количества выводов микроконтроллера, а так же с методами минимизации элемен- тов монтажа для быстрой сборки устройства. Счетчик ведет подсчет с момента включения от 0 до 99. Схема счетчика (рис. 4.1) очень проста: IC1 — регистр 74НС164; IC2 — мик- роконтроллер Tiny 15 от компании Atmel [3]. Микроконтроллер оснащен Flash-памятью на 1 Кбайт, памятью EEPROM на 64 байт, шестью ли- ниями ввода-вывода, встроенным RC-генератором, а так же АЦП, ана- логовым компаратором и двумя таймерами/счетчиками. Этого набора вполне достаточно для полноценной работы устройства. Питание счетчика осуществляется от батареи 4,5 В При включении питания светодиод LED1 светится, указывая о подаче питания. Микро- контроллер после сброса выполняет динамический опрос индикатора и устанавливает начальное положение в ноль. Индикатор счетчика оп- рашивает регистр IC1 при подаче импульсов управления от микрокон- троллера. Регистр IC1 преобразует последовательную информацию в параллельную [6], в результате чего нулевой потенциал подается на необходимый сегмент индикатора. Индикаторы подключены по схеме с общим анодом. Для включения индикатора DIS1 включаются транзисторы Q2, Q3; для индикатора DIS2 — транзистор Q1. Транзисторы включены по противофазной схе- ме, поэтому обоими индикаторами можно управлять одним выводом микроконтроллера. При включении одного из плеч транзисторов через сегменты индикатора протекает ток. Например, ток сегмента А индика- тора DIS1 протекает по пути: +ВАТ1, эмиттер-коллектор Q2, сегмент А индикатора DIS1, R3, 3-й вывод IC1, “ноль” GND.
40 Глава 4 Рис. 4.1. Схема счетчика событий
Счетчик событий 41 Недостатком схемы является непригодность регистра 74НС164 для коммутации сегментов индикаторов. Максимальный ток потребления IC1 — 40 мА, что почти достаточно для засветки восьми сегментов ин- дикаторов. Учитывая падение напряжения на выходных буферах микросхемы и на транзисторном переходе ЭК Q1 или Q2, а так же динамический ре- жим работы, автор установил в схему гасящие резисторы R3-R9 номи- налом 100 Ом. При этом яркость индикаторов уменьшится. В схему введен разъем внутрисхемного программирования SV1 для оперативного перепрограммирования микроконтроллера. Протокол про- граммирования через последовательный интерфейс SPI рассмотрен в книге [3]. Схему можно использовать в качестве индикатора от других устройств. Программа Счетчик событий имеет два индикатора. Для вывода цифр на инди- катор используется динамический режим. В начале программы указан вектор прерывания от различных источников микроконтроллера. Ис- пользуется только два прерывания: по сигналам RESET и TIME0. Далее в программе настраивается режим работы таймера с тактовой частотой f/64 от внутреннего генератора микроконтроллера, а так же на- стройка выводов порта В на ввод-вывод данных. Для прерывания про- граммы и вывода данных на индикатор с периодом в 0,738 мс автор ис- пользовал таймер 0 микроконтроллера. Динамический вывод цифр на индикаторы полностью реализован в подпрограмме обработки прерывания, которая считывает данные из регистров R22, R23 микроконтроллера и декодирует их в последова- тельный семисегментный код (по таблице “прошивки”) (табл. 4.1). За- тем этот код последовательно с тактируемыми импульсами выводится на индикатор через регистр IC1. Далее подпрограмма возвращается из вектора прерывания в то место, где была прервана основная программа. В подпрограмме запоминаются все данные, использованные в основной программе. После перехода в основную программу данные восстанав- ливаются. Алгоритм основной программы (рис. 4.2) проверяет, нажата кнопка или нет. Если кнопка нажата, то устраняется дребезг контактов (про- граммным путем) и содержимое регистра R22 микроконтроллера увели- чивается на единицу. На данном этапе алгоритм программы упрощен путем ограничения подсчета до девяти в R22 и увеличения следующего разряда десятичной функции в R23.
42 Глава 4 Рис. 4.2. Алгоритм основной программы счетчика событий
Счетчик событий 43 Таблица 4.1. Кодировка массива данных для вывода на семисегментные индикаторы пакетами в последовательном коде 0 Сброс а ь с d е f g p РВ5 RESET 1 1 1 1 1 1 1 1 1 РВ4 ВХОД 1 1 1 1 1 1 1 1 1 РВЗ Q3/Q1 1 1 1 1 1 1 1 1 1 РВ2 Qa_IC1 0 0 0 0 0 0 0 1 1 РВ1 CLK 1 1 1 1 1 1 1 1 1 РВО CLR 0 1 1 1 1 1 1 1 1 КодО ЗА ЗВ ЗВ ЗВ ЗВ ЗВ ЗВ 3F 3F Сброс а ь с d е 1 g p РВ5 RESET 1 1 1 1 1 1 1 1 1 РВ4 ВХОД 1 1 1 1 1 1 1 1 1 РВЗ Q3/Q1 1 1 1 1 1 1 1 1 1 РВ2 QaJC1 0 1 0 0 1 1 1 1 1 РВ1 CLK 1 1 1 1 1 1 1 1 1 РВО CLR 0 1 1 1 1 1 1 1 1 Код 1 ЗА 3F ЗВ ЗВ 3F 3F 3F 3F 3F Сброс а ь с d е f g p РВ5 RESET 1 1 1 1 1 1 1 1 1 РВ4 вход 1 1 1 1 1 1 1 1 1 РВЗ Q3/Q1 1 1 1 1 1 1 1 1 1 РВ2 Qa_IC1 0 0 0 1 0 0 1 0 1 РВ1 CLK 1 1 1 1 1 1 1 1 1 РВО CLR 0 1 1 1 1 1 1 1 1 Код 2 ЗА ЗВ ЗВ 3F ЗВ ЗВ 3F ЗВ 3F Сброс ь с fii «ж f g ips РВ5 RESET 1 1 1 1 1 1 1 1 1 РВ4 ВХОД 1 1 1 1 1 1 1 1 1 РВЗ Q3/Q1 1 1 1 1 1 1 1 1 1 РВ2 QaJC1 0 0 0 0 0 1 1 0 1 РВ1 CLK 1 1 1 1 1 1 1 1 1 РВО CLR 0 1 1 1 1 1 1 1 1 Код 3 ЗА ЗВ ЗВ ЗВ ЗВ 3F 3F ЗВ 3F
44 Глава 4 Таблица 4.1. Продолжение 4 Сброс а ь с d е f g Р РВ5 RESET 1 1 1 1 1 1 1 1 1 РВ4 вход 1 1 1 1 1 1 1 1 1 РВЗ Q3/Q1 1 1 1 1 1 1 1 1 1 РВ2 QaJC1 0 1 0 0 1 1 0 0 1 РВ1 CLK 1 1 1 1 1 1 1 1 1 РВО CLR 0 1 1 1 1 1 1 1 1 Код 4 ЗА 3F ЗВ ЗВ 3F 3F ЗВ ЗВ 3F 5 Сброс а ь с d е f g Р РВ5 RESET 1 1 1 1 1 1 1 1 1 РВ4 вход 1 1 1 1 1 1 1 1 1 РВЗ Q3/Q1 1 1 1 1 1 1 1 1 1 РВ2 QaJC1 0 0 1 0 0 1 0 0 1 РВ1 CLK 1 1 1 1 1 1 1 1 1 РВО CLR 0 1 1 1 1 1 1 1 1 Код 5 ЗА ЗВ 3F ЗВ ЗВ 3F ЗВ ЗВ 3F 6 Сброс а ь с d е f g р РВ5 RESET 1 1 1 1 1 1 1 1 1 РВ4 вход 1 1 1 1 1 1 1 1 1 РВЗ Q3/Q1 1 1 1 1 1 1 1 1 1 РВ2 QaJC1 0 0 1 0 0 0 0 0 1 РВ1 CLK 1 1 1 1 1 1 1 1 1 РВО CLR 0 1 1 1 1 1 1 1 1 Код 6 ЗА ЗВ 3F ЗВ ЗВ ЗВ ЗВ ЗВ 3F 7 Сброс а ь с d е f g р РВ5 RESET 1 1 1 1 1 1 1 1 1 РВ4 вход 1 1 1 1 1 1 1 1 1 РВЗ Q3/Q1 1 1 1 1 1 1 1 1 1 РВ2 QaJC1 0 0 0 0 1 1 1 1 1 РВ1 CLK 1 1 1 1 1 1 1 1 1 РВО CLR 0 1 1 1 1 1 1 1 1 Код 7 ЗА ЗВ ЗВ ЗВ 3F 3F 3F 3F 3F
Счетчик событий 45 Таблица 4.1. Окончание 8 Сброс а ь с d е f 9 р РВ5 RESET 1 1 1 1 1 1 1 1 1 > РВ4 вход 1 1 1 1 1 1 1 1 1 РВЗ Q3/Q1 1 1 1 1 1 1 1 1 1 РВ2 QaJC1 0 0 0 0 0 0 0 0 1 РВ1 CLK 1 1 1 1 1 1 1 1 1 РВО CLR 0 1 1 1 1 1 1 1 1 Код 8 ЗА ЗВ ЗВ ЗВ ЗВ ЗВ ЗВ ЗВ 3F 9 Сброс а ь с d е f g р РВ5 RESET 1 1 1 1 1 1 1 1 1 РВ4 вход 1 1 1 1 1 1 1 1 1 РВЗ Q3/Q1 1 1 1 1 1 1 1 1 1 РВ2 QaJC1 0 0 0 0 0 1 0 0 1 РВ1 CLK 1 1 1 1 1 1 1 1 1 РВО CLR 0 1 1 1 1 1 1 1 1 Код 9 ЗА ЗВ ЗВ ЗВ ЗВ 3F ЗВ ЗВ 3F В программе выполняется проверка на достижение числа 99. Если регистр R23 микроконтроллера достиг 99, то результат регистров обну- ляется. Однако для будущего использования в других приложениях не- обходим пересчет шестнадцатеричной системы исчисления в десятич- ную. Схему счетчика событий можно использовать для других прибо- ров. Если добавить согласующий усилитель и немного модифицировать программу, то получится измеритель напряжения или температуры. В составе микроконтроллера Tiny 15 компании Atmel присутствует АЦП, необходимый для этих целей. Индикация цифр имеет необычную структуру и организована через вектор прерывания от таймера TIME0 каждые 738 мкс. В подпрограмме прерывания реализован алгоритм, представленный на рис. 4.3. 1. Вывод в регистр кода первого разряда индикации. 2. Пауза в 130 мкс (отображение первой цифры). 3. Вывод в регистр кода второго разряда индикации. 4. Пауза в 130 мкс (отображение второй цифры). 5. Сброс регистра дважды.
46 Глава 4 О -------------------- Вывод цифры ••—[iUblKjaLKJnJgLJpl. 0 73-8-мё- 1,5мкС Сброс Первая цифра Вторая цифра ^осинди^ Й ||1 ДД 0,738мС Л J L „ 1ЙС ЗОмкС ЗОмкС \ Индикация цифры Рис. 4.3. Временная диаграмма работы индикаторов На примере цифры 2 рассмотрена структура движения разрядов в последовательном коде. На обоих индикаторах выводится цифра 22. Сегменты на индикаторе расположены стандартно, вывод данных в ре- гистр происходит, начиная с последнего (точка индикатора — сегмент р) и заканчивая первым сегментом (сегмент а). На рис. 4.3 представлены примеры кодировки всех цифр. Во время вывода кода в регистр буфер регистра постоянно включен, а сегменты индикатора хаотически засвечиваются, что приводит к ненужной под- светке. Однако инертность человеческого глаза настолько высока, что при отображении полезной информации 80% от общего времени и не- нужной — 20%, видна только полезная. Кроме того, частота отображе- ния цифр индикатора составляет около 1355 Гц, тогда как предел распо- знавания мерцания человеческим глазом составляет 25 Гц. Дальнейшее наращивание числа индикаторов снизит частоту ото- бражения, однако запас инертности очень велик. Изменяя время засвет- ки полезной информации до 90%, можно программным путем увели- чить яркость свечения сегментов индикатора. В программе не использу- ется “спящий” режим микроконтроллера, а также отключен сторожевой таймер, предотвращающий зацикливание.
Счетчик событий 47 Код программы на языке ассемблер представлен в листинге 4.1, шестнадцатеричный код — в листинге 4.2. Программа полностью про- верена в симуляторе AVR Studio 4. ®Три варианта программы можно найти на прилагаемом к книге компакт-диске В папке Программы\04 - Счетчик событий. Листинг 4.1. Ассемблерная программа счетчика событий .include "C:\Program Files\Atmel\AVR Studio\Appnotes\tnl5def.inc" .def tmp = rl6 .def coc = rl7 .def vih = rl8 .def tempo = rl9 .def pir = r22 .def pur = r23 .def par = r20 .def Y = r29 .def X = r21 .def W = r26 .def prgl = r24 .def prg2 = r25 .def adr2 = r27 .def aur = rl5 .def adr = rO ;начало сегмента программы . cseg . org 0 ;Вектор прерывания rjmp RESET nop ;rjmp EXT_INTO прерывание не используется nop /rjmp EXT_PIN прерывание не используется nop ;rjmp LOW_LEVEL rjmp TIME_1 /прерывание от таймера! rjmp TIME-0 /прерывание от таймераО nop /rjmp EE—RDY прерывание от таймера nop /rjmp ANA—COMP прерывание не используется /начало всей программы с подпрограммами .org 20 /настройка порта В RESET: clr tmp out DDRB, tmp out PORTB, tmp /обнулить порт В wdr /Настройка таймера timeO
48 Глава 4 Листинг 4.1. Продолжение clr coc Idi coc, $06 out TIMSK, coc Idi coc, $06 out TIER, coc Idi coc, 3 /Источник счет:чик/64 out TCCRO, coc Idi coc, $ff-35 out TCNTO, coc ;Настройка таймера timel clr coc Idi coc, $0E /Источник счетчик/512 out TCCR1, coc Idi coc, $00 out TCNT1, coc /Начало основной логической программы ;сброс всех значений nStart: nop /начало программы clr coc Idi coc, $0F /РВО,PB1,PB2,РВЗ-выходы out DDRB, coc nop Idi par, $0F clr tmp clr pir clr pur clr prgl clr prg2 clr rl4 sei rec: nop ;Проверка прерывания таймераО mov prgl, rl4 cpi prgl,' $7B brne jup clr rl4 ;Индикация в случае прерывания real: L TIMEW rjmp jup ;Проверка прерывания таймера! mov prgl, rl3 cpi prgl, $9B brne jup clr rl3 ;Индикация в случае прерывания
Счетчик событий 49 Листинг4.4. П| rcall DUP j up: nop sei rjmp rec ;Подпрограмма опроса клавиши Dup: clr vih rcall zader nop rcall zader nop nop clz /Чтение порта inc tempo in vih, PORTB andi vih, $10 cpi vih, $00 brne Dup inc tmp cpi tmp, $05 совпадение brbs 1, prod ;проверка результата накопления, не cpi tempo, $0A brbc 1, kon clr tmp clr tempo rjmp dup nop kon: nop ret 5 раза более подряд 50 раз ;Кнопка нажата и проверена prod: nop clz clr tempo clr tmp inc pir nop ;проверка на более 9 нажатий кнопки cpi pir, $09 /совпадение 9 brbs 1, razr rjmp kon razr: nop clz inc pur /проверка на более 99 нажатий кнопки
50 Глава 4 Листинг 4.1. Продолжение cpi brbs rjmp sbr: nop clz clr clr rjmp pur, $09 /совпадение 9 1, sbr kon pir pur kon /Начало подпрограмм. /Подпрограмма задержки включения светодиодов zader: nop wdr nop clr X nop clr Y nop Idi X, $0A dv: nop wdr mov Y, par dx: dec Y brne dx dec X brne dv ret /Подпрограмма вывода семисегментного кода /Начало вектора прерывания от таймера TIME_0: wdr cli clr prgl Idi prgl, $7B mov rl4, prgl reti TIME—l: wdr cli clr prgl Idi prgl, $9B mov rl3, prgl reti TIMEW: nop wdr cli
Счетчик событий 51 Л1Йтй«г4Л;И^Д<»’^внЙе''?'' </М^ч mov r9, tempo mov rl, tmp mov r2, pir mov r3, pur mov r4, adr mov r5, x mov гб, у mov r8, par mov par, r2 /первая цифра clr prg2 Idi adr2, $37 /первый индикатор rcall opros rcall zader Idi coc, $00 out TCNTO, coc clr prg2 mov par, r3 /вторая цифра Idi adr2, $3F /второй индикатор rcall opros rcall zader Idi adr2, $37 rcall sbros mov tempo, r9 mov tmp, rl mov pir, r2 mov pur, r3 mov adr, r4 mov x, r5 mov y, r6 mov par, r8 Idi coc, $ff-45 out sei ret TCNTO, coc /Подпрограмма опроса сегментов opros: nop clz cli /общее запрещение прерываний mov r7, par /сохранение par Idi prg2, $00 Idi r31, high(2*cod) Idi r30, Low(2*cod) mov W, par cpi W, 0 /для индикации 0 brbs ist: nop 1, hod /проверка по 0 результату
52 Глава 4 brbs Idi add dec rjmp 1, hod ;проверка по отрицательному результату tmp, $ 0A r30, tmp ;увеличение адреса par ;par номер цифры адреса ist hod: xod: kv: nasv: clz mov mov cpi breq add LPM and clr inc cpi brne mov mov ori mov mov ' nop out nop nop out nop nop nop nop nop nop nop nop out nop nop inc rjmp mov clr clr ret rl2, r30 r30, rl2 prg2, $09 ;вывод на индикатор количества nasv ;9 знаков выводятся гЗО, prg2 /увеличение адреса сложением /загрузка в регистр R0 данных по адр Z adr, adr2 ;adr2-BTopon сегмент aur aur adr2, $3F kv rlO, tmp tmp, aur tmp, $ 0 8 aur, tmp tmp, rlO PORTB, aur PORTB, adr PORTB, aur prg2 /увеличение шага адреса xod par, r7 /восстановление par Pir adr
:четчик событий 53 Листинг 4.1. Продолжение /сброс знаков индикатора, перевод регистра в высокое состояние sbros: cli ;общее запрещение прерываний пор istl clz mov Idi Idi Idi Idi mov cpi brbs nop brbs Idi add dec rjmp 1 1 r7, par /сохранение par par, $0A prg2, $00 r31, high(2*cod) r30, Low(2*cod) W, par W, 0 /для индикации 0 , hodl /проверка по 0 результату hodl /проверка по отрицательному результату tmp, $0А гЗО, tmp /увеличение адреса par /par номер цифры адреса istl hodl: dd: clz mov nop mov cpi breq add LPM and clr inc < out nop nop out nop nop nop nop nop nop nop nop out nop nop rl2, r30 гЗО, rl2 prg2, $09 /вывод на индикатор количества nasvt ;9 знаков выводятся гЗО, prg2 /увеличение адреса сложением /загрузка в регистр R0 данных по адр Z adr, adr2 /adr2-BTopon сегмент aur /регистр обнуления aur PORTB, aur PORTB, adr PORTB, aur
54 Глава 4 Листинг 4.1.Г inc rjmp nasvt: prg2 /увеличение шага адреса dd mov par, r7 /восстановление par clr clr ret pir adr ;начало таблицы кодировки .org $190 cod: .DB $3A, $3B, $3B, $3B, $3B, $3B, $3B, $3F .DB codl: .DB $3F $3A, $3F, $3B, $3B, $3F, $3F, $3F, $3F .DB cod2: .DB $3F $3A, $3B, $3B, $3F, $3B, $3B, $3F, $3B .DB cod3: .DB $3F $3A, $3B, $3B, $3B, $3B, $3F, $3F, $3B .DB cod4 : .DB $3F $3A, $3F, $3B, $3B, $3F, $3F, $3B, $3B .DB cod5: .DB $3F $3A, $3B, $3F, $3B, $3B, $3F, $3B, $3B .DB cod6: .DB $3F $3A, $3B, $3F, $3B, $3B, $3B, $3B, $3B .DB cod7 : .DB $3F $3A, $3B, $3B, $3B, $3F, $3F, $3F, $3F .DB cod8: .DB $3F $3A, $3B, $3B, $3B, $3B, $3B, $3B, $3B .DB cod9: .DB $3F $3A, $3B, $3B, $3B, $3B, $3F, $3B, $3B .DB codR: .DB $3F $3A, $3F, $3F, $3F, $3F, $3F, $3F, $3F .DB $3F .EXIT
Счетчик событий 55 Листинг 4.2. Шестнадцатеричный код «нетчика событий :020000020000FC :1000000013С00000000000007ЕС077С000000000А8 :10002800002707BB08BBA895112716E019BF16E0E3 :1000380018BF13E013BF1CED12BF11271EE010BF3D .:1000480010E01FBD000011271FE017BB00004FE0A4 :1000580000276627772788279927ЕЕ2478940000В9 :100068008E2D8B3741F4EE2450D005C08D2D8B3961 :1000780011F4DD2403D000007894F1CF222729D091 :10008800000027D0000000009894339528B3207111 :100098002030A1F70395053041F03A3021F40027CC :1000A8003327ECCF00000000089500009894332710 :1000B800002763950000693009F0F5CF0000989497 :1000C8007395793009F0EFCF000098946627772769 :1000D800EACF0000A895000055270000DD270000A2 :1000E8005AE00000A895D42FDA95F1F75A95C9F788 :1000F8000895A895F89488278BE7E82E1895A89571 :10010800F89488278BE9D82E18950000A895F894BC :10011800932E102E262E372E402C552E6D2E842EE3 :10012800422D9927B7E316D0D4DF10E012BF9927E4 :10013800432DBFE30FD0CDDFB7E343D0392D012DD9 :10014800622D732D042C552DD62D482D12ED12BF7E :1001580078940895F89400009894742E90E0F3E051 :10016800E0E2A42FA03031F0000021F00AE0E00F17 :100178004A95FACF9894CE2EEC2D9930F1F0E90FEC :10018800C8950B22FF24F394BF3329F4A02E0F2D1A : 100198000860F02E0A2D0000F8BA0000000008BA26 :1001А8000000000000000000000000000000000047 :1001B800F8BA000000009395DFCF472D662700248A :1001C8000895F89400009894742E4AE090E0F3E0C3 :1001D800E0E2A42FA03031F0000021F00AE0E00FA7 :1001E8004A95FACF9894CE2E0000EC2D9930B1F0B4 :1001F800E90FC8950B22FF24F394F8BA0000000019 :1002080008ВА000000000000000000000000000024 :100218000000F8BA000000009395E6CF472D662746 :040228000024089511 :100320003A3B3B3B3B3B3B3F3F003A3F3B3B3F3F46 : 100330003F3F3F003A3B3B3F3B3B3F3B3F003A3B6D :100340003B3B3B3F3F3B3F003A3F3B3B3F3F3B3B21 :100350003F003A3B3F3B3B3F3B3B3F003A3B3F3B51 :100360003B3B3B3B3F003A3B3B3B3F3F3F3F3F003C :100370003A3B3B3B3B3B3B3B3F003A3B3B3B3B3F02 :0E0380003B3B3F003A3F3F3F3F3F3F3F3F0088 :00000001FF___________________________________________________ Программу можно ввести программатором STK.200 с помощью про- граммы AVReal32. Для работы в течении часа достаточно трех аккуму-
56 Глава 4 ляторов по 1,5 В (150 мАч), или от внешнего блока питания 5 В (100 мА). При включении загорается светодиод индикации питания. Индикатор счетчика в начальный момент должен показать “ноль-ноль”. Если индикатор не светится, то неисправна схема индикации. Если све- тится восьмерка на одном из индикаторов, то не работает микрокон- троллер. В случае нагрева микросхемы 1С1 необходимо увеличить но- минал гасящих резисторов R3-R9 от 100 Ом. до 900 Ом. Плата Монтажная схема счетчика показана на рис. 4.4, а схема развод- ки— на рис. 4.5. Рис. 4.4. Монтажная схема платы счетчика событий Плата изготовлена из двухстороннего фольгированного текстолита. Автор для полной проверки схемы и программы использовал макетную плату (рис. 4.6). Компоненты: • светодиод LED1 — любой на ток 5 мА; • IC2 — микроконтроллера Tinyl5L-lSI (для печатной платы Tiny 15L-1PI корпус DIP); • IC1 — 74НС164 (К555ИР8) корпус DIP; • DIS1, DIS2 — TOD2M (5263ВН) корпус DIP или любой на ток не более 5 мА.
Счетчик событий 57 Микроконтроллер установлен на панельку, индикатор — на впаян- ный разъем (в случае неисправности индикатор легко заменяется, а так- же нет необходимости в соблюдении жестких условий пайки выводов). Рис. 4.5. Схема разводки платы счетчика событий Рис. 4.6. Конструкция счетчика событий
Глава 5 Музыкальный звонок Очень часто, покупая вещи, мы возлагаем на них определенные на- дежды, но иногда совершенно неожиданно они становятся поводом для скандала. Именно это произошло с автором, когда ему пришлось каж- дую неделю приобретать новый дверной звонок китайского производст- ва. На четвертом звонке, наконец, стало ясно, что китайцы народ хоро- ший, но вот их товары... Наша же промышленность, к сожалению, за- была о таких мелких проблемах потребителей. Схем музыкальных звон- ков очень много, но простых и многофункциональных автор не нашел, поэтому ему пришлось самому разработать простой и надежный звонок для создания уюта в доме. Начинающие микросхемотехники могут лег- ко повторить эту схему и дополнить программу на свой вкус. Для музыкального звонка был выбран простейший микроконтрол- лер ATtinyl5 от компании AtmeL Малое количество выводов, неболь- шой корпус, многофункциональность — все эти характеристики очень привлекательны для микроконтроллерного моделирования. Основная идея заключалась в дублировании китайского звонка с добавлением схе- мы генерирования музыки, а так же в реализации ее полностью авто- номной, независимой работы. Кроме того, был организован контроль питающей сети. Как только питание сети исчезает, схема начинает по- треблять ток от электролитического конденсатора, а при падении на- пряжения ниже нормы контроллер прерывает программу и переходит в ““спящий” режим. Схема (рис. 5.1) может работать как отдельное устройство или быть подключенной в точках А и В к схеме домашнего звонка. Питание осу- ществляется от сети переменного напряжения 220 В. Однополупериод- ный выпрямитель с ограничением по току питает схему мощного стаби- литрона и стабилизатора напряжения. Цепь понижения напряжения сети до уровня 9 В (Rl, СЗ) рассчитана на ток потребления 40 мА. Ток ста- билизации стабилитрона составляет 20 мА — столько же потребляет стабилизатор напряжения 5 В, питающий микроконтроллер в течение работы устройства. В момент включения основной ток потребляет конденсатор С2, но этот ток ограничен реактивным сопротивлением С2 и сопротивлением
Музыкальный звонок 59 Rl. Конденсатор С2 так же выполняет функцию источника тока в мо- мент отключения питания схемы, при этом D2 запирается, и потребите- лями остаются R5, R4, LED1, R3, DI, R2, IC2. R1 0V Рис. 5.1. Схема музыкального звонка При снижении напряжения на С2 до уровня менее 9 В стабилитрон D1 уменьшает потребление тока до минимума и отключается. Конден- сатор С4 сглаживает высокочастотные импульсные помехи, проходящие из сети в схему питания. Конденсаторы R5 и R4 составляют делитель напряжения на стабилитроне D1 (необходим для измерительного канала микроконтроллера). Измерительный канал не содержит схему выборки и хранения, а так же интегратора и фильтра верхних частот, поскольку эти функции выполняют фильтрующие элементы питания С2, С4. Функцию интегратора выполняет ограничительный стабилитрон D1. Микроконтроллер включается, как только подается напряжение питания. При этом светится светодиод LED1. При падении напряжения на стабилитроне D1 до уровня менее 9 В микроконтроллер переходит в ““спящий” режим. Как только на микроконтроллер поступает напряже- ние питания, он формирует низкочастотные сигналы музыкальных ме- лодий на пъезоизлучателе (можно выбрать любой пьезоизлучатель [7]). Для лучшего воспроизведения мелодии можно использовать динамик, но при этом для него необходимо обеспечить усилитель по току (на микросхеме или на транзисторе) и увеличить емкость С2.
60 Глава 5 Программа Программа разработана для микроконтроллера с тактовой частотой 4 МГц. Ее выполнение при включении питания начинается с вектора прерывания, по которому она переходит в заданную вектором подпро- грамму. При сбросе вектор прерывания переводит программу к метке RESET. Далее программа выполняет проверку питающего напряжения. Эту функцию выполняет АЦП при помощи одиночного преобразования. Программа проверяет напряжение питания схемы, и в случае падения его ниже уровня 0,89 В микроконтроллер переходит в “спящий” режим. После успешного прохождения проверки питания значения всех пе- ременных сбрасываются в ноль, а так же настраивается порт ввода-вы- вода и два таймера: ТО и Т1. Таймер ТО предназначен для установки времени звучания мелодии, а таймер Т1 — для установки частоты вы- бранной ноты. Таймер Т1 настроен на синхронизацию от тактового ге- нератора микроконтроллера с коэффициентом деления 1/64. Частота но- ты задается путем ввода длительности полупериода. При прохождении цикла, состоящего из деления тактовой частоты внутреннего генератора и инвертирования выходного сигнала дважды, формируется период с заданной частотой. В основе программы заложено использование таймера Т1 совместно с альтернативной функцией OClA-вывода порта РВ1, т.е. как только таймер выполнил заданный программой счет импульсов, на вывод РВ1 выдается единица. В следующий цикл Т1 обнуляется и повторяет счет импульсов до заданного значения, по достижению которого сигнал на выводе РВ1 инвертируется. С каждым последующим счетом значение на РВ1 инвертируется. Разобраться в расчете установленных коэффици- ентов для нот первой, второй и третьей октавы (диез и бемоль автор не рассматривал из-за ограниченного ресурса микроконтроллера) поможет табл. 5.1. Выходные данные: тактовая частота — 4000000 Гц, коэффи- циент деления — 2. Таблица 5.1. Расчет коэффициентов для нот первой, второй и третьей октавы Тай- мер Частота ноты Уста- новка Нота (ок- тава) Цифра НЕХ/ OCR1A Програм- ма, мкс Реальная частота 64 261,63 119 До(1) 32119 77 1928 259,3361 64 293,66 106 Ре (1) 32106 6А 64 329,63 95 Ми (1) 32095 5F 64 349,23 89 Фа (1) 32089 59 64 370 84 Соль (1) 32084 54
Музыкальный звонок 61 Таблица 5.1. Окончание Тай- мер Частота ноты Уста- новка Нота (ок- тава) Цифра НЕХ/ OCR1A Програм- ма, мкс Реальная частота 64 440 71 Ля (1) 32071 47 1157 432,1521 64 493,88 63 Си (1) 32063 3F 64 523,26 60 До (2) 32060 зс 64 587,32 53 Ре (2) 32053 35 64 659,26 47 Ми (2) 32047 2F 773 646,8305 64 698,46 45 Фа (2) 32045 2D 64 740 42 Соль (2) 32042 2А 64 880 36 Ля (2) 32036 24 64 987,76 32 Си (2) 32032 20 64 1046,52 30 До(3) 32030 1Е 64 1174,64 27 Ре (3) 32027 1В 64 1318,52 24 Ми (3) 32024 18 64 1396,92 22 Фа (3) 32022 16 64 1480 21 Соль (3) 32021 15 64 - 1760 18 Ля (3) 32018 12 64 1975,52 16 Си (3) 32016 10 276,75 1806,685 Установка таймера ТО определяет длительность ноты. ТО настроен на синхронизацию от тактового генератора микроконтроллера с коэф- фициентом деления 1/1024. К сожалению, разрядность этого таймера — только 8 разрядов. Даже с максимальным коэффициентом деления так- товой частоты выйти на необходимую длительность ноты (около 0,1- 0,5 с) очень сложно. По этой причине дополнительно задается цикл ра- боты ТО до 64 раз. Эта функция повторяется многократно, пока ТО не остановит звучание ноты и не перейдет к следующей ноте. Установка необходимых коэффициентов выполняется с помощью поочередного опроса памяти программ. В конце программы задается частота ноты и длительность звучания. Во избежание операций с 16-раз- рядными данными организована отдельная обработка 8-разрядных дан- ных (операции с двухбайтным словом предназначены для дальнейшей модернизации программы). После воспроизведения последней ноты микроконтроллер переходит в “спящий” режим. Мелодия звонка ограничена гаммой нот от “др” до “си”. Можно за- программировать любую гамму — для этого в конце программы есть много свободного места. Можно изменить порядок чтения нот и полу- чить интересную мелодию.
62 Глава 5 Код программы на ассемблере представлен в листинге 5.1, а шест- надцатеричный код — в листинге 5.2. ®Два варианта программы можно найти на прилагаемом к книге компакт-диске В папке Программы\05 - Звонок. Листинг 5.1. Ассемблерная программа для музыкального звонка .include "C:\Program Files\Atmel\AVR Studio\Appnotes\tnl5def.inc" /Программа музыкального звонка Сафонников В.В. /исправления и дополнения Кравченко А.В. . DEF Step=r20 .DEF Freqlndex=r21 .DEF FreqDelay=r22 .DEF Ah=rl8 / .DEF Al=rl7 .DEF Axx=r23 .DEF Ayy=r24 .DEF tmp=r27 .DEF tmp2=r28 .DEF tmp3=r26 .DEF tmp4=r25 /начало сегмента программы . cseg . org 0 /Вектор прерывания MK tinyl5 rjmp RESET nop /rjmp EXT_INT0 прерывание не используется nop /rjmp EXT_PIN прерывание не используется nop /rjmp LOW_LEVEL nop /rjmp TIME_1 /прерывание от таймера Т1 rjmp TIME_0 /прерывание от таймера TO nop /rjmp EE_RDY прерывание от таймера nop /rjmp ANA_COMP прерывание не используется /начало всей программы с подпрограммами .org 20 Reset: nop /Зададим уровень напряжения Idi Zl, $5D /уровень 0,9В Idi Zh, $00 /Настройка АЦП, проверка питания схемы. clr tmp3
Музыкальный звонок 63 Листинг 5.1. Продолжение Idi tmp3, $81 /внутренний ИОН, РВ2-вход out ADMUX, tmp3 /коммутация входов АЦП cli Запрет прерываний clr tmp 2 Idi tmp2, $С8 /АЦП разрешен, старт преобразования out ADCSR, tmp2 /Одиночное преобразование ;Сохранение данных АЦП in Ахх, ADCL in Ауу, ADCH ;вычитание значения АЦП от набранного значения mov А1, Ахх mov Ah, Ауу sub Al, Z1 sbc Ah, Zh nop brbs 2, SleepReset /уровень АЦП достигнут /сброс всех значений временных регистров clr tmp clr tmp 2 clr tmp3 clr tmp 4 clr Freqindex clr FreqDelay ;настройка направления работы линий порта В Idi tmp2,$04 out DDRB,tmp2 /режим работы таймера TO с максимальным предварительным /делением для установки времени музыкального сопровождения Idi tmp3,$05 out TCCR0,tmp3 /максимальное деление CK/1024 Idi tmp3,$02 out TIMSK,tmp3 /разрешаем прерывания по переполнению /от ТО и прерывания от Т1 sei /настройка таймера Т1 для музыкального сопровождения /выбор коэффициента предварительного деления тактовой частоты /1:64 и автоматический сброс таймера при совпадении Idi tmp4, $9В /настройка режима #10011011 /режим работы таймера 1 на переключение внешнего вывода, /состояние вывода меняется на противоположное, out TCCR1, tmp4 /вывод ОС1А линия вывода (РВ1) / установка . номера шага на начало clr Step
64 Глава 5 Листинг 5.1. Продолжение /начало воспроизведения мелодии ReadNote: /чтение длительности и номера одной ноты wdr Idi r31,High(2*ProgramTab) /Freqindex = Lo Idi гЗО,Low(2*ProgramTab) /ProgramTab[Step] /FreqDelay = Hi mov rO,Step /ProgramTab[Step] / Step++ Isl гО add гЗО,гО inc Step 1pm mov Freqindex,rO inc r30 1pm cpi Step, $16 brne dal rjmp SleepReset ;это означает, что мелодия ;закончилась /Если ноты не закончились, то продолжить dal: nop mov FreqDelay,rO SetFreq: / настройка Т1 на вывод частоты текущей ноты Idi r31,High(2*SoundTab) /OCR1A = /SoundTab[Freqindex] Idi гЗО,Low(2*SoundTab) Isl Freqindex add r30,Freqindex 1pm out OCR1A,rO inc r30 1pm out OCR1B,rO /Установка длительности ноты SetDalay: nop Idi r31,High(2*NoteDelay) Idi r30,Low(2*NoteDelay) 1pm mov FreqDelay,rO /Озвучивание ноты Wait: tst FreqDelay /Проверка на ноль длительности ноты / Ожидаем заданное время, пока проигрывается
Музыкальный звонок 65 Листинг 5Л. Окончание brne Wait / текущая нота /Если длительность ноты = 0, то переход к следующей ноте rjmp SleepReset: Idi ReadNote r30,$3F / подготовка к переходу в out sleep MCUCR,r30 / режим "Power Down" / отключение микроконтроллера rjmp Reset / эта команда в данной версии /программы не должна исполняться никогда /Прерывание от таймера 0, уменьшение шага длительности ноты Т1МЕ_0: пор dec FreqDelay clr tmp4 out TCNT1, tmp4 /обнуление таймера 1 reti .ORG $100 SoundTab: / Таблица констант, соответствующих нотам. / Желательно выровнять таблицу по границе 256 байтов, чтобы / упростить программу, отказавшись от 16-битовых операций. . DW 32047,32106,32095,32089,32084,32071,32063 /440 Гц - "ля” . DW 32060,32053,32047,32045,32042,32036,32032 /2-я октава . DW 32030,32027,32024,32022,32021,32018,32016 /3-я октава / при необходимости таблицу можно продолжить. .ORG $140 ProgramTab: / Таблица последовательности нот, / формат таблицы: байт длительности/кода операции, байт / номера частоты. В этом примере записано проигрывание гаммы. DW $1000, $1002, $1003, $1004, $1005, $1006, $1007 DW $1008, $1009, $100А, $100В, $100С, $100D, $100Е DW $200D, $200В, $2009, $2007, $2005, $2003, $2001 . DW $8000 . ORG $180 NoteDelay: / Таблица длительности нот, DW $0064, $3200, $1003, $1004, $1005, $1006, $1007 DW $1008, $1009, $100А, $100В, $100С, $100D, $100Е DW $200D, $200В, $2009, $2007, $2005, $2003, $2001 DW EXIT $8000
66 Глава 5 Листинг 5.2. Шестнадцатеричный код программы для музыкального звонка : 0 20 0 0 00 20 0 0 0 FC :1000000013С0000000000000000055С00000000008 :100028000000EDE5F0E0AA27A1E8A7B9F894CC27ED :10003800C8ECC6B974B185B1172F282F1E1B2F0B1A :1000480000008AF1BB27CC27AA27992755276627ВЕ : 100058 00C4E0C7BBA5E0A3BFA2E0A9BF7 8 94 9BE911 :1000680090BF4427A895F2E0E0E8042E000CE00DCC :100078004395С895502DE395C895463109F413С0АА :100088000000602DF2E0E0E0550FE50FC8950ЕВССА :10009800E395C8950DBC0000F3E0E0E0C895602D3D :1000A8006623F1F7DFCFEFE3E5BF8895B9CF00000E :0800B8006A9599279FBD189578 :100200002F7D6A7D5F7D597D547D477D3F7D3C7D9F :10021000357D2F7D2D7D2A7D247D207D1E7D1B7DBE :0A022000187D167D157D127D107DFE :1002800000100210031004100510061007100810СВ :1002900009100A100B100C100D100E100D200B2061 :0С02А00009200720052003200120008019 :1003000064000032031004100510061007100810D6 :1003100009100A100B100C100D100E100D200B20E0 :0С03200009200720052003200120008098 :00000001FF Обратите внимание на то, что таблицу длительности нот и частоту ноты можно прочитать только с помощью команды LPM микроконтрол- лера. Эта команда в версии ATtinyl5 по сути — единственная, выпол- няющая функции косвенного чтения данных из памяти в регистр R0. Кроме того, существует ограничение стека по нижнему уровню. Стек поддерживает не более трех вложений. Автор проверил в симуляторе AVR Studio 4 вложение стека на уровне 3, и обнаружил сбой програм- мы, поскольку команды условного перехода тоже используют стек. Программа теряет функциональность и последовательность. Учитывая эти замечания, исходная “прошивка” имеет небольшой объем (для мик- роконтроллера Tiny 15), но проверена и вполне работоспособна. Совет При модернизации программы автор не советует вставлять подпрограммы в под- программы. По окончанию проигрывания мелодии микроконтроллер переходит в “спящий” режим независимо от питания схемы.
Музыкальный звонок 67 Плата Плата изготавливается из двух- стороннего текстолита, или на ма- кетной плате. Монтажная схема представлена на рис. 5.2, а схема разводки — на рис. 5.3. К разъему SL1 подключается се- тевое напряжение 220 В. Кнопку S1 можно установить на плате или вы- нести на лестничную клетку. Можно использовать готовую кнопку, при этом вместо кнопки на плате уста- навливаем перемычку, а питание звонка используем по предыдущей схеме (разрыв питания по сетевому проводу). Возможен вариант под- ключения к домашнему звонку па- раллельно соленоиду (при этом вме- сто кнопки на плате устанавливаем перемычку). Рис. 5.2. Монтажная схема платы музыкального звонка Рис. 5.3. Схема разводки платы музыкального звонка
68 Глава 5 Плату монтируем и закрепляем в корпусе звонка. Конденсатор СЗ встречается в продаже нечасто, поэтому его можно заменить набором конденсаторов, спаянных параллельно (т.е. вместе). Стабилитрон D1 Д815Г — в металлическом корпусе для лучшего охлаждения, поскольку в момент всплесков сети он потребляет и рассеивает в тепло ток значи- тельной силы. Диод D2 — любой на обратное напряжение 300 В и ток не менее 0,2 А. Пьезоизлучатель — любого типа на напряжение 3-5 В. Светодиод LED1 — любой на ток 10 мА или меньше. Резисторы R1 и R2 — мощностью 1 Вт МЛТ-1. Конденсаторы С5 и R6 для большин- ства микроконтроллеров можно не устанавливать (на монтажной плате эти элементы не введены), однако в случае невозможности запустить программу их необходимо припаять навесным монтажом. Настройка схемы Для проверки схемы питание +9 В (“плюс” — к катоду D1, “ми- нус” — на “землю”) можно подать от независимого источника к стаби- литрону D1. Мелодия начинает воспроизводиться сразу же при подклю- чении питания. Проверить схему при питании от сети можно без микроконтролле- ра. Для этого необходимо подключить нагрузку к выходу IC2. В качест- ве нагрузки можно использовать резистор номиналом 300 Ом и мощно- стью 1 Вт. При отключении схемы раньше, чем набирается напряжение питания, можно увеличить номинал резистора R5 в два раза или устано- вить дополнительно конденсатор 1000 пФ (10 В) параллельно R5 (под- бирается экспериментально). Если мелодия имеет низкочастотную тональность, то используемый микроконтроллер настроен на внутреннюю тактовую частоту 1 МГц. Можно увеличить тональность, добавив к выводам 2 и 3 микрокон- троллера (РВ2, РВЗ) кварцевый резонатор 4 МГц и корректирующие конденсаторы по 100 пФ. При нестабильном запуске программы необ- ходимо установить конденсаторы С5, R6. В перспективе, схему можно дополнить фотодатчиком для регули- ровки уровня звука в ночное время, а так же сенсором открытия двери для выключения мелодии при открытии двери или при включении света в прихожей (S2). Оставшиеся выводы микроконтроллера можно задей- ствовать для реализации многоголосного музыкального сопровождения, подключив еще два пьезоизлучателя. В программе эти функции не реа- лизованы.
___________Глава 6_________ Индикатор уровня звукового В бытовой электронике для индикации уровня сигнала используют всевозможные индикаторы уровня. Десять лет назад они, в основном, были стрелочными, но на современном этапе развития микроэлектрони- ки используют светодиодные или газоразрядные индикаторы совместно со специализированными микросхемами. Индикатор, предлагаемый ав- тором, — светодиодный, 16-разрядный. Он выполнен на доступных элементах как автономное, функционально завершенное устройство и может использоваться в звуковых усилителях, эквалайзерах и магни- тофонах для индикации заряда аккумулятора и т.п. В основе схемы (рис. 6.1) заложен принцип преобразования анало- гового сигнала в цифровой. Для этого используется дешевый микрокон- троллер ATtinyl5 от компании Atmel [3], имеющий в своем составе 10- разрядный АЦП. Для микроконтроллерного моделирования этот пример является наглядным пособием по программированию. Индикатор уровня собран на четырех микросхемах: • IC1 — микроконтроллер для преобразования входного сигнала в цифровой код; • IC2 — преобразование цифрового кода в сигналы управления инди- катором [6]; • IC3A — согласование уровня входного звукового сигнала и уровня АЦП; • IC3B — фильтрация и интегрирование звукового сигнала; • IC4 — стабилизация питающего напряжения и формирование 5 В для питания схемы управления. Индикатор уровня имеет 16-разрядную шкалу, использует две ли- нейки по 10 разрядов индикатора (при этом четыре разряда не исполь- зуются) или три линейки по шесть разрядов индикатора. Измерительный канал не имеет схемы выборки и хранения [8]. Ин- тегратор и фильтр верхних частот, построены на IC3. Входной усили- тель IC3A реализует регулировку коэффициента усиления входного сиг- нала от одно- до двукратного усиления.
70 Глава 6 IC4 DZ3-4 LD266 DZ1-6 LD266 Рис. 6.1. Схема индикатора уровня звукового сигнала DZ1-4 LD266 DZ1-5 LD266 12 %....Е12/ 9 ГГ7О £ ' ГГ7*Э -Э DZ2-4 LD266 DZ2-5 LD266 DZ1-3 LD266 DZ2-2 LD266 *Х . DZ2-6 LD266 *Х . DZ2-3 LD266 DZ3-1 LD266 LD266 DZ1-2 LD266 DZ2-1 LD266 16 R16/ 13 Ria .14 К RM DZ3-2 LD266 ,15 RtC DZ3-3 LD266 Поскольку питание операционного усилителя — однополярное, не- обходимо согласовать уровень входного звукового сигнала с уровнем АЦП. Эту функцию выполняет смещение IC3B до определенного на- пряжения на выходе с помощью делителя R20, R21. Одновременно IC3B интегрирует входной сигнал и фильтрует высокочастотную со- ставляющую звука. Совмещение интегратора и фильтра не очень хоро- шо отражается на качестве интегрирования звукового сигнала — этот пробел можно заполнить программной оцифровкой и обработкой звуко- вого сигнала. Однако в программе микроконтроллера отсутствует циф- ровая фильтрация и интеграция звукового сигнала, поскольку это требу- ет мощных математических ресурсов. Для решения задачи индикации уровня это излишне, поэтому микроконтроллер работает в ненагружен- ном режиме. На выходе порта В микроконтроллера формируется шестнадцате- ричный код с изменением в сторону роста. Дешифратор IC2 преобразу- ет этот код в напряжение низкого логического нуля на одном из выво-
Индикатор уровня звукового сигнала 71 дов [6]. В результате соответствующий светодиод начинает светиться. Засветка светодиодов происходит в динамическом режиме, что позволя- ет уменьшить ток потребления от источника питания до минимума. Программа Ассемблерный код программы представлен в листинге 6.1. е Исходные файлы соответствующего проекта AVR Studio 4 можно найти на при- лагаемом К книге компакт-диске В папке Программы\О6 - Индикатор уровня. Листинг 6.1. Ассемблерная программа для индикатора уровня звукового .include "C:\Program Files\Atmel\AVR Studio\Appnotes\tnl5def.inc" /Программа индикатора уровня сигнала . DEF Х=г20 ; . DEF Y=r21 ; .DEF Ah=rl8 ; .’DEF Al=rl7 .DEF tmp=rl6 .DEF tmp2=r22 .DEF tmp3=r23 .DEF tmp4=r25 .DEF par=r24 .DEF Axx=r4 . DEF Ayy=r5 ;начало сегмента программы . cseg . org 0 /Вектор прерывания MK tinyl5 rjmp RESET nop /rjmp EXT_INT0 прерывание не используется nop /rjmp EXT_PIN прерывание не используется nop /rjmp LOW_LEVEL nop /rjmp TIME_1/прерывание от таймера Т1 NOP /Т1МЕ_0 /прерывание от таймера ТО nop /rjmp EE_RDY прерывание от таймера nop /rjmp ANA_COMP прерывание не используется /начало всей программы с подпрограммами .org 20 Reset: nop /сброс всех значений временных регистров clr tmp
72 Глава 6 Листинг 6.1. Продолжение clr tmp 2 clr tmp3 clr tmp 4 ;настройка направления работы линий порта В Idi tmp2, $10 out DDRB, tmp2 clr tmp 2 out PORTB, tmp2 ;Настройка АЦП, начало программы nash: nop Idi par, $0F clr tmp Idi tmp3, $81 out ADMUX, tmp3 /коммутация входов АЦП clr tmp 2 clr tmp3 Idi tmp2, $C8 out ADCSR, tmp2 /запуск АЦП на преобразование /Чтение АЦП , задержка на 25 тактов cli /запрет прерываний clz /сброс флага нуля Idi tmp2, $26 ru: nop clz dec tmp 2 nop brbc 1, ru ;Сохранение данных АЦП in Axx, ADCL in Ayy, ADCH ; sei /разрешение прерываний /Начало цикла вывода на индикатор clr tmp 4 clr tmp clr tmp2 Idi tmp, $ 11 /16 светодиодов clr tmp3 Start: nop clz cp tmp4, tmp /проверка на 16 св. диодов breq fnash /Проверка уровня с АЦП inc tmp 4 Idi tmp2, $3F nop
Индикатор уровня звукового сигнала 73 лйсШЖ10ОВйМНМзМЯИМ11ИМ!ИММ1^^ „J clc cln ;сброс флага знака ;вычитание mov mov sub sbc nop значения АЦП Al, Axx Ah, Ayy Al, Zl Ah, Zh из набранного значения brbs 2, nash ;уровень АЦП достигнут add Zl, tmp2 ,-набираем значение АЦП adc rcall Zh, tmp3 zader ,-набираем значение АЦП out rjmp SleepReset: PORTB, tmp4 Start ;вывод на индикатор Idi r30,$3F ;подготовка к переходу в режим ;”Power Down” out sleep MCUCR,r30 ,-установки режима микроконтроллера ,-отключение микроконтроллера rjmp Reset ;если отключение не произошло,сброс /•Подпрограмма временной zader: nop wdr clr X clr Y Idi X, $0A dv: nop wdr mov Y, par dx: dec Y brne dx dec X brne dv ret .EXIT задержки В начале программы настраивается конфигурация порта и АЦП. Алгоритм прост: опрашивается аналоговый вход микроконтроллера, и аналоговый сигнал преобразуется в цифровой код. В момент опроса и преобразования АЦП желательно остановить все процессы в микро- контроллере [9] (окончательно в рассматриваемой программе данная функция реализована в “спящем” режиме). Для этого организован цикл в 26 тактов. Согласно документации на микроконтроллер, для преобра- зования необходимо максимум 25 тактов [3]. Фактически, эта функция дублирует “спящий” режим процессора.
74 Глава 6 Как только АЦП закончил преобразование, генерируется прерыва- ние от АЦП, и по вектору прерывания продолжается работа программы. После преобразования и паузы в 25 тактов организован цикл увеличе- ния на единицу временного регистр tmp (R16). Поскольку разрядность АЦП составляет 10 разрядов, результат преобразования максимального аналогового уровня будет иметь 1024 отсчета. Для получения 16 отсче- тов (потому что дешифратор и индикатор — 16 разрядные) необходимо согласовать преобразование с помощью коэффициента деления. Для данного случая коэффициент деления 1024/16 = 64. Однако, ввиду от- сутствия 17-го разряда, автор выбрал коэффициент деления 63. Дешифратор не может включить все выводы выходного логическо- го сигнала одновременно, поэтому программа реализует пошаговое уве- личение уровня с шагом в 63 отсчета и выводом соответствующего кода на дешифратор. Если значение набранного уровня больше, чем код пре- образованного аналогового сигнала, то программа возвращается в нача- ло. Соответственно, зажигаются только те светодиоды, которые имеют меньший уровень или совпадают с отсчетом уровня аналогового сигна- ла. Для детального визуального различия разрядов светодиодной мат- рицы организована временная задержка подпрограммой zader. Сканирование аналогового входа происходит с частотой, равной тактовой частоте микроконтроллера, деленной на 16, чтобы аналого- цифровое преобразование происходило с частотой 50-200 кГц (согласно документации на микроконтроллер [3]). Деление тактовой частоты мик- роконтроллера реализовано в регистре ADCSR. На случай сбоя по пита- нию существует подпрограмма SleepReset. Шестнадцатеричный код программы, который занимает в памяти всего лишь 100 байт, представлен в листинге 6.2. Листинг 6.2. Шестнадцатеричный код программы для индикатора уровня звукового сигнала : 020000020000FC ~~~ —— - — :1000000013C000000000000000000000000000001D :100028000000002766277727992760Е167ВВ6627С6 :1000380068BB00008FE0002771E877B9662777274B :1000480068EC66B9F894989466Е2000098946А950А :100058000000D9F744В055В099270027662701Е179 :10006800772700009894901721F393956FE3000089 :100078008894A894142D252D1E1B2F0B0000CAF25E :10008800E60FF71F06D098BBECCFEFE3E5BF8895E6 :10009800C7CF0000A895442755274АЕ00000А89537 :0С00А800582F5A95F1F74A95C9F70895В2 :00000001FF
Индикатор уровня звукового сигнала 75 Любители моделирования спецэффектов могут добавить в про- грамму следующие эффекты: • при включении питания эффект маяка — движение четырех засве- ток светодиодов от минимума к максимуму шкалы индикатора и обратно; • при перегрузке на входе уровня звука — хаотическая засветка све- тодиодов индикатора; • при окончании музыкального исполнения — эффект “Падающая капля”, когда уровень звука падает, и верхняя (“максимальная”) за- светка медленно движется в направлении “минимума” индикатора. В обычных светодиодных аудио-индикаторах создать спецэффекты невозможно. В рассмотренной программе спецэффекты не реализованы. Плата Монтажная схема платы индикатора уровня представлена на рис. 6.2, а схема разводки — на рис. 6.3. Плата изготавливается из двух- стороннего текстолита или на макетной плате (рис. 6.4). Размеры платы могут быть приспособлены для установки в бытовую аппаратуру. На плате присутствуют два разъема (при монтаже внутри аппарата можно обойтись без разъемов): • XI — для подключения нестабилизированного напряжения 7-9 В; • Х2 — для подключения одного из каналов звукового сигнала. Другие компоненты платы: • индикатор 10-разрядный Kingbright DC763HWA; • IC1 — микроконтролдлер ATtiny 15L-1 PI в DIP корпусе; • IC2 — 74LS154 или советский аналог К155ИДЗ; • IC3 — любой операционный усилитель с питанием 5 В (автор ис- пользовал LM358); • IC4 — стабилизатор 5 В 78L05. Ток потребления схемы с К155ИДЗ составляет приблизительно 70 мА, а для варианта с микросхемой 74LS154 — приблизительно 30 мА. Максимальный выходной ток стабилизатора 78L05 — 140 мА. В наличии запас по току, что очень важно для миниатюризации устрой- ства. Настройка схемы На схему подается нестабилизированное питание 7 В. Перед на- стройкой на панельку микроконтроллера в плате ничего не устанавли-
Глава 6 вается. От линейного выхода бытового магнитофона подается звуковой сигнал на вход индикатора уровня. На аналоговом входе микроконтрол- лера (вывод 2 микросхемы) проверяется напряжение, которое не должно превышать 2,5 В. Рис. 6.2. Монтажная схема платы индикатора уровня
Индикатор уровня звукового сигнала 77 оооо оооооо оооооо Рис. 6.3. Схема разводки платы индикатора уровня При подаче внешнего звукового сигнала на вход платы настраива- ется максимальный уровень 2,5 В с помощью подстраиваемого резисто- ра R23. Начальный уровень на АЦП микроконтроллера подбирается ре- зистором R21. В случае, если звуковой сигнал имеет большой уровень напряжения, необходимо установить делитель напряжения. Для этого от вывода 3 микросхемы IC3A к “земле” подключается резистор делителя
78 Глава 6 (подбирается экспериментально). Если звуковой сигнал имеет малень- кий уровень напряжения, то необходимо поэтапно увеличить сопротив- ление R22 и R24 для изменения коэффициента усиления операционных усилителей. Эту операцию необходимо проводить очень осторожно во избежание насыщения ОУ при усилении сигнала. Как только микроконтроллер установлен на панельку платы, и вклю- чено питание, должен засветиться первый светодиод (необходимый на- чальный уровень) индикаторной линейки. При подаче звукового сигна- ла индикатор отображает уровень засветкой светодиодов в такт музы- кального сопровождения. Поскольку сканирование сигнала происходит с частотой около 50 кГц, то, возможно, понадобится большее интегри- рование уровня сигнала, уменьшение эффекта “раздражающего мерца- ния” в результате резонанса некоторых звуковых гармоник и частоты преобразования АЦП. Для этого к С5 добавляется дополнительно ем- кость 0,1-100 мкФ. Необходимый результат достигается эксперимен- тально в зависимости от применяемого микроконтроллера (внутренняя настройка тактовой частоты процессора может отличаться). В заключение автор хотел бы отметить, что себестоимость индика- тора уровня составляет около $10, однако возможности для моделиро- вания спецэффектов в бытовой аппаратуре неограниченны, учитывая огромное неиспользуемое пространство памяти микроконтроллера. Рис. 6.4. Конструкция индикатора уровня сигнала
______Глава 7___ Электромассажер В практике радиолюбителя встречаются приборы медицинского на- значения. Зарубежные производители, используя простые методы пре- образования напряжения, создают безопасные электромассажеры. Ав- тор неоднократно пользовался такими приборами в медицинских учре- ждениях, но для быта импортный аппарат стоит очень дорого. В этой главе рассматривается простой аналог импортного электромассажера, который легко настроить с помощью регулятора длительности частоты и времени импульсов. В основе схемы (рис. 7.1) заложен микроконтроллер ATtinyl5 от компании Atmel [3], оснащенный Flash-памятью на 1 Кбайт, памятью EEPROM на 64 байт, шестью линиями ввода-вывода, встроенным RC- генератором, АЦП, аналоговым компаратором и двумя таймерами/счет- чиками. Схема построена как классический полумостовой несимметричный преобразователь с трансформаторной гальванической развязкой. Расчет трансформатора основан на [10]. При этом учитывается максимальная длительность импульсов, которая в сумме составляет частоту преобра-
80 I лава 7 зователя. Время паузы между импульсами в конструктивных расчетах трансформатора не учитывается. Питание схемы осуществляется от внешнего источника 4,5 В. После включения тумблера S1 питание подается на микроконтроллер IC1 и выходной каскад QI, Q2. Для исключения влияния импульсных помех во время работы питание подается через фильтр Rl, СЗ. Стабилитрон D1 выполняет роль стабилизатора напряжения 4 В. Применение в схеме стабилизации напряжения одного стабилитрона вполне оправдано, по- скольку ток потребления микроконтроллера достигает максимум 10 мА. Во время включения питания происходит сброс микроконтроллера через R5, после чего микроконтроллер опрашивает входы АЦП ADC1, ADC2 и формирует импульсы управления MOSFET-транзисторами Q1, Q2. Напряжение на АЦП регулируется переменными резисторами R3, R4. Для устранения шума во время регулировки установлены конденса- торы С5 и С6. Выходной каскад собран по схеме полумостового преобразователя на MOSFET-транзисторах. Применение этих транзисторов позволило упростить схему выходного каскада. Для ограничения тока преобразо- вателя применен резистор R2. Поочередная коммутация первичной об- мотки трансформатора TR1 вызовет ЭДС на вторичной обмотке. По- скольку трансформатор — повышающий, то импульсы, формируемые во вторичной обмотке, будут иметь большую амплитуду около 20 В. При изменении частоты амплитуда импульсов так же будет изменяться. Эти импульсы вызывают сокращение мышц человека при контакте с электродами во время работы прибора. На этом эффекте и основана функция массажера, что давно применяется в медицине. В схеме не предусмотрена защита от КЗ электродов. Программа Код программы на ассемблере представлен в листинге 7.1, а шест- надцатеричный код — в листинге 7.2. Четыре варианта программы и проектные файлы AVR Studio 4 можно найти на Wlk прилагаемом к книге компакт-диске в папке Программы\07 - Электромассажер Листинг 7.1. Ассемблерная программа для электромассажера .include "C:\Program Files\Atmel\AVR Studio\Appnotes\tnl5def.inc” .def tmp = rl6 .def tmp2 = rl7
Электромассажер 81 .def tmp3 = rl8 .def tempo = rl9 .def tmp4 = r22 .def tmp5 = r23 .def tmp6 = r27 .def par = r20 .def Y = r29 .def X = r21 .def M = r26 .def prgl = r24 .def prg2 = r25 . cseg . org 0 rjmp RESET nop ;rjmp EXT_INT0 прерывание не используется nop ;rjmp EXT-PIN прерывание не используется nop ;rjmp TIME_OVFO прерывание от таймера nop ;rjmp EE_RDY прерывание от таймера nop ;rjmp ANA_COMP прерывание не используется .org 20 /настройка порта В RESET: пор clr tmp out DDRB, tmp out PORTB, tmp /обнулить порт В clr tmp Idi tmp, $13 /РВО,PB1,PB4-выходы out DDRB, tmp /Начало программы /сброс всех значений clr tmp6 clr tmp 4 clr tmp 5 clr prgl clr prg2 clr par cbi PORTB, 1 /сброс порта cbi PORTB, 0 /сброс порта cbi PORTB, 4 /сброс порта nStart: nop cbi PORTB, 1 /сброс порта 1 nop rcall adcnl /чтение АЦП1
82 Глава 7 Листинг7.1 i Продолжение пор rcall adcn2 /чтение АЦП2 пор пор sbi PORTB, 1 /установка порта 1 пор rcall zader2 /время пропорционально АЦП1 пор cbi PORTB, 1 /сброс порта 1 пор rcall zaderl /время пропорционально АЦП2 пор sbi PORTB, 0 /установка порта 0 пор rcall zader2 /время пропорционально АЦП1 пор cbi PORTB, 0 /сброс порта 0 пор rcall zaderl /время пропорционально АЦП2 пор inc par пор cln cpi par, $14 /проверка циклов 20 brge con пор cln cpi par, $0A /проверка циклов 4 brlt rem nop nop cbi PORTB, 4 /выключение светодиода пор rjmp ooo con: пор clr par nop rem: nop sbi PORTB, 4 /включение светодиода ooo: пор пор rjmp nStart /Настройка АЦП1 adcnl: пор cli
Электромассажер 83 Листинг^^Продолжение пор clr tmp awe: nop cpi tmp, $04 brsh ass clr tempo Idi tempo, $81 /внутренний источник, вход ADC1 out ADMUX, tempo /коммутация входов АЦП clr tmp 2 clr tmp3 clr prg2 Idi prg2, $C4 ;одиночное, запуск, 1/16 out ADCSR, prg2 /запуск АЦП на преобразование Сохранение данных АЦП1 in tmp2, ADCL in tmp3, ADCH mov r2, tmp2 mov r3, tmp3 mov r4, r2 mov r5, r3 mov гб, г4 mov г 7, г5 inc tmp rjmp awe ;среднее арифметическое действие ass: nop clr r8 clc add tmp2, r2 adc r9, r8 add tmp2, r4 adc r9, r8 add tmp2, r6 adc r9, r8 clc Isr r9 ror tmp2 Isr r9 ror tmp2 clr r9 clc add tmp3, r3 adc r9, r8 add tmp3, r5 adc r9, r8 add tmp3, r7
84 Глава 7 adc clc Isr ror Isr ror sei nop ret r9, r8 r9 tmp3 r9 tmp3 /Подпрограмма задержки zaderl: nop wdr clr tmp clr M clr Y Idi Y, $0A cpi tmp3, $00 brne goo Idi M, $01 add M, tmp3 nop mov tmp3, M goo: nop mov M, tmp3 dm: nop cpi tmp2, $00 brne goq Idi X, $01 add X, tmp2 nop goq: nop mov X, tmp2 dv: nop wdr nop dx: nop nop eee: nop inc tmp cln cpi tmp, $AA brio eee nop clr tmp nop включения
Электромассажер 85 Листинг 7.1 .Продолжение cln dec Y пор brpl dx cln dec X brpl dv clz dec M brne dm ret /Настройка АЦП2 adcn2: nop cli nop clr tmp awe2: nop cpi tmp, $04 brsh ass2 clr tempo Idi tempo, $82 /внутренний источник, вход ADC2 out ADMUX, tempo /коммутация входов АЦП clr tmp4 clr tmp5 Idi prg2, $C4 /одиночное, запуск, 1/16 out ADCSR, prg2 /запуск АЦП на преобразование /Сохранение данных АЦП2 in tmp4, ADCL in tmp5, ADCH mov r2, tmp4 mov r3, tmp5 mov r4, r2 mov r5, r3 mov r6, r4 mov r7, r5 inc tmp rjmp awe2 /среднее арифметическое действие ass2: пор clr r8 clc add tmp 4, r2 adc r9, r8 add tmp4, r4 adc r9, r8
86 Глава 7 Листинг 7.1. Продолжение add tmp4, r6 ado r9, r8 clc Isr r9 ror tmp 4 Isr r9 ror tmp 4 clr r9 clc add tmp5, r3 adc r9, r8 add tmp5, r5 adc r9, r8 add tmp5, r7 adc r9, r8 clc Isr r9 ror tmp 5 Isr r9 ror tmp 5 sei nop ret ;Подпрограмма задержки включения zader2: nop wdr clr clr nop Idi cpi brne Idi add nop rjmp goo2: nop nop mov M, mov M Y y, $ff tmp5, $00 goo2 M, $01 M, tmp5 XX tmp 5 tmp6, tmp5 ;для достижения длинных импульсов xx: nop nop dm2: nop cpi brne tmp4, $00 goq2
Электромассажер 87 Idi add nop X, $01 X, tmp4 goq2: nop mov X, tmp4 dv2: nop wdr nop dx2: nop nop rew: nop clz dec tmp 6 brne nop cln rew dec nop Y brpl nop cln dx2 dec X brpl clz dv2 dec M .EXIT brne ret dm2 ЛИС1ПЙЙ^7&:1^^ :020000020000FC :0С00000013С00000000000000000000021 :100028000000002707BB08BB002703E107BBBB276D :1000380066277727882799274427С198С098С498А6 :100048000000C19800002AD000008DD000000000F8 :10005800C19A0000BED00000C198000056D0000030 :10006800C09A0000B6D00000C09800004ED0000032 : 100078004 3950000A8944 4314CF40000A8 94 4A30F9 : 1000880044F000000000C4 98000005C000004 427A8 :1000980000000000С49A00000000D2CF0000F894CD :1000A800000000270000043090F4332731E837B906 :1000В80011272227992794ЕС96В914В125В1212ЕЗЕ :1000C800322E422C532C642C752C0395EBCF000058 :1000D80088248894120D981C140D981C160D981CD1 :1000Е8008894969417959694179599248894230D37
88 Глава 7 Листинг 7.2. Окончание :1000F800981C250D981C270D981С88949694279574 :10010800969427957894000008950000А8950027F4 :10011800AA27DD27DAE0203021F4A1E0A20F0000B1 :100128002A2F0000A22F0000103019F451E0510FBF : 1001380000000000512F0(}O0A8 95000000000000FA :1001480000000395А8940A3AD8F30000002700009D :10015800А894DA95000092F7A8945A9562F79894B3 :10016800AA9509F708950000F894000000270000F8 :10017800043088F4332732E837B96627772794ECB8 :1001880096В964В175В1262Е372Е422С532С642СА7 :10019800752C0395ECCF000088248894620D981C78 :1001A800640D981C660D981C88949694679596948F :1001В800679599248894730D981C750D981С770D74 :1001С800981С8894969477959694779578940000DF :1001D80008950000А895AA27DD270000DFEF7030FA :1001E80021F4A1E0A70F000004C000000000A72F21 :1001F800B72F000000000000603019F451E0560FDE :1002080000000000562F0000A89500000000000024 :1002180000009894BA95E1F70000A894DA950000D8 :10022800AAF70000А8945A9572F79894АА9519F716 :02023800089527 jOOOOOOOlFF_____________________________________________________ В начале программы выполняется конфигурирование микрокон- троллера. В этот момент все выводы обнулены, поэтому светодиод LED1 засвечивается. Далее АЦП микроконтроллера считывает напря- жение с резисторов R3, R4. Пропорционально считанному напряжению устанавливается время включения и выключения обоих плеч полумос- тового преобразователя. На выводы микроконтроллера РВО и РВ1 по- очередно подаются импульсы управления. Паузы между импульсами задаются значением напряжения на R3. Длительность импульсов зада- ется значением напряжения R4. Длительность формируется программ- ным путем. Считывание данных на АЦП производится несколько раз, и по ре- зультатам среднего арифметического получают более точные данные длительности пауз и импульсов Во время работы прибора светодиод LED1 мигает с частотой, про- порциональной напряжению на АЦП1. Если микроконтроллер не рабо- тает, светодиод LED1 не мигает. В этом случае необходимо перепро- граммировать микроконтроллер. В программе автор не использовал таймеры, поскольку длительность пауз очень большая, и потому ресурс таймера недостаточен. Во время пауз сторожевой таймер сбрасывается, благодаря чему микроконтроллер не переходит в “спящий” режим.
Электромассажер 89 Конструкция Монтажная схема платы представлена на рис. 7.2, а двухсторонняя разводка проводников — на рис 7.3. Рис. 7.2. Монтажная схема платы электромассажера Плата изготовляется из двухстороннего металлизированного тек- столита. Автор предлагает дизайн прибора, представленный на рис. 7.4. Экспериментальная модель (рис. 7.5) была собрана на макетной плате. Сверху платы управления устанавливаются детали, выключатель пита- ния, регуляторы длительности и трансформатор, снизу — батарейный отсек питания. От трансформатора (снизу платы) отводятся разъемы для жгутов электродов. На плате вертикально установлен светодиод, кото- рый входит в отверстие в корпусе прибора. С верхнего торца прибора установлен выключатель питания. Все детали импортного производства.
90 Глава 7 Рис. 7.3. Схема разводки платы электромассажера Рис. 7.4. Дизайн прибора, предложенный автором книги
Электромассажер 91 Рис. 7.5. Конструкция платы электромассажера Для трансформатора используется Ш-образный ферритовый сер- дечник 2000НН (рис. 7.6) 30X15X7 (ДХВХШ). Рис. 7.6. Ш-образный сердечник трансформатора Первичная обмотка имеет 114 витков ПЭЛ 0,15, вторичная — 1074 витков ПЭЛ 0,035. Расчеты производились согласно [10].
92 Глава 7 При изготовлении трансформатора вторичная обмотка была разде- лена на две секции по 537 витков (рис. 7.7). Рис. 7.7. Вторичная обмотка разделена на две секции Изоляция обмоток выполнена тефлоновой лентой 0,2 мм (применя- ется в сантехнике), а экранирование трансформатора — алюминиевой лентой 0,5 мм (применяется в воздухотехнике). Сердечник стянут по периметру нейлоновой стяжкой. Стабилитрон D1 — любой на 4 В (например, КС139). Микрокон- троллер ATtiny 15 установлен на панельку для возможности свободного монтажа при перепрограммировании. Полевые транзисторы IRF540 в схеме не имеют радиаторов, поскольку мощность нагрузки незначи- тельная. На плате установлен разъем для возможности подключения внешнего источника питания. Настройка На выводах 5 и 6 микроконтроллера в среднем положении регуля- торов при включенном питании должна быть получена осциллограмма,
Электромассажер 93 показанная на рис. 7.8, на выводах вторичной обмотки трансформато- ра — осциллограмма, показанная на рис. 7.9, а на первичной обмотке — осциллограмма, показанная на рис. 7.10. Рис. 7.8. Осциллограмма на выводах 5 и 6 микроконтроллера Рис. 7.9. Осциллограмма на выводах вторичной обмотки трансформатора
94 Глава 7 Рис. 7.10. Осциллограмма на первичной обмотке трансформатора Если напряжение на электродах будет иметь уровень, вызывающий болезненные ощущения у пациента, то необходимо увеличить сопро- тивление R2. Для уменьшения амплитуды выходного импульса доста- точно параллельно вторичной обмотке трансформатора подключить ре- зистор номиналом от 100 кОм до 10 МОм (или переменный резистор мощностью 1 Вт). Ощущения массажа можно улучшить, добавив парал- лельно вторичной обмотке конденсатор емкостью от 100 пФ до 0,1 мкФ. Емкость конденсатора зависит от частоты импульсов. Настройка произ- водится для каждого пациента отдельно, поскольку ощущения зависят от проводимости кожи. Эксплуатация На электроды насаживаются смоченные в дезинфицирующем рас- творе тампоны. Электроды с тампонами накладываются на место мас- сажа на теле человека, после чего включается прибор. Регулировка па- раметров частоты и скважности импульсов соответствует ощущениям пациента. Электроды медленно перемещают по месту массажа. На- стройку длительности импульсов необходимо производить плавно, не создавая болевых ощущений пациенту. Внимание! Во время манипуляции электродами необходимо отключать питание прибора!
Глава 8 Повышающий преобразователь ЗВ- 5 В на микроконтроллере Во время разработки радиомоделей автор столкнулся с проблемой формирования питания для схемы блока управления. В различных уст- ройствах всегда требуется дополнительное нестандартное питание. Ис- пользовать гасящий резистор большой мощности или дополнять бата- реи питания еще одним элементом — не всегда разумное решение про- блемы. На практике для повышающего преобразователя применяются специализированные микросхемы МАХ641-МАХ643, МАХ1703, и их российские аналоги. Однако такой подход не всегда оправдан, посколь- ку эти детали редко бывают в продаже. Параметры внутреннего генератора специализированных микро- схем заранее заданы, изменить схему и подстроится под нужды нагруз- ки не так-то просто. Эта проблема особенно остро стоит в синхронизи- рованных системах, которые часто встречаются в многозвенных источ- никах питания. Кроме того, служебные средства, распознающие проис- хождение сбоя, ошибки или короткого замыкания, в специализирован- ных микросхемах очень ограничены и неинформативны. По этой причине автор разработал повышающий преобразователь на микроконтроллере Tiny 15 [3]. При этом были проверены ресурсы микроконтроллера и принципиальная возможность его применения в преобразовательной технике. Также была определена структура про- граммы и оценено быстродействие заложенного алгоритма для будущих разработок. Применение микроконтроллера позволяет точно и быстро определить причину сбоя источника, предотвращает выход из строя де- талей, в случае кратковременного сбоя автоматически выводит источ- ник на необходимый режим. В перспективе возможна реализация инди- кации напряжения и служебной информации в цифровом виде на более развитом и быстродействующем контроллере. Схема построена по классическим методам создания повышающих преобразователей [11, 12, 13] (рис. 8.1). Транзисторный ключ преобра- зователя Q1 работает в импульсном режиме, попеременно включаясь и выключаясь.
ч© сч Рис. 8.1. Схема повышающего преобразователя DC-DC 3V-5V100 kHz Глава 8
Повышающий преобразователь 3 В - 5 В на микроконтроллере 97 Когда транзистор открыт, ток от источника питания Un протекает через дроссель L. В дросселе линейно растет ток и накапливается энер- гия. При этом ток в нагрузку от источника не поступает, поскольку прямое включение диода D1 имеет порог включения, который выше па- дения напряжения на сопротивлении открытого транзистора (транзи- стор необходимо подбирать с очень маленьким сопротивлением откры- того состояния). В этот момент ток в нагрузку поступает только от раз- ряда конденсатора С1 (в начальный момент ток конденсатора 1с = 0). Когда транзистор закрывается, ЭДС самоиндукции дросселя сум- мируется с выходным напряжением на конденсаторе С1 и энергия тока дросселя передается в нагрузку. При номинальном сопротивлении на- грузки излишек энергии передается на заряд емкости С1. Ток в нагрузке протекает непрерывно. Этот режим называется “режимом непрерывного тока нагрузки”. Если нагрузка увеличилась выше нормы (сопротивление упало ниже номинального на величину более 50%), то возникает не- хватка энергии заряда дросселя. В этот момент наступает режим преры- вистых токов нагрузки, пульсация напряжения увеличивается, и преоб- разователь уходит от стабилизации напряжения на нагрузке. В начальный момент работы преобразователя напряжение на на- грузке растет ступенчато, постепенно выходя на режим стабилизации выходного напряжения (рис. 8.2). В режиме стабилизации напряжение на нагрузке имеет небольшую пульсацию, среднее значение равно на- пряжению стабилизации. Во время увеличения нагрузки пульсация рас- тет, а при уменьшении нагрузки остается неизменной. Для питания схемы автор применил два источника тока. Первый ис- точник (батарея 2) состоит из соединенных последовательно батареек типа АА (2 штуки) в выносном батарейном отсеке, а второй (батарея 1) — элемент питания CR2032, установленный непосредственно на пла- те (рис. 8.3).
98 Глава 8 Рис. 8.3. Два источника тока для питания схемы Такую конструкцию автор использовал для уменьшения влияния электромагнитных помех на окружающую среду, а так же для уменьше- ния индуктивной составляющей проводов, ведущих к батарейному от- секу. Кроме того, батарея 1 выполняет функцию аварийного питания контроллера. Это важно для будущих разработок, поскольку короткое замыкание зачастую нарушает работу всей системы. В такой ситуации микроконтроллер может прервать работу преобразователя, тем самым сохранив элементы схемы от выгорания. После останова преобразовате- ля микроконтроллер выдает ошибку, которую устраняет пользователь. На такой основе построены все современные источники питания и пре- образователи напряжения. После включения и выхода на режим стабилизации загорается зеле- ный светодиод, что свидетельствует о нормальном состоянии питания нагрузки. В моменты коммутации нагрузки, выхода на режим или изме- нения параметров нагрузки зеленый светодиод гаснет, сообщая о крити- ческом состоянии преобразователя. Как только произошло замыкание
Повышающий преобразователь 3 В - 5 В на микроконтроллере 99 или обрыв нагрузки, загорается красный светодиод, который мигает с паузами в 0,16 с. В момент, когда красный светодиод не горит, преобразователь пы- тается автоматически запустится. Если запуск не произошел в течение 0,16 с, красный светодиод загорается на 0,16 с. Микроконтроллер от- ключает нагрузку, ток не подается непосредственно от источника через дроссель L. В критических случаях при коротком замыкании предохранитель предотвращает возможность выхода из строя элементов схемы. При на- пряжении питания 3 В ток потребления микроконтроллера Tiny 15 в ак- тивном состоянии составляет около 3 мА. Емкости батареи 1 (CR2032) достаточно для питания микроконтроллера в аварийном режиме. Расчет элементов схемы и методов стабилизации напряжения Все расчеты приведены в таблице Excel на четырех листах (для рас- чета необходимой индуктивности дросселя и элементов схемы, автор использовал формулы из [11]). Файл можно найти на прилагаемом к книге компакт-диске в папке РасчетыХ Расчет параметров повышающего преобразователя.xls Расчет схемы разбит на несколько этапов. 1. Расчет минимальной индуктивности дросселя и необходимых ха- рактеристик элементов схемы (желтый лист Индуктивность в таб- лице Excel). 2. Расчет количества витков дросселя по заданным параметрам сер- дечника (голубой лист Корпус L в таблице Excel). 3. Расчет длительности и скважности импульсов заданной частоты с учетом выбранной индуктивности дросселя (оранжевый лист Гам- ма в таблице Excel). 4. Расчет метода авторегулирования и устойчивости преобразователя (розовый лист ООС в таблице Excel). Результат расчета — коэффициент усиления усилителя отрицатель- ной обратной связи, полученный по методике, изложенной в [13]. Ха- рактеристики элементов преобразователя взяты из справочных материалов. В качестве основы авторегулирования автор использовал метод фиксированных точек. Согласно теории, заранее расчетные значения
100 Глава 8 введены как фиксированные точки угла открытого состояния транзи- стора. В реальной схеме имитируется различное поведение нагрузки, и при значительных отклонениях вводятся поправочные коэффициенты в таблице коррекции. Таблица коррекции находится в конце программы и доступна для перепрограммирования в любой момент. е Таблица стандартных значений и коррекции приведена на зеленом листе Кор- рекция файла Расчет параметров повышающего преобразователя.xls. Метод фиксированных точек часто используется в устройствах ре- ального времени, однако для компенсации провалов или всплесков на- пряжения на нагрузке угол регулируется по перекрестной схеме. На- пример, для компенсации провала напряжения нагрузки до 4,2 В при стабилизации на уровне 5,0 В необходимо изменить угол отпирания транзистора до значения, при котором достигается 5,8 В (рис. 8.4). Тем самым компенсируется провал в 0,8 В. Программа Блок-схема алгоритма программы представлена на рис. 8.5. В нача- ле программы указывается вектор прерывания для перехода в необхо- димую подпрограмму. Далее настраивается ввод-вывод через порт В, а также таймеры ТО и Т1. Микроконтроллеры всегда выполняют функ- ции управления, а функции генерирования импульсов успешно выпол- няет таймер, работающий в автоматическом режиме. Таймер ТО устанавливается как вспомогательный элемент програм- мы. За основу широтно-импульсного регулятора выбран таймер Т1 мик- роконтроллера, который может формировать импульсы различной дли- тельности. Настройка таймера Т1 заключается в выборе тактовой часто- ты и режима широтно-импульсной модуляции (ШИМ). Тактовая часто- та микроконтроллера составляет 1,6 МГц, а частота преобразователя — 40 кГц. Известно, что микроконтроллер выполняет одну команду за один такт внутреннего генератора [3]. Простое арифметическое деление показывает, что для управления преобразователем можно использовать всего 40 команд. С другой стороны, быстрый отклик на изменение тока нагрузки может вызвать неустойчивое состояние преобразователя с од- нозвенным LC-фильтром [13]. По этой причине обработка данных вы- полняется в текущем режиме, а полученные данные заносятся в таймер, который формирует ШИМ-напряжение. Напряжение на нагрузке измеряется раз в восемь циклов работы преобразователя. Для работы АЦП необходимо 25 тактов микрокон- троллеров.
Повышающий преобразователь 3 В - 5 В на микроконтроллере 101 Рис. 8.4. Функция t от Uh
102 Глава 8 Рис. 8.5. Блок-схема алгоритма управления повышающим преобразователем
Повышающий преобразователь 3 В - 5 В на микроконтроллере 103 Исходя из расчетов, представленных в файле Расчет производи- тельности повышающего преобразоателя. xls, для выполнения за- дачи авторегулирования имеется максимум 295 шагов программы. еФаЙЛ Расчет производительности повышающего преобразователя.xls МОЖ- НО найти на прилагаемом к книге компакт-диске в папке Расчеты. Таймер Т1 настроен на синхронизацию от тактового генератора микроконтроллера с коэффициентом деления 1/64. Частота импульса задается путем ввода длительности полупериода. При прохождении цикла, состоящего из деления тактовой частоты внутреннего генератора и инвертирования выходного сигнала дважды, формируется период с заданной частотой. Код программы на ассемблере представлен в листинге 8.1, а шест- надцатеричный код — в листинге 8.2. ©Проектные файлы AVR Studio 4 для тестовой и рабочей программы управления повышающим преобразователем можно найти на прилагаемом к книге компакт- диске В папке Программы\08 - Повышающий преобразователь. Листинг 8.1. Ассемблерная программа управления повышающим преобразователем .include "C:\Program Files\Atmel\AVR Studio\Appnotes\tnl5def.inc" /Программа повышающего стабилизатора Кравченко А.В. /Переменные для стабилизатора . DEF tmp7 = r20 .DEF tmp8=r21 .DEF Upor=r22 .DEF Unag=r23 /Переменные для АЦП .DEF Axx=rl8 .DEF Ayy=rl9 /Переменные для вычислений .DEF tmp5=rl6 .DEF tmp6=rl7 .DEF tmp=r25 .DEF tmp2=r26 .DEF tmp3=r27 .DEF tmp4=r28 .DEF tmp9=r24 .DEF tmpl0=r29 .DEF Totk=rll
104 Глава 8 Листинг 8.1. Продолжение . DEF Tzak=rl2 .DEF Tnao=rl3 .DEF Tnaz=rl4 .DEF tmpll=rl5 /начало сегмента программы . cseg . org 0 /Вектор прерывания MK tinyl5 rjmp RESET nop ;rjmp EXT_INTO прерывание не используется nop ;rjmp EXT_PIN прерывание не используется nop ;rjmp LOW_LEVEL /прерывание от компаратора nop /rjmp TIME-1 /прерывание от таймера Т1 rjmp TIME—О /прерывание от таймера ТО nop /rjmp EE_RDY прерывание от таймера nop /rjmp ANA_COMP прерывание не используется /начало всей .org 20 программы с подпрограммами Reset: nop /сброс всех значений временных регистров clr tmp clr tmp 2 clr tmp3 clr tmp 4 Idi tmp, Low(RAMEND) out SPL, tmp /настройка направления работы линий порта В Idi tmp2,$07 /входные линии РВ4, РВЗ #00000111 out DDRB,tmp2 /режим работы таймера ТО с максимальным предварительным /делением для установки времени включения сигнала ошибки Idi tmp3,$02 out TIMSK,tmp3 /разрешаем прерывания по /переполнению от ТО /настройка таймера Т1 для формирования ШИМ /выбор коэффициента предварит, деления тактовой частоты 1:1 /автоматический сброс таймера при совпадении, частота /преобразователя 40 кГц Idi tmp4,$69 /настройка режима #01101001 /режим работы таймера Т1 на переключение внешнего вывода, /состояние вывода меняется на противоположное,
Повышающий преобразователь 3 В - 5 В на микроконтроллере 105 Листинг 8 Л. Продолжение out TCCR1, tmp4 /вывод OC1A линия вывода (PB1) ;общее разрешение прерывания ; sei /начало программы. по: пор clr tmp 4 clr rlO clr tmp /Запуск мягкого нарастания напряжения пор mov tmp9, г9 subi tmp 9, $69 /Проверка, был ли мягкий запуск пор brbs 2, gg /уровень АЦП достигнут rjmp RNE /мягкий запуск был, переход gg:. clr tmp nop /Мягкий запуск Idi Axx, $00 /старший байт угла отпирания Idi Ayy, $08 /младший байт угла отпирания Idi tmp6, $03 /количество циклов мягкого запуска tyr: nop dec tmp 6 brbs 2, RNE /начало цикла rcall ADC1 /подпрограмма проверки питания cpi tmp5, $56 nop breq error /недостаточно питания nop rcall SF rjmp tyr RNE: nop clr tmp Idi tmp9, $69 /мягкий запуск прошел mov r9, tmp9 rjmp SET nop 9 /Стабилизация состояния напряжения нагрузки Stab: nop rcall ADC1 /проверка питания nop SET: nop
106 Глава 8 Листинг 8.1. Продолжение rcall ADC2 /проверка нагрузки пор rcall SF rjmp Stab /Запуск ШИМ SF: пор пор ; чтение длительности времени заряда и разряда ******************************************* ;ШИМ1 Idi tmp4, $69 /настройка режима #01101001 /режим работы таймера Т1 на переключение внешнего вывода, /состояние вывода меняется на противоположное, неинверсный ;ШИМ, СК/8 out TCCR1, tmp4 /вывод ОС1А линия вывода (РВ1) mov tmp3, г4 out OCR1B, tmp3 /регистр OCR1B частота ШИМ Idi tmp9, $02 out TIMSK, tmp9 /разрешаем прерывания по /переполнению от Т1 ret ************************************* ;Обработка ошибок и неисправностей error: пор /Перевод светодиодов в индикацию ошибок /выключение : зеленого светодиода /включение красного светодиода in Upor, portB Idi Unag, $04 or Unag, Upor out portB, Unag rcall tiO /пауза в 0,16 С rcall ADC1 /проверка питания cpi rl6, $56 breq error rcall ADC2 /проверка нагрузки cpi rl6, $76 breq error /Все исправно /включение зеленого светодиода /выключение : красного светодиода in tmp4, portB clr Unag Idi Unag, $01
Повышающий преобразователь 3 В - 5 В на микроконтроллере 107 Листинг 8.1. Продолжение or Unag, tmp4 out portB, tmp3 rjmp Stab /запуск стабилизатора . ★★★★★★★★★★ /Определение состояния питающего напряжениия и напряжения ;нагрузки /Подпрограмма проверка АЦП1 напряжения питания стабилизатора ADC1: пор /сброс всех значений временных регистров clr tmp 10 clr tmp clr tmp 5 mov r8, tmp6 clr tmp 6 cli /общее запрещение прерывания /Настройка АЦП1, начало программы Idi tmplO, $83 ;#10000011 /Внутренний источник опорного напряжения, вход РВ4 out ADMUX, tmplO коммутация входов АЦП Idi tmp, $С8 ;#11000010 /Включение АЦП1, начать, одиночное преобразование, Кдел=4 out ADCSR, tmp /запуск АЦП на преобразование /Сохранение данных АЦП1 in tmp5, ADCL in tmp6, ADCH mov г12, tmp5 mov rll, tmp6 / sei /разрешение прерываний /Начало цикла проверки уровня питания /Проверка на ЗВ clc /сброс флага переноса cln /сброс флага знака /вычитание значения АЦП от набранного значения mov Zl, rll mov Zh, rl2 subi Zl, $01 /Вычитание старшего байта 3 В sbci Zh, $Е0 /Вычитание младшего байта 3 В с заемом brbs 2, gool /отрицательное, уровень АЦП достигнут /Проверка на 2,8 В clc /сброс флага переноса cln /сброс флага знака /вычитание значения АЦП от набранного значения mov Zl, rll mov Zh, rl2
108 Глава 8 ЛистингбЛПродолжение subi Zl, $01 /Вычитание старшего байта 2,8 В sbci Zh, $С0 /Вычитание младшего байта 2,8 В с заемом brbs 2, доо2 /отрицательное, уровень АЦП достигнут ;Проверка на 2,5 В clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rll mov • Zh, г12 subi Zl, $01 /Вычитание старшего байта 2,5 В sbci Zh, $90 /Вычитание младшего байта 2,5 В с заемом brbs 2, дооЗ /отрицательное, уровень АЦП достигнут ;Проверка на 2 В clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rll mov Zh, rl2 subi Zl, $01 /Вычитание старшего байта 2 В sbci Zh, $40 /Вычитание младшего байта 2 В с заемом brbs 2, доо4 /отрицательное, уровень АЦП достигнут ;Проверка на 1,8 В clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rll mov Zh, rl2 subi Zl, $01 /Вычитание старшего байта 1,8 В sbci Zh, $20 /Вычитание младшего байта 1,8 В с заемом brbs 2, доо5 /отрицательное, уровень АЦП достигнут Idi г16, $56 /очень низкий уровень ;Обработка данных питающего напряжения gool: nop Idi zl, Low(S3<<1) Idi. zh, High(S3<<l) add гЗО, Ауу adc г31, Ахх 1pm mov г4, г0 rjmp RNVV goo2: nop Idi zl, Low(S28«l) Idi zh, High(S28«l) add гЗО, Ауу adc г31, Ахх
Повышающий преобразователь 3 В - 5 В на микроконтроллере 109 Листинг 8.1. Продолжение 1pm mov rjmp г4, г0 RNVV дооЗ: nop Idi zl, LOW<S25<<D Idi zh, High(S25<<l) add гЗО, Ауу adc г31, Ахх 1pm mov г4, гО rjmp RNVV goo4 : nop Idi zl, Low(S2«l) Idi zh, High(S2<<l) add гЗО, Ауу adc r31, Ахх 1pm mov г4, гО rjmp RNVV goo5: nop Idi zl, Low(S18<<l) Idi zh, High(S18«l) add гЗО, Ауу adc r31, Ахх 1pm mov г4, гО RNVV: nop mov tmp6, г8 ret ************************************ /Подпрограмма проверка АЦП2 выходного напряжения на стабилизаторе ADC2 : пор ;сброс всех значений временных регистров clr tmp 10 clr tmp cli /общее запрещение прерывания /Настройка АЦП2, начало программы Idi tmplO, $83 ,-#10000000 /Внутренний источник опорного напряжения, вход РВ5 out ADMUX, tmplO ;коммутация входов АЦП Idi tmp, $С8 ,-#11000010 /Включение АЦП2, начать, одиночное преобразование, Кдел=4 out ADCSR, tmp /запуск АЦП на преобразование /Сохранение данных АЦП2 in Ахх, ADCL
по Глава 8 Листинг 8.1.Продолжение in mov mov ; sei Ayy, ADCH rl3, Axx rl4, Ay^ / /разрешение прерываний /Начало цикла проверки уровня питания ;Проверка на 5,9 В clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rl3 mov Zh, rl4 subi Zl, $03 ; Вычитание старшего байта 5,9 В sbci Zh, $B0 ; Вычитание младшего байта 5,9 В с заемом brpl ewe rjmp gaa ; уровень АЦП достигнут ;Проверка на 5,7 В ewe: nop clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rl3 mov Zh, rl4 subi Zl, $03 /Вычитание старшего байта 5,7 В sbci Zh, $90 /Вычитание младшего байта 5,7 Вс заемом brpl zwe rjmp gbb /уровень АЦП достигнут ;Проверка на 5,5 В zwe: nop clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rl3 mov Zh, rl4 subi Zl, $03 /Вычитание старшего байта 5,5 В sbci Zh, $70 /Вычитание младшего байта 5,5 В с заемом brpl xwe rjmp gcc /уровень АЦП достигнут ;Проверка на 5,4 В xwe: nop clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rl3 mov Zh, rl4 subi Zl, $03 /Вычитание старшего байта 5,4 В
Повышающий преобразователь 3 В - 5 В на микроконтроллере Ш Листинг 8.1. Продолжение sbci brpl rjmp Zh, ewe gdd $60 /Вычитание младшего байта 5,4 Вс заемом /уровень АЦП достигнут ;Проверка на 5,3 В ewe: nop clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rl3 mov Zh, rl4 subi Zl, $03 /Вычитание старшего байта 5,3 В sbci Zh, $50 /Вычитание младшего байта 5,3 В с заемом brpl vwe rjmp gee /уровень АЦП достигнут ;Проверка’ на 5,2 В vwe: nop clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rl3 mov Zh, rl4 subi Zl, $03 /Вычитание старшего байта 5,2 В sbci Zh, $40 /Вычитание младшего байта 5,2 В с заемом brpl bwe rjmp gff /уровень АЦП достигнут ;Проверка на 5,1 В bwe: nop clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rl3 mov Zh, rl4 subi Zl, $03 /Вычитание старшего байта 5,1 В sbci Zh, $30 /Вычитание младшего байта 5,1 В с заемом brpl nwe rjmp gj j /уровень АЦП достигнут ;Проверка на 5 В nwe: nop clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rl3 mov Zh, rl4 subi Zl, $03 /Вычитание старшего байта 5 В sbci Zh, $20 /Вычитание младшего байта 5 В с заемом brpl mwe
112 Глава 8 Листинг 8.1. Продолжение rjmp ghh /уровень АЦП достигнут ;Проверка на 4,9 В mwe: nop clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rl3 mov Zh, rl4 subi Zl, $03 /Вычитание старшего байта 4,9 В sbci Zh, $10 /Вычитание младшего байта 4,9 В с заемом brpl Iwe rjmp gii /уровень АЦП достигнут ;Проверка на 4,8 В Iwe: nop clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rl3 mov Zh, rl4 subi Zl, $03 /Вычитание старшего байта 4,8 В sbci Zh, $00 /Вычитание младшего байта 4,8 Вс заемом brpl kwe rjmp ggg /уровень АЦП достигнут ;Проверка на 4,7 В kwe: nop clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rl3 mov Zh, rl4 subi Zl, $02 /Вычитание старшего байта 4,7 В sbci Zh, $F0 /Вычитание младшего байта 4,7 В с заемом nop brpl hwe rjmp gkk /уровень АЦП достигнут ;Проверка на 4,6 В hwe: nop clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rl3 mov Zh, rl4 subi Zl, $02 /Вычитание старшего байта 4,6 В sbci Zh, $E0 /Вычитание младшего байта 4,6 В с заемом brpl fwe rjmp gll /уровень АЦП достигнут
Повышающий преобразователь 3 В - 5 В на микроконтроллере 113 Листинг 8.1. Продолжение ;Проверка на 4,5 В fwe: пор clc /сброс флага переноса cln ;сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rl3 mov Zh, rl4 subi Zl, $02 ;Вычитание старшего байта 4,5 В sbci Zh, $D0 /Вычитание младшего байта 4,5 В с заемом brpl dwe rjmp gmm /уровень АЦП достигнут nop ;Проверка на 4,4 В dwe: nop clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rl3 mov Zh, rl4 subi Zl, $02 /Вычитание старшего байта 4,4 В sbci Zh, $D0 /Вычитание младшего байта 4,4 В с заемом brpl awe rjmp gnn /уровень АЦП достигнут ;Проверка на 4,3 В awe: nop clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rl3 mov Zh, rl4 subi Zl, $02 /Вычитание старшего байта 4,3 В sbci Zh, $B0 /Вычитание младшего байта 4,3 В с заемом brpl twe rjmp goo /уровень АЦП достигнут ;Проверка на 4,2 В twe: nop clc /сброс флага переноса cln /сброс флага знака ;вычитание значения АЦП от набранного значения mov Zl, rl3 mov Zh, rl4 subi Zl, $02 /Вычитание старшего байта 4,2 В sbci Zh, $A0 /Вычитание младшего байта 4,2 В с заемом brpl uwe rjmp gpp уровень АЦП достигнут ;Проверка на 4,1 В
114 Глава 8 Листинг 8.1. Продолжение uwe: nop gaa: Idi tmp5, $56;очень низкий уровень rjmp RNWW nop Idi Axx, $00 gbb: Idi Ayy, $10 rjmp RNWW nop Idi Axx, $00 gcc: Idi Ayy, $0F rjmp RNWW nop Idi Axx, $00 gdd: Idi Ayy, $0E rjmp RNWW nop Idi Axx, $00 gee: Idi Ayy, $0D rjmp RNWW nop Idi Axx, $00 gff: Idi Ayy, $0C rjmp RNWW nop Idi Axx, $00 gj j : Idi Ayy, $0B rjmp RNWW nop Idi Axx, $00 ghh: Idi Ayy, $0A rjmp RNWW nop Idi Axx, $00 gii: Idi Ayy, $09 rjmp RNWW nop Idi Axx, $00 ggg: Idi Ayy, $08 rjmp RNWW nop Idi Axx, $00 gkk: Idi Ayy, $07 rjmp RNWW nop Idi Axx, $00 Idi Ayy, $06
Повышающий преобразователь 3 В - 5 В на микроконтроллере 115 Листинг 8.1. Продолжение rjmp RNWW gll: nop Idi Axx, $00 Idi Ayy, $05 rjmp RNWW gmm: nop Idi Axx, $00 Idi Ayy, $04 rjmp RNWW gnn: nop Idi Axx, $00 Idi Ayy, $03 rjmp RNWW goo: nop Idi Axx, $00 Idi Ayy, $02 rjmp RNWW gpp: nop Idi Axx, $00 Idi Ayy, $01 nop RNWW: nop ret •★★★★★★★★★★★★★★★★★★★★★★★ / ;Подпрограммы обработки ;Получение 0,1632 С tiO: nop clr tmp Idi tmp, $6A out TCNT0, tmp clr tmp clr tmplO er: nop inc tmplO clr tmp4 Idi tmp, $05 out TCCR0, tmp ve: nop Idi tmp, $FA wdr cp tmp, Unag brge retr rjmp ve nop retr: nop ★★★★★★★★★★★★★★★★★★★★★★★★ паузы. ;корректировка времени таймера ТО ;запуск ТО, максимальное деление ;СК/1024
116 Глава 8 Листинг 8.1. Окончание cpi tmplO, $03 brlt er clr tmp out TCCRO, tmp ret f ;Подпрограмма обработки TIME_o: nop clr Unag Idi Unag, $FA reti . **********************9 ;останов прерывания таймера TO ★***★***★★★★★* [ от таймера TO ******★★*-*• ; Таблица констант АЦП1 .ORG $1CA S18: .db $31, $32, $34, $35, $36, $37, $38, $3 9 ; .db $3A, $3C, $3D, $3E, $40, $43, $44, $4 6 ; S2 : .db $36, $38, $3A, $3B, $3C, $3D, $3E, $40 ; .db $41, $42, $44, $45, $47, $4A, $4C, $4E ; S25: .db $43, $46, $48, $4A, $4B, $4C, $4E, $50 ; .db $51, $53, $55, $56, $58, $5C, $5F, $63 ; S28: .db $4B, $4E, $51, $52, $54, $56, $57, $59 ; .db $5B, *" $5F, $61, $63, $68, $6A, $6D ; S3: .db $51, $54, $57, $58, $5A, $5C, $5E, $5F ; .db $61, $63, $65, $68, .EXIT $6A, $6F, $72, $7 4 ; Листинг 8.2. Шестнадцатеричный код программы управления повышающим преобразователем :020000020000FC :1000000013С00000000000000000В4С100000000А8 :1000280000009927AA27BB27CC2790E09DBFA7EOOF :10003800A7BBB2E0B9BFC9E6C0BF0000CC27AA245D :1000480099270Q00892D895600000AF00FC09927CA :10005800000020E038E013E000001A953AF02FDOB5
Повышающий преобразователь 3 В - 5 В на микроконтроллере 117 Листинг 8.2. Продолжение : 1000680006350000D1F000000FD0F6CF0000992728 : 1000780089E6982E04C00000000021D0000000008E : 100088007BD0000001D0F8CF00000000C9E6C0BF57 :10009800B42DBDBD82E089BF0895000068B374E047 :1000А800762В78BB4BD10BD00635B9F365D0063724 :1000B800A1F3C8B3772771E07C2BB8BBDDCF000074 :1000C800DD2799270027812E1127F894D3E8D7B97F :1000D80098EC96B904B115B1C02EB12E8894A894A5 :1000E800EB2DFC2DE150F04EEAF08894A894EB2D0E : 1000F800FC2DE150F04CF2F08894A894EB2DFC2DE7 :10010800E150F049FAF08894A894EB2DFC2DE150C9 : 10011800F04402F18894A894EB2DFC2DE150F042B4 : 100128000AF106E50000E4EDF3E0E30FF21FC895DD :10013800402C1FC00000E4ECF3E0E30FF21FC89569 :10014800402C17C00000E4EBF3E0E30FF21FC89562 :10015800402C0FC00000E4EAF3E0E30FF21FC8955B : 10016800402C07C00000E4E9F3E0E30FF21FC89554 :10017800402C0000182D08950000DD279927F894D9 : 10018800D3E8D7B998EC96B924B135B1D22EE32E7D : 100198008894A894ED2DFE2DE350F04B0AF48CC002 :1001A80000008894A894ED2DFE2DE350F0490AF440 :1001B80087C000008894A894ED2DFE2DE350F047E9 : 1001C8000AF4 82C000008894A894ED2DFE2DE35017 :1001D800F0460AF47DC000008894A894ED2DFE2D09 : 1001E800E350F0450AF478C00000889’4A894ED2DF7 : 1001F800FE2DE350F0440AF473C0000088 94A894DC :10020800ED2DFE2DE350F0430AF46EC000008894F3 :10021800A894ED2DFE2DE350F0420AF469C00000C9 :100228008894A894ED2DFE2DE350F0410AF464C0A3 :1002380000008894A894ED2DFE2DE350F0400AF4B8 : 100248005FC000008894A894ED2DFE2DE250F04F7 9 :1002580000000AF459C000008894A894ED2DFE2DE2 :10026800E250F04E0AF454C00Q008894A894ED2D92 :10027800FE2DE250F04D12F44FC0000000008894AB :10028800A894ED2DFE2DE250F04D0AF449C000006F : 100298008894A894ED2DFE2DE250F04B0AF4 44C04A :1002A80000008894A894ED2DFE2DE250F04A0AF43F :1002B8003FC0000006E540C0000020E030E13CC03F :1002C800000020E03FE038C0000020E03EE034C0FD :1002D800000020E03DE030C0000020E03CE02CC001 :1002Е800000020Е03ВЕ028С0000020Е03АЕ024С005 :1002F800000020E039E020C0000020E038E01CC009 :100308000000?0Е037Е018С0000020Е036Е014С00С :10031800000020Е035Е010С0000020Е034Е00СС010 :10032800000020Е033Е008С0000020Е032Е004С014 :10033800000020Е031Е00000000008950000992747
118 Глава 8 Листинг 8.2. Окончание :100348009AE692BF9927DD270000D395CC2795E040 :1003580093BF00009AEFA895971714F4FACF0000FE :100368000000D3308CF3992793BF089500007727B6 :040378007AEF18956B :10039400313234353637 38393A3C3D3E4 3 434 4 46В1 :1003A40036383A3B3C3D3E4041424445474A4C4E38 :1003В4004346484A4B4C4E5051535556585C5F6126 :1003C4004B4E5152545657595B5D5F6163686A6D79 :1003D400515457585A5C5E5F616365686A6F727402 :00000001FF____________________________________________________ В основе программы заложено использование таймера Т1 совместно с альтернативной функцией OClA-вывода порта РВ1. В режиме ШИМ состояние счетного регистра TCNT1 изменяется от 0 до установленного значения в регистре сравнения OCR1B. При совпадении данных счет- ный регистр TCNT1 сбрасывается в 0. Цикл счета регистра TCNT1 по- вторяется, но при совпадении значения счетного регистра TCNT1 и ре- гистра сравнения OCR1A напряжение на выводе РВ1 изменяется на противоположное до момента совпадения данных TCNT1 и OCR1B. В момент совпадения напряжение на выводе РВ1 изменяется на проти- воположное. Таким образом, содержимое регистра OCR1A определяет скважность ШИМ-сигнала (с максимальным углом заполнения единич- ного состояния от 0,1 до 0,5), а содержимое регистра OCR1B — его час- тоту. Если угол заполнения более 0,5 и менее 0,7 (согласно таблице Рас- чет параметров повышающего преобразователя.xls, угол запол- нения 0,7 является критическим), таймер Т1 переключается на режим инвертирования. В результате таймер Т1 отрабатывает угол заполнения нулевого состояния от 0,3 до 0,5. После настройки таймеров программа выполняет алгоритм провер- ки входного напряжения питания с помощью встроенного АЦП. Для микроконтроллера Tiny 15 во время преобразования АЦП необходимо отработать непрерывно 25 тактов с запретом на прерывание (в пред- ставленной программе этот запрет исключен). В реальном времени вы- полняется подпрограмма обработки преобразования АЦП. Поскольку для получения достоверной информации от источника и от нагрузки не- обходимо два преобразования АЦП, то один раз за восемь тактов преоб- разователя выполняется также проверка напряжения источника пита- ния. Проверка осуществляется и в случае аварии в нагрузке. Начальный запуск и выход преобразователя на необходимое напря- жение стабилизации реализованы с помощью начальной подпрограммы.
Повышающий преобразователь 3 В - 5 В на микроконтроллере 119 При этом проверка АЦП выходного напряжения на нагрузке не проис- ходит — преобразователь выполняет задачу с фиксированным мини- мальным значением заполнения ШИМ. Далее, после нескольких тактов преобразователя с помощью АЦП проверяется напряжение на нагрузке. По результатам проверки включается зеленый светодиод и устанавлива- ется угол заполнения ШИМ, исходя из табличных значений. Во время стабилизации напряжения на нагрузке, один раз за восемь циклов рабо- ты преобразователя проверяется выходное напряжение. По результатам проверки с помощью таблицы формируется угол открытия транзистора ШИМ. При большем напряжении нагрузки угол ШИМ уменьшается, при меньшем — увеличивается. На нагрузку подается постоянное напряжение с заметной пульсаци- ей (см. рис. 8.2). Пульсация напряжения обусловлена работой АЦП, при которой невозможно изменять угол регулирования ШИМ. Этот недоста- ток можно компенсировать, установив линейный стабилизатор на выхо- де или дополнительный дроссель. В случае большой пульсации напряжения на нагрузке ниже или выше 50% от нормы преобразователь прекращает ШИМ, программа пе- реходит в подпрограмму Error, загорается красный светодиод. Подпро- грамма Error обнуляет вывод управления микроконтроллера РВ1 тран- зистором преобразователя и включает таймер ТО на отсчет времени 0,16 с. Если за это время условия нагрузки изменились, микроконтрол- лер формирует одиночный импульс. По результатам проверки выходно- го напряжения с помощью АЦП запускается начальная подпрограмма, и весь цикл запуска и стабилизации повторяется заново, или, если на- пряжение на нагрузке равно нулю, запускается подпрограмма Error. В рассмотренной программе алгоритм проверки и аварийной оста- новки имеет упрощенную версию, поскольку основан на простой форме реализации. Но даже простой алгоритм предотвращает выход из строя элементов схемы. Плата Монтажная схема платы представлена на рис. 8.6, а схема развод- ки с двух сторон — на рис. 8.7. Плата изготавливается из двухсторонне- го текстолита или на макетной плате (см. рис. 8.3). Существует два ва- рианта изготовления печатной платы: • по габаритам стандартного батарейного отсека размерами 56x32 мм (батарейный отсек крепится на задней стороне платы); • батарейный отсек и колодка предохранителя крепятся непосредст- венно на монтажную плату (как на рис. 8.6).
120 Глава 8 Рис. 8.6. Монтажная схема платы управления повышающим преобразователем Все элементы преобразователя, а также батарейный отсек 1 нахо- дятся на монтажной плате. Индуктивность наматывается на изолиро- ванном ферритовом стержне (рис. 8.8). Количество витков соответству- ет расчетным значениям из таблицы Расчет параметров повышающе- го преобразователя. xls. Автор выполнил расчеты для разных раз- меров ферритового сердечника 600НН с магнитной индукцией 0,31 Тл, индуктивность дросселя 376 мкГн. Для ферритового стержня диаметром 4 мм и длиной 4 см необходимо намотать 118 витков проводом ПЭЛ- 0,01. После намотки витков их следует зафиксировать на концах. Нама- тывается провод на изолированную основу от ферритового стержня. В качестве изолятора хорошо подходит тефлоновая лента (применяется в сантехнике). Если во время эксплуатации функция контроля источника не нужна, можно отказаться от батареи 1 или не вставлять батарейку в отсек. Вы- ключатель источника питания можно сделать выносным. В качестве ба-
Повышающий преобразователь 3 В - 5 В на микроконтроллере 121 тарей иногда используют аккумуляторы. При этом время эксплуатации увеличивается более чем в два раза. Нагрузка подключается через про- вода к разъему SL1. Поскольку питание — полярное, то лучше исполь- зовать разноцветные провода. Рис. 8.7. Схема разводки платы управления повышающим преобразователем
122 Глава 8 Рис. 8.8. Намотка провода на ферритовый сердечник Настройка В качестве источника тока можно использовать элемент CR2032 [15] для батарейного отсека 1 и элемент А А или LR6 [14] для батарей- ного отсека 2. Время непрерывной работы преобразователя на полно- стью заряженных батареях составляет около 2,5 часов. Технология на- стройки преобразователя выполняется по европейским нормам. Большинство радиолюбительских схем при повторении аматерами терпят неудачу. Анализ этих неудач показывает, что причиной является невнимательная сборка устройств, недостаточная точность настройки, отсутствие поэтапной проверки, отсутствие измерительных средств. Ав- тор предлагает поэтапную проверку преобразователя. 1. Внимательно проследить все соединения с контроллером. 2. Записать в микроконтроллер тестовую программу для проверки правильности монтажа. ©Ей на прилагаемом к книге компакт-диске соответствует программа S_testl из папки Программы\08 - Повышающий преобразователь. 3. Включить питание на плату без микросхемы микроконтроллера и проверить напряжение питания на выводах 4-8 микроконтролле- ра. 4. При включенной плате без микроконтроллера закоротить поочеред- но выводы 4-5 и 4-7 панельки микроконтроллера. Должны засве- титься поочередно зеленый и красный светодиоды. 5. После записи тестовой программы вставить микроконтроллер в па- нельку и включить преобразователь с нагрузкой в 10 кОм. Должны поочередно включаться зеленый и красный светодиоды, а транзи-
Повышающий преобразователь 3 В - 5 В на микроконтроллере 123 стор преобразователя — работать в прерывистом режиме генерации с частотой 40 кГц. 6. После прохождения теста можно перезаписать в микроконтроллер программу рабочую преобразователя (см. листинг. 8.1) и включить устройство с нормальной нагрузкой. 7. Проверка стабилизируемого напряжения на разных значениях на- грузки. Если напряжение не соответствует установленному значе- нию, то изменяют коэффициент угла открытия транзистора. Для этого в таблице Расчет параметров повышающего преобразо- вателя . xls (зеленый лист Коррекция) указаны значения напряже- ния на нагрузке и, соответственно, — данные угла ШИМ в виде НЕХ-кода. Если измеренные значения напряжения ниже заданного, то необходимо изменить НЕХ-код: для увеличения напряжения его уменьшают, а для уменьшения напряжения — увеличивают. 8. Повторное программирование микроконтроллера с новыми значе- ниями НЕХ-кода. Эту операцию выполняют для всего диапазона изменения нагрузки, после чего поправочные коэффициенты запи- сывают в память программ микроконтроллера. Проверку параметров преобразователя необходимо выполнить не- сколько раз: Вывод Таблица Расчет параметров повышающего преобразователя, xls составлена для проверки параметров преобразователя на различных частотах и при разном йоведении источника и нагрузки. В инженерных расчетах использованы известные методики. Автор пришел к выводу, что наиболее оптимальная частота преобразователя — 40 кГц при так- товой частоте микроконтроллера Tiny 15 в 1,6 МГц. Если использовать микроконтроллер с более высокой тактовой частотой, то можно достичь частоты преобразователя 100 кГц при условии программирования на языке ассемблера.
Глава 9 Шаговый двигатель для транспортера В практике инженера часто встречаются исполнительные устройст- ва на шаговых двигателях (ШД). Принтеры, факсы, станки с ЧПУ, сти- ральные машины, дисководы, видеоплееры — вот далеко не полный пе- речень устройств, использующих ШД. Одно из применений в учебных целях — это радиолюбительские модели, исполнительные узлы робо- тов, привод редукторов точного поворота антенн... Для ознакомления и практического применения автор разработал макет устройства с ШД SS12 для ленточного транспортера. Устройство можно также применить в качестве привода в станках для точного сверления и калибровки от- верстий небольшого диаметра, в транспортерных линиях и т.п. Применение шаговых двигателей очень широко представлено в промышленности, например, в проявочных (рис. 9.1) и упаковочных машинах (рис. 9.2). Изучение простейших свойств ШД формирует пред- ставление о физических принципах работы электромагнитных двигате- лей. Рис. 9.1. Проявочная машина с шаговым двигателем Используя современную электронику, автор собрал устройство на четырех микросхемах и шаговом двигателе от старого принтера (рис. 9.3).
Шаговый двигатель для транспортера 125 Рис. 9.2. Упаковочная машина с шаговым двигателем Рис. 9.3. Устройство с шаговым двигателем, разработанное автором Рассмотрим структуру устройства. АЦП, который тактируется от задающего генератора, снимает напряжение с регулятора R. Это напря- жение преобразуется в шестнадцатеричный код (10-разрядный АЦП встроенный в микроконтроллер). Полученные данные преобразуются для достижения целей поставленной задачи. Далее программа задает код работы порта А в зависимости от внешних управляющих сигналов. Этот код отрабатывает драйвер, который возбуждает обмотки ШД. В данном устройстве все функции контроля выполняет микрокон- троллер ATtiny26 семейства AVR от компании фирмы Atmel [3, 16] (рис. 9.4).
126 Глава 9 Рис. 9.4. Структура микроконтроллера ATtiny26 Драйвер и исполнительные элементы состоят из микросхем L6506 [18] и L298 [17]. Совместное использование этих микросхем дает хоро- ший результат, как по управлению, так и по защите по току в случае пе- регрузки. Если попробовать собрать подобное устройство на дискрет- ных элементах, то потребуется на порядок больше микросхем. Конструкцию предлагаемого к рассмотрению устройства следует воспринимать как учебное пособие (рис. 9.5). Она включает в себя пла-
Шаговый двигатель для транспортера 127 ту управления и шаговый двигатель, подключенный к плате через разъ- ем. Благодаря такому решению, шаговый двигатель можно вмонтиро- вать в любой механический узел или в транспортерное оборудование. Шаговый Рис. 9.5. Конструкция рассматриваемого устройства На плате реализованы следующие функции: • управление направлением вращения ШД с помощью переключения тумблером; • пошаговый режим; • режим вращения с помощью кнопки; • управление скоростью вращения вала ШД роликом потенциометра; • управление режимом “стоп-старт” еще одной кнопкой. К плате можно подсоединить разъем ISP для перепрограммирова- ния микроконтроллера. Плата питается от нестабилизированного источ- ника 6,5 В, обеспечивающего ток 700 мА. Подключение внешнего ис- точника осуществляется через разъем питания. Выбранные режимы на плате управления активизируют соответствующие светодиоды, что по- зволяет судить о правильности заданного режима. Скорость вращения ШД изменяется в пределах 1-1024 об/мин. Принципы работы шагового двигателя Существуют два основных типа шаговых двигателей, применяемых в практике: • с постоянным магнитом; • с переменным магнитным полем. Конструкция типичного биполярного шагового двигателя показана на рис. 9.6. Двигатели с постоянным магнитом бывают биполярными (рис. 9.7) и униполярными (рис. 9.8).
128 Глава 9 Рис. 9.6. Конструкция биполярного шагового двигателя Рис. 9.7. Схема биполярного двигателя Рис. 9.8. Схема униполярного двигателя Биполярные двигатели — наиболее простые для решения неслож- ных задач. Они состоят из постоянного магнита вращающегося ротора и окруженного полюсами статора, состоящего из четырех обмоток. Протекание тока в обмотках статора возбуждает ротор, и при последо- вательной коммутации обмоток происходит ступенчатое вращение. Для двигателя этого типа существует три метода возбуждения обмоток. • Возбуждение обмоток происходит в последовательности АВ/CD/ ВА/DC (ВА указывает на то, что обмотка АВ возбуждается в проти- воположном направлении). Эта последовательность известна под названием “одна фаза активна”, “полный шаг” или “привод волны”. В каждый момент возбуждается только одна из фаз (рис. 9.9).
Шаговый двигатель для транспортера 129 Рис. 9.9. Последовательность возбуждения обмоток “одна фаза активна” • Возбуждение одновременно обеих фаз, чтобы ротор выровнялся между двумя положениями полюса. Такой метод называется “две фазы активны”, “полный шаг”. Это состояние является следующей последовательностью привода биполярного двигателя и дает самый высокий вращающий момент (рис. 9.10). Рис. 9.10. Последовательность возбуждения обмоток “две фазы активны” • Возбуждение одной фазы, потом — двух, потом — одной и т.д., чтобы ротор двигался поэтапно, вращаясь в квадранте. Эта после- довательность известна как “ступенчатый метод половины”. Полу- волна имеет большой угол вращения за шаг двигателя, но слабый вращающий момент (рис. 9.11). Рис. 9.11. Последовательность возбуждения обмоток “ступенчатый метод половины”
130 Глава 9 Рис. 9.12. Схема униполярного двигателя с постоянным магнитом Для вращения в противоположном направлении (синхронизация прежняя) изменяется порядок возбуждения обмоток, на противополож- ный. Как показано на диаграммах, угол поворота ротора составляет 90°. Промышленные двигатели имеют больше полюсов и достигают угла поворота в несколько градусов, но число обмоток и последовательность привода остаются неизменными. Униполярный двигатель с посто- янным магнитом идентичен биполяр- ному за тем исключением, что у него в каждой фазе используются две об- мотки. Это необходимо для того, что- бы полностью изменить поток статора быстрее, чем в двунаправленном при- воде (рис. 9.12). Ротор выполняет тот же путь, что и у биполярного двигателя за тем ис- ключением, что мостовые драйверы заменены простыми униполярными каскадами: четыре транзистора Дар- лингтона, или счетверенные транзи- сторные матрицы Дарлингтона. Униполярные двигатели более дорогостоящие, поскольку у них — вдвое больше обмоток. Кроме того, их характеризует гораздо меньший вращающий момент при одинаковых габаритах, так как обмотки выпол- нены из более тонкого провода. Все двигатели с постоянным магнитом генерируют электромагнитные помехи ротором, который ограничивает скорость вращения. При очень высоких скоростях вращения необходим двигатель с переменным магнитным полем. Двигатель переменного магнитного поля оснащен ротором из нена- магниченного мягкого железа с меньшим количеством полюсов, чем статор (см. рис. 9.12). При этом используется униполярный метод воз- буждения пары полюсов статора, чтобы повернуть ротор к полюсам возбуждаемой обмотки ступенчато. Здесь также используют три раз- личных последовательности возбуждения фаз: • “одна фаза активна” — A/C/B/D; • “две фазы активны” — AC/CB/BD/DA; • “шаг-половина” — A/AC/C/BC/B/BD/D/DA. Заметьте, что угол поворота ротора составляет 15°, а не 45°. В про- шлом униполярные двигатели были более интересны для проектиров- щиков, поскольку имеют простой выходной каскад. Теперь, когда вы-
Шаговый двигатель для транспортера 131 пускаются монолитные драйверы напряжения, биполярные двигатели становятся более популярным. Для правильного генерирования импульса обмотки ШД необходим мостовой коммутатор тока обмотки. Такой коммутатор можно собрать на дискретных элементах. При этом габариты платы управления увели- чатся, а в некоторых случаях ухудшатся характеристики выходного кас- када. Автор использовал готовый, относительно дешевый драйвер управления биполярным ШД: микросхему L298, в которой реализованы два моста для полноценного управления ШД. Кроме того, драйвер (рис. 9.13) может коммутировать направления тока в подключаемых обмотках ШД в разных направлениях. Рис. 9.13. Схема драйвера управления биполярным шаговым двигателем По сигналу Еп А можно быстро размыкать ключи моста. Недостат- ком микросхемы является отсутствие диодов защиты ключей от обрат- ных токов, поэтому в практическом применении необходимо дополнять схему диодами. Для предотвращения перегрузки по току в схему введен датчик тока Rs. Если падение напряжения на этом резисторе выше нор- мы, то сработает схема защиты по току. Схема управления шаговым двигателем Схема управления шаговым двигателем представлена на рис. 9.14.
132 Глава 9 Рис. 9.14. Схема управления шаговым двигателем
Шаговый двигатель для транспортера 133 Питание схемы осуществляется от нестабилизированного источни- ка 6,5 В (ток потребления до 1 А). Для полноценной работы микрокон- троллера питание стабилизировано микросхемой IC3. При подаче пита- ния на схему устройства, микроконтроллер автоматически выбирает пошаговый режим. На драйвер ШД питание подается через диод D9 за- щиты от изменения полярности источника. О включении питания сиг- нализирует светодиод LED3. Микроконтроллер синхронизирован от кварцевого резонатора час- тотой 4 МГц. При нажатии кнопки S1 (“Старт/Стоп”) активизируется прерывание INTO, программа в микроконтроллере проверяет состояние порта РА. АЦП считывает уровень напряжения на регуляторе скорости R5 и направление вращения ШД на тумблере S3. Для правильного функционирования АЦП с учетом замечаний в книге [19] автор допол- нил схему элементами, влияющими на считывание данных. Питание АЦП, встроенного в микроконтроллер, осуществляется через фильтр высокочастотных помех L3, СИ, наводимых ядром микроконтроллера во время работы схемы. После обработки информации на выводы РАЗ-РА7 подаются им- пульсы соответствующей последовательности со скоростью, пропор- циональной уровню напряжения на R5. Элементы R5, R6, С9 — это своеобразный интегратор для регулируемого напряжения. В режиме реального времени проверяется состояние вывода РАО микроконтроллера. Если кнопка S2 длительно нажата (около 1-2 с), то микроконтроллер переводит программу в режим скорости вращения ШД. При повторном длительном нажатии происходит переход в поша- говый режим. Для управления направлением вращения существует трехходовой двухсекционный тумблер S3. Одна его секция включает светодиоды, показывающие направление вращения ШД, а вторая — коммутирует порт РА1 микроконтроллера. Логика управления ШД реализована в микроконтроллере Tiny26. Поскольку этот микроконтроллер не может коммутировать большие то- ки, применен драйвер L298. Между драйвером и микроконтроллер ус- тановлена микросхема А1, которая отслеживает токи обмоток ШД. Для контроля тока в обмотках ШД в драйвере IC2 присутствуют выводы 1 и 15 (SEN_A и SENJB). В случае заклинивания двигателя или короткого замыкания на Rl, R2 растет напряжение, и микросхема А1 прекращает подачу импульсов на драйвер IC2. В А1 встроены два компаратора и че- тыре схемы “И”.
134 Глава 9 На входы компараторов А1 (выводы 10 и 15) подается напряжение от датчиков тока двигателя Rl, R2 и опорное напряжение (выводы 16 и 17) от резистивного делителя R3, R4. Если напряжение на датчиках тока ниже опорного, то компараторы разрешают прохождение импуль- сов от микроконтроллера к драйверу IC2. Если напряжение на датчиках тока выше опорного, то импульсы не проходят через А1. Для питания драйвера ШД к IC2 от источника питания подключен D9, предотвращающий попадание помех от ШД во время работы к схе- ме управления. Эту же функцию выполняют демпфирующие диоды D1- D8. Обратный ток диодов во время коммутации обмоток сглаживает конденсатор С13. Программа Блок-схема алгоритма, управления драйвером шагового двигателя представлена на рис. 9.15. Программа на ассемблере представлена в листинге 9.1, а шестнадцатеричный код — в листинге 9.2. Согласно блок схеме, в начале программы выполняется установка состояния портов, а также указывается вектор прерывания, который имеет две ветви: • вектор RESET переходит при сбросе программы в начальное со- стояние; • вектор INTO активизируется при нажатии кнопки “START/STOP”. Активным уровнем INTO считается нулевое состояние на выводе РВ6 микроконтроллера. Активный уровень задается программой и во время сброса не активизируется. В случае активизации INTO вызывается подпрограмма обработки вектора прерывания, которая запрещает пре- рывание и проверяет длительность нажатия кнопки. Если кнопка нажата более 1 с, то режим работы схемы управления ШД изменяется на проти- воположный (если был режим “STOP”, то программируется режим “START” и наоборот). В режиме “STOP” порт А обнуляется, а в режиме “START” — активизируется. При выходе из подпрограммы обработки вектора прерывания разрешается общее прерывание. После прохождения начальной части программы запускается на преобразование АЦП. На первом этапе необходимо выполнить комму- тацию аналогового входа АЦП с помощью встроенного аналогового мультиплексора. Для этого в 0-2 разрядах регистра ADMUX устанавли- вается соответствующая комбинация нолей и единиц, а в 6 и 7 разрядах ADMUX выбирается источник опорного напряжения. При этом на вы- вод 17 микроконтроллера нельзя подавать никакого напряжения [19].
Шаговый двигатель для транспортера 135 Запуск преобразования АЦП Перекодировка данных Измерение времени нажатия кнопки Шаг Ожидание START Да Нет Нет Да корость ительн Да Режим шаг? Установка R22 Пропорционально Данным АЦП .....~т Импульс строба Пропорционально Данным АЦП Изменение Режима шаг/скорость На противоположный Импульс строба пропорционально нажатию кноки Да Влево Нет Увеличение R23 На шаг Считывание кода влево Шагового двигателя Увеличение R23 На шаг Считывание кода вправо Шагового двигателя Нет Обнуление Регистра R23 Шаг Больше 4 Рис. 9.15. Блок-схема алгоритма управления драйвером шагового двигателя
136 Глава 9 На втором этапе в регистре ADCSR с помощью разрядов 0-2 зада- ется тактовая частота АЦП путем деления тактовой частоты микрокон- троллера (тактовая частота АЦП обязательно должна находиться в пре- делах 50-200 кГц). Затем разрешается работа АЦП, выбирается режим его работы (в данном случае — одиночное преобразование) и активизи- руется преобразование, которое длится 25 тактов АЦП. В конце преоб- разования данные записываются в регистры данных АЦП ADCL и ADCH. Чтение регистров строго определено: сначала — ADCL, по- том — ADCH. Если не предпринимать мер подавления помех, то программа счи- тывания данных АЦП работает нестабильно из-за наводок и шумов от питающей сети. Для защиты входа АЦП применен малый фильтр L3, СИ по питанию аналоговой части микроконтроллера. Кроме того, дан- ные считываются четыре раза, суммируются и делятся на четыре путем сдвига вправо с переносом на два разряда. Результат среднего арифме- тического позволяет достоверно судить о считанном напряжении. После считывания данных разрешается прерывание и проверяется нажатие кнопки “Старт”. В это время программа находится в ожидании команды “Старт”. Когда команда “Старт” поступает, программа прове- ряет, нажата ли кнопка “Скорость/шаг”, и при соответствующем режиме разветвляется по одной из двух исполнительных ветвей. В режиме “Скорость” светодиод LED4 гаснет, а в режиме “Шаг” — засвечивается. Для определения режима “Шаг/Скорость” необходима подпрограмма измерения длительности нажатия кнопки. После измере- ния происходит разветвление программы. Первая ветвь соответствует режиму “Скорость”, в котором задается скорость, пропорциональная напряжению, полученному с АЦП. Вторая ветвь соответствует режиму “Шаг”. При этом программа ожидает короткое (менее 0,5 с) нажатие кнопки “Шаг”. По мере выполнения операций программа проверяет, в каком на- правлении задан режим вращения ШД. По соответствующему коду со- стояния ШД задается код перехода влево или вправо (против часовой стрелки или по часовой стрелке). Начальное положение ШД неопреде- ленно, поэтому порты ввода-вывода обнуляются, и алгоритм вращения ШД повторяется сначала. После отработки выбранного шага программа начинает заново опрос режимов работы ШД. Если все режимы заданы, то программа автоматически продолжает выполнение команд, если же нет — переходит в режим ожидания. Цикл повторяется бесконечно. Для правильной коммутации фаз автор разработал таблицу коди- ровки фаз (табл. 9.1). В случае применения униполярных двигателей
Шаговый двигатель для транспортера 137 или полного режима “шаг, половина, шаг” можно изменить таблицу и дополнить код. Таблица 9.1. Таблица кодировки фаз ШАГ PA7 PA6 PA5 PA4 COD Примечание 1 1 0 0 0 8 шаг 2 1 0 Г 0 A половина 3 0 0 1 0 2 шаг 4 0 1 1 0 6 половина 5 0 1 0 0 4 шаг 6 0 1 0 1 5 половина 7 0 0 0 1 1 шаг 8 1 0 0 1 9 половина Программа активно использует стек, поскольку микроконтроллер ATtiny26 имеет в своем составе 254 ячейки ОЗУ. Это позволяет более рационально использовать память программ и повышает гибкость при написании алгоритма. е Проектные файлы AVR Studio 4 для программы управления шаговым двигате- лем можно найти на прилагаемом к книге компакт-диске в папке Программы\ 09 - Шаговый двигатель. Листинг 9.1. Ассемблерная программа управления шаговым двигателем .include "C:\Program Files\Atmel\AVR Tools\AVRStudio4\Appnotes\tn26def.inc" . def start . def kay = rll . def lef = rl2 . def for = rl3 . def tmp = Г16 . def tmp2 = rl7 . def tmp3 = rl8 . def tempo = rl9 . def speed = r20 . def pur = r21 . def par = r22 . def n = r24 . def X = r25 . def m = rl5 . def adr = rO . def step = r23 . def prg2 = rl4 rlO
138 Глава 9 Листинг . cseg . org 0 rjmp RESET rjmp EXT—INT0 /прерывание IRQO nop /rjmp EXT—PIN прерывание PIN nop /rjmp Т1МЕ1_СМР1А прерывание от таймера 1А nop /rjmp Т1МЕ1_СМР1В прерывание от таймера 1В nop /rjmp TIME1_OVFO прерывание от таймера 1 перепол nop /rjmp TIMEO_OVFO прерывание от таймера 0 перепол nop /rjmp USI_STRT прерывание от приемо-перед старт nop /rjmp USI—OVF прерывание от приемо-перед перепол nop /rjmp EE_RDY прерывание от EEPROM готов nop /rjmp ANA—COMP прерывание от аналог компарат nop /rjmp ADC прерывание от АЦП .org 20 ;настройка порта В RESET: пор clr tmp Idi tmp, R^MEND /константа верхней ячейки ОЗУ out SP, tmp /резервирование стека в ОЗУ clr tmp out DDRA, tmp out PORTA, tmp /обнулить порт В out DDRB, tmp out PORTB, tmp /обнулить порт В clr tmp Idi tmp, $F0 /PA4-PA7-выходы out DDRA, tmp clr tmp Idi tmp, $09 /РВ0,РВЗ -выходы out DDRB, tmp ;общее разрешение прерывания Idi tmp, $ 8 0 out SREG, tmp ; sei /Маска прерывания INTO Idi tmp, $40 /прерывание INTO out GIMSK, tmp Idi tmp, $00 /режим энергопотребления /Idle, условие прерывания по НИЗКОМУ уровню на INTO out MCUCR, tmp /Начало программы /сброс всех значений clr tmp 2
Лаповый двигатель для транспортера 139 clr tmp3 clr pur clr prg2 clr adr clr start nStart: nop nop ;начало цикла программы rcall nop adcn ;чтение данных АЦП push tmp ci: nop ;проверка режима старт mov tmp, start cpi tmp, $АА /если равно АА то старт brne nop ci POP nop tmp ;измерение времени Шаг rcall nop STEP ;проверка шаг-скорость /условие режима Шаг-Скорость push tmp nop ;проверка режима скорость mov tmp, speed cpi tmp, $99 ;если равно 99 то скорость brne nop spd Pop nop tmp rjmp nop spd: nop das rcall nop das: nop zader /задержка по времени rcall nop left /влево? rcall nop opros /таблица состояний ШД rcall nop strob /генерация импульса строба rcall nop for /4 шага? rjmp nStart ;Настройка АЦП
140 Глава 9 йй1Н1в111ЯВиЖЖ^ adcn: nop nop clr tmp awe: nop cpi tmp, $ 0 4 brsh ass clr tmp3 Idi tmp3, $C2 ;внутренний источник Uon, конденсатор на РАЗ /вход ADC2, ADLAR=0 - выравнивание по правой стороне out ADMUX, tmp3 ;коммутация входов АЦП clr tmp 2 clr tmp3 Idi tmp2, $C4 ;одиночное, запуск, 1/16 out ADCSR, tmp2 /запуск АЦП на преобразование ;Сохранение данных АЦП in tmp2, ADCL in tmp3, ADCH mov r2 f tmp2 mov r3, tmp3 mov r4, r2 mov r5, r3 mov r6, r4 mov r7 f r5 inc tmp rjmp awe /среднее арифметическое действие ass: nop clr r8 clc add tmp2, r2 adc r9, r8 add tmp2, r4 adc r9, r8 add tmp2, r6 adc r9, r8 clc Isr r9 ror tmp 2 Isr r9 ror tmp 2 clr r9 clc add tmp3, r3 adc r9, r8
Шаговый двигатель для транспортера 141 и/ 4 J/V \ г" ’ А >>' к " add tmp3, r5 adc r9, г8 add tmp3, г 7 adc r9, г8 clc Isr r9 ror tmp3 Isr r9 ror tmp3 nop ret /Подпрограмма задержки включения zader: nop wdr clr M clr pur Idi pur, $78 cpi tmp3, $00 brne goo Idi tempo, $01 add tempo, tmp3 nop goo: nop mov tempo, tmp3 dm: nop cpi tmp2, $00 brne goq Idi X, $01 add X, tmp2 nop goq: nop mov X, tmp2 dv: nop wdr nop dx: dec pur brpl dx cln dec X brpl dv cln dec tempo brne dm ret /Подпрограмма измерения времени 3 байта O.m.n.x.
142 Глава 9 Листинг 9;1-..П|».одслйсеийе '•= izmer nop clr X clr m clr n clr tmp3 clc dml: nop clc dvl : nop wdr nop clc dxx : nop inc X nop clc dd: nop inc tmp3 brbc 0, dd clr tmp3 brbc 0, dxx clc nop clr X nak: nop nop sbis PORTB, 6 rjmp vak sbis PORTB, 6 rjmp vak sbis PORTB, 6 rjmp vak vak: nop sbic PORTB, 6 rjmp nak sbic PORTB, 6 rjmp nak sbic PORTB, 6 rjmp nak clc inc n brbc 0, dvl clr n clc adiw r30, $01 inc m
Шаговый двигатель для транспортера 143 Листинг 9.1. Продолжение brbc 0, dml ret /Подпрограмма опроса состояний ШД opros: nop cpi par, $0B breq prn2 Idi ZH, high(2*progl) Idi ZL, Low(2*progl) Add ZL, par LPM mov prg2, adr out PORTB, prg2 inc par rjmp got prn2: nop clr par clr pur clr adr clr prg2 got: nop ret /подпрограмма проверки шаг-скорость STEP: nop kay: nop nop nakc: nop nop sbis PORTA, 0 rjmp nakc sbis PORTA, 0 rjmp nakc sbis PORTA, 0 rjmp nakc sbis PORTA, 0 rjmp nakc sbis PORTA, 0 rjmp nakc nop nop Idi speed, $99 nop ret /Подпрограмма определения влево, вправо
144 Гпава 9 Листинг 9.1; Пр9ДО1»кенИ9 -. i"? •?•:• :.;>aa?.'A WW>6’$ left: nop nop clr tempo wer: nop inc tempo clz cpi tempo, $04 breq right sbis PORTA, 1 rjmp wer sbis PORTA, 1 rjmp wer sbis PORTA, 1 rjmp wer sbis PORTA, 1 rjmp wer sbis PORTA, 1 rjmp wer nop push tmp Idi tmp, $DD /влево mov lef, tmp POP tmp rjmp fg right: nop push tmp Idi tmp, $4 4 /вправо mov lef, tmp pop tmp fg: nop ret /подпрограмма опроса 4 шага? for: nop push tmp / запомним tmp mov tmp, for /запишем for inc tmp clz cpi tmp, $05 /проверяем 4 шага? breq rav /Да 4 шага nop rjmp nrav rav: nop clr tmp mov step, tmp /сбрасываем R23 nrav: nop
Шаговый двигатель для транспортера Листинг 9.1. Продолжение mov for, tmp Pop tmp /восстанавливаем tmp ret /подпрограмма формирования импульса строба strob: nop sbi PORTB, 0 /установить имульс строба rcall zader /подпрограмма длительности строба cbi PORTB, 0 /снять импульс строба nop ret .•подпрограмма обработки режима старт-стоп EXT INTO: nop push tmp2 ;сохранение tmp2 in tmp2, SREG /сохранение состояния SREG cli nop ;сохранение переменных push m push п push X push tmp3 /подпрограмма измерения времени нажатия call izmer /восстановление переменных Pop tmp3 Pop m Pop n Pop X /проверка измеренного значения cpi r31, $D3 brsh hsd rjmp rt hsd: nop cpi r30, $45 brlt rt /сравнение с предыдущим значением push speed mov speed, start cpi speed, $AA brne fag Idi speed, $AA /режим старт mov start, speed nop rjmp rt fag: nop
146 Глава 9 Листинг 9.1- Окончание Idi mov nop speed, $22 start, speed ;режим стоп rt: nop nop POP out pop sei reti speed SREG, tmp2 tmp 2 /восстановление SREG /восстановление tmp2 ;Код . org progl . DB движения по часовой $200 $08, $0A, $02, $06, стрелке $04, $05, $01, $09 ; Код . org prog2 .DB движения против часовой стрелке $220 $09, $01, $05, $04, $06, $02, $0А, $08 .EXIT Листинг 9.2. Шестнадцатеричный код программы управления шаговым двигателем # :020000020000FC :1000000013С031С10000000000000000000000002В :080010000000000000000000Е8 :10002800000000270FED0DBF00270ABB0BBB07BB65 :1000380008BB002700EF0ABB002709E007BB00E860 :100048000FBF00E40BBF00E005BF1127222755278В :10005800EE240024AA240000000022D000000F9300 :1000680000000A2D0A3AE1F700000F910000AED017 : 1000780000000F93000004 2F09392 9F4 00000F91A4 :10008800000004C0000000003FD000000000B2D013 :1000980000008AD00000DDD00000CBD00000DBCF0C :1000A8000000000000270000043088F4222722EC1A :1000В80027В91127222714ЕС16В914В125В1212Е1Е :1000C800322E422C532C642C752C0395ECCF000057 :1000D80088248894120D981C140D981C160D981CD1 :1000Е8008894969417959694179599248894230D37 :1000F800981C250D981C270D981C88949694279574 :1001080096942795000008950000A895FF24552788 :1001180058E7203019F431E0320F00000000322F88 : 100128000000103019F491E0 910F00000000 912FA9
Шаговый двигатель для транспортера 147 Листинг 9.2. Окончание [ :100138000000A89500005A95F2F7A8949A95C2F77E ! :10014800А8943A9569F7089500009927FF2488270D \ :1001580022278894000088940000A89500008894BD j :10016800000093950000889400002395E8F7222763 :10017800B8F788940000992700000000С69В04С0С7 :10018800C69B02C0C69B00C00000C699F5CFC699A1 :10019800F3CFC699F1CF88948395F0F68827889491 :1001A8003196F394B8F6089500006B3041F0F4E00E :1001B800E0E0E60FC895E02CE8BA639505C00000BA j :1001С800662755270024ЕЕ2400000895000000004В \ :1001D800000000000000D89BFCCFD89BFACFD89B2A :1001E800F8CFD89BF6CFD89BF4CF0000000049Е9А0 ! :1001F80000000895000000003327 000033959894ОС i :10020800343081F0D99BF9CFD99BF7CFD99BF5CF63 :10021800D99BF3CFD99BF1CF00000F930DEDC02EE2 : 100228000F9105C000000F9304E4C02E0F91000049 :10023800089500000F930D2D03959894053011F043 : 10024800000003C000000027 7 02F0000D02E0F917F \ :1002580008950000C09A58DFC09800000895000073 j :100268001F931FB7F8940000FF928F939F932F93CB I :100278000E94A8002F91FF908F919F91F33D08F461 \ :100288000FC00000E53464F04F934A2D4A3A21F438 J :100298004АЕАА42Е000004С0000042Е2А42Е000096 j :0E02A800000000004F911FBF1F917894189521 ! :08040000080А020604050109С7 \ :080440000901050406020А0887 | :00000001FF Плата Монтажная схема платы представлена на рис. 9.16, а схема развод- ки— на рис. 9.17. Макет платы для проверки параметров и возможно- стей ШД, а так же для изучения работы ШД в разных режимах показан на рис. 9.18. Все элементы управления размещены на плате. Выключа- тель питания находится в блоке питания. Направление вращения двига- теля задается трехходовым тумблером, а скорость вращения — с помо- щью переменного сопротивления (небольших габаритов с колпачком для ручной регулировки). Режимы “Старт/Стоп” и “Шаг/Скорость” за- дается однократным (менее 2 с) нажатием соответствующей кнопки (для быстрой ориентации кнопки имеют разный цвет колпачков). Плата оснащена ножками для крепления в любом корпусе. В слу- чае, если мощность двигателя велика (более 5 Вт), для микросхемы драйвера L298 необходим радиатор общей площадью 1000 мм2.
148 Глава 9 Рис. 9.16. Монтажная схема платы управления шаговым двигателем Для демонстрации была разработана монтажная плата из текстолита с двухсторонней разводкой. Автор собрал устройство на макетной плате путем навесного монтажа. Дроссель L3 — 10-100 мкГн (фильтрующий элемент) с током не менее 20 мА. Светодиоды — любого цвета свечения с током не более 8 мА. Кнопки SI, S2 — любые, контактного типа.
Шаговый двигатель для транспортера 149 Тумблер S3 — любой двухходовой (автор применил трехходовой на ток 3 А) на ток в схеме не более 20 мА. Диоды — любые кремниевый на об- ратное напряжение не менее 30 В и прямой ток не менее 1 А. Все мик- росхемы (кроме драйвера L298) установлены на панельках для опера- тивной замены. Рис. 9.17. Схемы разводки платы управления шаговым двигателем Настройка Для быстрого программирования на плате присутствует разъем ISP. Программу с компьютера через программатор можно оперативно внести в микроконтроллер. Это позволяет на базе одной схемы смоделировать различные устройства, по своим назначениям и функциям отличающие- ся от рассмотренного примера. Для предотвращения неправильного пи- тания от программатора к разъему SV1 подключен D10.
150 Глава 9 Рис. 9.18. Макет платы управления шаговым двигателем Функции тумблера S3 можно расширить, изменив программу. Диа- пазон скорости вращения вала ШД также задается константами в про- грамме. В начале настройки питание схемы подается на плату без мик- росхем микроконтроллера Tiny26 и L6506, а разъем ШД отсоединен. Если все исправно, то устанавливается L6506 и проверяются уровни на- пряжения на Rl, R2 и R4 (соответственно 0 В, 0 В и 0,54 В), после чего устанавливается микроконтроллер. При включении проверяются импульсы управления на разъеме ШД. В случае соответствия импульсов от микроконтроллера осциллограм- мам к плате подключается разъем ШД. Далее при подключении ШД и выборе режима “Скорость” необходимо настроить защиту по току. Для этого, устанавливая режим “Скорость” и “Старт”, необходимо уменьшить сопротивление R3 с 82 кОм до 62 кОм. Когда вал ШД нор- мально вращается во всем диапазоне регулировки оборотов двигателя, дальнейшая настройка защиты по току не нужна. Если необходимо для эксперимента увеличить диапазон регулировки оборотов двигателя, то можно уменьшить сопротивление R13 с 47 кОм до 4,7 кОм. В случае, когда микроконтроллер плохо реагирует на кнопку “Старт”, необходимо увеличить номинал резистора R12 с 10 кОм до 100 кОм. В дальнейших разработках устройства можно отказаться от приме- нения микросхемы А1 при условии полной уверенности в отсутствии перегрузок обмоток ШД. При этом элементы R1-R4 и А1 не нужны, а выводы 11, 12, 13 и 14 микроконтроллера IC1 подключаются соответ- ственно к выводам 5, 7, 10 и 12 драйвера IC2.
Глава 10 Г ------- L Бытовой цифровой термометр Термометры комнатные или уличные, автомобильные или офисные используются в быту каждый день. В наши дни цифровая техника вы- тесняет спиртовые, пружинные и ртутные термометры. Погрешность показаний и срок эксплуатации современных цифровых термометров зависит от назначения прибора и от их производителя. Основная часть цифровых термометров производится на специализированных жидкок- ристаллических дисплеях, недоступных радиолюбителю. Автор собрал термометр из доступных импортных и отечественных деталей. Пред- ставленное устройство имеет универсальное бытовое применение как на улице, так и в помещении. В перспективе, если реализовать питание прибора от солнечных батарей совместно с аккумуляторами, эксплуата- ция термометра на улице будет достаточно длительной. Термометр собран на основе микроконтроллера Tiny 15 и драйвера четырехразрядного семисегментного индикатора SAA1064 [20]. Микро- контроллер Tiny 15 оснащен четырехканальным 10-разрядным АЦП, Flash-памятью на 1 Кбайт, памятью EEPROM на 64 байт, шестью ли- ниями ввода-вывода, встроенным RC-генератором, а также двумя тай- мерами/счетчиками. Драйвер SAA1064 содержит интерфейс 12С, регистр-указатель, ре- гистр управления, мультиплексор пар индикаторов и четыре регистра дешифратора семисегментных индикаторов [21]. Предел измерений температуры составляет -22°..+30° С. Прибор проектировался в наиболее дешевом варианте исполнения, поэтому точ- ность измерения — в пределах последнего знака. Термометр можно ис- пользовать ночью, поскольку индикация температуры основана на све- тодиодах и потому очень яркая. Данные о температуре окружающей среды снимаются с терморезистора. Температурный датчик Терморезистор — это устройство, сопротивление которого значи- тельно изменяется с изменением температуры. Он обладает высоким температурным коэффициентом сопротивления (ТКС) в широком диа- пазоне температур [22]. Различают терморезисторы с отрицательным
152 Глава 10 ТКС, сопротивление которых падает с возрастанием температуры (их часто называют термисторами), и терморезисторы с положительным ТКС, сопротивление которых увеличивается с возрастанием температу- ры (их называют позисторами). Терморезисторы обоих типов изготавливают из полупроводниковых материалов. Диапазон изменения их ТКС составляет -6,5°....+70°С. Наиболее распространенные терморезисторы изготавливают на основе медно-марганцевых (ММТ), кобальто-марганцевых (КМТ) и медно-ко- бальто-марганцевых (СТЗ) оксидных полупроводников. По конструктивному оформлению терморезисторы можно разделить на следующие категории (рис. 10.1): • в виде цилиндрических стержней (KMT-1, ММТ-1, КМТ-4 ММТ-4); • в виде дисков (СТ1-17,5 СТЗ-17, СТ5-1); • в виде плоских прямоугольников (CT3-23); • в виде миниатюрных бусинок (СТ1-18, СТ1-19) [22]. Рис. 10.1. Терморезисторы Автор выбрал терморезистор ММТ-1 сопротивлением 9,0 кОм при 25°С. У терморезисторов также есть недостатки, которые необходимо учитывать при выборе. Первый недостаток — это инерционность изме- нения сопротивления. Автор проделал следующий эксперимент. Термо- резистор ММТ-1 на 9,0 кОм был помещен в морозильник и подключен к измерительному устройству, которое сканировало сопротивление ка- ждые 200 мс. Данные передавались на компьютер и записывались в файл . dat, а затем были преобразованы в формат таблицы Excel (табл. 10.1), и на их основании был построен график выхода на темпера- туру комнаты (рис. 10.2). Таблица 10.1. Данные измерений, полученные для терморезистора ММТ-1 Минуты Секунды Полные секунды Сопротивление, кОм 43 41 0 30,44 43 42 1 30,45 43 43 2 30,52 43 44 3 30,43 43 46 5 30,43
Бытовой цифровой термометр 153 Таблица 10.1. Продолжение Минуты Секунды Полные секунды Сопротивление, кОм 43 47 6 30,28 43 48 7 30,28 43 49 8 28,33 43 50 9 25,42 43 52 11 23,06 43 53 12 21,95 43 54 13 21,11 43 55 14 20,21 43 56 15 19,52 43 58 17 18,78 43 59 18 17,72 44 0 19 17,35 44 1 20 16,97 44 2 21 16,57 44 4 23 16,37 44 5 24 15,88 44 6 25 15,69 44 7 26 15,54 44 8 27 15,46 44 10 29 15,40 44 11 30 15,22 44 12 31 15,22 44 13 32 15,00 44 14 33 14,94 44 16 35 14,77 44 17 36 14,75 44 18 37 14,64 44 19 38 14,54 44 21 40 14,30 44 22 41 14,15 44 23 42 13,89 44 24 43 13,89 44 25 44 13,82 44 27 46 13,70
154 Глава 10 Таблица 10.1. Продолжение Минуты Секунды Полные секунды Сопротивление, кОм 44 28 47 13,71 44 29 48 13,58 44 30 49 13,58 44 31 50 13,53 44 33 52 13,53 44 34 53 13,37 44 35 54 13,41 44 36 55 13,37 44 37 56 13,39 44 39 58 13,26 44 40 59 13,27 44 41 60 13,12 44 42 61 13,19 44 43 62 13,10 44 45 64 13,12 44 46 65 13,09 44 47 66 13,05 44 48 67 13,03 44 49 68 13,03 44 51 70 12,99 44 52 71 13,07 44 53 72 13,10 44 54 73 13,03 44 55 74 12,95 44 57 76 12,92 44 58 77 12,91 44 59 78 12,90 45 0 79 12,90 45 1 80 12,89 45 3 82 12,88 45 4 83 12,89 45 5 84 12,88 45 6 85 12,87 45 7 86 12,86
Бытовой цифровой термометр 155 Таблица 10.1. Продолжение Минуты Секунды Полные секунды Сопротивление, кОм 45 9 88 12,88 45 10 89 12,85 45 11 90 12,83 45 12 91 12,87 45 14 93 12,74 45 15 94 12,78 45 16 95 12,74 45 17 96 12,68 45 19 98 12,63 45 20 99 12,60 45 21 100 12,57 45 22 101 12,57 45 24 103 12,53 45 25 104 12,53 45 26 105 12,49 45 27 106 12,48 45 28 107 12,42 45 30 109 12,47 45 31 110 12,40 45 32 111 12,42 45 33 112 12,38 45 34 113 12,36 45 35 114 12,34 45 36 115 12,33 45 38 117 12,30 45 39 118 12,27 45 40 119 12,23 45 42 121 12,26 45 43 122 12,26 45 44 123 12,25 45 45 124 12,21 45 47 126 12,20 45 48 127 12,21 45 49 128 12,21
156 Глава 10 Таблица 10.1. Окончание Минуты Секунды Полные секунды Сопротивление, кОм 45 ЙО 129 12,13 45 51 130 12,07 45 53 132 12,07 45 54 133 12,01 45 55 134 12,00 45 56 135 12,00 45 57 136 11,96 45 59 138 11,99 46 0 139 11,98 46 1 140 12,00 46 2 141 11,95 46 4 143 11,98 46 5 144 11,86 46 6 145 11,89 46 8 147 11,87 46 9 148 11,88 46 10 149 11,88 46 11 150 11,89 46 13 152 11,80 46 14 153 11,81 46 15 154 11,81 46 16 155 11,86 46 18 157 11,81 46 19 158 11,80 46 20 159 11,82 46 21 160 11,81 46 22 161 11,86 46 24 163 11,85 46 25 164 11,84 46 26 165 11,76 46 27 166 11,80 46 29 168 11,80 46 30 169 11,80
Бытовой цифровой термометр 157 Рис. 10.2. График, соответствующий табл. 10.1 При выходе на постоянные показания, что соответствует примерно 0°С (сопротивление 30,44 кОм) терморезистор быстро перемещен из морозилки в комнату с температурой 20°С (сопротивление 11,8 кОм). Можно сделать вывод, что для установки точных значений температуры необходимо около двух минут. Это объясняет неверные (некорректные) показания температуры в случаях, когда термометр был помещен на от- крытую местность и при этом дул ветер, или термометр быстро пере- мещали из комнаты на кухню или в ванную, где температура значитель- но отличается. Показания прибора будут явно некорректны, поскольку сопротивление терморезистора изменяется очень медленно. Второй недостаток терморезисторов — это шумы. Амплитуда шу- мов, создаваемая терморезистором, может достигать больших значений, тогда как АЦП микроконтроллера быстро фиксирует эти данные с тер- модатчика. В результате показания термометра будут некорректны. Эти недостатки, а также большой разброс параметров при изготов- лении терморезисторов, ограничивают их массовое применение. Однако возможности микроконтроллеров (имеется ввиду не только Tiny 15) не- ограниченны, поскольку данные можно не только измерять, но и обра- батывать с помощью математического анализа, использовав методы ин- теграции и интерполяции, а в крайних случаях — коррекцию по этало- ну. Схема термометра Схема термометра (рис. 10.3) имеет питание +4,5 В от трех батарей 1,5 В типа АА (относительно общей “земли”) и ток потребления не бо- лее 60 мА.
158 Глава 10 й S1 Xi- Xi- 2.6 В KC119A 500 0V ov AL С1 21 G1 OV SAA1064 vcc VEE SCL SDA E2. <D2 P16 P15 P14 P13 P12 P11 P10 P9 VCC 13 , 12 ADR MX1 MX2 CEXT P8 P7 P6 P5 P4 P3 P2 P1 Коррекция * I SCI__21 ZSDA 23 Q2. Рис. 10.3. Схема термометра 5. 6 7_ 8 9 'Д1208 -SDL SDA_____6 5 (ADC0)PB5 (ADC3JPB4 (ADC2)PB3 (ADC1)PB2 (OCP)PB1 (AREF)PBO VCC GND 300 TINY15LP ERROR KT315 ,0V C2 0,1 KT315 Канал измерения имеет стабилизированное питание +2,6 В от це- почки R5-D1 и состоит из измерительного моста TR1/R2/R3/R4/R7/R8 и операционного усилителя IC3, выполняющего роль сумматора. Для устранения смещения нуля операционного усилителя IC3 настраивается баланс R6 и выполняется коррекция по току нуля R9. Операционный усилитель КР140УД1208 может работать при на- пряжении питания от +2,4 В до +18,0 В, поэтому питание ОУ не стаби- лизировано. В состав микроконтроллера Tiny 15 входит 10-разрядный АЦП, который коммутируется встроенным четырехканальным мульти- плексором при настройке АЦП. На входе АЦП внутри микроконтролле- ра присутствует конденсатор, который компенсирует потери при считы- вании данных в АЦП, поэтому после операционного усилителя нет кон- денсатора, выполняющего роль компенсатора. Микроконтроллер сохра- няет работоспособность при питании +2,7 В.
Бытовой цифровой термометр 159 Связь между драйвером SAA1064 и АЦП микроконтроллера Tiny 15 осуществляется по линии 12С [20, 24]. Протокол 12С в микроконтроллере реализован программно. Скорость передачи данных по шине ГС огра- ничивается частотой тактовых импульсов SCL, равной 125 кГц. Драйвер сохраняет работоспособность при напряжении питания +4,0 В. В случае постоянного сбоя передачи данных засвечивается или моргает светодиод “ERROR”. Основной причиной сбоя является низкое напряжение питания или необходимость перезапуска микроконтролле- ра. Для управления семисегментными индикаторами в драйвере присут- ствуют дешифраторы, а также схема управления мультиплексированием по два разряда четырехразрядного индикатора. Мультиплексоры могут коммутировать ток до 110 мА, но в случае применения светодиодных матриц с ультраярким свечением и снижении питания ниже нормы драйвер может выйти из строя. По этой причине для усиления по току установлены транзисторы QI, Q2. Ток базы транзисторов при управле- нии ограничен в драйвере. В драйвере реализованы команды для ступенчатой регулировки вы- ходного тока мультиплексора, а также в него встроен собственный ге- нератор, поэтому синхронизация необязательна. Для знака “±” выпус- каются специальные индикаторные матрицы, однако, если их нет, мож- но использовать четыре прямоугольных светодиода. Для отключения питания существует кнопочный выключатель S1. В перспективе микроконтроллер может выполнять дополнительную функцию проверки собственного питающего напряжения, а также кор- рекции данных (в рассматриваемой конструкции эта идея не реализова- на). Очень важное значение для правильности показаний имеет канал измерения. Прежде всего, зависимость сопротивления терморезистора от температуры в идеале — линейная, хотя на практике наблюдаются отклонения в каждом экземпляре. --------------------------------------------------------------— Файл Расчет характеристик терморезистора. xls с соответствующими гра- фиками можно найти на прилагаемом к книге компакт-диске в папке Расчеты. Данные с терморезистора может снимать АЦП микроконтроллера, однако автор для измерения сопротивления терморезистора выбрал мост, а также усиление сигнала разницы, что накладывает нелинейность на напряжение с выхода операционного усилителя (т.е. на получаемые данные). Еще одной проблемой является выбор коэффициента усиления опе- рационного усилителя (ОУ). Питание схемы ОУ имеет ограничение сверху, поскольку иПит = 4,5 В, и снизу, поскольку питание ОУ — од-
160 Глава 10 нополярное. Для решения проблемы питание измерительного моста ста- билизировано на уровне +2,6 В, а коэффициент усиления ОУ равен 13. Дальнейшее уменьшение коэффициента усиления приведет к искаже- нию данных и увеличению погрешности. Если канал измерения идеально настроен, то необходимо обратить внимание на линеаризацию полученных данных после АЦП. При этом положительная ветвь температуры имеет одну формулу линеаризации, а отрицательная — другую. В качестве базисной точки автор выбрал 0°С. Результат линеаризации данных относительно этого базиса пред- ставлен на графике в файле Расчет характеристик терморезисто- pa.xls 2 (идеальная прямая с углом наклона 45°). Данные после АЦП линеаризуются (заодно масштабируются) и преобразуются в десятичное значение. Погрешность показаний дости- гает 3° в верхнем и нижнем пределе измерения температуры, что вполне допустимо для бытового применения. Для улучшения полученных дан- ных можно ввести корректировочные коэффициенты на разных участ- ках температурного диапазона. При разряде батарей менее 4,0 В данные индикации температуры будут иметь погрешность, которая увеличива- ется с падением напряжения питания. Программа Код программы на ассемблере представлен в листинге 10.1, а шест- надцатеричный код — в листинге 10.2. Листинг ЮЛ. Ассемблерная программа для управления термометром .include "C:\Program Files\Atmel\AVR Studio\Approtes\tnl5def.inc" .device ATtinyl5 /Микроконтроллер: AVR tinyl5. /Тактовая частота: 1.6мГц /Питание: нестабилизированное 4,5 В . list . def tmp = r25 / Рабочий регистр . def time = rl7 / Счетчик цикла задержки . def dbyt = rl8 / Байт данных для передачи по шине I2C . def Fig = r28 / Флаги программы . def Dig43 = r20 / Цифры 4 и 3 для вывода .def Dig21 = r21 / Цифры 2 и 1 для вывода .def tt = r22 / Рабочий регистр .def ttl = r23 / Рабочий регистр . def tt2 = r24 / Рабочий регистр
Бытовой цифровой термометр 161 Листинг 10.1. Продолжение * * * * * Регистровые переменные def tmpl = Г16 ; Рабочий регистр def tmp2 = rl9 ; Рабочий регистр def tmp3 = r26 ; Рабочий регистр def tmp4 = r27 ; Рабочий регистр Флаги в регистре Fig: equ Ack = 0 ; Флаг квитирования = разряд 0 ; Входы/выходы I2C: equ SDA PBl SDA = порт В / разряд 1 equ SCL PB2 SCL = порт В / разряд 2 equ ERR =. Адреса ведомых PBO : устройств ERR = I2C: порт В / разряд 0 equ DispAdr = $76 ; Адрес записи SAA1064 (Вывод ADR (1) - Vcc) . equ DisrAdr = $77 ; Адрес чтения SAA1064 ; (Вывод ADR (1) - Vcc) . cseg . org 0 rjmp RESET пор ;rjmp EXT_INT0 прерывание не используется пор ;rjmp EXT_PIN прерывание не используется пор ;rjmp TIME—OVFO прерывание от 1 таймера пор ;rjmp EE—RDY прерывание от 1 таймера пор ;rjmp ANA_COMP прерывание не используется .org 10 ;настройка порта В RESET: пор clr tmp ; Сброс» регистра out DDRB, tmp out PORTB, tmp ;обнулить порт В clr tmp Idi tmp, $07 ;РВО,PBl,РВ2-выходы out DDRB, tmp ;иниацилизация стека Idi dbyt,Low(RAMEND) ; Функция вспомогательного ; регистра out SPL,dbyt ; Инициализируем указатель стека ;Начало программы nStart: пор rcall Res ;сброс временных данных rcall adcn ;получение данных АЦП млб-бтр2 стб-бтрЗ mov r5, tmp3 mov r4, tmp2 cis /сброс знака
162 Глава 10 Листинг 10.1. Продолжение /проверка на минус cpi tmp3, 01 brge plus nop cis cpi tmp2, $47 brge plus /больше равно /сброс знака /больше равно nop rjmp minus plus : nop mov tmp3, r5 mov tmp2, r4 ;проверка на ноль =147 clz cpi tmp3, 01 /проверка на ноль brne fog cpi tmp2, $47 brne fog Idi dig43, 00 /вывод на экран 00 rjmp initial fog: nop mov tmp3, r5 mov tmp2, r4 Idi dig21, $11 / Вывод на индикатор плюса /формула линеаризации 1 /установка данных Idi rl7, $00 /старший полубайт делимого Idi rl6, $00 /старший полубайт делимого Idi r25, $70 /младший полубайт делимого Idi r24, $00 /младший полубайт делимого mov r23, tmp3 /старший полубайт делителя mov r22, tmp2 /младший полубайт делителя clr r5 clr r4 rcall delit /подпрограмма деления mov tmp3, r5 /возвращение данных mov tmp2, r4 /возвращение данных Idi dig43, $38 sub dig43, tmp2 /вычитание rcall hextodcd rjmp initial minus: nop Idi dig21, $01 / Вывод на индикатор минуса /формула линеаризации 2 subi tmp3, 01 subi tmp2, $47
Бытовой цифровой термометр 163 Листинг 10.1. Продолжение Idi rl7, $00 ;старший полубайт делимого Idi rl6, $00 /старший полубайт делимого mov r25, tmp3 /младший полубайт делимого mov r24, tmp2 /младший полубайт делимого Idi r23, $00 /младший полубайт делителя Idi r22, $06 /младший полубайт делителя rcall delit /подпрограмма деления mov tmp3, r5 /возвращение данных mov * dig43, r4 /возвращение данных rcall hextodcd /Начало программы Initial: nop Idi dbyt,Low(RAMEND) ; Функция вспомогательного регистра out SPL,dbyt / Инициализируем указатель стека Idi Fig,$01 / Сбрасываем в 0 все флаги, кроме Аск clr tt / Обнуляем переменную Idi tmp, $ 01 out PORTB, tmp / Отменить сообщение об ошибке mov ttl,Dig21 / Цифры 1 (младшая) и 2 (старшая) swap ttl Меняем местами младшую и старшую цифры andi ttl,$0F Очищаем старший полубайт (цифра 1) mov tt2,Dig43 / Цифры 3 (младшая) swap tt2 Меняем местами младшую и старшую цифру andi tt2,$0F ; Очищаем старший полубайт (цифра 3) nop ;чтение байта управления для сброса флага питания read: Idi dbyt, DisrAdr /назначаем адрес ведомого rcall Start RBI: nop sbi DDRB, SCL /ниспадающий фронт SCL rcall waitbus / Цикл задержки cbi DDRB, SCL /нарастающий фронт SCL RB2: nop sbis PinB, SCL /состояние ожидания ведомого устройства rjmp RB2 rcall waitbus / Цикл задержки clc /сброс флага переноса sbic PinB, SDA /если SDA=1 sec /установка флага переноса rol dbyt /сдвигаем прочитанный бит в байте brcc RBI /переход если чтение не завершено SetAck: nop /вывод бита квитирования sbi DDRB, SCL /ниспадающий фронт SCL
164 Глава 10 Листинг ЮЛ. Продолжение sbrs Fig, Ack SAI DDRB, SDA SA2 /Пропускаем следующую команду, ;если Аск=1 /Переход если Аск=0 /установка SDA в 1 rjmp cbi rjmp SAI: nop sbi DDRB, SDA /установка SDA в 0 SA2: nop rcall wait5us / Цикл задержки cbi DDRB, SCL /нарастающий фронт SCL SA3: nop sbis PinB, SCL /Состояние ожидания ведомого устр-ва rjmp SA3 rcall waitbus / Цикл задержки rcall stopp / Выводим условие завершения Haupt: nop ; Инициализируем SAA1064 ; Передача байта управления в SAA1064 Idi dbyt,DispAdr / Адрес SAA1064, направление-запись ; Передаем условие старта + адрес ведомого rcall Start / Передаем условие старта + ; адрес ведомого sbrc Fig,Ack / Пропускаем следующую команду, / если квитирование rjmp ss / Завершаем, если отрицательное / квитирование Idi dbyt,$00 / Подадрес - регистр управления rcall WriteByte / Передаем sbrc Fig,Ack / Пропускаем следующую команду, / если квитирование rjmp ss / Завершаем, если отрицательное / квитирование Idi dbyt,$27 / Максим., вывод цифр, динамический / режим rcall WriteByte / Передаем /Продолжение программы ss: nop rcall stopp / Выводим условие завершения sbrc Fig,Ack / Пропускаем следующую команду, / если получено квитирование rjmp Haupt ; Новая попытка, если нет квитирования ; Вывод 4-x цифр в SAA1064 Idi dbyt,DispAdr / Адрес SAA1064, направление-запись rcall Start / Передаем условие старта + / адрес ведомого
Бытовой цифровой термометр 165 Листинг 10.1. Продолжение sbrc Fig, Ack ; Пропускаем следующую команду, rjmp ; если квитирование erro ; Завершаем, если отрицательное квитирование Idi dbyt,$01 ; Подадрес = Digit 1 rcall WriteByte ; Передаем sbrc Fig, Ack ; Пропускаем следующую команду, rjmp erro ; если квитирование ; Завершаем, если отрицательное mov tmpl,Dig21 ; квитирование ; Цифры 1 (младшая) и 2 (старшая) andi tmpl,$0F ; Очищаем старший полубайт (цифра 2) rcall Get7Segm ; Загружаем 7-сегментный код rcall WriteByte ; младшего полубайта ; Передаем цифру 1 et: rcall Stopp Idi dbyt,DispAdr ; Адрес SAA1064, направление-запись rcall Start ; Передаем условие старта + sbrc Fig,Ack ; адрес ведомого ; Пропускаем следующую команду, rjmp erro ; если квитирование ; Завершаем, если отрицательное Idi dbyt,$02 ; квитирование ; Подадрес = Digit 1 rcall WriteByte ; Передаем sbrc Fig,Ack ; Пропускаем следующую команду, rjmp et ; если квитирование ;Повторяем mov rcall tmpl, tt2 Get7Segm ; Загружаем 7-с^гментный код rcall WriteByte ; младшего полубайта ; Передаем цифру 2 ot: rcall Stopp Idi dbyt, DispAdr ; Адрес SAA1064, направление-запись rcall Start ; Передаем условие старта + sbrc Fig,Ack ; адрес ведомого ; Пропускаем следующую команду, rjmp erro ; если квитирование ; Завершаем, если отрицательное Idi dbyt,$03 ; квитирование ; Подадрес = Digit 1 rcall WriteByte ; Передаем sbrc Fig,Ack ; Пропускаем следующую команду, rjmp ot ; если квитирование ;Повторяем mov tmpl, Dig4 3 ; Цифры 3 (младшая) и 4 (старшая) andi tmpl, $0F ; Очищаем старший полубайт (цифра 4)
166 Глава 10 Листинг 10.1. Продолжение rcall Get7Segm ; Загружаем 7-сегментный код ; младшего полубайта rcall WriteByte ; Передаем цифру 3 rt: rcall Stopp Idi dbyt, DispAdr ; Адрес SAA1064, направление-запись rcall Start ; Передаем условие старта + ; адрес ведомого sbrc Fig,Ack ; Пропускаем следующую команду, ; если квитирование rjmp erro ; Завершаем, если отрицательное ; квитирование Idi dbyt,$04 ; Подадрес = Digit 1 rcall WriteByte ; Передаем sbrc Fig,Ack ; Пропускаем следующую команду, ; если квитирование rjmp rt ;Повторяем mov tmpl, ttl rcall Get7Segm ; Загружаем 7-сегментный код ; младшего полубайта rcall WriteByte ; Передаем цифру 4 rcall Stopp rjmp : nStart ; Возвращаемся в начало программы erro: nop /Обработка ошибки -квитирования inc tt /Увеличить на 1 cpi tt, 4 /Сравнить количество отказов brne vb /Если не равно то выход clr tmp out PORTB, tmp /Если сбой то сигнализация rcall stopp / Выводим условие завершения nop rcall w200 clr tt /Сброс ошибки vb: nop rjmp initial /Возвращаемся в начало программы Start: nop clz sbi DDRB,SDA / SDA = лог. 0: условие старта rcall wait4us ; Цикл задержки WriteByte: nop / Запись байта в ведомое устройство clz sec / Флаг переноса С = 1 rol dbyt / Сдвигаем влево, C->LSB, MSB->C rjmp bitl / Особая обработка разряда 1 WriteBit: nop Isl dbyt / Если dbyt пустой, ...
Бытовой цифровой термометр 167 Листинг 10.1. Продолжение bitl: пор breq GetAck ; ... то передача завершена sbi DDRB,SCL ; SCL = лог. 0 Ниспадающий фронт SCL brcc WriteLow ; Переход, если флаг С = 0 пор Чтобы уравновесить время выполнения cbi DDRB,SDA ; SDA-высокоомный Установка SDA в 1 rjmp SCL_High WriteLow: nop sbi DDRB,SDA ; 'SDA = лог. 0 Установка SDA в 0 nop ; Чтобы уравновесить длительность такта SCL_High: nop rcall wait4us ; Цикл задержки cbi DDRB,SCL ; SCL - высокоомный Ниспадающий ; фронт SCL WB1: nop sbis PinB,SCL ;Состояние ожидания ведомого устройства? rjmp WB1 rcall wait5us ; Цикл задержки rjmp WriteBit \ GetAck: nop ;Считывание бита квитирования от ведомого \ sbi DDRB,SCL ; SCL= лог. 0 Ниспадающий фронт SCL cbi DDRB,SDA ; SDA - высокоомный SDA - ; высокоомное состояние rcall waitbus ; Цикл задержки cbi DDRB,SCL ; SCL - высокоомный Нарастающий ; фронт SCL GAI: nop sbis PinB,SCL ; Состояние ожидания ведомого ; устройства rjmp GAI cbr Fig,l<<Ack ; Флаг Аск = 0 sbic PinB,SDA ; Если SDA = 1, sbr Fig,l<<Ack ; флаг Аск = 1 rcall ret wait4us ; Цикл задержки ;Подпрограмма перекодировки данных из 7-ми сегм. кода * Get7Segm: пор * Idi ZH, high (2 *prog3) \ Idi ZL, Low(2* ргодЗ) j Add ZL, tmpl | 1pm mov dbyt, rO \ ret \ ;Подпрограмма передачи флага STOP \ Stopp: nop ; Вывод условия завершения
168 Глава 10 Листинг 10.1. Продолжение j sbi DDRB,SCL / SCL = лог. 0 Ниспадающий фронт SCL sbi DDRB,SDA / SDA = лог. 0 / Установка SDA в 0 rcall waitSus / Цикл задержки cbi DDRB,SCL / SCL-высокоомный Установка SCL в 1 rcall waitSus / Цикл задержки cbi DDRB,SDA / SDA - высокоомный Нарастающий / фронт SCL rcall waitSus / Цикл задержки ret ;Подпрограмма задержки 12 мкс WaitSus:nop / Цикл задержки 12 мкс при f = 1,6 МГц Idi time,2 W5: nop dec time /4x2 такта + rcall + ret brne W5 9 ret /Подпрограмма задержки 6 МКС Wait4us: МГц / Цикл задержки 6 мкс при f = 1,6 Idi timb, 1 W4 : nop dec time /3x1 такт + rcall + ret brne W4 nop ret W200: nop ;задержка 200 mc Idi tt, 0 ;Задержка цикл Idi ttl, 0x35 ;Задержка цикл clc /Сброс флага переноса nn: subi tt, 1 /Вычитаем 1 с заемом subi ttl, 0 /Вычитаем с заемом brcc nn /Переход если сброшен флаг переноса ret /Делимое r7r6r5r4 делитель r3r2 результат r5:r4 *************** ************************************ /* HexBCD - 32-разрядное двоичное число (целое)делить ;* на 16-разрядное. • ********* *************** ************************************
Бытовой цифровой термометр 169 Листинг 10.1. Продолжение [ delit: пор \ /Пересылка данных в рабочие регистры mov r7, rl7 mov r6, Г16 mov r5, r25 mov r4, r24 mov r3, r23 mov r2, r22 Idi tmpl, .$10/делитель 16 разрядов \ mov rO, tmpl j DCLK: пор j rcall HL2 /подпрограмма с старшим полубайтом * in rll, SREG /сохранение регистра состояния rcall DE2 /проверка младшего полубайта \ пор \ brcc PER1 /переход если не было переноса I пор j rcall INXH /восстановление старшего полубайта I пор | PERI: rcall HLMNBC /вычисление разницы старшего полубайта I пор | brcs PER2 /переход если перенос \ out SREG, rl7;восстановление регистра состояния ; PER3: rcall INXD /восстановление младшего полубайта | пор \ rjmp PER4 \ PER2: out SREG, rl7 /восстановление регистра состояния \ brcs PER3 /переход если перенос I пор j rcall DADB /восстановление старшего полубайта | PER4: clz j mov tmp3, rO [ dec tmp3 /уменьшение 16 разрядов mov rO, tmp3 brbc 1, DCLK /переход если Z=0 nop ret /подпрограмма с старшим полубайтом HLMNBC: clc /сброс флага переноса mov tmpl, r6 /переслать гб в временный регистр sbc tmpl, r2 /вычитание с заемом mov r6, tmpl /сохранение в гб mov tmp2, r7 /переслать г 7 в временный регистр sbc tmp2, r3 /вычитание с заемом mov r7, tmp2 /сохранение в г 7
170 Глава 10 Листинг 10.1. Продолжение ret ;восстановление старшего полубайта DADB: mov tmpl, г6 /переслать г6 в временный регистр add tmpl, r2 ;сложение mov гб, tmpl ; сохранение в гб mov tmp2, г 7 ;переслать г 7 в временный регистр adc tmp2, r3 ;сложение с переносом mov г 7, tmp2 ; сохранение в г 7 ret ;подпрограмма с младшим полубайтом DE2: clc ;сброс флага переноса mov tmpl, r4 ;переслать г4 в временный регистр rol tmpl ;сдвиг влево через перенос mov r4, tmpl ;сохранение в г4 mov tmp2, г5 /переслать г5 в временный регистр rol tmp2 /сдвиг влево через перенос mov r5, tmp2 /сохранение в г5 ret /сдвиг старшего полубайта HL2: clc /сброс флага переноса mov tmpl, г6 /переслать г4 в временный регистр rol tmpl /сдвиг влево через перенос mov гб, tmpl /сохранение в гб mov tmp2, г 7 /переслать г 7 в временный регистр rol tmp2 /сдвиг влево через перенос mov г 7, tmp2 /сохранение в г7 ret /восстановление младшего полубайта с константой 1 INXD: mov tmpl, г4 /переслать г4 в временный регистр Idi tmp4, $1 /записать константу 1 add tmpl, tmp4 /сложение с константой mov r4, tmpl /сохранение в г4 mov tmp2, г5 /переслать г5 в временный регистр Idi tmp4, $0 /записать константу 0 adc tmp2, tmp4 /сложение с константой с переносом mov r5, tmp2 /сохранение в г5 ret /восстановление старшего полубайта с константой 1 INXH: mov tmpl, гб /переслать гб в временный регистр Idi tmp4, $1 /записать константу 1 add tmpl, tmp4 /сложение с константой mov гб, tmpl /сохранение в гб mov tmp2, г 7 /переслать г 7 в временный регистр Idi tmpl, $0 /записать константу 0 adc tmp2, tmpl /сложение с константой с переносом mov r7, tmp2 /сохранение в г 7
Бытовой цифровой термометр 171 ЛистингЛОЛ. Продолжение ret ;сброс временных регистров Res: пор clr tmpl ;сброс tmpl clr tmp2 ;сброс tmp2 clr tmp3 ;сброс tmp3 clr tmp4 ;сброс tmp4 ret /Настройка АЦП adcn: nop nop clr tmp awe: nop cpi tmp, $04 /считывание АЦП 4-раза brsh ass /более 4-х раз clr tmp3 Idi tmp3, $02 /внутренний источник, вход ADC3 out ADMUX, tmp3 /коммутация входов АЦП clr tmp2 clr tmp3 Idi tt2, $C5 /одиночное, запуск, 1/32 out ADCSR, tt2 /запуск АЦП на преобразование /Сохранение данных АЦП in tmp2, ADCL /чтение младшего байта АЦП in tmp3, ADCH /чтение старшего байта АЦП mov r2, tmp2 /запомнить временно mov r3, tmp3 /запомнить временно mov г4, г2 /запомнить временно mov г5, гЗ /запомнить временно mov гб, г4 /запомнить временно mov г7, г5 /запомнить временно inc tmp /увеличить на 1 rjmp awe /среднее арифметическое действие ass: пор clr г8 /для младшего байта clc /сброс флага переноса add tmp2, г2 /сложение с предыдущим adc г9, г8 /сложение с переносом add tmp2, г4 /сложение с предыдущим adc г9, г8 /сложение с переносом add tmp2, г6 /сложение с предыдущим adc г9, г8 /сложение с переносом clc Isr г9 /сдвиг вправо
172 Глава 10 Листинг 10.1. Продолжение ror tmp 2 ;сдвиг вправо через перенос Isr r9 ;сдвиг вправо ror clr clc- tmp 2 r9 ;сдвиг вправо через перенос ;для старшего байта add tmp3, r3 ;сложение с предыдущим adc r9, r8 ;сложение с переносом add tmp3, r5 ;сложение с предыдущим adc r9, r8 ;сложение с переносом add tmp3, r7 ;сложение с предыдущим adc clc r9, r8 ;сложение с переносом Isr r9 ;сдвиг вправо ror tmp3 ;сдвиг вправо через перенос Isr r9 ;сдвиг вправо ror tmp3 ;сдвиг вправо через перенос nop ret ;младший байт tmp2, старший tmp3 hextodcd: nop Idi ZH, high(2 *prog2) Idi ZL, Low(2* prog2) Add 1pm ZL, dig43 mov ret dig43, rO . ORG $1ВС prog2: .DB . DB .DB .DB . DB .DB .DB . DB .DB .DB .DB . DB $01,$02,$03,$04,$05,$06,$07,$08 $09,$10,$11,$12,$13,$14,$15,$16 $17,$18,$19,$20,$21,$22,$23,$24 $25,$26,$27,$28,$29,$30,$31,$32 $33,$34,$35,$36,$37,$38,$39,$40 $41,$42,$43,$44,$45,$46,$47,$48 $49,$50,$51,$52,$53,$54,$55,$56 $57,$58,$59,$60,$61,$62,$63,$64 $65,$66,$67,$68,$69,$70,$71,$72 $73,$74,$75,$76,$77,$78,$79,$80 $81,$82,$83,$84,$85,$86,$87,$88 $89,$90,$91,$92,$93,$94,$95,$96 ; Таблица 7-сегментных кодов .ORG $1FO ргодЗ:
Бытовой цифровой термометр 173 ЛистийгЮЛ.Окбйчание ; . DB $3F,$06,$5B,$4F,$66,$6D,$7D,$07 ;Шестнадцатеричные ; 0. .7 . DB $7F,$6F,$77,$7C,$39,$5E,$00,$40 ;Шестнадцатеричные ;8..D,Е=пробел,Г=минус . DB $7F,$6F,$77,$7C,$39,$5E,$79,$71 ;Шестнадцатеричные ; 8 . . F :020000020000FC : 0С00000009С0000000000000000000002В :100014000000992797ВВ98ВВ992797Е097ВВ20Е0ЕЕ :100024002DBF000055D15AD15A2E432EC894A13069 :1000340034F40000C894373414F400001DC00000E8 :10004400A52D342D9894A13021F4373411F440E0D7 :1000540021C00000A52D342D51E110E000E090E70F : 1000640080E07A2F632F55244424DDD0A52D342D30 : 1000740048E3431B67D10EC0000051E0A150375440 : 1000840010E000E09A2F832F70E066E0CCD0A52D1D :10009400442D58D1000020E02DBFC1E0662791E037 :1000A40098BB752F72957F70842F82958F70000096 :1000B40027E76BD00000BA9AA2D0BA980000B29B8E :1000C400FDCF9DD08894B1990894221F98F7000021 :1000D400BA9AC0FF02C0B99802C00000B99A0000E1 :1000E4008ED0BA980000B29BFDCF89D07FD000009B :1000F40026E74BD0C0FD06C020E04BD0C0FD02C0B7 :1001040027E247D0000072D0C0FDF1CF26E73DD0F2 :10011400C0FD2FC021E03DD0C0FD2BC0052F0F70C6 :100124005ED037D063D026E730D0C0FD22C022E0B5 :1001340030D0C0FDF7CF082F52D02BD057D026E7B0 : 1001440024D0C0FD16C023E024D0C0FDF7CF042F77 :100154000F7045D01ED04AD026E717D0C0FD09C085 :1001640024E017D0C0FDF7CF072F39D012D03ED0EE :1001740058CF00006395643031F49927.98BB36D08A :10018400000049D06627000085CF00009894B99AF2 :100194003CD0000098940894221F02C00000220F53 :1001A400000081F0BA9A18F40000B99803C0000066 :1Q01B400B99A0000000029D0BA980000B29BFDCF84 :1001C4001ED0ECCF0000BA9AB99819D0BA980000A2 :1001D400B29BFDCFCE7FB199C16017D008950000C6 :1001E400F3E0E0EEE00FC895202D08950000BA9AE0 :1001F400B99A05D0BA9803D0B99801D008950000EF : 1002040012E000001A95E9F7089511E000001A952C :10021400E9F700000895000060E075E388946150F8 :100224007050E8F708950000712E602E592E482E64
174 Глава 10 Листинг 10.2. дксйнчйние :10023400372E262E00E1002E000030D01FB726D026 :10024400000018F400003BD0000011D0000020F0A2 :100254001FBF2CD0000004C01FBFD8F300000FD074 :100264009894A02DAA950A2E39F700000895889431 :10027400062D0209602E372D3309732E0895062D9D :10028400020D602E372D331D732E08958894042D8E : 10029400001F402E352D331F532E08958894062DAC :1002A400001F602E372D331F732E0895042DB1E0E7 :1002B4000B0F402E352DB0E03B1F532E0895062D15 :1002C400B1E00B0F602E372D00E0301F732E089520 :1002D400000000273327AA27BB2708950000000049 :1002E40099270000943088F4AA27A2E0A7B93327FD :1002F400AA2785EC86B934B1A5B1232E3A2E422C17 :10030400532C642C752C9395ECCF0000882488948E :10031400320D981C340D981C360D981C88949694В4 :1003240037959694379599248894A30D981CA50D18 :10033400981CA70D981C88949694A7959694A795B5 :10034400000008950000F3E0E8E7E40FC895402DAD :0203540008950А :1003780001020304050607080910111213141516C3 :10038800171819202122232425262728293031321D :100398003334353637383940414243444546474877 :1003А80049505152535455565758596061626364С5 :1003В8006566676869707172737475767778798025 :1003С8008182838485868788899091929394959673 :1003E0003F065B4F666D7D077F6F777C395E00400F :0803F0007F6F777C395E7971A3 :00000001FF____________________________________________________ Структура программы упрощена и не имеет сложных логических переходов (это видно из блок-схемы на рис. 10.4). В начале программы настраивается конфигурация порта ввода-вывода. Затем несколько раз считываются данные из АЦП. Эти данные суммируются и делятся на количество раз считывания (вычисляется среднее арифметическое). Это необходимо для уменьшения погрешности измерения и устранения шу- мов терморезистора. АЦП настроен на преобразование с частотой 50 кГц. Опорное на- пряжение для АЦП берется от вывода питания микроконтроллера. В процессе аналого-цифрового преобразования двоичное число Z вы- числяется по уравнению Z = 1024*Ubx/UreF, где UBx при 0°С составит 0,58 В, a Uref=VCc. Для Tiny 15 Z = 147|б. После получения точных данных АЦП в программе выделяется по- ложительное и отрицательное значение температуры.
Бытовой цифровой термометр 175 Рис. 10.4. Блок-схема алгоритма управления термометром
176 Глава 10 В этом действии от данных АЦП вычитается эталонное шестнадца- теричное значение 0°С= 14716- Получившиеся положительные данные соответствуют положительной температуре, а отрицательные — отри- цательной. Положительные данные линеаризуются по формуле (кон- станты — в шестнадцатеричном коде): Линеаризация 1 = 38 - 7000/идцп- Отрицательные данные линеаризуются по формуле (константы — в шестнадцатеричном коде): Линеаризация 2 = (Пацп - 147)/6. Детектор нуля должен быть нолем при Детектор 0 = (иАцп - 147) (константа — в шестнадцатеричном коде). Подпрограмма деления длится 800 мкс при тактовой частоте мик- роконтроллера 1,6 МГц. После линеаризации получаем соответствую- щий масштаб полученных данных, которые преобразуются в данные о реальной температуре в десятичном коде (с помощью таблицы hex-bed по адресу prog2). На следующем этапе данные разбиваются поразрядно. Для работы семисегментного индикатора двоично-десятичное значение преобразу- ется в семисегментный код с помощью таблицы в конце программы (по адресу ргодЗ). Преобразование кода выполнено по методике, описан- ной в [23]. Полученная цифра разряда передается по шине 12С на драй- вер семисегментных индикаторов по протоколу, описанному в [21]. По- скольку первый индикатор состоит из светодиодов, то для засветки зна- ка “минус” передается код 01XX, а для засветки знака “плюс”— код 11XX. Драйвер SAA1064 имеет ряд особенностей. Поскольку питание схе- мы может снизиться до уровня меньше 4.0 В, необходимо сбросить флаг по питанию в драйвере SAA1064. Для этого следует прочитать данные из регистра состояния по адресу 7716- Для записи байта информации в микросхему необходимо ввести адрес ведомого устройства 7616, опре- деляющий направление записи, а затем — задать выходной ток драйве- ра (автор выбрал среднее значение 6 мА, код 47 j6). Далее при получении квитирования посредством логического нуля записывается субадрес каждой цифры, и пересылаются два разряда зна- ка и два разряда значения температуры. В случае, если квитирование от SAA1064 не подтверждается (т.е. данные записываются с ошибкой), программа переходит в режим “ERROR” и засвечивается светодиод “ERROR”. Выдерживается пауза в 230 мс, все данные обнуляются,
Бытовой цифровой термометр 177 а выполнение программы автоматически начинается сначала. В начале программы светодиод “ERROR” гаснет. Если ошибка повторяется регу- лярно, то светодиод “ERROR” моргает или светится, пока не будет уст- ранена неисправность. Плата Монтажная схема платы представлена на рис. 10.5, а схема разводки с двух сторон — на рис. 10.6. Рис. 10.5. Монтажная схема платы управления термометром Монтажная плата изготовляется из двухстороннего металлизиро- ванного текстолита. На ней установлен батарейный отсек с тремя сек- циями для батарей питания типа АА и элементы схемы с индикаторны- ми матрицами (рис. 10.7). На плате присутствует кнопочный выключа- тель питания (на ток не более 0,2 А) и разъем PTR-500 для подсоедине- ния датчика температуры. Примерный дизайн прибора представлен на рис. 10.8. Корпус из пластика имеет окно для индикации и отверстие для кнопочного выключателя питания и индикатора ошибки. Окно ин- дикации изготовлено из оргстекла и снизу покрыто пленкой, выделяю- щей элементы индикации. К корпусу окно приклеено клеем.
178 Глава 10 Рис. 10.6. Схема разводки платы управления термометром Рис. 10.7. Макет платы Рис. 10.8. Примерный дизайн прибора
Бытовой цифровой термометр 179 Светодиодная матрица знака “±” собрана из четырех прямоуголь- ных светодиодов в виде отдельных сегментов знака “+”. Светодиоды установлены на панельки так, чтобы общая высота совпадала с высотой индикаторов. Индикатор и микросхемы установлены на панельки, для облегчения монтажа при отбраковке элементов. Автор собрал термометр навесным монтажом, применив: • семисегментные светодиодные индикаторы HLEK-S512GWA; • операционный усилитель КР140УД1208 (или любой другой с низ- ковольтным питанием и низким дрейфом “нуля”); • стабилитрон D1 — КС119А на напряжение стабилизации 2,6 В; • резисторы мощностью 0,125 Вт; • переменные резисторы — миниатюрные, маломощные на 22 кОм. Остальные детали — любые отечественного или зарубежного про- изводства. Настройка Прежде всего, необходимо проверить правильность сборки устрой- ства. Для этого в микроконтроллер записывается тестовая программа, ассемблерный код которой представлен в листинге 10.3, а шестнадцате- ричный — в листинге 10.4. ©Соответствующие проектные файлы AVR Studio 4 можно найти на прилагаемом к книге компакт-диске в папке Программы\10 - Термометр. Листинг 10.3. Ассемблерная программа для тестирования устройства .include "C:\Program Files\Atmel\AVR Studlo\Appnotes\tnl5def.inc" /Микроконтроллер: AVR tinyl5. /Тактовая частота: 1.бмГц /Питание: нестабилизированное 4,5 В .DEVICE ATtinyl5 . list .def tmp = r25 / Рабочий регистр . def tmpl = rl6 / Рабочий регистр . def time = rl7 / Счетчик цикла задержки . def dbyt = rl8 / Байт данных для передачи по шине I2C . def Fig = rl9 / Флаги программы . def Dig43 = r20 / Цифры 4 и 3 для вывода . def Dig21 = r21 / Цифры 2 и 1 для вывода . def tt = r22 / Рабочий регистр . def ttl = r23 / Рабочий регистр . def tt2 = r24 / Рабочий регистр
18Ю Глава 10 Листинг 10.3. Продолжение ; Флаги в регистре Fig: . equ Аск • = 0 ; Флаг квитирования = разряд 0 ; Входы/выходы I2C: .equ SDA = PB1 ; SDA = порт В / разряд 1 .equ SCL = PB2 ; SCL = порт В / разряд 2 .equ ERR = PBO ; ERR = порт В / разряд 0 ; Адреса ведомых устройств I2C: .equ DispAdr = $76 ; Адрес записи SAA1064 ; (Вывод ADR (1) - Vcc) .equ DisrAdr = $77 ; Адрес чтения SAA1064 ; (Вывод ADR (1) - Vcc) . cseg . org 0 rjmp RESET nop ;rjmp EXT—INT0 прерывание не используется nop ; rjmp EXT_PIN прерывание не используется nop ; r jmp TIME—OVFO прерывание от таймера nop ;rjmp EE_RDY прерывание от таймера nop ;rjmp ANA_COMP прерывание не используется .org 10 ;сброс всех значений ;настройка порта В RESET: nop clr tmp ; Сброс регистра out DDRB, tmp out PORTB, tmp ;обнулить порт В clr tmp Idi tmp, $ 0 7 ;РВО,РВ1,РВ2-выходы out DDRB, tmp ;Начало программы Initial: nop Idi dbyt,Low(RAMEND) ; Функция вспомогательного ; регистра out SPL,dbyt ; Инициализируем указатель стека Idi Fig,$01 Сбрасываем в 0 все флаги, кроме Аск clr tt ; Обнуляем переменную Idi tmp, $ 01 out PORTB, tmp ; Отменить сообщение об ошибке Idi dig21, $11 ; Вывод на индикатор плюса Idi dig43, $25 ; Вывод на индикатор 25 mov ttl,Dig21 ; Цифры 1 (младшая) и 2 (старшая) swap ttl ; Меняем местами младшую и старшую цифры
Бытовой цифровой термометр 181 Листинг 10.3. Продолжение andi ttl,$0F Очищаем старший полубайт (цифра 1) mov tt2, Dig43 ; Цифры 3 (младшая) swap tt2 ; Меняем местами младшую и старшую цифру andi tt2,$0F Очищаем старший полубайт (цифра 3) nop /чтение байта управления для сброса флага питания read: Idi dbyt, Dis г Adr- /назначаем адрес ведомого rcall Start RB1: nop sbi DDRB, SCL /ниспадающий фронт SCL rcall wait5us / Цикл задержки cbi DDRB, SCL /нарастающий фронт SCL RB2: nop sbis PinB, SCL /состояние ожидания ведомого устройства rjmp RB2 rcall wait5us / Цикл задержки clc /сброс флага переноса sbic PinB, SDA /если SDA=1 sec /установка флага переноса rol dbyt /сдвигаем прочитанный бит в байте brcc RBI /переход если чтение не завершено SetAck: nop /вывод бита квитирования sbi DDRB, SCL /ниспадающий фронт SCL sbrs Fig, Ack /Пропускаем следующую команду, /если Аск=1 rjmp SAI /Переход если*Аск=0 cbi DDRB, SDA /установка SDA в 1 rjmp SA2 SA1: nop sbi DDRB, SDA /установка SDA в 0 SA2: nop rcall wait5us /Цикл задержки cbi DDRB, SCL /нарастающий фронт SCL SA3: nOp sbis PinB, SCL /Состояние ожидания ведомого /устройства rjmp SA3 rcall wait5us / Цикл задержки rcall stopp / Выводим условие завершения Haupt : nop ; Инициализируем SAA1064 ; Передача байта управления в SAA1064 Idi dbyt,DispAdr / Адрес SAA1064, направление-запись ; Передаем условие старта + адрес ведомого
182 Глава 10 Листинг 10.3. Продолжение; rcall Start Передаем условие старта + sbrc Fig,Ack адрес ведомого Пропускаем следующую команду, rjmp f ss ; если квитирование Завершаем, если отрицательное Idi dbyt,$00 ; квитирование Подадрес - регистр управления rcall WriteByte ; Передаем sbrc Fig,Ack Пропускаем следующую команду, rjmp f ss ; если квитирование Завершаем, если отрицательное Idi dbyt,$47 квитирование Максим., вывод цифр, динамический rcall f WriteByte ; режим Передаем ;Продолжение программы ss: nop rcall stopp ; Выводим условие завершения sbrc Fig,Ack ; Пропускаем следующую команду, rjmp f Haupt ; если получено квитирование Новая попытка, если нет ; Вывод 4-x Idi цифр в SAA1064 dbyt,DispAdr ; квитирования Адрес SAA1064, направление-запись rcall Start Передаем условие старта + sbrc Fig,Ack ; адрес ведомого Пропускаем следующую команду, rjmp r erro если квитирование Завершаем, если отрицательное Idi dbyt,$01 ; квитирование Подадрес = Digit 1 rcall WriteByte Передаем sbrc Fig,Ack Пропускаем следующую команду, rjmp f erro ; если квитирование Завершаем, если отрицательное mov tmpl,Dig21 ; квитирование Цифры 1 (младшая) и 2 (старшая) andi tmpl,$OF ; Очищаем старший полубайт (цифра 2) rcall Get7Segm ; Загружаем 7-сегментный код rcall f WriteByte ; младшего полубайта Передаем цифру 1 et: rcall Idi Stopp dbyt,DispAdr ; Адрес SAA1064, направление-запись rcall Start ; Передаем условие старта + f адрес ведомого
Бытовой цифровой термометр 183 Листинг 10.3. Продолжение sbrc Fig,Ack ; Пропускаем следующую команду, rjmp erro ; если квитирование ; Завершаем, если отрицательное Idi dbyt,$02 ; квитирование ; Подадрес = Digit 1 rcall WriteByte ; Передаем sbrc Fig,Ack ; Пропускаем следующую команду, rjmp et ; если квитирование ; Повторяем mov tmpl, tt2 rcall Get7Segm ; Загружаем 7-сегментный код rcall WriteByte ; младшего полубайта ; Передаем цифру 2 ot: rcall Stopp Idi dbyt,DispAdr ; Адрес SAA1064, направление-запись rcall Start ; Передаем условие старта + sbrc Fig,Ack ; адрес ведомого ; Пропускаем следующую команду, rjmp erro ; если квитирование ; Завершаем, если отрицательное Idi dbyt,$03 ; квитирование ; Подадрес = Digit 1 rcall WriteByte ; Передаем sbrc Fig,Ack ; Пропускаем следующую команду, rjmp ot 7 если квитирование ; Повторяем mov tmpl, Dig4 3 ; Цифры 3 (младшая) и 4 (старшая) andi tmpl,$0F ; Очищаем старший полубайт (цифра 4) rcall Get7Segm ; Загружаем 7-сегментный код rcall WriteByte ; младшего полубайта ; Передаем цифру 3 rt: rcall Stopp Idi dbyt,DispAdr ; Адрес SAA1064, направление-запись rcall Start ; Передаем условие старта + sbrc Fig,Ack ; адрес ведомого ; Пропускаем следующую команду, rjmp erro ; если квитирование ; Завершаем, если отрицательное Idi dbyt,$04 ; квитирование ; Подадрес = Digit 1 rcall WriteByte ; Передаем sbrc Fig,Ack ; Пропускаем следующую команду, rjmp rt ; если квитирование ;Повторяем mov tmpl, ttl
184 Глава 10 Листинг 10.3. Продолжение rcall Get7Segm ; Загружаем 7-сегментный код ; младшего полубайта rcall WriteByte ; Передаем цифру 4 rcall Stopp rjmp Initial ; Возвращаемся в начало программы erro: пор /Обработка ошибки квитирования inc tt /Увеличить на 1 cpi tt, 4 /Сравнить количество отказов brne vb /Если не равно то выход clr tmp out PORTB, tmp /Если сбой то сигнализация rcall stopp / Выводим условие завершения пор rcall w200 clr tt /Сброс ошибки vb: пор rjmp initial /Возвращаемся в начало программы Start: пор clz sbi DDRB,SDA / SDA = лог. 0: условие старта rcall wait4us / Цикл задержки WriteByte: пор / Запись байта в ведомое устройство clz sec / Флаг переноса С = 1 rol dbyt / Сдвигаем влево, C->LSB, MSB->C rjmp bitl / Особая обработка разряда 1 WriteBit: nop Isl dbyt / Если dbyt пустой, ... bitl: nop bre7 GetAck / ... то передача завершена sbi DDRB,SCL / SCL= лог. 0 Ниспадающий фронт SCL brcc WriteLow / Переход, если флаг С = 0 nop / Чтобы уравновесить время выполнения cbi DDRB,SDA / SDA-высокоомный Установка SDA в 1 rjmp SCL_High WriteLow: nop sbi DDRB,SDA / SDA = лог. 0 Установка SDA в 0 nop / Чтобы уравновесить длительность такта SCL_High: nop rcall wait4us / Цикл задержки cbi DDRB,SCL / SCL - высокоомный Ниспадающий фронт SCL WB1: nop sbis PinB,SCL /Состояние ожидания ведомого устройства? rjmp WB1 rcall wait5us / Цикл задержки
Бытовой цифровой термометр 185 Листинг 10.3. Продолжение rjmp WriteBit GetAck: nop / Считывание бита квитирования от ведомого sbi DDRB,SCL / SCL = лог. 0 Ниспадающий фронт SCL cbi DDRB,SDA / SDA - высокоомный SDA - / высокоомное состояние rcall wait5us / Цикл задержки cbi DDRB,SCL / SCL - высокоомный Нарастающий / фронт SCL GAI: nop sbis PinB,SCL / Состояние ожидания ведомого устройства rjmp GAI cbr Fig,l<<Ack / Флаг Аск = 0 sbic PinB,SDA / Если SDA = 1, sbr Fig,l<<Ack / флаг Аск = 1 rcall wait4us / Цикл задержки ret /Подпрограмма перекодировки данных из 7-ми сегм. кода Get7Segm: пор Idi ZH, high(2*prog3) Idi ZL, Low(2*prog3) Add ZL, tmpl 1pm mov dbyt, rO ret /Подпрограмма передачи флага STOP Stopp: nop / Вывод условия завершения sbi DDRB,SCL / SCL = лог. 0 Ниспадающий фронт SCL Sbi DDRB,SDA / SDA = лог. 0 / Установка SDA в 0 rcall wait5us / Цикл задержки cbi DDRB,SCL / SCL-высокоомный Установка SCL в 1 rcall wait5us / Цикл задержки cbi DDRB,SDA / SDA - высокоомный Нарастающий / фронт SCL rcall wait5us / Цикл задержки ret /Подпрограмма задержки 12 мкс Wait5us:nop / Цикл задержки 12 мкс при £=1,6МГц Idi time,2 W5: nop dec time /4x2 такта + rcall + ret brne W5 г ret
186 Глава 10 Листинг 10.3. Окончание /Подпрограмма задержки Wait4us: Idi time,1 W4: nop dec time brne W4 nop ; ret W200: nop /задержка 200 мс Idi tt, 0 Idi ttl, 0x35 6 мкс / Цикл задержки 6 мкс /3x1 такт + rcall /Задержка цикл /Задержка цикл при f=l,6 МГц + ret clc nn: subi subi tt, 1 ttl, 0 /Сброс флага переноса /Вычитаем 1 с заемом /Вычитаем с заемом brcc ret / Таблица .ORG $1FO nn 7-сегментных /Переход если сброшен кодов флаг переноса ргодЗ: . DB $3F, $06,$5В,$4F,$66,$6D,$7D,$07 /Шестнадцатеричные ; 0 . . 7 .DB $7F,$6F,$77,$7С,$39,$5Е,$00,$40 /Шестнадцатеричные /8..D,Е=пробел,Е=минус .DB $7F,$6F,$77,$7С,$39,$5Е,$79,$71 /Шестнадцатеричные ___________________/8..F_________________ Листинг 10.4. Шестнадцатеричный код тестовой программы :020000020000FC :0С00000009С0000000000000000000002В :100014000000992797ВВ98ВВ992797Е097ВВ0000ЕЕ :1000240020E02DBF31E0662791E098BB51E145E225 : 10003400752F72957F70842F82958F70000027E74В :100044006BD00000BA9AA2D0BA980000B29BFDCF40 :100054009DD08894B1990894221F98F70000BA9A09 :1000640030FF02C0B99802C00000B99A00008ED0D7 :10007400ВА980000В29BFDCF89D07FD0000026Е75С :100084004BD030FD06C020E04BD030FD02C027E449 :1000940047D0000072D030FDF1CF26E73DD030FDCF :1000A4002FC021E03DD030FD2BC0052F0F705ED056 :1000B40037D063D026E730D030FD22C022E030D0E4 :1000C40030FDF7CF082F52D02BD057D026E724D0BD :1000D40030FD16C023E024D030FDF7CF042F0F707D :1000E40045D01ED04AD026E717D030FD09C024E001
Бытовой цифровой термометр 187 лМЙМИММВИД^ :1000F40017D030FDF7CF072F39D012D03ED08FCF95 :1001040000006395643031F4992798BB36D0000021 :1001140049D06627000083CF00009894B99A3CD058 :10012400000098940894221F02C00000220F0000CF : 1001340081F0BA9A18F40000B99803C00000B99A83 :100144000000000029D0BA980000B29BFDCF1ED059 : 10015400ECCF0000BA9AB99819D0BA980000B29BB3 :10016400FDCF3E7FB199316017D008950000F3E0D0 :10017400E0EEE00FC895202D08950000BA9AB99AD0 :1001840005D0BA9803D0B99801D00895000012E0C0 : 1001940000001A95E9F7089511E000001A95E9F7AF :1001А40000000895000060Е075Е388946150705089 :0401B400E8F70895CB :1003E0003F065B4F666D7D077F6F777C395E00400F :0803F0007F6F777C395E7971A3 :00000001FF____________________________________________________ Эта программа выводит на дисплей цифры +25, микроконтроллер устанавливается в панельку, и затем включается питание. Если тест прошел без проблем, то в микроконтроллер записывается рабочая про- грамма (см. листинг 10.1 и листинг 10.2) (микроконтроллер в панельку не устанавливается), после чего необходимо настроить канал измерения. В этом случае правильные показания температуры настраиваются в следующей последовательности. 1. Терморезистор или термопару опустить в воду и заморозить в ста- кане в морозильной камере холодильника. При этом выводы термо- датчика изолированы термоусадочной трубкой и не должны касать- ся какой-либо поверхности. 2. После заморозки необходимо подобрать резистор R2, равный по со- противлению замороженному датчику. 3. Установив замороженный датчик в схему и включив питание, заме- ряем напряжение на выводе 6 операционного усилителя. Нулевому показанию температуры должно соответствовать напряжение 0,58 В на этом выводе. В противном случае оно регулируется с помощью резисторов R6 и R9. 4. Для установки коэффициента усиления Ку = 13 операционного уси- лителя, необходимо припаять навесным монтажом резистор 6 кОм от 6 вывода ОУ IC3 к выводу 2 IC3 (на схеме резистор имеет обо- значение **, поскольку подбирается с высокой точностью при на- стройке канала измерения). Для улучшения чувствительности мож- но добавить положительную обратную связь. При снижении темпе-
188 Глава 10 ратуры напряжение снижается, а при увеличении температуры — увеличивается. 5. Проверка работы. ОУ во всем диапазоне температур и регулировка с помощью R9, ПОС и ООС изменения выходного напряжения ОУ. Данные по напряжению соответствуют таблице Расчет характе- ристик терморезистора. xls (последний сектор). 6. Устанавливается микроконтроллер с “прошитой” рабочей програм- мой, подается питание и проверяются осциллограммы SDA (канал В), SCL (канал А) при развертке 100 мс и 200 мс, а также показания температуры. Небольшая коррекция температуры достигается настройкой рези- стора R4. В случае возникновения большой погрешности на разных уча- стках показания температуры необходима коррекция программным пу- тем. Если при включении питания происходят сбои, то к выводам 1 и 4 микроконтроллера припаивается конденсатор на 10 нФ. При изготовлении прибора на SMD-элементах себестоимость мож- но снизить в два раза. Прибор является попыткой преодолеть различные проблемы путем математического моделирования с помощью совре- менных средств. Математические преобразования выполнены на языке ассемблера из-за ограничения в ресурсах и размерах памяти микрокон- троллера Tiny 15. Для дальнейшего улучшения характеристик измерения температуры необходимо реализовать два канала измерения (отдельно для положительной и отрицательной температуры) с хорошими линей- ными передаточными характеристиками, а также задействовать более производительный микроконтроллер.
___________Глава 11________ Автомат ночного освещения Во многих многоэтажных домах на лестничной клетке круглосу- точно горит освещение, попусту тратя драгоценную электроэнергию. Кроме того, ресурс лампочки ограничен (автор регулярно их меняет раз в два месяца). Эту ситуацию можно исправить, установив автомат ноч- ного освещения. Такой автомат можно использовать как автономно для одной нагрузки, так и для нескольких (например, в пригородном доме для освещения периметра дома или крыльца в ночное время). Питание автомата осуществляется от той же сети, в которой находится нагрузка. Автор рассмотрел три вида конструкций: • для светильника лестничной клетки (рис. 11.1); • для светильников приусадебного хозяйства (рис. 11.2); • для светильника на крыльце или пороге дома (рис. 11.3). Рис. 11.1. Конструкция для светильника лестничной клетки Каждый из вариантов построен на базе одной схемы, но имеет раз- личные программы управления, которые точно выполняют поставлен- ные задачи. Например, на лестничной клетке необходимо наибольшее
190 Глава 11 время освещения и более грубая чувствительность к дневному свету. В приусадебном хозяйстве по периметру участка необходимо наимень- шее время освещения и повышенная чувствительность к свету. На крыльце дома жестких требований нет, поэтому чувствительность должна регулироваться в широком диапазоне коэффициента усиления. Рис. 11.2. Конструкция для светильников приусадебного хозяйства Автомат (рис. 11.4) имеет ручную регулировку уровня срабатыва- ния освещения, отслеживает уровень напряжения сети для защиты на- грузки. В основе схемы применен микроконтроллер ATtinyl5 от компа- нии Atmel [3], оснащенный Flash-памятью на 1 Кбайт, памятью EEPROM на 64 байт, шестью линиями ввода-вывода, встроенным RC- генератором, а также АЦП, аналоговым компаратором и двумя тайме- рами/счетчиками. Структурная схема автомата представлена на рис. 11.5. Главная идея заложена в аналого-цифровом преобразовании. Если аналогичные схемы [22] используют в качестве компаратора операционный усили- тель, то в рассматриваемом автомате эту функцию выполняет микро- контроллер.
Автомат ночного освещения 191 Рис. 11.3. Конструкция светильника на крыльце или пороге дома Рис. 11.4. Плата автомата ночного освещения
192 Глава 11 Рис. 11.5. Структурная схема автомата ночного освещения Внешнее управление позволяет изменять уровень срабатывания в широких пределах. Систему можно настроить на различные варианты применения. Также не исключается ручное регулирование уровня сра- батывания и, как дополнительная функция, — защита от перенапряже- ния сети. В питающей сети очень часто наблюдаются значительные броски. На осциллограмме, представленной на рис. 11.6, видны всплески негар- монического напряжения в сети, которые достигают значительных уровней напряжения. Рис. 11.6. Осциллограмма бросков в сети
Автомат ночного освещения 193 При этом в нагрузку (лампочку) подается большая мощность, и, со- ответственно, нить накаливания еще более раскаляется и сгорает. Авто- мат реализует режим мониторинга напряжения сети и отключает на- грузку в случае сбоя. Кроме того, включение и выключение лампы про- изводится при переходе через ноль переменного напряжения сети 220 В. Такой процесс исключает резкий рост тока нити накаливания, который выводит из строя лампу во время включения. Для разработки и понимания работы схемы, согласно теории, ис- пользуются некоторые свойства дневного света. Физика света Солнечное излучение на некоторых длинах волн полностью дохо- дит до земли, в то время как на других длинах волн почти целиком по- глощается [25]. Диапазон видимого света одновременно соответствует и максимальному уровню солнечного излучения, и максимальной про- зрачности атмосферы. По-видимому, на Земле живые организмы, обла- дающие зрением, ориентированы на эти два максимума. Для приема светового потока применен фототранзистор, чув- ствительный именно к дневному свету. К сожалению, выбор фо- тодатчиков невелик (рис. 11.7). Автор смог найти в продаже фо- торезисторы СФ2-2, СФ2-6, ФР- 7640581 и фотодиод импортного производства. Характеристики одиночных фотоэлементов недостаточно хо- роши для практического исполь- зования, однако применение спа- Рис. 11.7. Фотодатчики ренных и даже включенных параллельно датчиков дает хороший ре- зультат по требуемым показателям чувствительности [22]. Для практического применения автор поставил следующий экспе- римент. Фоторезистор СФ2-6, помещенный на балконе восьмого этажа, был подключен через усилитель к цепи питания. На нагрузке (напряже- ние измеряется на выводе 1 микросхемы IC2A — см. рис. 11.8) наблю- дались изменения тока с 19:14 до 20:47 (месяц август в момент наи- большего изменения освещенности дневного света) (табл. 11.1). По субъективному мнению автора, сумерки, при которых человеческое зрение плохо различает объекты, наступают:
194 Глава 11 • на лестничной клетке — при 4,5 В фотодатчика; • на улице — при 2,86 В; • полная темнота — при 2,2 В. Таблица 11.1. Результаты измерений изменений тока через фоторезистор СФ2-6 Минуты Секунды Рабочая минута Уровень, VDC 14 43 0 4,89 16 22 2 4,87 18 2 4 4,84 19 42 5 4,91 21 21 7 4,95 23 1 9 4,96 24 40 10 4,98 26 20 12 5,08 27 59 13 5,02 29 39 15 4,99 31 18 17 4,81 32 58 18 5,03 34 37 20 5,08 36 17 22 5,04 37 56 23 5,05 39 35 25 5,08 41 15 27 5,01 42 54 28 5 44 34 30 5,06 46 13 32 4,98 47 53 33 4,92 49 33 35 5,1 51 13 37 4,94 52 53 38 5,19 56 12 42 5,12 57 51 43 5,07 59 31 45 5,1 1 10 47 5,07 2 50 48 4,9 4 29 50 5,02 6 9 52 5,01
Автомат ночного освещения 195 Таблица 11.1. Окончание Минуты Секунды Рабочая минута Уровень, VDC 7 48 53 4,95 9 28 55 4,83 11 7 57 4,9 12 47 58 4,91 16 6 62 3,46 17 45 63 2,86 19 25 65 2,53 22 44 68 2,16 26 3 72 1,76 27 42 73 1,72 29 22 75 1,72 31 1 77 1,61 32 41 78 1,58 34 20 80 1,56 36 0 82 1,62 37 39 83 1,55 39 19 85 1,42 40 58 86 1,4 42 38 88 1,43 44 18 90 1,38 45 57 91 1,38 47 36 93 1,4 Исходя из табл. 11.1, фотодатчик фиксирует свет до уровня 1,4 В (напряжение измеряется на выводе 1 микросхемы IC2A). Это говорит о наличии инфракрасных лучей, невидимых человеческому зрению, но зафиксированных фотодатчиком. Можно было бы ориентироваться на эти данные, однако разряд- ность АЦП микроконтроллера составляет 10 разрядов, что не позволит получить дискретность для точности измерений. Микроконтроллер не сможет различить уровень 0,088 и 0,064 В, поэтому данные от фотодат- чика были пропущены через усилитель сигнала уровня. Схема автомата ночного освещения Схема автомата ночного освещения представлена на рис. 11.8. Пи- тание схемы управления осуществляется от сети к которой подключена нагрузка.
иинэГпэаэо ojOHhOH eienoiae ешэхэ ‘8Ц, эи^ Фотормистор I. j. bsbuj 961
Автомат ночного освещения 197 Для достижения падения напряжения с 220 В до 9 В установлено реактивное сопротивление. Поскольку ток потребления схемы не пре- вышает 80 мА, мощности гасящих резисторов R1 и R18 достаточно для питания схемы. ©Файл Расчет питания схемы ночного освещения, xls можно найти на прила- гаемом к книге компакт-диске в папке Расчеты. Стабилитрон D1 выполняет роль стабилизатора напряжения и со- вместно с конденсатором СЗ выравнивает пульсации по питанию. Ми- нимальный ток стабилизации — 25 мА при питании 9 В. Если нагрузка потребляет ток более 80 мА, то напряжение стабилизации 9 В падает до 6 В, и D1 отключается от потребления тока. Если наоборот, растет на- пряжение сети, то стабилитрон D1 потребляет больше тока, который рассеивает в тепло. Роль стабилизатора работы микроконтроллера выполняет микро- схема IC3. Поскольку микроконтроллер потребляет ток не более 30 мА, то IC3 выбрана в миникорпусе ТО92. Отдельно для измерения сети выделена цепь делителя напряжения R2, R3. Измерения пульсации и детектор нуля реализованы при считы- вании уровня напряжения на R3. В случае перенапряжения сети растет уровень импульса на конденсаторе С4, и микроконтроллер отключает нагрузку на 5 с. Максимальное напряжение на R3 не превышает 3 В. Для исключения импульсных помех, создаваемых открытием семи- стора, микроконтроллер считывает данные напряжения сети и выделяет переход через ноль. В этот момент микроконтроллер открывает оптопа- ру ОК.2, и семистор во время роста тока сети открывается. Аналогич- ным образом происходит закрывание семистора. Для настройки автомата, предусмотрена кнопка “Сброс”, таким об- разом, сброс микроконтроллера происходит при выключении питания или принудительно с помощью кнопки. Функцию изменения режима эксплуатации устройства выполняет переключатель “Двор/Лестница”. Микроконтроллер, считывая уровень в порту РВО, переключает режим программы. Данные об освещенности местности поступают от фоторезистора R7. Для исключения самовозбуждения схемы, параллельно фоторези- стору установлен резистор R20, который ухудшает чувствительность, однако самовозбуждение входного операционного усилителя прерыва- ется, а схема входного каскада усиления получает простую ц надежную структуру. Операционный усилитель IC2B усиливает уровень освещен- ности, и подает его на IC2A. IC2A имеет регулировку усиления R8, для настройки уровня освещенности вручную.
198 Глава 11 Операционный усилитель используется при усилении порога чувст- вительности. При полном освещении (дневной свет) ОУ выходит в ре- жим насыщения, при этом функции усиления не нужны. АЦП микроконтроллера (вход РВ4) считывает данные по уровню напряжения и, согласно режиму программы, включает или отключает семистор. Как только лампа включена, освещенность местности изменя- ется, на что реагирует фотодатчик. В этом случае существуют два спо- соба управления: • отключение лампы на короткое время и считывание уровня осве- щенности; • считывание уровня освещенности во время свечения лампы и сни- жение уровня срабатывания путем коррекции данных. В программе реализован первый из двух методов, который хорош для лестничной клетки, но неприемлем для улицы, поскольку лампы могут быть галогенные или наполненные газом. Включение/вык- лючение отрицательно влияет на работу таких ламп. К тому же, они требуют длительного разогрева. Программа Блок схема алгоритма представлена на рис. 11.9. Программа (ас- семблерный код — в листинге 11.1, шестнадцатеричный — в листин- ге 11.2) начинается с настройки таймера и портов ввода-вывода. АЦП микроконтроллера содержит встроенный мультиплексор, который ком- мутирует измеряемые каналы. Соответствующие проектные файлы AVR Studio 4 можно найти на прилагаемом К книге компакт-диске в папке Программы\ 11 - Автомат освещения Вначале проверяется АЦП1. Считываются данные по перенапряже- нию сети. АЦП выполняет четыре выборки и получает их среднее арифметическое. Если в сети не более % 240 В, то состояние порта В не изменяется, в противном случае порт В обнуляется. Отсчитывается пауза в пять минут и проверяется переход через ноль сети. Лампа отключается, проверяется фотодатчик. Опорное на- пряжение для АЦП получают с вывода питания микроконтроллера. В процессе аналого-цифрового преобразования двоичное число Z вы- числяется по уравнению Z = 1024*UBx/UREF. Для режима “Лестница” UBx = 4,5 В; UreF = VCc- Для микрокон- троллера Tinyl 5 Z = 37616. Для режима “Улица” UBX = 2,8 В; UREF = VCc- Для микроконтролле- ра Tiny 15 Z = 22#716.
Автомат ночного освещения 199 Рис. 11.9. Блок-схема алгоритма управления автоматом ночного освещения
200 Глава 11 Листинг 11.1. Ассемблерная программа для управления автоматом ночного .include "C:\Program Files\Atmel\AVR Studio\Appnotes\tnl5def.inc" /Микроконтроллер: AVR tinyl5. /Тактовая частота: 1.6 МГц /Питание: стабилизированное 5 В list def tt = r22 / Рабочий регистр def ttl = r23 / Рабочий регистр def tt2 = r24 / Рабочий регистр def dig4 = r20 / Рабочий регистр def dig5 = r28 / Рабочий регистр * * * * * Регистровые переменные def tmp = r21 def tmpl = rl6 / Рабочий регистр def tmp2 = rl9 / Рабочий регистр def tmp3 = r26 / Рабочий регистр def tmp4 = r27 / Рабочий регистр def X = r25 / Рабочий регистр def Y = rl7 / Рабочий регистр def M = rl8 / Рабочий регистр . cseg . org 0 rjmp пор RESET ;rjmp EXT—INTO прерывание не используется пор ;rjmp EXT—PIN прерывание не используется пор / rjmp TIME_OVFO прерывание от таймера пор / rjmp EE_RDY прерывание от таймера пор ; rjmp ANA—COMP прерывание не используется .org 10 /настройка порта В RESET: пор clr tmp / Сброс регистра out DDRB, tmp out PORTB, tmp /обнулить порт В clr tmp Idi tmp, $02 /РВ1-выход out DDRB, tmp /иниацилизация стека Idi tt,Low(RAMEND) / Функция вспомогательного / регистра out SPL, tt / Инициализируем указатель стека
Автомат ночного освещения 201 Листинг 11 Л. Продолжение ;Начало программы clr tt nStart: nop clr tmpl Idi tmpl, $01 /внутренний источник, вход ADC1, ; проверка 240В rcall adcn /получение данных АЦП млб-1тр2 CT6-tmp3 cis cpi tmp3, $03 /сброс знака /проверка больше 240 В brio fog clr tmp4 out portb, tmp4 /обнуление порта В fog: nop rcall zaderl /задержка 1 секунда nop rcall zaderl /задержка 1 секунда nop rcall zaderl /задержка 1 секунда cis /сброс знака cpi tt, $АА /проверка больше 5 минут brsh dd inc tt rjmp nStart /проверка перехода через ноль переменного напряжения, dd: пор clr tt clr tmpl vb: Idi tmpl, $02 /внутренний источник, вход ADC1, / проверка 0B rcall cis adcn /получение данных АЦП млб-1тр2 стб-tmpS /сброс знака cpi tmp3, $00 /проверка менее 100 В breq we rjmp dd we: nop cpi tmp2, $0A /проверка больше 10 В brsh dd clr tmp4 /при проверке уровня отключить семистор out portb, tmp4 /отключение семистора nop rcall zaderl /задержка 1 секунда nop rcall zaderl /задержка 1 секунда nop /проверка уровня фотодатчика, отключение семистора clr .tmpl
202 Глава 11 Листинг 11.1. Продолжение Idi tmpl, $03 /внутренний источник, вход ADC1, /уровень фотодатчика rcall adcn /получение данных АЦП млб-1тр2 CT6-tmp3 cis /сброс знака in ttl, portb /проверка режима включения двор-лестница andi ttl, $01 cpi ttl, $01 breq sf Idi dig4, $00 rcall dcd rjmp rd /режим двор sf: nop Idi dig4, $02 rcall dcd /режим лестница rd: nop rcall zaderl /задержка 1 секунда nop rcall zaderl /задержка 1 секунда nop rcall zaderl /задержка 1 секунда nop ; не полная операция вычитания двухбайтных чисел cis /сброс флага знака sub dig5, tmp2 /вычитаем табличное значение и /нижний уровень brpl wwe dec dig4 /заем от старшего байта wwe: : nop cis /сброс флага знака sub d?g4, tmp3 /вычитаем табличное значение и /верхний уровень brmi uuu /если минус выключить семистор nop rjmp et uuu: : nop cis /сброс cpi dig5, $0A флага знака brlt et /уровень света меньше установленного+10 clr tmp4 out portb, tmp4 rjmp nStart /отключить семистор et: nop clr tmpl /•проверка перехода через ноль переменного напряжения. vv: Idi tmpl, $02 /внутренний источник, вход ADC1, /проверка 0В
Автомат ночного освещения 203 ’ -''У': '• •- -Ж- > ’' •' • *ЙЫ rcall adcn /получение данных АЦП млб-Ътр2 стб-ЪтрЗ cis /сброс знака cpi tmp3, $00 /проверка менее 100 В breq we rjmp et Idi tmp4, $02 out portb, tmp4 /включить семистор rjmp nStart /Подпрограмма задержки 1 С zaderl: nop wdr * /сброс сторожевого таймера clr M /начальный сброс константы clr Y /начальный сброс константы Idi Y, $62 /первая константа цикла goo: пор Idi М, $62 dm: пор Idi X, $62 /третья константа цикла пор goq: пор пор dv: пор wdr пор dx: dec Y пор пор пор пор пор brpl dx /проверка условия пор пор cln dec X brpl dv /проверка условия cln dec M пор brne dm /проверка условия ret /Настройка adcn: пор пор clr АЦП tmp
204 Глава 11 Листинг 11 Л. Продолжение awe: пор cpi tmp r $ 0 4 /считывание АЦП 4-раза brsh ass /более 4-х раз пор out ADMUX, tmpl /коммутация входов АЦП clr tmp2 clr tmp3 Idi tt2, $C5 /одиночное, запуск, 1/32 out ADCSR, tt2 /запуск АЦП на преобразование ;Сохранение данных АЦП in tmp2, ADCL /чтение младшего байта АЦП in tmp3, ADCH /чтение старшего байта АЦП mov r2, tmp2 /запомнить временно mov r3, tmp3 /запомнить временно mov r4 f r2 /запомнить временно mov r5, r3 /запомнить временно mov r6, r4 /запомнить временно mov r7 , r5 /запомнить временно inc tmp /увеличить на 1 rjmp awe ;среднее арифметическое действие ass: nop clr r8 /для младшего байта clc /сброс флага переноса add tmp2, r2 /сложение с предыдущим adc r9, r8 /сложение с переносом add tmp2, r4 /сложение с предыдущим adc r9, r8 /сложение с переносом add tmp2, r6 /сложение с предыдущим adc r9, r8 /сложение с переносом clc Isr r9 /сдвиг вправо ror tmp 2 /сдвиг вправо через перенос Isr r9 /сдвиг вправо ror tmp 2 /сдвиг вправо через перенос clr r9 clc ; для старшего байта add tmp3, r3, /сложение с предыдущим adc r9, r8 /сложение с переносом add tmp3, r5 /сложение с предыдущим adc r9, r8 /сложение с переносом add tmp3, r7 /сложение с предыдущим adc r9, r8 /сложение с переносом clc
Автомат ночного освещения 205 Листинг 11.1. Окончание Isr ror Isr ror nop ret r9 tmp3 r9 tmp3 ;сдвиг вправо ;сдвиг вправо через перенос ;сдвиг вправо ;сдвиг вправо через перенос ;младший байт tmp2, старший tmp3 ;подпрограмма декодирования данных уровня освещения dcd: nop Idi ZH, high(2 *prog2) ;старший байт адреса Idi ZL, Low(2* prog2) ;младший байт адреса Add ZL, dig4 ;увеличение адреса на константу 1pm ;чтение младшего полубайта mov dig4, rO Idi ZH, high(2 *prog2) /старший байт адреса Idi ZL, Low(2* prog2) /младший байт адреса Add ZL, dig4 /увеличение адреса на константу inc ZL /увеличение адреса на единицу 1pm /чтение старшего полубайта mov dig5, rO ret ;таблица уровня освещения . ORG $1BC prog2 .DB $02, $27,$03,$76 Листинг11.2. Шестнадцатеричный код программы для управления : . автоматом ночного освещения ' : 020000020000FC :0С00000009С0000000000000000000002В : 100014000000552757ВВ58ВВ552752Е057ВВ60Е03В :100024006DBF66270000002701E074D0C894A33098 : 1000340010F0BB27B8BB00004DD0000O4BD000002F : 1000440049D0C8946A3A10F46395ECCF000066274F : 1000540O0027 02E05FD0C894A03009F0F7CF000079 :100064003A30A0F7BB27B8BB000034D0000032D030 :100074000000002703E04ED0C89478B3717071304В :1000840019F040E07AD003C0000042E076D00000CE :1000940021D000001FD000001DD00000C894C31B55 :1000A4000AF44A950000C8944A1B12F0000007C0E5 :1000B4000000C894CA301CF0BB27B8BBB3CF000003 :1000C400002702E027D0C894A03049F2F8CFB2E06C : 1000D400B8BBA8CF0000A8952227112712E600007C : 1000E40022E6000092E60000000000000000A8954F
206 Глава 11 Листинг 11.2. Окончание "ТГо О О F 40О00О01А95000000000 00000000000 CAF7 8 С :1001040000000000А8949A958AF7A8942A95000004 : 1001140041F708950000000055270000543080F492 :10012400000007B93327AA2785EC86B934B1A5B1F5 :10013400232E3A2E422C532C642C752C5395EDCF4О :10014400000088248894320D981C340D981C360DB8 :10015400981С889496943795969437959924889406 :10016400A30D981CA50D981CA70D981C8894969413 :10017400А7959694А795000008950000F3E0E8E79A : 100184 00E4QFC8 954 02DF3E0E8E7E4 0FE3 95C8954 4 :04019400C02D0895DD :0403780002270376DF :00000001FF ______________________________________________ Программа при проверке уровня фотодатчика использует метод вы- читания. Поскольку АЦП при считывании уровня выдает двухбайтное число, необходима операция сравнения двух двухбайтных чисел. Мик- роконтроллер ATtinyl5 имеет ограниченный ресурс памяти и длины ко- манд, поэтому автор применил метод вычитания (т.е. из полученных с АЦП данных вычитается заданная константа и определяется поле до- пуска чисел). Для каждого из режимов работы константа имеет свое зна- чение и записана в конце программы. Для данной программы поле допуска — 10 единиц АЦП (Ai6). Если результат вычитания — в поле допуска, то необходимый уровень дос- тигнут. Если результат вычитания больше поля допуска и имеет поло- жительное значение, то уровень выше заданного. Если результат вычи- тания больше поля допуска и имеет отрицательное значение, то уровень ниже заданного. Таким образом, имитируется работа аналогового ком- паратора. При этом программа микроконтроллера написана простыми математическими функциями, не требующими значительных ресурсов. Если уровень света выше установленного режима, то лампа не включается, если же ниже — активизируется порт В, и лампа включает- ся. Включение производится по переходу через ноль сети. Дальше цикл повторяется. Переход через ноль допускается на уровне ±10 В. Такой уровень напряжения не влияет на нагрев нити накаливания лампы, создает усло- вие включения семистора и не создает импульсных помех при коммута- ции нагрузки. В каждом цикле проверяется режим программы, и изме- няется уровень срабатывания согласно выбранному режиму. В случае сбоя микроконтроллер по нажатию кнопки “Сброс” переводится в нача- ло программы.
Автомат ночного освещения 207 Плата Монтажная схема платы представлена на рис. 11.10, а схема развод- ки проводников с двух сторон — на рис. 11.11. Рис. 11.10. Монтажная схема платы управления автоматом ночного освещения Плата изготовляется из двухстороннего металлизированного тек- столита и устанавливается на пластмассовые ножки для изоляции от корпуса. Микросхемы IC1 и IC2 установлены на панельки для поэтап- ной настройки платы. На плате присутствуют разъемы PTR-500 (разной конфигурации и цвета, чтобы не перепутать провода) для подсоедине- ния питания сети, нагрузки и фотодатчика. Автор собрал автомат навесным монтажом на макетной плате. Ее компоненты: • фотодатчик — фоторезистор СФ2-6; • операционный усилитель — TL062 (два усилителя в одном корпусе) или любой с низковольтным питанием и низким дрейфом нуля; • стабилитрон D1 — Д815Г в металлическом корпусе на напряжение стабилизации 9 В (при настройке можно установить на радиатор 50 мм2); • резисторы мощностью 0,125 Вт;
208 Глава 11 • переменные резисторы — миниатюрные, маломощные на 10 кОм; • резисторы R1 и R18 — по 200 Ом на 2 Вт (при настройке возможно увеличение мощности рассеивания); • конденсатор ХС1 — составной: два параллельно включенных кон- денсатора с номиналом 0,68 мкФ х 350 В; • конденсатор С2 — на 0,1 мкФ х 350 В; • остальные конденсаторы — любые на напряжение 9 В • светодиоды — любые на ток 5 мА; • стабилизатор 5 В — микросхема 78L05 в миниатюрном корпусе; • кнопка “Сброс” и переключатель режимов — обязательно с пласти- ковой ручкой; • предохранительная колодка F1 имеет пластиковый корпус для ис- ключения касания с элементами предохранителя; • предохранитель для лампы 60 Вт — на 1 А; • выпрямительный мост В2 — КВР08, но можно применить любой отечественный мост на ток до 500 мА и обратное напряжение 220 В; • оптосемистор МОСЗ 063; • семистор ВТ136, без радиатора для лампы 60 Вт. Рис. 11.11. Схема разводки платы управления автоматом ночного освещения
Автомат ночного освещения 209 Настройка Настройка автомата состоит из трех этапов. 1. Вначале настраивается канал измерения. Для питания схемы под- ключается нестабилизированное постоянное напряжение 9 В к точ- ке А в соответствии с полярностью схемы. Проверяется на нагрев стабилитрон D2. Проверяется напряжение после IC3: 5 В. 2. Проводится тест “прошивки” микроконтроллера. Записывается тес- товая программа, представленная в листинге 11.3 (ассемблерный код) и листинге 11.4 (шестнадцатеричный код), и включается мик- роконтроллер. На оптопару в течении двух минут подается сигнал управления, потом — пауза на две минуты, отключение оптопары и еще одна пауза на две минуты. Цикл повторяется бесконечно. При проверке устраняются дефекты схемы. Далее записывается рабочая программа (см. листинги 11.1 и 11.2) и ранним утром или вечером настраивается уровень срабатывания автомата. Вручную регулиру- ется значение R8. Если необходимо изменить уровень в больших пределах, подбирается R10. Для лучшей чувствительности фотодат- чик выносится на освещенное место, а к его ножкам припаивается экранированный провод, который затем подводится к автомату. Улучшения чувствительности можно добиться, если подсоединить два фотодатчика параллельно. ©Проектные файлы AVR Studio 4 тестовой программы можно найти на прилагае- мом к книге компакт-диске в папке Программы\11 - Автомат освещения. 3. Настройка схемы питания. В зависимости от уровня сети подбира- ется ХС1, после чего автомат без микроконтроллера включается в сеть 220 В и проверяется напряжение на R3. Если напряжение бо- лее 3 В, то параллельно R3 необходимо установить стабилитрон на 3,3 В. Автомат выключается из сети и проверяются на нагрев эле- менты D2, R1 и R18. При необходимости мощность рассеивания ре- зисторов увеличивается, а стабилитрон устанавливается на радиа- тор. Внимание! Схема не имеет гальванической развязки! Настройка и проверка во время включе- ния в сеть 220 В должна выполняться по всем правилам техники безопасности. Нельзя прикасаться к любым элементам схемы незащищенной поверхностью рук и тела! Измерительные приборы и инструмент должны иметь изоляцию. Если при проверке используется осциллограф, необходима гальваническая развязка по об- щему проводу. Если всплески напряжения происходят часто, подбирается R1, R18.
210 Глава 11 Листинг113. Тестоваяассемблерная программа для автоматам ночного? 111^ .include "C:\Program Files\Atmel\AVR Studio\Appnotes\tnl5def.inc" /Микроконтроллер: AVR tinyl5. /Тактовая частота: 1.6 МГц /Питание: стабилизированное 5 В . list def tt = r22 t Рабочий регистр def ttl = r23 Рабочий регистр def tt2 = = r23 Рабочий регистр def dig4 = r20 Рабочий регистр * * * ★ * Регистровые переменные def tmp =r21 def tmpl = Г16 9 Рабочий регистр def tmp 2 = rl9 9 Рабочий регистр def tmp3 = r26 9 Рабочий регистр def tmp 4 = r27 9 Рабочий регистр def X = r25 9 Рабочий регистр def Y = rl7 9 Рабочий регистр def M = rl8 9 Рабочий регистр . cseg . org 0 rjmp пор RESET /rjmp EXT—INTO прерывание не используется пор /rjmp EXT—PIN прерывание не используется пор /rjmp TIME—OVFO прерывание от таймера пор / rjmp EE—RDY прерывание от таймера пор /rjmp ANA—COMP прерывание не используется .org 10 /настройка порта В RESET: пор clr tmp / Сброс регистра out DDRB, tmp out PORTB, tmp /обнулить порт В clr tmp Idi tmp, $02 /PBl-выход out DDRB, tmp /иниацилизация стека Idi tt,Low(RAMEND) / Функция вспомогательного / регистра out SPL, tt Инициализируем указатель стека /Начало программы
Автомат ночного освещения 211 Ли<ггйнг1^<Ь^дЬгокёнйё.'г clr tt nStart: nop clr tmpl Idi tmpl, $01 /внутренний источник, вход ADC1, ; проверка 240В rcall adcn /получение данных АЦП млб-Ьтр2 стб-tmpS cis /сброс знака cpi tmp3, $A9 /проверка больше 240 В brio fog clr tmp4 out portb, tmp4 fog: nop rcall zaderl /задержка 0,15 секунда nop rcall zaderl /задержка 0,15 секунда nop rcall zaderl /задержка 0,15 секунда nop rca»ll zaderl /задержка 0,15 секунда nop cis /сброс знака cpi tt, $AA /проверка больше 5 минут brsh dd inc tt rjmp nStart dd: nop clr tmpl vb: Idi tmpl, $02 /внутренний источник, вход ADC1, /проверка OB rcall adcn /получение данных АЦП млб-Ьтр2 CT6-tmp3 cis cpi tmp3, $00 breq we rjmp dd /сброс знака /проверка менее 100 В we: nop cpi tmp2, $0A /проверка больше 10 В brsh dd clr tmp4 /отключить семистор out portb, tmp4 rcall zaderl /задержка 0,15 секунда пор rcall zaderl /задержка 0,15 секунда пор rcall zaderl /задержка 0,15 секунда пор rcall zaderl /задержка 0,15 секунда
212 Глава 11 Листинг 11.3. Продолжение ddl: nop clr tmpl vbl: Idi tmpl, $02 /внутренний источник, вход ADC1, /проверка OB rcall adcn /получение данных АЦП млб-1тр2 CT6-tmp3 cis /сброс знака cpi tmp3, $00 /проверка менее 100 В breq wel r-jmp ddl wel: nop cpi tmp2, $0A /проверка больше 10 В brsh ddl Idi tmp4, $02 out portb, tmp4 rcall zaderl /включить семистор /задержка 0,15 секунда пор cis /сброс знака cpi tt, $АА /проверка больше 5 минут brio ddl inc tt rjmp nStart /Подпрограмма задержки 1 С zaderl: nop wdr clr M clr Y Idi Y, $62 goo: nop Idi M, $62 dm: nop Idi x, $62 nop goq: nop nop dv: nop wdr nop dx: dec Y nop nop nop nop nop nop brpl dx nop
Автомат ночного освещения 213 Листинг 11.3. Продолжение пор cln dec X brpl dv пор пор cln dec M пор brne dm ret /Настройка АЦП adcn: пор пор clr tmp awe: nop cpi tmp, $04 /считывание АЦП 4-раза brsh ass /более 4-х раз out ADMUX, tmpl /коммутация входов АЦП clr tmp 2 clr tmp3 Idi tt2, $C5 /одиночное, запуск, 1/32 out ADCSR, tt2 /запуск АЦП на преобразование /Сохранение данных АЦП in tmp2, ADCL /чтение младшего байта АЦП in tmp3, ADCH /чтение старшего байта АЦП mov r2, tmp2 . , /запомнить временно mov r3, tmp3 /запомнить временно mov г4, г2 /запомнить временно mov г5, гЗ /запомнить временно mov гб, г4 /запомнить временно mov г7, г5 /запомнить временно inc tmp /увеличить на 1 rjmp awe /среднее арифметическое действие ass: пор clr г8 /для младшего байта clc /сброс флага переноса add tmp2, г2 /сложение с предыдущим adc г9, г8 /сложение с переносом add tmp2, г4 /сложение с предыдущим adc г9, г8 /сложение с переносом add tmp2, г6 /сложение с предыдущим
214 Глава 11 Листинг 11.3. Окончание adc r9, r8 /сложение с переносом clc Isr r9 /сдвиг вправо ror tmp 2 /сдвиг вправо через перенос Isr r9 /сдвиг вправо ror tmp 2 /сдвиг вправо через перенос clr r9 clc ;для старшего байта add tmp3, r3 /сложение с предыдущим adc r9, г8 /сложение с переносом add tmp3, г5 /сложение с предыдущим adc г9, г8 /сложение с переносом add tmp3, г7 /сложение с предыдущим adc г9, г8 /сложение с переносом clc Isr г9 /сдвиг вправо ror tmp3 /сдвиг вправо через перенос Isr г9 /сдвиг вправо ror tmp3 /сдвиг вправо через перенос nop /младший байт tmp2, старший tmp3 ret Листинг 11.4. Шестнадцатеричный код тестовой программы для управления автоматом ночного освещения :020000020000FC :0С00000009С0000000000000000000002В :100014000000552757ВВ58ВВ552752Е057ВВ60Е03В :100024006DBF66270000002701E05ED0C894A93A9E :10003400±0F0BB27B8BB000034D0000032D0000061 :1000440030D000002ED00000C8946A3A10F46395В2 :10005400E9CF0000002702E047D0C894A03009F09F :10006400F8CF00003A30A8F7BB27B8BB1AD000007D :1000740018D0000016D0000014D00000002702E0C1 :1000840033D0C894A03009F0F8CF00003A30A8F774 :10009400B2E0B8BB06D00000C8946A3A70F3639526 :1000А400C1CF0000A8952227112712E6000022E6FE :1000В400000092Е60000000000000000А895000087 :1000C4001A95000000000000000000000000C2F7C4 :1000D40000000000А8949A9582F700000000A894FC :1000E4002A95000029F70895000000005527000014 :1000F400543078F407В93327АА2775ЕС76В934В1АС :10010400A5B1232E3A2E422C532C642C752C5395D6 :10011400EECF000088248894320D981C340D981C6E :10012400360D981C8894969437959694379599240F
215 Листинг 11.4. Окончание < : 100'134008894A30D981CA50D981CA70D981C889451 | :0С0144009694А7959694А7950000089546 j :00000001FF Эксплуатация Размещение и зона действия прибора зависит от необходимого уровня освещенности. Для каждого из вариантов (лестничная клетка, приусадебное хозяйство или крыльцо) фотодатчик следует размещать в зоне максимальной освещенности. Также необходимо следить за тем, чтобы светодиоды платы не засвечивали оптоэлементы. Можно отка- заться от применения светодиодов, но при быстрой диагностике схемы невозможно оценить работоспособность устройства. В рабочем состоя- нии светодиоды можно накрыть колпачком. Плату управления автоматом для различных вариантов устанавли- вают рядом с нагрузкой в освещенном месте. В процессе эксплуатации, возможно, потребуется оперативная регулировка уровня срабатывания. Поскольку днем может быть темно (например тучи перед ливнем), то потенциометром R8 можно изменить уровень срабатывания (в целях техники безопасности эта операция выполняется отверткой с изолиро- ванной ручкой). Для увеличения мощности включаемых ламп необхо- димо семистор ОК2 установить на радиатор и, соответственно, увели- чить предохранитель F1. В случае использования нескольких мощных ламп необходимо установить несколько опторазвязок и семисторов на каждую нагрузку. Кроме того, питание силовых цепей можно включить через автоматический выключатель с током срабатывания, равным сум- ме токов нагрузки. Экономия Экономия от использования автомата представлена в табли- це Расчет экономии от автомата ночного освещения.xls,кото- рую можно найти на прилагаемом к книге компакт-диске в папке Рас- четы. При этом автор исходил из оплаты электроэнергии в г. Киеве за февраль 2007 г. и стоимости радиодеталей в свободной продаже на рын- ке в этот период. Себестоимость устройства, приблизительно равная $16, окупается экономией электроэнергии в течении года при эксплуа- тации одной лампочки на 60 Вт. Если же задействовать лампочку мощ- ностью 100 Вт, то устройство окупится в течении восьми месяцев.
216 Список литературы Список литературы 1. Зобин Ю, Тамазов А, Микроконтроллеры популярных семейств М: Радио №6-8, 2000. 2. Голубцов М.С. Кириченкова А.В. Микроконтроллеры AVR: от про- стого к сложному . 2-е издание. М: Солон-Пресс, 2004 с диском. 3. Евстифеев А.В. Микроконтроллеры AVR семейства Tiny и Mega фирмы ATMEL. 2-е издание. М: Додэка-ХХ1, 2005. 4. Кравченко А.В. Шар со световым эффектом для елки// Радиоама- тор.-2006.-№1-С.26. 5. Кравченко А.В. Опыт работы с программатором STK200// Радио- ’ аматор.-2006.-№4-С.36. 6. Шило В.Л. Популярные цифровые микросхемы Справочник. МРБ выпуск 1111. Челябинск: Металлургия, 1988г. 7. Новые технологиии// Радиоаматор.-2005.-№12-С.30. 8. Волович Г.И. Схемотехника аналоговых и аналого-цифровых элек- тронных устройств. М: Додэка-ХХ1, 2005. 9. Баранов В.Н. Применение микроконтроллеров AVR: схемы, алго- ритмы, программы. М: Додэка-ХХ1, 2004. 10. Мелешин В.И. Транзисторная преобразовательная техника. М:Техносфера, 2005. 11. Семенов Б.Ю. Силовая электроника для любителей и профес- сионалов. М: Солон-Р, 2001. 12. Марти Браун. Источники питания. Расчет и конструирование. Киев МК-Пресс, 2005. 13. Головацкий В.А. Гулякович Г.Н. Мелешин В.И. под редакци- ей Конева Ю.И. Источники вторичного электропитания. М: Радио и связь 1990г. 14. Варламов Р.Г. Малогабаритные источники тока. М: Радио и связь 1988г. 15. Data sheet. Sony. Lithium Manganese Dioxide Battery CR2032. 16. Data sheet. ATtiny26 -8 bit microcontroller. Atmel. 2002 17. Data sheet. L298 Dual full -bridge driver. STMicroelectronics. 1998. 18. Data sheet. L6506 Current controller for stepping motors. SGS- Thomson. 1998.
217 19. Вольфганг Трамперт. Измерение, управление и регулирование с помощью AVR микроконтроллеров. Киев: МК-Пресс, 2006. 20. Вольфганг Трамперт. AVR-RISC микроконтроллеры. Архитектура, аппаратные ресурсы, система команд, программирование, примене- ние. Киев: МК-Пресс, 2006. 21. Data sheet. SAA 1064. 4- digit LED- driver with I2C- Bus interface. Philips. 1991. 22. Кашкаров А.П. Фото - и термодатчики в электронных схемах. -М: Алекс. 2004. 23. Фрунзе А.В. Микроконтроллеры? Это же просто. -М:ООО «ИД Скимен» 2002г Том1. 24. Семенов Б.Ю. Шина 12С в радиотехнических конструкциях. -М: Со- лон-Р. 2002. книга 3. 25. Шрайбер Г. Инфракрасные лучи в электронике. М: ДМК-Пресс, 2003.
Содержимое прилагаемого к книге компакт-диска Прилагаемый к книге компакт-диск содержит четыре папки: Видео — видеопрезентация автором разработанных им устройств, о которых идет речь в книге; Программы — исходные файлы проектов AVR Studio 4, соответст- вующих рассмотренным в книге программам, с разбивкой по пап- кам согласно номерам и названиям глав; Расчеты — таблицы в формате Excel, содержащие крупные мате- матические и статистические расчеты, упомянутые на страницах книги; Справочник — технические описания микросхем и электронных компонентов, задействованных в схемах рассмотренных устройств.