Текст
                    Вольфганг Трамперт
wwworr®affl©af1Ш„ЗВт®=т®йо[гсш
Измерение, управление
и регулирование
с помощью
AVR
микроконтроллеров

Вольфганг Трамперт Измерение, управление и регулирование с помощью AVR-микроконтроллеров Практическая разработка аппаратных и программных средств для техники измерения, управления и регулирования с применением микроконтроллеров AVR и ПК Перевод с немецкого: А. Г. Эдигаров “МК-Пресс” Киев, 2006
Messen, Steuern und Regeln mit AVR-Mikrocontrollern Praktische Entwicklung von Hard- und Software zur MSR-Technik, realisiert mit AVR-Mikrocontrollern und PC Wolfgang Trampert Franzis’ Verlag GmbH
ББК 32.973-04 Т65 УДК 004.312 Трамперт В. Т65 Измерение, управление и регулирование с помощью AVR-микро- контроллеров.: Пер. с нем. — К.: “МК-Пресс”, 2006. — 208 с., ил. ISBN 966-8806-14-Х (рус.) Книга описывает особенности применения AVR-микроконтроллеров в технике измерения, управления и регулирования. При этом основной акцент поставлен на измерении напряжения, выводе и отображении результатов измерений, а также на регулировании аналоговых напряжений. Изложенный материал дает возмож- ность поэтапно проследить весь процесс разработки устройства, понять, почему программное и аппаратное обеспечение скомпоновано именно таким, а не каким- либо другим образом, и суметь в случае необходимости выполнить самостоя- тельную разработку. ББК 32.973-04 Гпавный редактор: Ю. А. Шпак Подписано в печать 31.05.2006. Формат 70 х 100 1/16. Бумага офсетная. Печать офсетная. Усл. печ. л. 18,8. Уч.-изд. л. 12,9. Тираж 2000 экз. Заказ Ns 6-460. Изготовление фотоформ и печать в ОАО «Харьковская книжная фабрика “Глобус”. 61012, г. Харьков, ул. Энгельса, 11 СПД Савченко Л.А., Украина, г.Киев, тел./ф.: (044) 517-73-77; e-mail: info@mk-press.com. Свидетельство о внесении субъекта издательского дела в Государственный реестр издателей, производителей и распространителей издательской продукции: серия ДК №51582 от 28.11.2003г. Никакая часть настоящего издания ни в каких целях не может быть воспроизведена в какой бы то ни было форме и какими бы то ни было средствами, будь то электронные или механические, включая фотокопирование и запись на магнитный носитель, если на это нет письменного разрешения издательства Franzis' Verlag GmbH. Authorized translation from the German language edition published by Franzis', Copyright © 2004. All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted in any form or by any means, electronic, mechanical, photocopying, recording, or otherwise, without prior written permission of the publisher. Russian language edition published by MK-Press according to the Agreement with Franzis' Verlag GmbH, Copyright © 2006. ISBN 966-8806-14-X (pyc.) ISBN 3-7723-4298-1 (нем.) © “МК-Пресс”, 2006 © Franzis' Verlag GmbH, 2004
Содержание 5 Содержание Л ( ’ RADIODVD * www.radiodvd.jino-net.ru ПРЕДИСЛОВИЕ...................................................................9 Соглашения...............................................................10 Дополнительные соглашения.............................................11 ВВЕДЕНИЕ.....................................................................12 Технические данные и применение микроконтроллеров AVR.................13 Разработка....................................................... 13 Программирование......................................................14 Плата STK500 для тестирования и программирования микроконтроллеров AVR 14 Внутрисистемное программирование......................................17 Глава 1. Анализ и коррекция ошибок. Калибровка устройств, управляемых микроконтроллерами AVR...................................................18 Калибровка с целью коррекции ошибки на программном уровне.............19 Калибровка в случае метода измерения с зависимостью от времени........21 Частные случаи........................................................23 Выводы................................................................24 Глава 2. Вспомогательные средства при вводе-выводе данных....................25 2.1. Мультиплексный режим светодиодного семисегментного индикатора...25 Непосредственное управление семисегментным светодиодным индикатором с помощью микроконтроллера AVR..........................................25 Принцип мультиплексной индикации......................................26 2.2. Управление семисегментным индикатором через один вывод порта микроконтроллера AVR.................................................28 Разделение тактового сигнала и сигнала данных...................... 29 Генерирование импульса записи в буфер.................................31 Вычисление частоты регенерации fa.....................................32 Буферизированный сдвиговой регистр....................................32 Расчет токоограничительных резисторов R4...R11 (см. рис. 2.3).........35 Практическая реализация светодиодных дисплеев.........................36 Описание программы....................................................46 Часть инициализации................................................46 Программа тестирования.............................................46 Подпрограмма обработки прерываний Display..........................47 Подпрограмма Code_4................................................48 Подпрограмма Code_3................................................48 Подпрограмма Get_7_Segm............................................48 Выводы................................................................48 2.3. Взаимодействие микроконтроллера AVR с ПК через последовательный интерфейс............................................................49 Программа HyperTerminal...............................................49 Определения для последовательной передачи данных по интерфейсу RS232..50 Соединения внутри интерфейса RS232....................................51 Управляющие сигналы стандарта RS232.................................. 52
6 Схема тестирования обмена данными по интерфейсу RS232...............52 Программа тестирования..............................................54 Описание программы..................................................59 Часть инициализации..............................................59 Основная программа...............................................60 Глава 3. Измерение напряжения с помощью микроконтроллеров AVR...............64 3.1 Встроенный АЦП микроконтроллеров AVR с разрешением десять разрядов .. 64 Характеристики АЦП микроконтроллеров AVR............................64 Принцип работы........:.............................................65 Подача тактовых импульсов на АЦП....................................67 Входные каналы АЦП..................................................68 Режимы работы АЦП...................................................68 Выбор входных каналов и источника опорного напряжения...............71 Регистр ADMUX АЦП...................................................72 Регистровая пара ADCH:ADCL..........................................73 Регистр управления и состояния ADCSRA...............................73 Подавление/предотвращение помех при аналого-цифровом преобразовании..74 Примеры.............................................................77 Описание программы..................................................83 Часть инициализации..............................................83 Основная программа...............................................83 Подпрограмма Out_Text............................................84 Подпрограмма CalcResult..........................................84 Подпрограмма SendResult..........................................85 Подпрограмма DivlO...............................................85 Подпрограмма Ми 15...............................................85 3.2 . Подключение микросхемы АЦП ADS7818 с разрешением 12 разрядов и интерфейсом SPI.........................................................86 Технические данные ADS7818..........................................86 Принцип работы ADS7818..............................................87 Процесс аналого-цифрового преобразования eADS7818...................89 Режим пониженного энергопотребления ADS7818.........................90 Дополнительные режимы работы ADS7818................................92 Изменение направления потока битов результата....................92 Уменьшение разрешения ADS7818....................................92 Управление ADS7818 через интерфейс SPIмикроконтроллераAVR...........95 Реализация последовательной передачи с помощью аппаратного интерфейса SPI 95 Реализация последовательной передачи с помощью программного интерфейса SPI97 Тестовая схема для проверки интерфейса АЦП микроконтроллера.........97 Тестовая программа управления ADS7818 и выдачи результата аналого-цифрового преобразования....................................99 Описание программы.................................................105 Часть инициализации.............................................105 Основная программа..............................................106 Подпрограмма обработки прерывания Display.......................106 Подпрограмма ReadSPI............................................106 Подпрограмма CalcResult.........................................106 Подпрограмма SendByte...........................................107 Подпрограмма SendResult.........................................107
Содержание 7 Подпрограмма Code_4................................................107 Подпрограмма Get_7_Segm............................................107 Подпрограмма Divio.................................................107 Выводы................................................................107 3.3. Тестовая плата для микроконтроллера AT90S2313 и микросхемы АЦПАО87818...............................................................108 aba 4. Цифро-аналоговое преобразование с помощью микроконтроллеров AVR......................................................116 4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции..............................................116 Принцип цифро-аналогового преобразования с помощью ШИМ-сигнала........116 Амплитудный спектр прямоугольных импульсов.........................116 Среднее арифметическое выходного напряжения........................120 Практическая реализация АЦП с ШИМ..................................121 Калибровка схемы...................................................123 Пример расчета параметров фильтра нижних частот....................124 Формирование ШИМ-сигнала с помощью Т/С1...............................127 Аналоговое управление коэффициентом заполнения прямоугольных импульсов напряжения...............................................128 Управление коэффициентом заполнения прямоугольных импульсов напряжения с помощью Т/С1.....................................................128 Режим быстрой широтно-импульсной модуляции.........................130 Программа..........................................................133 Описание программы.................................................145 Тестовая программа.................................................150 ЦАП с управлением по прерыванию при использовании ШИМ-аккумулятора....157 Алгоритм формирования ШИМ-сигнала..................................157 Пример ШИМ-генератора в качестве “виртуальной периферии”...........159 Описание программы.................................................161 4.2. Цифро-аналоговое преобразование с помощью встроенного АЦП микроконтроллера AVR......................................................164 Практическая реализация ЦАП с помощью встроенного АЦП микроконтроллера AVR................................................ 165 Алгоритм регулирования ЦАП............................................172 Пример применения.....................................................176 Описание программы................................................... 185 Часть инициализации................................................185 Основная программа.................................................185 Подпрограмма обработки прерывания по завершению АЦ-преобразования..187 Подпрограмма Dif ferenz............................................188 Подпрограмма SendByte..............................................188 Подпрограмма Get Byte..............................................188 Подпрограмма Out_Text..............................................188 Подпрограмма In_Text...............................................188 Подпрограмма Dekodieren............................................188 Подпрограмма Mul_10................................................188 Подпрограмма Div_5.................................................189 Подпрограмма Verzoegerung..........................................189 Выводы................................................................189
8 4.3. Тестовая плата для различных применений микроконтроллера ATmega8 .... 189 СОДЕРЖИМОЕ ПРИЛАГАЕМОГО К КНИГЕ КОМПАКТ-ДИСКА.....................199 Папка Аррысат................................................199 Папка Datasheets.............................................200 Папка Program................................................200 Папка tools..................................................200 A t • RADIODVD — www.radiodvd.jino-net.ru www.radiodvd.jino-net.ru
Предисловие Микроконтроллеры уверенно и, по-видимому, навсегда завоевали место в на- й жизни. Найти хоть одно электронное изделие, не имеющее микроконтроллеров, 1ктичсски невозможно. Разнообразные элементы схем в видеомагнитофонах, Т)-плеерах, телевизорах и микроволновых печах, автоматических дверях, систе- к управления лифтами, промышленных системах управления, измерительных ройствах, устройствах регулирования и, естественно, в транспорте стали чем-то «о собой разумеющимся. Микросхемы размером не больше булавочной головки — так называемые ID-метки (Radio Frequency Identification — радиочастотная идентификация) мож- встретить во множестве повседневных вещей: на упаковке товаров из супермар- а, в швах продаваемой в магазинах одежды и т.д. Подобно штрих-коду, они по- >ляют быстро и точно идентифицировать товар, однако для распознания микро- ом не обязательно подносить каждый предмет к сканеру — информация с них ггывается на достаточно большом расстоянии и не обязательно по отдельности, купателю достаточно пройти с полной корзиной товара мимо специального ра- эустройства. Все выбранные предметы при этом будут мгновенно идентифициро- 1Ы и оценены, а с кредитной карты покупателя снята соответствующая сумма. Панацея или страшный сон? Спор об этом между производителями и защитни- ки прав потребителей ведется уже не первый год, и перспектив его решения не що. Соответственно, остается открытым вопрос: следует ли и дальше развивать пюе направление. Как бы там ни было, неоспоримым остается тот факт, что повсеместное распро- >анение микроконтроллеров произвело революцию во всей электронике в целом и ехнике измерения и управления в частности . Измерительные приборы, которые е пару лет назад можно было в шутку назвать “могильщиками” микросхем, сего- я состоят из одного микроконтроллера и нескольких дополнительных конструк- зных элементов. Управляющие и регулирующие устройства, которые в не столь шие времена были чрезвычайно энергоемкими, сейчас имеют еще один дополни- [ьный микроконтроллер (например, ATtiny26) и довольствуются током 15 мА при повой частоте 8 МГц. Автор этой книги многие годы занимался разработкой техники измерения и заиления, управляемой микроконтроллерами. Появление и стремительное рас- эстранение микроконтроллеров AVR (по мнению автора, среди всех существую- [х в мире микроконтроллеров семейство AVR имеет наиболее высокие темпы ироста производства), а также возросшая потребность в специальной технической гературе по данной тематике и стали побудительным мотивом начать серию “Из- рение, управление и регулирование с помощью AVR-микроконтроллеров”. Представляем вниманию читателя первую книге из этой серии, в которой ос- зное внимание уделено измерению напряжений, выводу и отображению резуль- ?ов измерений, а также управлению и регулированию аналоговых напряжений. :ерии также будут рассмотрены вопросы измерения температуры, времени, час-
10 Предисловие тоты и расстояний, графические характеристики, индуктивность, емкость и другие физические величины, а также многие вопросы из области измерительной техники. Не останутся без внимания также особенности управления и регулирования нагру- зок, двигателей, шаговых двигателей, температур, частот, напряжений и токов. В любом случае, читатель получит не просто готовый прибор с заданной схе- мой и анонимным программным обеспечением заранее запрограммированного мик- роконтроллера и, как правило, неизвестным типом конструкции. Сведения, излагае- мые в данной книге, дадут возможность поэтапно проследить весь процесс разра- ботки устройства, понять, почему программное и аппаратное обеспечение скомпо- новано именно таким, а не каким-либо другим образом, и суметь в случае необхо- димости выполнить самостоятельную разработку. Книга будет полезна разработчикам, инженерам, студентам, изучающим элек- тротехнические профессии, радиолюбителям — короче, всем, кто обладает базовы- ми познаниями в области строения и функционирования микрокомпьютеров и зна- ком с однокристальными микроконтроллерами AVR, кто способен учиться, реали- зовывать собственные идеи и желает заниматься этой в высшей степени перспек- тивной областью электроники. Автор хотел бы выразить благодарность за поддержку в написании этой книги г-ну Вольфгангу Нойдерту (Wolfgang Neudert), представителю компании Atmel Deutschland, и г-ну Андреасу Райденауэру (Andreas Reidenauer), представителю ве- дущего немецкого и европейского дистрибьютора Atmel — Ineltek (на Web-сайте этой компании http://www.ineltek.de можно найти полный ассортимент пред- лагаемых AVR-моделей и прайс-лист). Кроме того, выражаем благодарность всем, кто приложил свои усилия для выхода этой книги в свет и кого, к сожалению, не представляется возможности упомянуть поименно. Особая благодарность — г-ну Гюнтеру Валю (Guenter Wahl) из издательства “Franzis’ Verlag” за оказанное доверие и сотрудничество. В рамках работы в свом проектно-конструкторском бюро автор разрабатывает электронные схемы и приборы (в основном с применением микроконтроллеров AVR, но не только). Связаться с ним можно по адресу электронной почты w.trampert@web.de. И напоследок еще одно небольшое замечание: поймите, пожалуйста, правильно, но автор не имеет возможности отвечать на каждый вопрос или сообщение читате- лей. Если же такой вопрос представляет интерес для других, то ответ на него, веро- ятно, можно будет найти в следующих книгах Вольфганга Трамперта. Желаем читателям успехов в работе с микроконтроллерами AVR и удачного воплощения в жизнь собственных идей. Соглашения Для облегчения понимания в данной книге введены некоторые соглашения. Так, например, в литературе встречаются различные способы написания шестнадцате- ричных чисел. Например, в программах на Pascal и Basic они, как правило, обозна- чаются символом доллара перед числом (допустим, $АЗ), а в программах на С или же в разработанном компанией Atmel ассемблере для серии AVR то же число обо- значается как ОхАЗ, а в текстах можно встретить индекс “h” (A3h) или большую бу- кву “Н” (АЗН). В данной книге встречаются все три варианта написания. В следую- щей таблице перечислены еще некоторые определения:
Соглашения 11 Написание Примеры Шестнадцатеричные числа Знак $ перед числом или “Ох” + шест- надцатеричное число; индекс “h" или большая буква “Н” $AF, $10, $FEDC, OxAF, 0x10, OxFEDC, AFh, 10h, FEDCh, FEDCH, ЗОН Двоичные числа “ОЬ” + двоичное число или индекс “Ь” 0Ы0100101, 10100101b Десятичные числа Без дополнений или индекс “d” 15, 37, 1023, 15d, 27d, 1023d Команды ассемблера Шрифт Courier r jmp, clr, breq Инвертирование Косая перед обозначением ZG, /CLR Дополнительные соглашения Разряд “установлен”, если содержит лог. 1 (высокий уровень) и наоборот, “сброшен”, если его значение равно лог. О (низкий уровень). Для выделения некоторых важных фрагментов в тексте книги используются следующие обозначения: Знак важного примечания Знак обозначения дополнительной информации и полезных советов
Введение Компания Atmel — производитель высокопроизводительных и широко распро- страненных микроконтроллеров AVR — использовав комбинацию энергосбере- гающей технологии изготовления комплементарных МОП-полупроводников, про- грессивной RISC-архитектуры и системно программируемой памяти типа Flash- EPROM, разработала очень эффективный способ решения всех задач внутриплатно- го управления и добилась новых масштабов в соотношении цены и качества. Тем не менее, прогресс не стоит на месте. Специалисты Atmel продолжают ра- ботать над расширением модельного ряда серии AVR (рис. 0.1). Рис. 0.1. Стратегия Atmel. Производительность и технологический процесс микроконтроллеров AVR К серии “Classic”, состоящей из AVR микроконтроллеров типа AT90Sxxxx, раз- работанных по технологическому процессу 0,6-цм, добавляются новые представи- тели, дополняющие AT90Sxxxx как в верхнем, так и в нижнем ценовых сегментах. Так, например, в последние годы были представлены модели ATtinyll...l2, ATtinyl5, ATtiny26 и ATtiny28, предназначенные для использования в нижнем це- новом сегменте, где нет необходимости в большом количестве входов и выходов. Внедрение технологии 0,5-цм позволило компании Atmel предложить серию megaAVR: ATmegal61(L) и ATmegal63(L), отличающуюся особо высокой плотно- стью кодировки. Изготавливаемые по технологии 0,35-цм модели ATmega 8, -16, -32, -64, -128, - 169, дополняют серию “Classic” в верхнем ценовом сегменте. Эти модели способны к “автопрограммированию”, благодаря разделению флэш-памяти на раздел загруз- чика (Boot Loader) и раздел прикладных программ. Они демонстрируют великолеп- ные рабочие характеристики: низкую энергоемкость при удвоении допустимой так- товой частоты (см. рис. 0.1).
Соглашения 13 Технические данные и применение микроконтроллеров AVR В своей книге “AVR RISC-микроконтроллеры”1 автор достаточно подробно описал возможности микроконтроллеров AVR на примере некоторых моделей се- рии “Classic” (AT90Sxxxx). Рассмотренные характеристики действительны также и для новейших представителей семейства AVR и останутся актуальными и в буду- щих моделях. Как и прежде, у микроконтроллеров будет регистровый файл, опера- тивная и флэш-память, память типа EEPROM, порты ввода-вывода, интерфейсы SPI, I2C (TWI) и RS232, таймер, аналоговый компаратор и режим ожидания и т.д. К примеру, порты ввода-вывода ATmega32 устроены аналогично портам AT90S2313, а аналоговый компаратор ATtiny26 работает по тем же принципам, что и в AT90S8515. Безусловно, в устройствах появляются новые дополнительные функции, однако и в новейших поколениях микроконтроллеров AVR будут приме- няться принципы, исследованные и описанные в упомянутой выше книге. Система команд также основана на системе команд серии AT90Sxxxx, хотя и дополнена новыми инструкциями (например, командами умножения и пересылки, применение которых будет описано ниже в этой книге). По этой причине, в данной серии мы не будем повторяться с описанием всех функций микроконтроллеров AVR, рассмотренных в книге “AVR-RISC микроконтроллеры”, а остановимся под- робнее на таких вопросах как цифро-аналоговое преобразование и скоростной ре- жим широтно-импульсной модуляции таймера/счетчика Т/С1. Наиболее свежие технические описания всех микроконтроллеров AVR и многие рекомендации относительно их применения можно найти на Web-сайте компании Atmek. www. atmel. com (информация распространяется бесплатно). Atmel — компания, непрерывно совершенствующая свою продукцию. Серия микроконтроллеров AVR постоянно пополняется новыми, более производительны- ми образцами. В том случае, если модели, рассмотренные в этой книге, станут не- доступны, все примеры и варианты применения могут быть воспроизведены с по- мощью более совершенных AVR-моделей следующего поколения. Разработка Для ускорения и упрощения разработки собственных проектов, основанных на устройствах AVR, можно воспользоваться интегрированной средой AVR-Studio, бесплатно распространяемой через Web-сайт компании Atmel (www. atmel. com). В состав AVR-Studio входит ассемблер и эмулятор, позволяющий тестировать программы непосредственно в среде разработки. При этом программа может вы- полняться последовательно или с учетом точек прерывания, а на экране может быть отображено и, в случае необходимости, изменено содержимое ячеек памяти, реги- стров и портов ввода-вывода. Пользователь может непрерывно контролировать ход выполнения программы, наблюдая за состоянием переменных в окне Watch. Компания Atmel предлагает также внутрисхемные эмуляторы, однако возмож- ности моделирующей среды AVR-Studio позволяют отследить до 95% всех ошибок. Остальное обнаруживается при тестировании в режиме реального времени посред- ством определения подходящих программных прерываний. Интегрированный в AVR-Studio ассемблер является неизмененной версией ав- тономного ассемблера, описанного в книге “AVR-RISC микроконтроллеры”. В этой же книге описаны и принципы работы с самой средой AVR-Studio. 1 Русский перевод книги Вольфганга Трамперта “AVR-RISC микроконтроллеры” также был издан из- дательством “МК-Пресс” (www.mk-press.com) — прим, редактора.
14 Введение Программирование Серия “Измерение, управление и регулирование с помощью AVR-микроконт- роллеров” затрагивает, прежде всего, наиболее распространенные задачи техники измерения и автоматического регулирования на примере микроконтроллеров AVR компании Atmel. Исходные тексты разработанных автором программ в расширен- ном виде можно найти на прилагаемом к книге компакт-диске. Программы предна- значены для частного (не промышленного!) использования и создавались как обра- зец для дальнейших самостоятельных разработок. Плата STK500 для тестирования и программирования микроконтроллеров AVR Существует множество способов записи представленных в книге и созданных , читателем самостоятельно программ в микроконтроллеры AVR, однако наиболее доступным и универсальным решением можно назвать предлагаемую компанией Atmel плату STK500 (рис. 0.2), позволяющую максимально упростить программи- рование почти всех микроконтроллеров AVR серий “Classic”, “Tiny” и “Mega”. Рис. 0.2. Плата STK500 для тестирования и программирования микроконтроллеров AVR
Соглашения 15 Компоненты платы STK500 изображены на рис. 0.3. Переключатели Светодиоды Разъем для интерфейса DataFlash Разъем для светодиодов Гнезда для целевых AVR Разъемы для портов ввода-вывода Разъем для интерфейса RS232 Разъем для переключателей Разъем для плат расширения Перемычки конфигурации В5Я Кнопка сброса целевого устройства Вкл. питания Разъем питания <— Индикация питания Разъемы для параллельного программирования ПортР3232 для программирования Главный MCU .Индикация состояния Порт RS 232 'для обмена данными Гнездо для кристалла Кнопка “Программирование" Разъем для / ISP-разъемы 10-тиконтактный плат расширения целевого устройств _ ISP-разъем (только 6-ти контактный ISP-разъем дЛЯ внешних устройств) Рис. 0.3. Составляющие платы STK500 Для различных вариантов исполнения микроконтроллеров предусмотрены раз- личные разъемы с двухрядным расположением контактов. Микроконтроллеры AVR с корпусами типа PLCC и TQFP подключаются к плате через адаптер. Плата STK500 питается нестабилизированным постоянным напряжением в диа- пазоне 10-15 В. Стабилизация реализована в самой плате. На рис. 0.4 показана схе- ма соединения с компьютером через последовательный интерфейс RS-232. Рис. 0.4. Соединение STK500 к ПК через последовательный интерфейс Данные из компьютера поступают на STK500, где собственно и происходит процесс программирования микроконтроллера. Благодаря этой концепции, плата STK500 может применяться и с новыми типами микроконтроллеров AVR, для чего достаточно установки обновленного программного обеспечения — весьма ценное свойство, если учесть темпы расширения семейства AVR. На рис. 0.5 показано окно AVR-Studio в процессе программирования микрокон- троллера ATmega8 с помощью платы STK500.
16 Введение Рис. 0.5. Программирование микроконтроллера ATmega8 Система меню позволяет легко выбрать и записать данные. Кроме того, возмо- жен просмотр и изменение разрядов предохранения и блокировки, просмотр в рас- ширенном режиме битов сигнатуры или же изменение параметров платы (рис. 0.6). Рис. 0.6. Настройка параметров платы STK500 Так, например, могут быть изменены напряжение питания, опорное напряже- ние, а также частота системной синхронизации платы. VFlo умолчанию, в качестве тактового генератора микросхем AVR (в том числе, и рассматриваемой в данной книге АТтедав) используется встроенный калиброван- ный RC-осциллятор. Если же такт системной синхронизации задается внешним кварцем, то после его подключения необходимо соответствующим образом запро- граммировать предохранители CKSEL3..0, SUT1..0 и СКОРТ. Настройки при про- граммировании микросхемы с помощью STK500 показаны на рис. 0.7 (частота кварца — 12 МГц).
Соглашения 17 Рис. 0.7. Настройки предохранителей: CKSEL3..0 = 1111ь, SUT1..0 = 11ь и СКОРТ = 0 при частоте кварца 12 МГц В этом случае настройки портов для XTAL1 и XTAL2 переписываются с на- строек предохранителей, и эти выводы автоматически конфигурируются на под- ключение внешнего осциллятора. Внутрисистемное программирование Также существует возможность настроить микроконтроллер AVR таким обра- зом, чтобы мог программироваться в схеме. Для этого в последовательном процессе программирования все задействованные выводы разъема должны оставаться неис- пользованными или же поддерживать переключение состояний. В этом случае дан- ные могут передаваться непосредственно в целевой микроконтроллер AVR с помо- щью специального интерфейса внутрисистемного программирования (ISP — In Sys- tem Programming) от компании Atmel (рис. 0.8). Рис. 0.8. ISP-интерфейс от компании Atmel Внутрисистемное программирование также реализовано в AVR-Studio. С его помощью можно программировать флэш-память, память EEPROM, а также разряды предохранения и блокировки.
ГЛАВА 1 Анализ и коррекция ошибок. Калибровка устройств, управляемых микроконтроллерами AVR В реальных условиях измерительные приборы неизбежно работают с опреде- ленными погрешностями. В книге, посвященной измерению, управлению и регули- рованию, нельзя не упомянуть об интерпретации результатов измерений и коррек- ции ошибок этого процесса. При проведении измерений с помощью микроконтроллеров AVR существует возможность отказаться от обычного способа калибровки измерительного прибора с помощью измерительного усилителя и компенсационного потенциометра, а пере- ложить задачи калибровки/коррекции на микроконтроллер. Рассмотрим реальный случай из практики измерений: измерительный прибор выдает характеристику, представленную на рис 1.1. Рис. 1.1. Нормальная ys и фактическая ум характеристика измерительного прибора На диаграмме показана фактическая характеристическая кривая ум (сплошная линия) и нормальная характеристика ys (пунктирная линия) измерительного прибо- ра. При этом кривой ум могут, к примеру, соответствовать значения на выходе циф- ро-аналогового преобразователя (ЦАП) в зависимости от входного напряжения х. Как видно из рис. 1.1, фактические значения ум смещены относительно кривой ys на величину Ь. Кроме того, наблюдается незначительное усиление (наклон ам прямой ум незначителен).
19 В обычных случаях подобные погрешности устраняются с помощью измери- тельного усилителя и подстроечного резистора. Если же в описанной измеритель- ной системе присутствует микроконтроллер, то коррекция ошибки реализуется на программном уровне. Соответственно, отпадает необходимость в использовании усиливающей схемы и подстроечного резистора. Значения поправки просчитываются в процессе калибровки, после чего они мо- гут быть записаны, например, в память EEPROM микроконтроллера. С их помощью при последующих измерениях все замеряемые (искаженные) значения могут быть откорректированы в режиме реального времени. Данный метод применим не только при выполнении измерений, но и, к примеру, при выводе заданных величин с помощью цифро-аналогового преобразователя (см. в разделе 4.1.2 пример вывода значения напряжения с помощью тайме- ра/счетчика Т/С1, работающего в режиме широтно-импульсного модулятора). Калибровка с целью коррекции ошибки на программном уровне На рис. 1.2 изображена линейная характеристика измерительного прибора с двумя контрольными точками МР1 и МР2, в которых следует выполнить калиб- ровку с помощью микроконтроллера. Рис. 1.2. Характеристика измерительного прибора, калибруемого с помощью микроконтроллера Если характеристика имеет нелинейных характер, то ее можно разбить на мень- шие интервалы, на которых она может рассматриваться как линейная (рис. 1.3). От- резок между точками хЗ и х4 на рис. 1.3 с целью повышения точности также можно разбить на несколько частей. На практике для двух произвольных исходных величин X] и Хг с помощью циф- ро-аналогового преобразователя получают соответствующие величины yi и уг. При этом одна из точек замера выбирается как можно ближе к началу, а вторая — к кон- цу диапазона ввода (см. рис. 1.2).
20 Анализ и коррекция ошибок. Калибровка устройств, управляемых микроконтроллерами AVR Рис. 1.3. Фрагментарная линеаризация нелинейной характеристической кривой Если характеристика имеет линейный характер, то все замеряемые величины у находятся на одной прямой и описываются уравнением (1.1). у = а -х + Ъ. (1.1) Неизвестные коэффициенты а и b легко определить, зная точки замера МР1 и МР2. Подставив их координаты в (1.1), получим: а=У1~Ук и Ь=у1_а.Хъ (1.2),(1.3) х2-Х1 Искомой, однако, является исходная величина х, которой соответствует считы- ваемое на выходе ЦАП значение у. Путем перестановки (1.1) получаем у — Ь 1 х =------, то есть, х = (у - Ь) — (1.4) а а Перед тем как определить искомую исходную величину х, необходимо прежде вычесть из у сохраненное в памяти EEPROM значение смещения Ъ. Полученная разность затем делится на наклон прямой о, и в результате получаем искомую вели- чину. Поскольку микроконтроллеры выполняют операции умножения, как правило, быстрее, чем операции деления, деление можно заменить умножением на обратную величину 1/а. На практике процесс калибровки обычно реализуется в три этапа. 1. Для определения смещения b =ум<х=о) вход измерительного прцбора замыкается накоротко, т.е. устанавливается х=0. При этом искомому смещению b соответствует входное числовое значении Zoff. 2. Для определения максимального измеряемого значения умтах на входе измери- тельного прибора устанавливается максимальная входная величина х = хтах. При этом определяемое с помощью ЦАП числовое значение ZMmax соответствует ко- нечному ЗНачеНИЮ Ум max- 3. Из рис. 1.1 видно, что прямую, проходящую через начало координат и парал- лельную прямой ум, можно получить путем вычитания из каждой замеряемой величины ум смещения Ь. Однако наклон этой прямой не соответствует наклону номинальной характеристики. Здесь возникает понятие поправочного коэффи- циента (ПК), на который необходимо умножить измеренные величины, чтобы получить корректное усиление.
21 Этот коэффициент, а также наклон номинальной прямой можно получить из уравнения (1.5). пк= Ух™ = У» (15) Умт~ь Ум~Ъ ПК можно найти также из уравнения (1.6): 7 7 _ ТS'max ___ ^5 max S (16) Умтах.~^ ^Mmax~^Off М ~ Off Параметры Zbfr и ZM maX определяются на этапах 1 и 2. При завершении процесса калибровки значения ZOff и ПК сохраняются в памяти EEPROM микроконтроллера AVR. При последующих измерениях фактические величины Zs = ys легко вычислить, используя измеренные величины ZM = Ум, для чего из ZM вычитается сохраненное в памяти EEPROM смещение Zoff, а полученная разница умножается на поправоч- ный коэффициент, который также хранится в памяти EEPROM: ZS = (ZM-Zoff) ПК (1.7) | Пример [ При входном напряжении Ue = О В (соответствует х = 0) 12-тиразрядный ЦАП ; : с разрешающей способностью 1 LSB (младший двоичный разряд) = 1 мВ и диапа- | зоном измерений 0..ys max = 4,095 В (соответствует цифровому числу Zs max= 212-1 = i = 4095) выдает цифровое число Zoff =78, соответствующее смещению b = 78 мВ. При максимальном входном напряжении Ue max = 4,095 В (соответствует xmax = 1 ! = 4,095 В) числовое значение ZM тах равно 4234 (соответствует ум тах = 4,234 В). Согласно (1,6), поправочный коэффициент равен Z 4095 77# =-----smax--=-----= 0,98532 Z^-Z^ 4234-78 В результате последующего вычитания из измеренного значения ZM max = . = 4234, полученного при максимальном входном напряжении Ue max - 4,095 В, j смещения Zoff получаем промежуточное значение ZM max - Zoff = 4234 - 78 = 4156. = Этот результат умножается на поправочный коэффициент, что дает корректный ! итогу8 = 4095. Калибровка в случае метода измерения с зависимостью от времени В системе измерений, где величины определяются через установленные вре- менные интервалы (например, в случае счетчиков-частотомеров и любых интегри- рованных ЦАП), умножение при коррекции усиления может быть заменено измене- нием длительности измерения. Таймер для определения длительности измерений необходимо установить в зна- чение Гизм= ПК • ГИзм, где ПК — соответствующий поправочный коэффициент.
22 Анализ и коррекция ошибок. Калибровка устройств, управляемых микроконтроллерами AVR Рассмотрим еще раз рис. 1.1. Прямая фактических величин ум отличается от расчетной прямой ys наклоном ам и смещением Ь. В этом случае процесс калибров- ки выполняется в четыре этапа. 1. Для того чтобы определить смещение b = ум (х=ю> необходимо, как и в предыду- щем случае, накоротко замкнуть вход измерительного прибора, что соответст- вует х = 0. При этом определяемое с помощью ЦАП числовое значение ZOff соот- ветствует искомому смещению Ь. 2. Максимальное измеряемое значение Zm max — Ум max определяется по уже описан- ной выше методике: на входе измерительного прибора устанавливается макси- мальная входная величина х = Хщах- 3. Поправочный коэффициент также рассчитывается описанным выше способом. _ 5 max Z -Z ^Л/max ^Off Если измеряемая величина определяется за период 7м, в течение которого для получения результата измерений подсчитывается п импульсов, то его следует умножить на поправочный коэффициент, чтобы увеличить или уменьшить (Гм = ПКТМ). Таким образом, за новый период измерений Т’м будет подсчитано следующее количество импульсов: п'=^--и= п = ПК п т т (1-8) На рис. 1.4 изображена характеристика у м, полученная из фактической путем умножения на поправочный коэффициент. Как видим, она проходит параллель- но характеристике ys. Рис. 1.4. Характеристика с учетом поправочного коэффициента: у’м = ПК - ум
23 4. Поскольку смещение b за счет поправочного коэффициента увеличивается до Ь' (см. рис. 1.4), то для получения фактического результата из каждого измеренно- го значения необходимо вычесть числовое значение нового смещения Z off, т.е произведение ПК • ZOff. Пример 12-тиразрядный ЦАП при методе подсчета с разрешающей способностью | ’ 1 LSB (младший двоичный разряд) =10 мВ и диапазоном измерений O..ys max - I i - 10,23 В, соответствующим цифровому числу Zs max = 210 - 1 = 1023, дает при мак- I ! сималыюм входном напряжении Ue max = 10,23 В цифровое значение ZM max = 965, | ' соответствующее ум тах = 9,65 В. При замыкании входа накоротко Ue = 0 В, преоб- ! j разователь выдает результирующее цифровое значение Zoff = 25, соответствующее ! | смещению b = 250 мВ. Соответственно, параметры коррекции выглядят следующим образом: пк = Zsmax/ (ZMmax-Zoff) = Ю23 / (965 -25) = 1,088 и Z'off = ПК • Zoff = 1,088 ♦ 25 = 27. Первоначальная длительность измерений Тизм составляла 20 мс. Необходимое j умножение на поправочный коэффициент 1,088 может быть осуществлено путем увеличения длительности измерения. Для этого следует установить таймер на зна- i чение Т'изм = ПК • Тизм = 21,76 мс. Если же не откорректированное значение Zm max = 956 импульсов подсчитыва- | j ются в течение Тид, = 20 мс, то согласно (1,8) период Гизм = 21,76 мс заключает в | I себе Z м max = ПК Zm max = 1050 счетных импульсов. Для Ue = 0 при длительности измерений 7изМ = 20 мс с учетом напряжения | j смещения ZOff составляет 25 импульсов. При новой длительности измерений 7'изм | j смещение увеличивается до Ь* = 0,272 В, что соответствует цифровому значению ! j Z'off = 27. I Для коррекции измененных величин необходимо из измеренного значения вы- i । честь постоянное цифровое значение Z off = 27. Для верхней границы диапазона 1 I измерений результат составляет Zmax = Z'm max - ZOff = 1050 - 27 = 1023, а для ниж- j : него — Zimn = Z off - Z'off = 27 - 27 = 0, то есть, корректный диапазон измерений I ’ преобразователя. j Частные случаи На систему с одним рабочим напряжением может влиять случайное отрица- тельное смещение (рис. 1.5). В таком случае измерительная схема не в состоянии охватить отрицательные значения характеристики ум, показанные на рис. 1.5 пунк- тирной линией. Таким образом, показания для малых входных напряжений оказы- ваются искаженными. По этой причине перед процедурой измерения на измерительную схему реко- мендуется подать небольшое положительное смещение, призванное компенсировать вероятное отрицательное смещение, показанное на рис. 1.5. Если измерительный прибор сам обладает определенным положительным смещением, то в результате этой процедуры оно незначительно увеличится, но зато будут предупреждены ошибки измерений вблизи нулевой точки, возникающие при отрицательном смеще- нии.
24 Анализ и коррекция ошибок. Калибровка устройств, управляемых микроконтроллерами AVR Рис. 1.5. Измерительная система с униполярным рабочим напряжением, находящаяся под воздействием отрицательного смещения Поскольку в некоторых системах измерения вблизи нулевой точки несколько затруднены, для калибровки вместо начальной величины х = 0 на входе можно ус- танавливать невысокий и не равный 0 сигнал хм, что также показано на рис. 1.5. Наклон ам характеристики в данном случае равен _ Ум max Ум(х=хм) ам — •^тах *М а поправочный коэффициент: пк = У Л/max У 5 max •(1-—) *^тах Выводы При калибровке с помощью микроконтроллера достаточно однократного опре- деления смещения ZOff и вычисления по уравнению (1.6) поправочного коэффици- ента фактической характеристики с последующей записью полученных результатов в память EEPROM. При каждом последующем измерении из получаемого значения Ум будет вычитаться Zofi, а результат умножается на поправочный коэффициент. Задача решается еще проще, если умножение заменяется коррекцией времени измерения, как это было продемонстрировано выше. В таком случае вычисления, выполняемые микроконтроллером, сводятся к простому вычитанию константы Z сиг из измеренного значения Z'M.
ГЛАВА Вспомогательные средства при вводе-выводе данных 2.1. Мультиплексный режим светодиодного семисегментного индикатора В целом, в микроконтроллерах можно заметить четкую закономерность: чем большее выводов присутствует на корпусе, тем большее количество функций реали- зует микроконтроллер (приемопередатчик UART, цифро-аналоговый преобразова- тель, таймер, интерфейсы TWI и SPI и т.д.). Эти функции, безусловно, влияют на стоимость, поэтому микроконтроллеры с большим количеством выводов более до- рогостоящие. Тем не менее, очень часто многие функций остаются неиспользован- ными, а наиболее востребованными оказываются порты ввода-вывода. В этом слу- чае, из соображений экономии, выбирается микроконтроллер AVR с наименьшими возможными размерами корпуса и оптимальным набором портов ввода/вывода. В главе 16 своей книги “Л КА RISC-микроконтроллеры” автор продемонстриро- вал метод увеличения количества портов ввода/вывода с помощью интерфейса SPI, позволяющий без значительных затрат получить устройство с необходимым коли- чеством выводов. Интерфейс SPI позволяет подключать параллельно внешние бло- ки, используя при этом все три вывода (а также, в случае необходимости, дополни- тельные п выводов для сигналов выборки, разрешения или фиксации). Однако, учи- тывая тот факт, что в “младших” моделях микроконтроллеров AVR (например, та- ких как AT90S1200 или AT90S2313) этот интерфейс не реализован вообще или предназначен только для программирования, а не для свободного использования, описанный способ также будет стоить (3 + п) выводов. В разделе 2.2 на примере восьмиразрядного дисплея, построенного на основе семисегментных светодиодных индикаторов, будет рассмотрена схема управления, которая свободно интегрируется в пользовательские проекты и обходится всего од- ним выводом микроконтроллера AVR. Этот принцип управления может быть легко применен также и для других вариантов вывода данных. Но прежде рассмотрим два стандартных метода управления светодиодным дис- плеем с помощью микроконтроллера AVR. Непосредственное управление семисегментным светодиодным индикатором с помощью микроконтроллера AVR Выход микроконтроллера AVR способен “поглощать” выходной ток силой до 20 мА (то есть, ток втекает в выход и через внутренний n-канальный МОП- транзистор отводится на “землю”). Благодаря этому, становится принципиально возможно подключать сегменты светодиодного дисплея непосредственно к выходам микроконтроллера AVR через токоограничительные резисторы R1 ... R8 (рис. 2.1).
26 Вспомогательные средства при вводе-выводе данных Рис. 2.1. Непосредственное управление семисегментным индикатором hp5082-7730 через порт В микроконтроллера AVR Несмотря на то, что каждый из выходов микроконтроллера AVR способен ра- ботать при силе выходного тока до 20 мА, в отношении предельных параметров уст- ройства действуют определенные ограничения. Так, например, сумма всех выход- ных токов не должна превышать 200 мА, а сумма выходных токов портов В и С — 100 мА. Учитывая эти ограничения, сила тока, проходящего через светодиоды, не должна быть выше 100 мА : 8 = 12,5 мА, при условии, что включены все семь сег- ментов и десятичная запятая. Также можно допустить, что порт В, изображенный на рис. 2.1, — единственный порт, работающий с упомянутым выходным током. Для того чтобы определить номинал резисторов R1...R8, предназначенных для получения тока требуемой силы 12,5 мА, используем заданное в спецификациях ин- дикатора hp5082-7730 прямое напряжение светодиода Uled = 1,5 В, а также указан- ное в характеристиках микроконтроллера AVR падение напряжения на выходном каскаде Us « 0,3 В. Значение сопротивления определяется по формуле: n Vcc-Uled~Us 5Г-1,5Г-0,ЗГ R = _сс---LED---£ =-----»----->-- = 256 О IOL 12,5л/Л Ближайшее значение в стандартном ряду составляет 270 О. Учитывая достаточно высокую нагрузку по току микроконтроллера AVR при непосредственном управлении светодиодным дисплеем, в глаза бросается еще один недостаток: даже одна отображаемая на дисплее позиция требует восемь выводов порта микроконтроллера! По этой причине при отображении нескольких позиций они, как правило, представляются в виде матрицы и обрабатываются в многока- нальной системе с временным разделением каналов. Принцип мультиплексной индикации Соответствующая схема восьмиразрядного индикатора изображена на рис. 2.2. Дисплей создан на основе семисегментных модулей с общим анодом. Все равно- значные выводы сегментов а ... g, а также десятичной запятой dp восьми дисплеев
2.1. Мультиплексный режим светодиодного семисегментного индикатора 27 соединены параллельно. Из всех восьми индикаторов всегда светится только один, но смена позиций происходит настолько быстро, что человеческий глаз не воспри- нимает этого мерцания, так же как не видит смену кадров в фильме. В результате кажется, что дисплей постоянно отображает все восемь позиций. Если же время цикла (т.е. время, через которое каждая из позиций дисплея опять становится активной) меньше 15-10 мс, что соответствует частоте 70-100 Гц, то мерцание становится заметным. Рис. 2.2. Стандартная схема управления светодиодным дисплеем в мультиплексном режиме Для того чтобы одновременно могло светиться несколько позиций, анод дис- плея через управляющие транзисторы Т1...Т8 подключается к источнику рабочего напряжения V сс. Как видно из рис. 2.2, затраты на перевод восьмиразрядного светодиодного дис- плея в мультиплексный режим не так уж незначительны. В сравнении с ним, явны преимущества “энергосберегающего” мультиплексного режима, показанного на рис. 2.1.
28 Вспомогательные средства при вводе-выводе данных Поскольку сам микроконтроллер AVR не может выдавать ток прямо на общие аноды А0...А7, для этой цели нужны управляющие р-п-р-транзисторы Т1...Т8. При работе в мультиплексном режиме сила тока через сегменты, как и при параллельном управлении, обычно довольно высока, что необходимо для достижения достаточной яркости свечения индикаторов. Несмотря на относительно сильный ток, который способен принимать выход микроконтроллера AVR, для токов восьми сегментов a...g, а также десятичной запятой dp необходимы восемь управляющих п-р-п-тран- зисторов T9... 16. Кроме того, необходимы также восемь резисторов R17...24, огра- ничивающих токи через сегменты, восемь резисторов R1...8, ограничивающих токи через базы управляющих р-п-р-транзисторов Т1...8 и восемь резисторов R9...16, ог- раничивающих токи через базы управляющих р-п-р-транзисторов T9... 16. Итого, 24 резистора и 16 транзисторов. 2.2. Управление семисегментным индикатором через один вывод порта микроконтроллера AVR На примере восьмиразрядного дисплея с самосветящимися семисегментными индикаторами с общим катодом, который в случае “классического” мультиплексно- го управления (см. рис. 2.2) занимает все 16 выводов двух портов микроконтроллера AVR, можно продемонстрировать не требующий дополнительных затрат способ управления всеми мультиплексированными индикаторами с помощью всего лишь одного вывода. Схема подключения дисплея к единственному управляющему выво- ду показана на рис. 2.3. ЮОр R1 10k Рис. 2.3. Управление восьмиразрядным светодиодным дисплеем с общими катодами по одной линии
2.2. Управление семисегментным индикатором через один вывод порта микроконтроллера AVR 29 Вся схема, по сути, состоит из двух “буферизированных” сдвиговых регистров IC2 и IC3, содержащих, кроме собственно восьмиразрядных сдвиговых регистров, буферную память и драйвер для получения требуемых выходных токов, а также IC1 — сдвоенного одновибратора триггерного типа 74НС4538, формирующего им- пульсы определенной длины. Поскольку в изображенной на рис. 2.2 схеме для работы индикатора в любом случае требовались дополнительные задающие каскады, решение согласно рис. 2.3 требует затрат, по крайней мере, не больших, чем для схемы на рис. 2.2. Кроме того, не следует забывать об освобожденных выводах микроконтроллера и экономии пространства, благодаря отсутствию шестнадцати резисторов и шестнадцати управ- ляющих транзисторов. Сам дисплей может представлять собой или цельный многоразрядный блок с выведенными катодами, или же восемь светодиодных семисегментных индикато- ров, что типично для работы в мультиплексном режиме. "“I На рис. 2.3 специально показано соответствие выходов QA ... QH регистра IC2 сег- i । ментами и выходов QA ... QH регистра IC3 катодам. Это сделано для того, чтобы = _____ в дальнейшем, при компоновке печатной платы было проще создать разводку и j разместить компоненты таким образом, чтобы линии были проложены по макси- i мально простым и коротким маршрутам. Само собой разумеется, в программах : управления дисплеем должны использоваться специальные таблицы соответствия | определенных шестнадцатеричных чисел сегментам и определенных разрядов : дисплея катодам. Для того чтобы организовать взаимодействие с микроконтроллером AVR по одной управляющей линии, последовательные биты данных и тактовый сигнал ком- бинируются в сигнал ClkData и выдаются на вывод порта микроконтроллера. При этом по нарастающему фронту сигнала ClkData всегда начинается новый бит дан- ных. Передаче лог. О соответствует высокий уровень сигнала в линии ClkData на протяжении 25% (время tH) полного периода Т, а в случае передачи лог. 1 время tH составляет 75% периода Т. На рис. 2.4 показан сигнал ClkData, соответствующий выводу лог. О, а затем — лог. 1. ClkData -JI-------1 u _1^____ I ;‘н____I !«—T—►! Рис. 2.4. Форма сигнала ClkData при передаче такта и данных по одной линии В данном случае период Т комбинированного тактового сигнала и сигнала дан- ных ClkData должен составлять 20 циклов при частоте системной синхронизации fSYs =Ю МГц, т.е 2 мкс. Разделение тактового сигнала и сигнала данных По нарастающему фронту сигнала ClkData срабатывает одновибратор MF1 (см. рис. 2.3), продолжительность импульса ii которого составляет половину периода Т сигнала ClkData, т.е. ii = ХА Т = 1 мкс. Зная Ti, номиналы Ri и Ci можно определить с помощью диаграммы, представ- ленной на рис. 2.5.
30 Вспомогательные средства при вводе-выводе данных Рис. 2.5. Длительность ti импульса на выходе одновибратора типа 74НС4538 в зависимости от емкости времязадающего конденсатора Поскольку номинал времязадающего резистора Ri для известной длительности импульса Т1 определяется по диаграмме только приблизительно, а требуемая ем- кость конденсаторов, как правило, имеет значительное отклонение в пределах ±10...20%, то рекомендуется выставлять точное значение Rb Для этого вместо по- стоянного резистора Ri включается сериесная схема, состоящая из постоянного ре- зистора сопротивлением 1 kQ и подстроечного резистора сопротивлением 22 kQ , а длительность импульса п одновибратора настраивается точно на 1 мкс. В случае, если подходящие средства измерения для точной настройки R] отсут- ствуют, выбрать номиналы R] и С] можно по рис. 2.3. Длительность выходного им- пульса при указанных значениях составляет п « 1 мкс. В схеме, показанной на рис. 2.3, сигнал на инвертирующем выходе /Qi одно- вибратора MF1 используется в качестве такта сдвига SCK обоих сдвиговых регист- ров IC2 и IC3, а сигнал ClkData — в качестве сигнала данных последовательного входа SERjn регистра IC2. Таким образом, логический уровень, соответствующий половине периода Т сигнала ClkData, записывается в сдвиговый регистр IC2 по на- растающему фронту сигнала /Qi. После восьми тактовых сигналов SCK первый бит полностью проходит сдвиго- вой регистр IC2 и появляется на выходе QH'. Поскольку этот выход соединен с по- следовательным входом SERin регистра IC3, по следующему тактовому сигналу бит будет перемещен в сдвиговый регистр IC3. После шестнадцати тактовых импульсов
2.2. Управление семисегментным индикатором через один вывод порта микроконтроллера AVR 31 первый бит достигает выхода QH’ сдвигового регистра IC3, управляющего катодами разрядов дисплея. Таким образом можно каскадировать оба сдвиговых регистра IC2 и IC3. В этом случае цикл сдвига начинается с восьми бит данных, передаваемых для выбора катода, после которых следуют восемь бит данных, управляющих сег- ментами дисплея (см. рис. 2.6 и 2.7). Генерирование импульса записи в буфер Импульс на выходе MF2 формируется по прошествии времени Т2 после возник- новения нарастающего фронта на выходе /Qi. Для того чтобы быть уверенным, что время возникновения импульса от MF2 не истечет перед появлением следующего нарастающего фронта /Qi, выберем Т2 > 1,5 Т. Длительность импульса на выходе одновибратора MF2 не настолько критична для генерирования импульса записи в буфер как в случае с MF1 — требуется только соответствие вышеупомянутому условию тг > 3 мкс. Для значений Ri и Сь указан- ных на рис. 2.3, длительность Т2 ® 5 мкс, т.е. условие полностью выполнено. Поскольку тг больше периода импульсов в линии ClkData, сигнал на выходе /Q2 MF2 переходит в состояние лог. 1 только после прохождения всех шестнадцати так- товых импульсов регенерации дисплея. По своему нарастающему фронту он ини- циирует сохранение данных на выходах сдвиговых регистров IC2 и IC3 во внутрен- них буферных регистрах обеих микросхем с последующей их передачей на выходы Q0...7 задающих каскадов. Рассмотрим два примера регенерации дисплея: на рис. 2.6 показана временная диаграмма в случае отображения в третьем разряде дисплея цифры “4” (катод Кб, выход сдвигового регистра QF), а на рис. 2.7 — в случае отображения в пятом раз- ряде дисплея шестнадцатеричной цифры “F” (катод КО, выход сдвигового регистра QD). Размещение выводов дисплейного модуля соответствует рис. 2.3 (слева напра- во: КЗ - К2 - К1 - КО - К7 - Кб - К5 - К4). К4 К5 Кб К7 КО К1 К2 КЗ dp d е с g a b f 001000000001 101 1 Рис. 2.6. Процесс регенерации дисплея при выводе в третьем разряде цифры “4” (катод Кб) Время ожидания перед началом следующего цикла tw > 1,5 Т (см. рис. 2.7) га- рантирует, что периоды Т2 и Тз истекли, а данные переписаны в буферный регистр IC2 и IC3 до того, как начнется вывод данных в следующую позицию дисплея. Для выбранных в данном примере временных параметров на передачу всех 16 бит данных требуется около 35 мкс, а между двумя циклами регенерации проходит около 1,25 мкс, что вполне согласуется с вышеупомянутым временем ожидания tw.
32 Вспомогательные средства при вводе-выводе данных Рис. 2.7. Процесс регенерации дисплея при выводе в пятом разряде дисплея шестнадцатеричной цифры “F” (катод КО) На рис. 2.8 слева показан дисплей при отображении на нем цифры “4” в третьем разряде (катод Кб), а справа — при отображении шестнадцатеричной цифры “F” в пятом разряде (катод КО) согласно рис. 2.6 и 2.7. Размещение выводов дисплея со- ответствует рис. 2.3 (слева направо: КЗ - К2 - К1 - КО - К7 - Кб - К5 - К4). КЗ К2 К1 КО К7 Кб К5 К4 КЗ К2 К1 КО К7 Кб К5 К4 Рис. 2.8. Отображение на дисплее цифры “4” и шестнадцатеричной цифры “F” согласно рис. 2.6 и рис. 2.7 Вычисление частоты регенерации fp Согласно рис. 2.7, передача всех битов данных для управления одним разрядом дисплея включает в себя 16 тактовых импульсов с периодом Т сигнала ClkData (8 тактов для выбора требуемого катода дисплея плюс 8 тактов для семи сегментов индикатора и десятичной запятой dp), а также время ожидания tw > 1,5 Т перед на- чалом следующей последовательности. Следовательно, общее время ts, необходи- мое для отображения одного разряда дисплея, составляет как минимум t = 16 Г + 1,5 Т = 17,5-2 мкс = 35 мкс. При частоте повторения > 70 Гц человеческий глаз воспринимает изображение как “постоянное”. В нашем случае была выбрана частота повторения 100 Гц, при- званная обеспечить отсутствие каких-либо мерцаний. Вывод данных катодов и сег- ментов проще всего реализовать в подпрограмме обработки прерывания от таймера Т/СО, настроенного таким образом, чтобы переполнение из состояния $FF в состоя- ние $00 происходило каждые 10 мс. Буферизированный сдвиговой регистр На рис. 2.9 показана структурная схема и корпус буферизированного сдвигово- го регистра TPIC6595N от компании Texas Instruments, предназначенного для управ- ления катодами дисплейного модуля.
2.2. Управление семисегментным индикатором через один вывод порта микроконтроллера AVR 33 □ PGND Vcc SERIN QA QB QC QD SRCIr IG PGND Ep 10 LJ Ю CD io <0 О 20 19[] 18 17tj’ QH 15 □ 14p 13 12 11 tl (вид сверху) PGND LGND QH’ QG QF QE SCK RCK PGND E E E E 2 3 6 □ □ □ Рис. 2.9. Структурная схема и корпус буферизированного сдвигового регистра TPIC6595N от компании Texas Instruments Схема содержит: • восьмиступенчатый сдвиговый регистр, в котором поступающие на вход SERin биты данных по нарастающему фронту тактового сигнала на входе SCK перемещаются вглубь регистра; • восьмиступенчатый буферный регистр для преобразования последовательной передачи в параллельную и хранения данных с выходов сдвигового регистра, записываемых по нарастающему фронту сигнала на входе RCK; • выходной каскад на мощных ДМОП-транзисторах (см. рис. 2.10) с внутрен- ним сопротивленим RDs = 1,3 О, способный работать с установившимися то- ками силой до 250 мА и пульсирующими токами силой до 750 мА и отводить их в точку заземления силового каскада (PGND). При низком уровне сигнала на выводе /G активируется весь выходной задающий каскад с открытым сто- ком, если же на этом выводе установлена лог. 1, то каскад отключен. Рис. 2.10. Схема выходного задающего каскада с открытым стоком сдвигового регистра TPIC6595N Значение лог. 0 на входе SRCIr сбрасывает все восемь выводов сдвигового ре- 1стра в 0. В нормальном режиме вывод SRCIr соединен с выводом Vcc. Для каскадирования нескольких сдвиговых регистров бит данных со входа ERin, пройдя через сдвиговый регистр, на девятом тактовом импульсе SCK переда- 'ся на выход QH'. Микросхема TPIC6595N имеет два различных соединения с “землей” для сило- )й и логической частей, что позволяет достичь оптимальной развязки. Четыре вы- >да PGND корпуса должны быть снаружи соединены между собой и затем под- точены к выводу “земли” LGND логической части. [змерение
34 Вспомогательные средства при вводе-выводе данных TPIC6595N — один из самых распространенных на рынке электронных компонен- тов. Тем не менее, если приобрести именно эту модель по каким-no причинам не удастся, ее можно заменить сдвиговым регистром типа 74НС595 с драйвером ULN2803 от компании Allegro Micro или же восемью отдельными управляющими транзисторами п-р-п-типа, соответствующими Т9...Т16 на рис. 2.2. Управление выводами сегментов дисплейного модуля осуществляется с помо щью сдвигового регистра MIC5891 от компании Micrel или UCN5891 от компанщ Allegro Micro. Этот компонент устроен аналогично описанному выше TPIC6595N однако в данном случае выходной драйвер отводит ток не на “землю” через полево] МОП-транзистор с открытым стоком, как в случае с TRIC6595, а подает напряжени питания VBb для силовой части через биполярную пару Дарлингтона. При этом Vb может быть больше Vcc, благодаря чему возможна, например, работа дисплея от не стабилизированного напряжения при подключении через сглаживающий конденса тор блока питания. Таким образом, не только снижается потребление электроэнер гии стабилизатором напряжения и, соответственно, уменьшаются габариты его ох ладителей, но и устраняются кратковременные помехи и шумы рабочего напряже ния Vcc в логической части схемы в результате переключения сегментных токов. На рис. 2.11 показана структурная схема и корпус, а также силовой выходно] каскад сдвигового регистра MIC5891. Выходной задающий каскад aVbb Рис. 2.11. Структурная схема и корпус, а также силовой выходной каскад сдвигового регистра MIC5891 Как и в модели TPIC6595, здесь имеется восьмиразрядный сдвиговый регист] в котором подаваемый на вход SERin бит данных по нарастающему фронту тактовс го сигнала SCK сдвигается вглубь регистра, а также восьмиразрядный регистр дг последовательно-параллельного преобразования и хранения выходных даннь сдвигового регистра, однако в данном случае для записи не используется нара< тающий фронт сигнала RCK. В данном случае речь идет о “прозрачной” фиксаци при которой входные данные постоянно выдаются на выход регистра до тех по пока на входе ST установлен уровень лог. 1, и только после того как на этом вход появится лог. О начнется сохранение передаваемых на вход данных. Именно поэт му сигнал с выхода /Qi (см. рис. 2.3) используется не напрямую как источник стр< бирующего импульса IC2, как это имеет место в случае с IC3, а предварцтелы проходит через RC-звено R3, СЗ. Если принять для R3 и С3 номиналы согласг рис. 2.3, то для дифференцирующего звена определяется следующая постоянн; времени т3: тз = 7?3 - С3 = 10 kQ • 100 пФ = 1 мкс.
2.2. Управление семисегментным индикатором через один вывод порта микроконтроллера AVR 35 Диод D1 на рис. 2.3 защищает строб-вход IC2 от всплесков напряжения, обу- словленных дифференцирующим звеном. Выходной каскад Дарлингтона, согласно рис. 2.11, способен выдавать устано- вившиеся токи силой до 500 мА. Когда на выводе /ОЕ установлен уровень лог. 1, то выходной задающий каскад отключен. MIC5891, а также UCN5891 — достаточно распространенные на рынке электрон- ные компоненты. Тем не менее, если приобрести эти устройства по каким-то при- чинам не удастся, их можно заменить сдвиговым регистром типа 74НС595 с моду- лем драйвера UDN2981A от компании Allegro Micro или же восемью отдельными управляющими п-р-п-транзисторами, соответствующими Т1 ...Т8 на рис. 2.2. Расчет токоограничительных резисторов R4...R11 (см. рис. 2.3) В мультиплексном режиме работы дисплейного модуля каждый индикатор мо- жет быть активен только на протяжении одной восьмой длительности цикла. Ток не проходит через индикатор в течении 87,5 % этой длительности, что позволяет инди- катору остыть. По этой причине в импульсном режиме работы индикатора произво- дитель допускает более высокие значения тока, чем в статическом. В технической характеристике дисплея hp5082-7740 с семисегментными свето- диодными индикаторами с общим катодом (парный модели hp5082-7730 с общим анодом) указано, что сила тока через сегмент в импульсном режиме с длительно- стью импульса около 1,25 мс и общей длительностью цикла 8-1,25 мс = 10 мс может в четыре раза превышать силу установившегося тока в статическом режиме. Допус- тимое значение статического тока через сегмент для индикатора hp5082-7740 при температуре окружающей среды 25°С составляет 25 мА. Интенсивность свечения индикатора hp5082-7740 пропорциональна току через сегмент. Чтобы напрасно не перегружать дисплей, ток через сегмент устанавливается эавным Is = 45 мА. При таком входном токе, протекающем через сегмент дисплея, da биполярный управляющий транзистор Дарлингтона в выходном каскаде подается спряжение USh ~ 2,1 В. В худшем случае, когда при отображении цифры “8” с де- сятичной запятой светятся все восемь сегментов индикатора, сумма выходных токов щя MIC5891 составляет IgeS = 8 • Is = 8 • 45 мА = 360 мА. Для выходного задающего саскада MIC5891 это не составляет проблемы, тем более что в статическом режиме >н может обеспечивать выходные токи силой до 500 мА. Максимальная мощность ютерь Ру для MIC5891 составляет Л = USH • lges = 2,1В • ЗбОл/Л = 0,16Вт. В случае, когда включены все сегменты дисплея, мощность потерь необходимо [епрерывно отводить. Согласно техническим характеристикам MIC5891 с корпусом ИР-16, это возможно при температуре окружающей среды до Та = 110°С. Если включены все восемь сегментов некоторого разряда дисплея, то на выход- гой каскад TRIC6595 должен поступать общий ток lges = 8 • Is= 8 • 45 мА = 360 мА. 1адение напряжения на полевом МОП-транзисторе в выходном каскаде TRIC6595 таком случае составляет Usl = 1,3 Q • Isl « 500 мВ. Максимальная мощность по- ерь Pv для TRIC6595 определяется согласно формуле: Ру = I* Яп, = (0,36Л)2 1,30 = 110мВт. V LJ L/iJ V ' ' J Согласно техническим характеристикам TRIC6595, это значение не должно оздавать каких-либо проблем.
36 Вспомогательные средства при вводе-выводе данных Прямое напряжение Uf на светодиоде индикатора hp5082-7740 рассчитывается по формуле Uf ~ 1,55 В • Is • 7 Q . Таким образом, для тока через сегмент Is = 45 мА значение Uf обычно составляет Uf « 1,55 В • 45 мА • 7 Q = 1,85 В. Следовательно, падение напряжения UR на резисторах R4...R11 составляет: Ur = Vbb — Ush — Usl — Uf- Исходя из этого, можно рассчитать сопротивление токоограничительных рези- сторов R4...R11: R4...R11 =UR/IS. В нашей тестовой схеме напряжение питания VBb индикатора должно состав- лять 10 В (усредненное значение постоянного напряжения Vbb)- В таком случае на каждый из резисторов R4...R11 подается напряжение Ur = Vbb-Ush-Usl-Uf= ЮВ-2,1 В-0,5 В-1,85 В = 5,55 В. При этом каждый из восьми резисторов R4...R11 имеет сопротивление минимум Rs = R4...R11 = UR / Is = 5,55 В / 45 мА = 123 Q. Из стандартного IEC-ряда Е24 было выбрано значение Rs = 120 Q. Благодаря этому приближению сила тока через сегмент увеличивается до Is = URI Rs = 5,55 В / 120 Q = 46,25 мА. Каждый из восьми резисторов должен быть рассчитан на мощность потерь Pv = UR Is= 5,55 В • 46,25 мА = 0,26 Вт. Поскольку не рекомендуется длительное время использовать резистор при мощности потерь, приближающейся к критической, остановимся на варианте рези- сторов R4...R11 с Pv = 0,5 Вт. И еще несколько слов относительно напряжения питания Vbb светодиодного индикатора. С одной стороны, оно должно быть минимальным, чтобы минимизиро- вать мощность потерь при работе индикатора. Однако, с другой стороны, более вы- сокое значение VBb приводит к увеличению падения напряжения на токооограничи- тельных резисторах R4...R11. Как следствие, колебания нагрузки, связанные с коли- чеством задействованных сегментов, будут влиять на яркость свечения индикатора. Выбранное значение VBb = 10 В — это оптимальный компромисс между двумя опи- санными выше вариантами. Источник VBB должен иметь низкое внутреннее сопротивление, потому что, в противном случае, будет получена различная яркость свечения сегментов в тех раз- рядах дисплея, где их светится слишком много или, наоборот, слишком мало. Практическая реализация светодиодных дисплеев Практическая реализация светодиодного дисплея представлена на рис. 2.12. С целью обеспечения универсальности использования печатной платы, дисплей может управляться через вывод ClkData (переключатели S1...S3 в положении А) или же через три вывода SCLK, DATA и RCLK (переключатели S1...S3 в положении В). Если управление дисплеем осуществляется исключительно через вывод ClkData, то выводы SCLK, DATA и RCLK остаются без нагрузки. Порядок действий описан выше. Если к дисплею требуется обратиться через интерфейс SPI микроконтроллера AVR, то вывод ClkData остается открытым, а выводы SCLK, DATA и RCLK соеди-
2.2. Управление семисегментным индикатором через один вывод порта микроконтроллера AVR 37 с соответствующими линиями управления SPI: SCK, MOSI и /SS. В таком сдвоенный одновибратор 74НС4538 можно не подключать. Рис. 2.12. Схема светодиодного дисплея Сигналы S-SCLK, S-DATA и S-RCLK генерируются, как было описано выше, помощью одновибратора 74НС4538 на основании входного сигнала ClkData, Со- тветствующая схема изображена на рис. 2.13.
38 Вспомогательные средства при вводе-выводе данных Рис. 2.13. Схема регенерации сигналов S-SCLK, S-DATA и S-RCLK из входного сигнала ClkData С учетом особенностей отображения измеряемых единиц, восьмой разряд дис- плея реализован из отдельных светодиодов. Так, на передней панели отображаются символы “V”, “mA” и “°C”. Схема питания буферизированного сдвигового регистра IC2 и IC3 изображена на рис. 2.14. VCC GND Рис. 2.14. Схема питания буферизированного сдвигового регистра IC2 и IC3 Как уже было упомянуто выше, напряжение Vbb (напряжение питания индика- тора) может быть нестабилизированным. PGND — вывод силовой “земли” источни- ка питания. Обе линии должны быть по возможности короткими и достаточно ши- рокими. Изображенные на рис. 2.12 справа диоды могут быть использованы для опроса клавиш. Соответственно, если клавиши не используются, от них можно отказаться. На рис. 2.15 показано расположение навесных элементов на печатной плате ин- дикатора, а топология платы представлена на рис. 2.19. Поскольку прототип схемы предусматривал одностороннюю топологию, необходимо реализовать несколько перемычек, а также четыре изолированных монтажных провода в навесном испол- нении (см. рис. 2.15).
2.2. Управление семисегментным индикатором через один вывод порта микроконтроллера AVR 39 Рис. 2.15. Расположение навесных элементов на печатной плате индикатора Фотография укомплектованного образца платы представлена на рис. 2.16. Рис. 2.16. Фотография платы (вид сверху) Вместо R30 в данном случае установлен подстроечный резистор, предназна- 1енный для точной регулировки длительности импульса одновибратора MF 1 IC3A). Резистор R3 в целях эксперимента заменен двумя включенными параллель- ю резисторами на 0,25 Вт (смонтированы друг над другом). Разрядам дисплея D0...D6 соответствуют семисегментные индикаторы типа ID1133R (с общим катодом). Они отличаются от вышеупомянутых индикаторов 1р5082-7740 схемой подключения, а высота 13 см при указанных параметрах обес- ючивает хорошую яркость и четкость отображения. При всех вычислениях для дан- 1ых индикаторов действуют те же принципы и величины, что и для индикаторов ?ипа hp5082-7740. Подводка напряжения питания VCc микросхемы IC2 (вывод 2, см рис. 2.14) вы- юлняется в виде навесного провода и монтируется в образце платы на нижней сто- >оне (с проводящим рисунком). Это соединение хорошо видно на фотографии рис. 2.18). На рис 2.19 представлена фотография лабораторного образца индикаторной :хемы, управляемой микроконтроллером AT90S2313 на тестовой плате (описана f разделе 3.3). Микроконтроллер проверяет схему с помощью тестовой программы, [редставленной в листинге 2.1.
40 Вспомогательные средства при вводе-выводе данных Рис. 2.17. Топология платы индикатора (вид снизу) Рис. 2.18. Фотография нижней стороны платы Рис. 2.19. Лабораторная сборка образца индикаторной платы
2.2. Управление семисегментным индикатором через один вывод порта микроконтроллера AVR 41 Файл К2_2 Testprogramm Display 1 Ltg. asm можно также найти на прилагаемом к Ж книге компакт-диске в папке Program. Листинг2.1. Программа тестирования Дисплея К2_2 Testprogramm Display 1 Ltg.asm ;***** 8-разрядный семисегментный дисплей с одной управляющей линией ;* Версия: 1.0 ;* Целевое устройство: AT90S2313 /* Частота системной синхронизации: 10 Мгц ;* Описание: Семь семисегментных индикаторов и шесть отдельных светодиодов управляются в мультиплексном режиме через один вывод микроконтроллера AVR. nolist inlude "С:\Programme\Atmel\AVR Tools\AvrAssembler\Appnotes\2313def.inc" list ;***** Определения .equ ClkD = PB7 /Разряд 7 порта В - вывод для тактов+данных .equ Time = 195 /Коэф.деления=64, fSys=10Mru -> Прерывание каждые 1,25мс .equ Daur = 160 /Длительность задержки - 200 мс equ Ablf =0 /Разряд 0 в регистре флагов - задержка истекла equ K4 = ОЫООООООО /Катод 4 - разряд 7 выходного байта equ K5 = ОЬОЮООООО /Катод 5 - разряд 6 выходного байта equ K6 = ОЬООЮОООО /Катод 6 - разряд 5 выходного байта equ K7 = оьоооюооо /Катод 7 - разряд 4 выходного байта equ K0 = оьооооюоо /Катод 0 - разряд 3 выходного байта equ KI = оьоооооюо /Катод 1 - разряд 2 выходного байта equ K2 = оьоооооою /Катод 2 - разряд 1 выходного байта equ КЗ = ObOOOOOOOl /Катод 3 - разряд 0 выходного байта equ a = 2 /Сегмент A - разряд 2 выходного байта equ b = 1 /Сегмент В - разряд 1 выходного байта equ c = 4 ;Сегмент С - разряд 4 выходного байта equ d = 6 /Сегмент D - разряд 6 выходного байта equ e = 5 /Сегмент Е - разряд 5 выходного байта equ f = 0 /Сегмент F - разряд 0 выходного байта equ g = 3 /Сегмент G - разряд 3 выходного байта equ dp = = 7 /Сегмент DP - разряд 7 выходногс ) байта ► ****: * Регистровые переменные . def Ct40 = r08 /Младший байт счетчика для 4-хразрядного дисплея . def Ct41 = r09 /Старший байт счетчика для 4-хразрядного дисплея . def Ct30 = rlO /Младший байт счетчика для 3-хразрядного дисплея . def Ct31 = rll /Старший байт счетчика для 3-хразрядного дисплея . def RefO = rl2 /Младший байт (сегменты) для регенерации дисплея . def Refl = rl3 /Старший байт (катоды) для регенерации дисплея , def Verz = rl4 /Счетчик длительности задержки . def Save = rl5 /Буфер для сохранения SREG при прерывании . def tO = rl6 /Временный рабочий регистр . def tl = rl7 /Временный рабочий регистр . def Flag = rl8 /Регистр флагов . def DPtr = r20 /Указатель на цифру дисплея . def DPOn = r21 /Указатель на десятичную точку дисплея . def iO = r24 /Временный рабочий регистр прерываний . def il = r25 /Временный рабочий регистр прерываний
42 Вспомогательные средства при вводе-выводе данных Ли тинг 2.1. Продолжение ;***** КОД . cseg .org 0 /Адрес рестарта rjmp Initial .org OVFOaddr ;Адрес вектора прерывания при переполнении Т/СО Display: ;Регенерация дисплея при переполнении Т/СО in Save,SREG /Сохранение регистра состояния push zl ;Сохранение указателя Z push zh ; также используется в основной программе Idi il,-Time ;Продолжительность до следующего прерывания out TCNTO, il /Инициализация счетчика ТС1 Idi zl, Low (Kath«l) /(Адрес таблицы катодов) * 2 Idi zh, High (Kath«l) / загружаем в указатель Z clr il add zl,DPtr /Текущее состояние указателя дисплея adc zh,il ; прибавляем к содержимомому указателя Z 1pm /Битовая комбинация для катодов в г0 mov Refl,rO /Загружаем битовую комбинацию в Refl Idi zl,Low(D0) /Адрес SRAM-буфера Idi zh,High(DO) / загружаем в указатель Z add zl,Dptr /Прибавляем указатель дисплея Id RefO,z /Загружаем соответствующую цифру в RefO inc DPtr /Увеличиваем указатель дисплея на 1 andi DPtr,$07 /Сбрасываем в 0 разряды 3... 7 Idi i0,16 /Устанавливаем счетчик на вывод 16-ти бит H_Flanke: sbi PortB,ClkD /Формируем нарастающий фронт сигнала Data/Clock Isl RefO /Сдвигаем младший байт влево rol Refl /Сдвигаем старший байт влево brcc LowLang /Переход, если флаг С=0 (длительный низкий уровень). HighLang / иначе - длительный высокий уровень импульса nop nop nop nop nop nop nop nop nop nop cbi Port,ClkD /Формируем ниспадающий фронт сигнала Data/Clock Dis3: dec iO /Выдать все биты? brne H Flanke /Переход, если нет dec Verz ;Уменьшаем счетчик задержки brne Exitlnt /Переход, если не равно нулю Idi il,Daur /Дозагрука длительности задержки mov Verz,il sbr Flag,l«Ablf /Флаг указывает на то, что задержка истекла tjmp Exitlnt LowLang: /Длительный низкий уровень импульса cbi PortB,ClkD /Формируем ниспадающий фронт сигнала Data/Clock
2.2. Управление семисегментным индикатором через один вывод порта микроконтроллера AVR 43 Листинг 2.1. Предо/ркение пор пор пор пор пор пор пор rjmp Dis3 Exitlnt: pop zh pop zl out SREG,Save ;Восстанавливаем указатель Z /Восстанавливаем регистр состояния Initial: /Инициализация регистров Idi tl,low(RAMEND) out SPL,tl InitPortD: /Инициализация указателя стека Idi tl,l«ClkD out DDRB,tl InitTCO: Idi tl,-Time ;Направление передачи данных: все выводы - входы, / за исключением ClkD /Инвертированное значение, поскольку Т/СО - / суммирующий счетчик out TCNT0,tl Idi tl,$03 out TCCR0,tl Idi tl,l«T0lE0 out TIMSK,tl Idi tl,Daur mov Verz,tl /Инициализируем счетчик /Коэффициент деления = 64 /Инициализируем регистр управления Т/СО /Разрешаем прерывание при переполнении Т/СО /Дозагружаем длительность задержки sei /Общее разрешение прерываний ;* Программа тестирования InitDislayBuffer: clг Dptr /Инициализируем указатель дисплея Idi tl,01 /Устанавливаем светодиодный индикатор в разряд 0 sts D7,tl clr Ct40/ /Сохраняем в SRAM-буфере clr Ct41 /Очищаем указатель 4-хразрядного дисплея clr Ct30 clr Ct31 /Очищаем указатель 3-хразрядного дисплея rcall Code 4 /Код для 4-хразрядного дисплея rcall Code_3 /Код дял 3-хразрядного дисплея nop Ids tl,D0 /Первая цифра в SRAM-буффере sbr 11,1 «dp /Устанавливаем десятичную точку sts D0,tl /Отображаем цифру Wait_Ablauf: sbrs Flag,Ablf /Пропускаем следующую команду, если задержка истекла rjmp Wait Ablauf /Ожидаем появления флага Ablf ebr Flag, l«Ablf inc Ct40 /Сбрасываем флаг Ablf brne HP1 inc Ct41 HP1: mov t0,Ct30 mov tl,Ct31 /Ct41:Ct40 увеличиваем на 1
44 Вспомогательные средства при вводе-выводе данных Листинг 2.1. Продолжение subi tO,01 sbci tl,00 andi tl,$0F mov CT30,t0 mov CT31,tl rcall Code_4 rcall Code_3 Ids tl,D7 Isl tl brne HP2 inc tl HP2: sts D7,tl inc DPOn cpi DPOn,7 brio HP3 clr DPOn HP3: Idi zl,Low(D0) Idi zh,High(DO) add zl,DPOn Id tl, z sbr tl,l<<dp st z,tl rjmp Wait_Ablauf /Очищаем старший полубайт, ; так как показание счетчика Ct31:Ct30 макс. $FFF /Уменьшаем Ct31:Ct30 на 1 ;Код дял 4-хразрядного дисплея /Код для 3-хразрядного дисплея /Извлекаем светодиодную комбинацию из SRAM /Сдвигаем комбинацию влево /Переход,- если пройдены не все светодиоды /Устанавливаем светодиодный индикатор на разряд 0 /Сохраняем в буфере SRAM /Увеличиваем указатель на текущую десятичную точку /Указывает ли DPOn на светодиоды индикатора (D7)? /Переход, если нет (DPOn <= 6) /DPOn указывает на первую цифру в буфере SRAM /Соответствующая цифра в tl /Устанавливаем десятичную точку ;Восстанавливаем цифру /Ожидаем флага Ablf ;* Подпрограммы Code_4: mov tO,Ct41 andi tO,$FO swap tO rcall Get_7_ sts D0,r0 mov tO,Ct41 andi tO,$OF rcall Get_7_ sts Dl,r0 mov t0,Ct40 andi tO,$F0 swap tO rcall Get_7_ sts D2,r0 mov t0,Ct40 andi tO,$OF rcall Get_7_ sts D3,r0 ret Segm Segm Segm Segm /Очищаем младший полубайт /Обмен полубайтами /Генерируем код для полубайта /Сохраняем код цифры /Очищаем старший полубайт /Генерируем код для полубайта /Сохраняем код цифры /Очищаем младший полубайт /Обмен полубайтами /Генерируем код для полубайта /Сохраняем код цифры /Очищаем старший полубайт /Генерировать код для полубайта /Сохраняем код цифрз Code_3: mov tO,Ct31 rcall Get_7_ sts D4,r0 mov t0,Ct30 andi tO,$F0 swap tO rcall Get_7_ Segm Segm /Генерируем код для полубайта /Сохраняем код цифры /Очищаем младший полубайт /Обмен полубайтами /Генерировать код для полубайта
2.2. Управление семисегментным индикатором через один вывод порта микроконтроллера AVR 45 Листинг 2.1. Окончание sts D5,r0 mov t0,Ct30 andi tO,$OF rcall Get_7_Segm sts D6,r0 ret /Сохраняем код цифры ;Очищаем старший полубайт ;Генерировать код для полубайта ;Сохраняек код цифры Get_7_Segm: Idi zl,Low(Segm<<l) Idi zh,High(Segm«l) clr tl add zl,tO adc zh,tl 1pm ret Код 7 сегментов - в rO ; Таблицы кодировки Kath: .db KO, KI, K2, КЗ, К4, К5, Кб, К7 /Расположение катодов Segm: /Таблица для конвертации шестнадцатеричных кодов в коды 7 сегментов /Порядок расположения: Разряды 7...О = dp-d-e-c-g-a-b-f a fl lb I g I e| I c Z0_l: Z2_3: Z4_5: Z6_7: Z8_9: ZA_B: ZC_D: ZE_F: 1 1 dp о о dp (альтернативная) d db l<<a | l«b | l<<c | l«d| l<<e | l«f, l«b|l<<c db l<<a | l«b | l<<d | l«e 11<<д, 1<<а | l«b | l<<c | l<<d | l«g db 1<<Ь 1 l«c | l<<f I l«g, l«a | l«c | l<<d | l«f | l«g db l<<a | l<<c | l<<d | l<<e | l<<f | l«g, 1<<а | l<<b | l<<c db l«a | l<<b | l«c | l<<d 11<<е | l«f 11<<д, 1<<а | l«b | l«c | l«d | l<<f | l<<g db l<<a | l<<b | 1<<c | l<<e | l<<f | l«g, 1<<с | l<<d 11<<е | l<<f | l<<g db l<<a | l«d| 1<<е I l«f, l«b11<<с | l«d| l<<e | l<<g db l<<a|l<<d|l<<e|l<<f|1<<д, 1<<а|l<<e|l<<f|l<<g ;***** Область RAM . dseg /Начало области SRAM DO: .byte 1 /Сегменты цифры DO DI: .byte 1 /Сегменты цифры D1 D2 : .byte 1 /Сегменты цифры D2 D3: .byte 1 /Сегменты цифры D3 D4 : .byte 1 /Сегменты цифры D4 D5: .byte 1 /Сегменты цифры D5 D6: .byte 1 /Сегменты цифры D6 D7: .byte 1 /Сегменты цифры D7
46 Вспомогательные средства при вводе-выводе данных Описание программы Часть инициализации После установки указателя стека вывод РВ7 (сигнал ClkData) конфигурируется как выход. Таймер Т/СО обеспечивает синхронизацию, необходимую для регенера- ции индикатора каждые 1,25 мс. Соответственно, его делитель установлен на значе- ние 64, что позволяет синхронизировать Т/СО с fsvs / 64 = 10 МГц /64 = 156,25 кГц. Поскольку Т/СО — суммирующий счетчик, в счетный регистр записывается отрица- тельное значение -195, что должно вызвать переполнение регистра после 195 / 156,25 кГц =1,248 мс. В результате установки разряда TOIEO в регистре TIMSK разрешается прерыва- ние при переполнении таймера/счетчика Т/СО. Таким образом, при переходе со- стояния счетчика из $FF в $00 вызывается соответствующая подпрограмма обра- ботки прерывания. При каждом прерываний счетчик опять инициализируется зна- чением -195, благодаря чему подпрограмма повторяется каждые 1,25 мс. Кроме то- го, счетчик Verz, назначение которого будет описано ниже, инициализируется стар- товым значением Daur = 160. Программа тестирования Для того чтобы проверить работоспособность дисплея, на нем отображаются состояния четырехразрядного шестнадцатеричного счетчика Ct41:Ct40 и трехраз- рядного шестнадцатеричного счетчика Ct31:Ct30. При этом счетчик Ct41:Ct40 уве- личивается, a Ct31 :Ct30 — уменьшается. Изменение обоих счетчиков на единицу происходит каждые 200 мс. Этот промежуток времени определяется счетчиком Verz в подрограмме обработки прерывания от Т/СО. Дополнительно происходит настройка десятичных точек цифр дисплея и светодиодов, отображающих диапазон. Отдельные светодиоды, отображающие диапазон, подключены к катоду К7 вместо неиспользуемых внутренних светодиодов восьмого разряда дисплея (см. рис. 2.12). Как было отмечено выше, принцип работы мультиплексного индикатора осно- ван на инертности человеческого глаза. В каждый момент времени на дисплее све- тится только один индикатор из восьми. Это свечение продолжается 1,25 мс, после чего загорается следующий индикатор на тот же промежуток времени и т.д. Для за- вершения цикла, в котором каждый из восьми индикаторов должен быть задейство- ван один раз, требуется 10 мс. После этого цикл повторяется. Столь быстрая смена индикаторов не воспринимается человеческим глазом, в результате чего изображе- ние на дисплее кажется постоянным. Содержимое изображения для каждого разряда индикатора закладывается в ста- тическую память SRAM микроконтроллера AVR в ячейках памяти D0...D7 в виде кода для семи сегментов. Указатель дисплея DPtr поочередно перебирает катоды всех позиций дисплея, которые должны быть задействованы при следующей регенерации. В начале про- граммы указатель DPtr устанавливается в 0, что соответствует первому разряду. Кроме того, первым должен быть задействован светодиод отображения диапазона, поэтому позиции D7 присвоено значение $01. После обнуления счетчиков Ct41:Ct40 и Ct31:Ct30 начальные показания преоб- разуются подпрограммами Code_4 и Code_3 в код семи сегментов и сохраняются в ячейках памяти от D0 (максимальное значение) до D3 (минимальное значение) статической память SRAM.
2.2. Управление семисегментным индикатором через один вывод порта микроконтроллера AVR 47 В конце концов посредством установки соответствующего разряда в ячейке па- мяти DO включается десятичная точкой в первом разряде дисплея. На позицию ин- дикатора с активной десятичной точкой указывает указатель DPOn, который при пе- резапуске микроконтроллера инициализируется значением 0 (то есть, указывает на первый разряд дисплея). При каждом вызове подпрограммы обработки прерывания от Т/СО значение счетчика Verz уменьшается на 1. Через 160 вызовов подпрограммы обработки пре- рывания, когда значение счетчика Verz станет равным 0, в Vertz опять загружается число 160, а также устанавливается флаг Ablf, сигнализирующий основной про- грамме о завершении задержки tv = 160 • 1,25 мс = 200 мс. Таким образом, каждые 200 мс младший байт Ct40 счетчика Ct41:Ct40 увеличи- вается на 1. Когда же в результате переполнения его содержимое изменится с $FF на $00, увеличивается на 1 содержимое старшего байта счетчика Ct41. Затем содер- жимое счетчика Ct31:Ct30 будет уменьшено на 1, а его старший полубайт будет очищен, поскольку в случае с Ct31 :Ct30 речь идет только о трехразрядном счетчи- ке. Новые показания счетчика вновь будут преобразованы подпрограммами Code_4 и Code_3 в код семи сегментов и сохранены в ячейках D0...D3 или D4...D6 стати- ческой памяти SRAM. После смещения битовых комбинаций отдельных светодиодов, отображающих диапазон и десятичную точку, на одну позицию цикл программы завершен и не во- зобновится до окончания периода задержки. Подпрограмма обработки прерываний Display После входа в подпрограмму обработки прерывания Display и сохранения ре- гистров, используемых как в основной программе, так и в подпрограмме обработки прерывания, в таймер Т/СО записывается значение перезагрузки -Time, опреде- ляющее временной интервал до следующего прерывания. Затем указатель Z уста- навливается на начало хранящегося во флэш-памяти списка катодов, определяюще- го очередность разрядов дисплея. Текущее положение указателя дисплея DPtr при- бавляется в качестве смещения к начальному адресу списка катодов (указатель Z), что позволяет с помощью команды 1pm загрузить комбинацию битов, управляющую необходимым для данного разряда катодом, в регистр г0, а оттуда — в регистр Refl. Re fl совместно с RefO образует 16-тиразрядное значение Refl: RefO, содер- жащее поступающую на сдвиговый регистр комбинацию битов для катодов и сег- ментов. При этом указатель Z устанавливается на начало списка разрядов дисплея в статической памяти SRAM (DO), где в кодах семи сегментов записано содержимое индикаторов. Текущее положение указателя дисплея DPtr прибавляется в качестве смещения к начальному адресу списка катодов (указатель Z), в результате чего со- ответствующая цифра загружается в Ref 0. Указатель дисплея для следующего пре- рывания увеличивается на 1 и в случае необходимости сбрасывается в 0, если имеет место переполнение из 7 в 8 (индикатор состоит лишь из 8 позиций). После того как комбинация битов для текущего катода и сегмента записана в Ref 1: RefO, она может быть выведена как комбинированный тактово-информаци- онный сигнал. Как было описано выше (см. рис. 2.4) вывод каждого бита начинает- ся по нарастающему фронту. В случае вывода лог. 1 доля высокого уровня в сигнале составляет 75%, а в случае лог. 0 — только 25% от общего периода 2 мкс. Управ- ляющие фронты создаются с помощью соответствующих команд в цикле програм- мы. При этом временные задержки формируются с помощью команд пор.
48 Вспомогательные средства при вводе-выводе данных После завершения участка высокого уровня вывод ClkD вновь переходит в со- стояние лог. О, и цикл программы повторятся до тех пор, пока не будут выведены все 16 бит. Поскольку команде brcc LowLang требуется два тактовых импульса в случае перехода и только один в случае отсутствия перехода, выходной сигнал несколько отличается от требований согласно рис. 2.4 (1,5 мкс из 2 мкс при лог. 1 в противо- положность 0,6 мкс из 2 мкс при лог. 0), что на практике, однако, не играет никакой роли. После того как все 16 бит выведены, значение счетчика задержки Verz умень- шается на 1. Когда оно достигает 0, в основной программе устанавливается флаг Ablf, сигнализирующий о завершении задержки. Счетчик Verz опять инициализи- руется исходной величиной Daur = 160, после чего начинается новый цикл задерж- ки. Подпрограмма обработки прерывания завершается восстановлением сохранен- ного регистра. Подпрограмма Code_4 Подпрограмма Code_4 определяет коды семи сегментов для четырех позиций счетчика Ct41:Ct40 и сохраняет их в ячейках памяти от D0 (максимальное число) до D3 (минимальное число) статической памяти SRAM. Подпрограмма Code_3 Подпрограмма Code_3 определить коды семи сегментов для трех позиций счет- чика Ct31:Ct30 и сохраняет их в ячейках памяти от D4 (максимальное число) до D6 (минимальное число) статической памяти SRAM. Подпрограмма Get_7_Segm Код семи сегментов для каждого шестнадцатеричного числа (0....F) хранятся в списке Segm во флэш-памяти. Поскольку ячейки флэш-памяти 16-тиразрядные, по одному адресу всегда содержится две цифры (первый — младший байт). Какой из байтов: младший или старший — будет считан, определяется указателем Z. Подпро- грамма Get_7_Segm определяет код семи сегментов для одной из шестнадцатерич- ных цифр 0...F, пересланных в регистр tO. При этом tO добавляется программой к начальному адресу списка Segm, что позволяет с помощью команды 1pm загрузить в регистр г0 соответствующий код семи сегментов. Выводы При статической настройке восьми светодиодных индикаторов, каждый из ко- торых состоит из восьми (включая десятичную точку) сегментов, с типичным током через сегмент в 20 мА общее потребление тока составляет lStat = 8-8-50 мА = 1,28 А. Если сравнить рабочий ток использованного в данном случае восьмиразрядного мультиплексного индикатора IA тах = 360 мА с необходимым для статического ото- бражения током Istat = 1,28 А , то преимущества такого способа отображения нали- цо. Тем не менее, если сравнить сложность конструкции и особенно потребление тока восьмиразрядных светодиодных индикаторов с другими формами дисплеев (например, с широко распространенными ЖК-модулями, потребление тока у кото- рых настолько незначительно, что им можно пренебречь), то становятся очевидны- ми и недостатки индикаторов данного типа.
2.3. Взаимодействие микроконтроллера AVR с ПК через последовательный интерфейс 49 И все же очень многие пользователи предпочитают ЖК-индикаторам светоди- одные дисплеи, поскольку с самосветящегося и зачастую достаточно большого LED-дисплея считывать данные гораздо проще, чем с альтернативного ЖК-монито- ра. Величина светодиодного индикатора и высокая яркость свечения позволяют бы- стро определять его показания даже со значительного расстояния, что чаще всего невозможно при использовании как правило небольших жидкокристаллических мо- дулей. 2.3. Взаимодействие микроконтроллера AVR с ПК через последовательный интерфейс Даже после внедрения USB-интерфеса последовательная передача по стандарту RS232 все еще актуальна, что обусловлено простотой использования этого стандар- та в сфере измерений и регулирования. Передача данных через последовательный интерфейс с хорошим соотношением “сигнал/помеха” может осуществляться на ко- роткие и средние дистанции. Практически во всех моделях микроконтроллеров серии AVR реализован аппа- ратный приемо-передатчик U(S)ART, позволяющий принимать и передавать байты данных. Множество возможностей обмена данных через последовательного интерфейса существует даже в том случае, если участником обмена является не другой микро- контроллер AVR, а, например, ПК, в котором принятые данные будут обработаны и представлены в графическом виде. Так, в Internet доступно множество библиотек DLL, содержащих подпрограммы для работы с последовательным интерфейсом. Например, для пользователей Visual Basic компания Microsoft предоставляет дополнительный элемент управления по- следовательным интерфейсом MSCOMM.OCX, который можно интегрировать в собст- венные программы. Программа HyperTerminal В операционной системе Windows в разделе стандартных программ присутст- вует программа HyperTerminal, используемая для получения и отправки данных че- рез последовательный интерфейс. Эта программа используется во многих из рас- смотренных в этой книге примеров. Для ее запуска следует выполнить команду сис- темного меню Пуск ► Все программы ► Стандартные ► Communications ► HyperTerminal. Примечание Если ссылка на программу HyperTerminal в системном меню Пуск отсутствует, то это означает, что она не была установлена при установке операционной системы Windows. Для того чтобы ее установить отдельно, следует выполнить следующие действия: 1. Открыть панель управления Windows. 2. Выбрать категорию задач Установка и удаление программ. 3. Нажать кнопку Установка компонентов Windows. 4. В диалоговом окне Мастер компонентов Windows выбрать элемент Связь и на- жать кнопку Подробнее. 5. Установить флажок возле элемента HyperTerm-nal, нажать кнопку ОК и пройти дальнейшие этапы программы установки.
50 Вспомогательные средства при вводе-выводе данных При регулярном использовании HyperTerminal рекомендуется создать на рабо- чем столе соответствующий ярлык. Программа HyperTerminal может быть настроена в соответствии с любыми тре- бованиями. Как показано на рис. 2.20, возможно определить скорости передачи, ко- личество передаваемых бит данных, четность и количество стоп-битов, а также вы- брать протокол, т.е. тип сигнала квитирования (Xon-Xoff, аппаратный, нет). Рис. 2.20. Возможности настройки программы HyperTerminal В представленных в данной книге программах предполагается, что в качестве символа конца строки используется комбинация CR (возврат каретки, шестнадцате- ричный код ODh) и LF (перевод строки, шестнадцатеричный код OAh). Для этого в программе HyperTerminal следует выполнить команду меню File ► Properties, в диалоговом окне свойств пе- рейти на вкладку Settings, на- жать кнопку ASCII Setup, в диа- логовом окне ASCII Setup уста- новить флажок Send line ends with line feeds (рис. 2.21) и на- жать кнопку OK. Рис. 2.21. Добавление символа перевода строки к передаваемым с помощью HyperTerminal строкам Определения для последовательной передачи данных по интерфейсу RS232 Требования ко входному и выходному уровням сигнала согласно стандарту RS232 изображены на рис. 2.22. Выходной уровень со стороны передатчика для лог. 0 (TTL-уровень 0...+0,8 В или “Пробел”) должен быть больше или как минимум равен +5 В. Для лог. 1 (TTL-уровень +2,0 В...+5,0 В, или “Отметка”), соответствен- но, меньше или равен -5 В. Со стороны приемника входной уровень больше +3 В рассматривается как лог. 0, а меньше -ЗВ — как лог. 1.
2.3. Взаимодействие микроконтроллера AVR с ПК через последовательный интерфейс 51 Многие К8232-приемники даже распознают как лог. 1 входной уровень меньше +2 В, а как лог. О — входной уровень больше +2 В. Таким об- разом, при передаче данных на небольшие рас- стояния могут быть использованы очень простые интерфейсы (см. рис. 3.24 в разделе 3.3). Если же существует необходимость в преодолении значи- тельных расстояний или же есть вероятность воз- действия помех, тогда необходимо применять “полноценные” приемо-передатчики RS232. Для преобразования уровня из стандарта TTL или КМОП в RS232 существует множество микросхем. Чаще всего в качестве драйверной схемы для этой цели используется МАХ232 от компании Maxim или любая из ее многочисленных производных. Ее Сторона Сторона приемника ।передатчика +15В ----------1--------- +15В Низкий уровень, лог. О, "Пробел" Высокий уровень, лог. 1, "Отметка" -15В __________I__________ -15В Рис. 2.22. Требуемые уровни напря- жения согласно стандарту RS232 отличительные особенности — встроенный преобразователь напряжения и напря- жение питания +5 В. Соединения внутри интерфейса RS232 На рис. 2.23 изображены два возможных варианта соединения ПК в качестве аппаратуры передачи данных (DTE — Data Terminal Equipment) с микроконтролле- ром AVR в качестве аппаратуры канала данных (DCE — Data Communication Equipment) по интерфейсу RS232. DTE (PC) DCE (AVR) DTE (PC) DCE (AVR) 1 1 1 1 DCD v DCD DCD ucu 2 2 2 2 RxD o RxD RXD ’ V l\XD 3 3 3 3 TxD О ►О TxD 1 XD * I XU 4 4 4 4 DTR О ►O DTR D1К * 11 * 14 U 1 r\ 5 5 5 5 SG О ""О SG SG v v oU 6 6 6 6 DSR v DSR DSR * W UOR 7 7 7 7 RTS О ► U RTS R 1 Ь V v rv 1 о 8 8 8 8 CTS о« О CTS CTS <x ►© CTS Стандартное соединение DTE-DCE Трехпроводное соединение DTE-DCE Рис. 2.23. Виды В3232-соединения для обмена данными между DTR и DCE При стандартном расположении (рис. 2.23 слева) соответствующие контакты соединены, а все управляющие сигналы должны обрабатываться согласно установ- ленному протоколу на стороне приемника.
52 Вспомогательные средства при вводе-выводе данных На рис. 2.23 справа показано распространенное трехпроводное соединение, со- стоящее из линий передачи/приема и линии “земли”. VCo стороны DTE (ПК) вывод TxD работает как выход, через который отправляются передаваемые данные, со стороны же DCE (микроконтроллер AVR) он является входом, соединенным со входом приемника UART. В случае контакта RxD ситуа- ция обратно противоположна: со стороны DTE (ПК) вывод RxD является входом, через который поступают передаваемые DCE (микроконтроллером AVR) данные, однако со стороны DCE (AVR) он уже функционирует как выход, соединенный с выходом передатчика UART. В некоторых случаях каналы передачи данных RxD и TxD (подобное соедине- ние используется, например, в так называемом “нуль-модемном” кабеле), из-за чего выход TxD одного коммуникационного элемента оказывается связанным с входом RxD другого (и наоборот). V Использование нуль-модемного кабеля с пересекающимися каналами RxD и TxD для передачи данных в рассматриваемых в данной книге примерах не допускается, поскольку подобное пересечение уже присутствует в схемах: выходящая из ПК ли- ния TxD_PC связана с линией приема микроконтроллера RxAVR, а выходящая из микроконтроллера линия TxAVR связана с линией приема ПК RxD_PC. Управляющие сигналы стандарта RS232 Для того чтобы создать соединение с квитированием, по стандарту требуются определенные управляющие сигналы, что, однако, не является обязательным усло- вием. При этом они не могут оставаться просто неиспользованными, поскольку это может привести к ошибочным оценкам данных в протоколе. Неиспользованные управляющие выводы должны быть задействованы согласно рис. 2.23. Назначение выводов в штекере и гнезде RS232 указано в табл. 2.1. Таблица 2.1. Назначение выводов в штекере и гнезде RS232 Сиг- нал Название Функция Номер в 9- тиконтакт- ном разъеме Номер в 25- тиконтакт- ном разъеме DTE (ПК) DCE (AVR) RCR Carrier Detect Уровень входного сиг- нала 1 8 Вх. Вых. RxD Receive Data Входные данные 2 3 Вх. Вых. TxD Transmit Data Передаваемые данные 3 2 Вых. Вх. DTR Data Terminal Ready Терминал готов 4 20 Вых. Вх. SG Signal Ground “Земля” 5 1, 7 DSR Data Set Ready Готовность к работе 6 6 Вх. Вых. RTS Request To Send Запрос на передачу 7 4 Вых. Вх. CTS Clear To Send Готовность к передаче 8 5 Вх. Вых. RI Ring Indicator Входящий вызов 9 22 Вх. Вых. Схема тестирования обмена данными по интерфейсу RS232 На рис. 2.24 изображена простая схема для тестирования интерфейса RS232. В данном случае обмен данными происходит между контролером ATmega8 и про- граммой HyperTerminal ПК.
2.3. Взаимодействие микроконтроллера AVR с ПК через последовательный интерфейс 53 100n 1Ou Рис. 2.24. Схема тестирования обмена данными по интерфейсу RS232 GND GND GNDGND GNDGND GND GND GND GND
54 Вспомогательные средства при вводе-выводе данных Тактовый сигнал и сигнал сброса микроконтроллера ATmega8 генерируются типичным для микроконтроллеров AVR способом (см. книгу Вольфганга Трамперта “AVR-RISC микроконтроллеры”). В качестве альтернативы специфическому драйверному элементу интерфейса RS232, преобразование уровня из стандарта TTL/KMOII в RS232 осуществляется с помощью операционного усилителя. Резисторы R3 и R4 делят напряжение питания операционного усилителя V+ = +12 В до уровня переключения 2,5 В. Передаваемый сигнал микроконтроллера AVR подается на инвертирующий вход IC2B. Таким об- разом, в линию RxD-PC (контакт 2 разъема XI) при высоком уровне сигнала TxAVR подается -12 В, а при низком уровне — стандартные +12 В (см. рис. 2.22). Поступающий из ПК сигнал TxD-PC подается на базу транзистора Т1 через контакт 3 разъема XI и токоограничительные резисторы R6 и R7, делящие уровень ± 12 В до безопасного для Т1 значения. Диод D3 ограничивает напряжение между базой и эмиттером Т1 при TxD-PC = -12 В до 0,7 В. Входной сигнал на коллекторе Т1 с уровнем TTL/КМОП подается по линии RxAVR на вход приемопередатчика UART микроконтроллера AVR. Различные режимы программы тестирования могут быть выбраны с помощью перемычек JI, CAL и MW. На этапе инициализации микроконтроллера AVR к пе- ремычке подключается внутренний подтягивающий резистор, благодаря чему внеш- ний подтягивающий резистор оказывается ненужным. Программа тестирования Программы тестирования постоянно или передает ASCII-символ “U” (01010101b = 55h) (см. рис. 2.26) или же считывает передаваемые ПК через програм- му HyperTerminal сигналы и возвращает их на ПК в виде ASCII-эхо-сигала и шест- надцатеричного числа (см. рис. 2.25). Вид выполняемого действия определяется пе- ремычкой Л согласно табл. 2.2. Таблица 2.2. Возможности выбора программы тестирования для интерфейса RS232 Перемычка Л Выбранный тест 0 (замкнута) В: 01010101b (55ь) продолжительный сигнал на TxD 1 (разомкнута) А: Прием/возврат от/к ПК С помощью перемычек CAL и MW можно установить необходимую скорость передачи данных в бодах. Комбинации CAL и MW представлены в табл. 2.3. Таблица 2.3. Варианты скорости передачи данных в бодах для интерфейса RS232 Перемычка CAL Перемычка MW Выбранная скорость передачи данных 0 (замкнута) 0 (замкнута) 2400 бод 0 (замкнута) 1 (разомкнута) 4800 бод 1 (разомкнута) 0 (замкнута) 9600 бод 1 (разомкнута) 1 (разомкнута) 19200 бод Текст программы тестирования представлен в листинге 2.2. Файл К2_3 USART-Testprogramm. asm можно также найти на прилагаемом к книге компакт- Wk диске в папке Program.
2.3. Взаимодействие микроконтроллера AVR с ПК через последовательный интерфейс 55 Листинг 2.2. Программа тестирования обме а данными по интерфег у IS232 К2_3 USART-Tes tprogram»-. asm ;* Программа: Программа тестирования интерфейса RS232 ;* Версия: 1.2 ;* Целевое устройство: ATmega8 ;* Частота системной синхронизации: 12 МГц ;* Описание: Перемычка Л=0 - тест В ;* Передается продолжительный сигнал ObOlOlOlOl ("U") Перемычка Л=1 - тест А Каждый принимаемый через USART ASCII-символ от ПК передается обратно, при этом также передается и его ASCII-код в виде шестнадцатеричного числа. nolist inlude "С: \Prograinme\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def. inc" list ;***** Определения equ PUART = Port D /Выходной порт для последовательного интерфейса equ DUART = DDRD /Регистр направления передачи данных для / последовательного интерфейса equ TxD = PD1 /Выход передатчика - разряд 1 порта D equ ME = PD6 /Перемычка MW - разряд 6 порта D equ CAL = PD7 /Перемычка CAL - разряд 7 порта D equ JO = PB2 /Перемычка J0 - разряд 2 порта В equ JI = PB3 /Перемычка Л - разряд 3 порта В equ Bd24 = 312 /UBRR для 2400 бод при 12 МГц equ Bd48 = 155 /UBRR для 4800 бод при 12 МГц equ Bd96 = 77 /UBRR для 9600 бод при 12 МГц equ Bdl92 = 38 /UBRR для 19200 бод при 12 МГц /UBRR = (fSys / 16*бод) - 1 equ Run = 0 /Разряд 0 в регистре флагов указывает на ; длительную работу ;***** Регистры-переменные def to = Г16 /Временный рабочий регистр 0 def tl = rl7 /Временный рабочий регистр 1 def t2 = rl8 /Временный рабочий регистр 2 def Flag = rl9 /Различные флаги Код . cseg Initial: Idi tl,Low(RAMEND) out SPL,tl Idi tl,High(RAMEND) out SPH,tl InitPorts: Idi tl,l«TxD out DDRD,tl /Инициализация микроконтроллера AVR /Инициализируем младший байт указателя стека /Инициализируем старший байт указателя стека /Конфигурируем направление передачи данных / через порт D
56 Вспомогательные средства при вводе-выводе данных Листинг 2.2. Продолжение Idi tl, (1«CAL) | (1«MW) out PortD, tl Idi tl, (1«JO) I (1«J1) out PortB,tl InitUSART: ;Подтягивающие резисторы ; для перемычек CAL и MW ; Подтягивающие резисторы ; для перемычек J0 и Л in t2,PinD /Считываем значения для перемычек CAL и MW andi t2,$C0 /Демаскируем перемычку brne IU1 /Переход, если не выполняется условие CAL=0, MW=0 Idi tl, High(Bd24) /Старший байт для скорости передачи данных 2400 бод Idi tO,Low(Bd24) /Младший байт для скорости передачи данных 2400 бод rjump IU4 /Продолжаем инициализацию IU1: cpi t2,l«MW /Перемычки CAL=0, MW=1? brne IU2 /Переход, если не выполняется условие CAL=0, MW=1 Idi tl,High(Bd48) /Старший байт для скорости передачи данных 4800 бод Idi tO,Low(Bd48) /Младший байт для скорости передачи данных 4800 бод rjump IU4 /Продолжаем инициализацию IU2: cpi t2,l«CAL /Перемычки CAL=1, MW=0? brne IU3 /Переход, если не выполняется условие CAL=1, MW=0 Idi tl,High(Bd96) /Старший байт для скорости передачи данных 9600 бод Idi tO,Low(Bd96) /Младший байт для скорости передачи данных 9600 бод rjump IU4 /Продолжаем инициализацию IU3: Idi tl,High(Bdl92) /Старший байт для скорости передачи данных 19200 бод Idi tO,Low(Bdl92) /Младший байт для скорости передачи данных 19200 бод rjump IU4 /Продолжаем инициализацию IU4 : out UBRRH, tl out UBRRH, tO /Устанавливаем скорость передачи данных /Включаем передатчик и приемник Idi tl, (1«RXEN) | (1«TXEN) out UCSRB,tl /Устанавливаем формат передачи: 8 бит данных, 1 стоп-бит Idi tl, (1«URSEL) | (0bll«UCSZ0) out UCSRC, tl cbr Flag,l«Run /Устанавливаем флаг длительного сигнала cli /Общий запрет прерываний Основная программа Haupt: Idi zH,High(Gruss<<l) Idi zL, Low (Gruss«l) rcall Out_Text Haupt1: sbis PinB,Jll rjmp Dauersignal cbr Flag, l«Run Idi zH, High (Txtla«l) Idi zL,Low(Txtla<<l) rcall Out_Text rcall GetByte rcall Echo rcall BuildString rcall Out_String rjmp Haupt1 /Устанавливаем указатель Z на / начало текста во флэш-памяти /Выводим текст на ПК /Пропускаем следующую команду, если Л=1 /Если Л = 0, передаем длительный сигнал /Устанавливаем флаг длительного сигнала /Устанавливаем указатель Z на / начало текста во флэш-памяти /Выводим текст на ПК /Принимаем символ в t2 /Возвращаем символ на ПК /Формируем строку ответа /Выдаем строку на ПК /Следующий символ
2.3. Взаимодействие микроконтроллера AVR с ПК через последовательный интерфейс 57 Листинг 2.2. Продолжение Dauersignal: sbrc Flag,Run rjmp Dauerl /Переход, если нет длительного сигнала Idi zH, High (Txtlb«l) /Устанавливаем указатель Z на Idi zL,Low(Txtlb<<l) / начало текста во флэш-памяти rcall Out_Text Dauerl: sbis UCSRA, UDRE /Выводим текст на ПК rjmp Dauerl /Ожидаем освобождения буфера передачи Idi tl,$55 /Тестовый символ out UDR,tl /Начинаем передачу sbr Flag,l<<Run /Флаг извещает о продолжительном сигнале rjmp Haupt1 /Опрашиваем перемычку Л ;***** Подпрограммы SendByte: sbis UCSRA,UDRE /Передача символа на ПК rjmp SendByte /Ожидаем освобождения буфера передачи out UDR,tO ret /Переджаем символ GetByte: /Прием символа sbis UCSRA,RXC rjmp GetByte /Ожидаем ASCII-символ от ПК in t2,UDR ret /Сохраняем полученный символ Echo: /Передача сохраненного символа обратно на ПК mov t0,t2 /Копируем символ в tO rcall SendByte ret /Передаем символ Out Text: /Вывод текста на ПК Imp tO,z+ /Загружаем ASCII-символ в t2 cpi t0,0 /Конец текста? breg OT2 OT1: /Переход, если готов rcall SendByte /Передаем символ rjmp Out Text /Следующий символ OT2: ret Out String: /Вывод текста на ПК Id tO,y+ /Загружаем ASCII-символ в tl cpi t0,0 /Конец текста? breg OS2 OS1: /Переход, если готов rcall SendByte /Передаем символ rjmp Out String /Следующий символ OS2: ret BuildString: /Формирование строки ответа Idi yH,High(Strng) /Устанавливаем указатель Y Idi yL,Low(Strng) / на начало строки ответа в памяти SRAM Idi zH, High (StAnf«l) /Устанавливаем указатель Z на начало
58 Вспомогательные средства при вводе-выводе данных Листинг 2.2. Продолжение Idi zL, Low (StAnf«l) BS1: ; текста во флэш-памяти 1pm tl,z+ ;Считываем байт текста из флэш-памяти cpi tl,0 /Конец текста? breq BS2 /Переход, если готов st y+,tl /Сохраняем байт текста в строке ответа rjmp BS1 BS2: /Извлекаем следующий байт текста cpi t2,' ' /Сравниваем принятый символ с пробелом brio BS3 /Переход, если меньше st y+,t2 rjmp BS4 BS3: /Сохраняем символ в строке ответа rcall GetName BS4: /Вносим название символа в строку ответа Idi zH, High (AscHx«l) /Устанавливаем указатель Z на начало Idi zL, Low (AscHx«l) BS5: / текста во флэш-памяти 1pm tl,z+ /Считываем байт текста из флэш-памяти cpi tl,0 /Конец текста? breq BS6 /Переход, если готово st y+,tl /Сохраняем байт текста в строке ответа rjmp BS5 BS6: /Загружаем следующий байт текста rcall HexInASCII /Преобразовываем шестнадцатеричный байт ; в два ASCII-байта st y+,tl /Сохраняем старший байт в строке ответа st y+,tO /Сохраняем младший байт в строке ответа Idi tO,13 /Возврат каретки st y+,tO / сохраняем в строке ответа Idi tO,10 /Перевод строки st y+,tO / сохраняем в строке ответа Idi t0,0 /Символ окончания текста st y+,t0 / сохраняем в строке ответа Idi yH,High(Strng) /Устанавливаем указатель Y Idi yL,Low(Strng) ret / на начало строки ответа в памяти SRAM HexInASCII: mov tl,t2 /Копируем принятый символ в tl swap tl /Переставляем полубайты cbr tl,$F0 /Очищаем старший полубайт subi tl,-$30 /Прибавляем к цифрам ASCII-смешение cpi tl,$3A /ASCII-код > $39 ($39 = цифра 9)? brio AHI /Переход, если нет sbci tl,-$07 AHI: /Добавляем дополнительное смещение к буквам mov t0,t2 /Копируем полученное значение в tO cbr tO,$FO /Очищаем старший полубайт subi t0,-$30 /Прибавляем ASCII-смешение к цифрам cpi tO,$3A /ASCII-код > $39 ($39 = цифра 9)? brio AH2 /Переход, если нет sbci t0,-$07 AH2: /Добавляем дополнительное смещение к буквам ret /ASCII-код шестнадцатеричного значения в tl:tO GetName:
2.3. Взаимодействие микроконтроллера AVR с ПК через последовательный интерфейс 59 Листинг 2.2. Окончание Idi zH, High (Tab«l) /Устанавливаем указатель Z Idi zL, Low (Tab«l) ; на начало текста во флэш-памяти clr tl /tl = $00 mov t0,t2 /Копируем полученный символ в tO Isl tO ;Сдвигаем полученный символ Isl tO ; на 2 разряда влево add zL,t0 /Прибавляем полученный символ к adc zH,tl / указателю таблицы 1pm tO, z+ /Считываем байт текста из таблицы st y+,tO / и копируем в буфер 1pm tO,z+ /Считываем байт текста из таблицы st y+,tO / и копируем в буфер 1pm tO,z+ /Считываем байт текста из таблицы cpi tO,' ' / символ пробела? breq GN1 /Переход, если да st y+,tO /Записываем байт текста в буфер GN1: ret ;Тексты: Tab:, db "NUL ","SOH ","STX ","ETX "/'EOT ","ENQ ","ACK ","BEL " db "BS ","HT ","LF ","VT ","FF ","CR ","SO ","SI " db "DLE ","DC1 ","DC2 ","DC3 ","DC4 ","NAK ","SYN ","ETB " db "CAN "/’EM "/’SUB "/'ESC ", "FS ", "GS ", "RS ”,"US " Gruss: .db 13,10,10,07,"Test der RS232-Schnittstelle",13,10,0 Txtla: .db 13,10,:"Zeichen eingeben: ",0 Txtlb: .db 13,10,:"Dauersignal liegt an TxD",13,10,0 StAnf .db 13,10,"Empfangenes Zeichen: '",0 AscHx .db "', ASCII-Code (in HEX): " ,0 ;*****Данные . dseg Strng: .byte 64 /Символьный буфер Описание программы Часть инициализации После установки указателя стека вывод PD2 (сигнал TxD) конфигурируется как выход. К портам, соединенным с перемычками Л, CAL и MW, подключаются под- тягивающие сопротивления. Для того чтобы инициализировать USART, необходимо сначала обработать со- стояния перемычек Л, CAL и MW. Требуемая скорость передачи данных в бодах ус- танавливается согласно табл. 2.3 с помощью регистра управления UBRRH:UBRRL. Для вычисления скорости передачи данных в нормальном асинхронном режиме используется формула (2.1): UBRRH: UBRRL =----------------------------1 , (2.1) 16 • скорость _ передачи _ данных где fsYs — частота системной синхронизации (в данном случае 12 МГц).
60 Вспомогательные средства при вводе-выводе данных После установки скорости передачи данных с помощью регистра управления UCSRB активизируется приемник и передатчик, а с помощью регистра UCSRC ус- танавливаются требуемые параметры передачи: 8 бит данных, один стоп-бита. Перед переходом в основную программу устанавливается флаг, указывающий на длительный сигнал, а также блокируются все прерывания. Основная программа После вывода тестовой строки в программу HyperTerminal обрабатывается со- стояние перемычки Л, чтобы определить, какой тест будет выполняется: постоян- ная передача символа “U” или эхо-передача. Тест А: Эхо-тест В случае проведения эхо-теста сбрасывается флаг продолжительного сигнала “Run”, установленный при предыдущих прогонах, после чего поступает требование вывести символ, переданный в программу HyperTerminal. Символ сохраняется, эхом отправляется обратно в HyperTerminal, его шестнадцатеричный код декодируется из ASCII-кода и в конце концов символ или его значение, если речь идет о непечатае- мых символах, а также определенный шестнадцатеричный код символа передаются в HyperTerminal. Эхо-тест в действии изображен на рис. 2.25. Рис. 2.25. Окно HyperTerminal во время эхо-теста После каждого прогона цикла происходит возврат к началу основной програм- мы и дальнейшие действия определяются в зависимости от состояния Л. Код ASCII, кроме отображаемого символа с шестнадцатеричным кодом в диа- пазоне 20h...7Eh, содержит также управляющий символ (шестнадцатеричный код в диапазоне 00ь... IFh). Оба этих символа, кроме всего прочего, управляют также по- ложением курсора на экране. Из рис. 2.25 видно, что некоторым из этих управляю-
2.3. Взаимодействие микроконтроллера AVR с ПК через последовательный интерфейс 61 щих символов в ряде шрифтов соответствуют определенные знаки. Так, в програм- ме HyperTerminal используется шрифт Terminal, а управляющим символам SOH и STX соответствуют знаки “ © ” и “ ® ”. Как видно из рис. 2.25, символам непосредственного управления курсором ни- какие знаки не соответствуют. Вместо этого просто выполняется соответствующая функция. Так, например, при получении управляющего кода 0Ah (символ перевода строки) курсор смещается на одну строку вниз, а при получении управляющего кода 08и (Back Space) возвращается на одну позицию влево. Дополнительные сигналы управления курсором: НТ (Horizontal Tabulation — горизонтальная табуляция, 09ъ), VT (Vertical Tabulation — вертикальная табуляция, 0Bh), FF (Form Feed — прогон страницы, ОСь) или CR (Carriage Return — возврат каретки, 0Dh). Если же управляющий символ с шестнадцатеричным кодом в диапазоне OOh...lFh должен быть задан с помощью клавиатуры, соответствующее числовое значение, представленное тремя знаками в десятичном виде, вводится с цифровой клавиатуры при нажатой клавише <Alt>. Например, управляющему символу “Line Feed” (0Ah = 10(!) соответствует комбинация клавиш <Alt+0+l+0>. Тест В: Постоянна передача символа “U” Здесь в первую очередь анализируется флаг длительного сигнала “Run”. Если он сброшен, то это означает, что данная ветвь программы еще не выполнялась. В этом случае с целью тестирования устанавливается заголовок и сам флаг, по- скольку заголовок должен появляться только один раз в начале теста. В итоге, после того как флаг “Run” установлен, выводится ASCII-символ “U” (55ь) и происходит переход к началу основной программы, где дальнейшие действия определяются по- сле обработки состояния J1. Поскольку передача через U(S)ART начинается со старт-бита, заканчивается стоп-битом, а биты передаются от младшего к старшему, то при непрерывном вы- воде символа “U” (0101 0101ь) будет получен выходной сигнал, представленный на рис. 2.26 (частота fTxAVR = fBaudrate/ 2). 55ft 55ft при непрерывном выводе ASCII-символа “U” (код 55h = 01010101b)
62 Вспомогательные средства при вводе-выводе данных Благодаря своей симметричности, символ “U” оптимально подходит для про- верки передающей части схемы. Из-за падения напряжения на транзисторах в вы- ходном каскаде операционного усилителя рабочее напряжение оказывается ниже номинального значения ± 12 В. Уровень выходного напряжения, в зависимости от нагрузки, составляет примерно ±11 В. Подпрограмма SendByte Подпрограмма SendByte передает символ в программу HyperTerminal, после чего ожидает освобождения буфера передачи USART и начинает передачу копиро- ванием символа, хранимого в регистре tO, в регистр данных UDR. Подпрограмма GetByte Подпрограмма GetByte ожидает приема символа из программы HyperTerminal. Как только символ получен, он копируется из регистра данных UDR в регистр t2. Подпрограмма Echo Подпрограмма Echo незамедлительно передает полученный символ обратно ПК. Подпрограмма Out_Text Подпрограмма Out_Text отправляет хранящийся во флэш-памяти текст в про- грамму HyperTerminal. Начальный адрес текста хранится в указателе Z, а его окон- чание обозначается символом ООь Подпрограмма Out_String Подпрограмма Out_String пересылает хранящийся в памяти SRAM текст в программу HyperTerminal. Начальный адрес строковой константы хранится в ука- зателе Y, а ее окончание обозначается символом 00ь Подпрограмма Buildstring Подпрограмма Buildstring объединяет в строковой константе полученный символ (или его обозначение, если речь идет об управляющем символе) и опреде- ляемый с помощью подпрограммы HexlnASCll его шестнадцатеричный ASCII-код. Конец текста обозначается символом 00h. Подпрограмма HexlnASCll Подпрограмма HexlnASCll разбивает полученный символ на два полубайта и генерирует для каждого из них соответствующий ASCII-код шестнадцатеричной цифры. При этом шестнадцатеричным цифрам 0...9 присваиваются ASCII-коды 30h...39h, а шестнадцатеричным цифрам A...F — 41h...46h. ASCII-коды сохраняются в регистровой паре tl :t0. Подпрограмма GetName Подпрограмма GetName с помощью хранящейся во флэш-памяти таблицы Tab определяет обозначения неотображаемых управляющих символов. Каждое обозна- чение в таблице состоит из четырех символов, причем два символа всегда хранятся вместе в одном из 16-тиразрядных слов флэш-памяти. Чтобы определить начальный адрес определенного символа в таблице, этот символ умножается на четыре с по- мощью двух сдвигов влево, после чего прибавляется к адресу таблицы. Затем обе первые буквы названия записываются в строковую константу. Поскольку некоторые
2.3. Взаимодействие микроконтроллера AVR с ПК через последовательный интерфейс 63 обозначения состоят из трех, а некоторые — только из двух символов, происходит также проверка третьего символа названия. В случае символа пробела название счи- тается завершенным и происходит выход из подпрограммы. В противном случае, в строковую константу записывается также третий символ. Как показано на рис. 2.26, с помощью постоянной передачи символа “U” (55h = 01010101b) можно получить симметричные прямоугольные импульсы, для чего должен использоваться только один стоп-бит. Если в конкретном случае примене- ния микроконтроллера последовательный интерфейс свободен, а таймеры ис- пользуются для каких-либо внутренних целей, и потому получить с их помощью выходные импульсы прямоугольной формы невозможно, то с помощью аппаратно- го обеспечения U(S)ART можно сформировать сигнал, частота которого регулиру- ется в определенных пределах с помощью регистра скорости передачи данных UBRRH:UBRRL (см. уравнение (2.1)). Чтобы дополнительно не усложнять процесс, с помощью разряда UDRIE раз- решаем прерывание, инициированное флагом UDRE при пустом буфере передачи UDR, после чего в программе обработки прерывания в UDR записывается символ “U”. Как только будет передан последний бит (стоп-бит), автоматически выводится следующий символ “U”.
ГЛАВА Измерение напряжения с помощью микроконтроллеров AVR 3.1. Встроенный АЦП микроконтроллеров AVR с разрешением десять разрядов Во многих микроконтроллерах AVR реализован интегрированный в кристалл десятиразрядный аналого-цифровой преобразователь (АЦП). Особенности, а также принципы работы и управления этого преобразователя будут продемонстрированы на примере АЦП микроконтроллера ATmega8. Аналого-цифровые преобразователи большинства типов микроконтроллеров AVR, в основном, идентичны. Различия заключаются лишь в некоторых деталях. Так, некоторые микроконтроллеры AVR (например, ATmegal28), кроме аналогово- го потенциала “земли” AGND относительно аналоговых входов имеют также диф- ференциальные входы, с помощью которых сигнал на входе АЦП представляется в виде разности напряжений между двумя входными каналами. Эта разность допол- нительно может быть умножена на некоторый коэффициент. Такой режим работы подходит, в частности, для измерения падения напряжения на (шунтирующих) ре- зисторах. В отличие от модели ATmega8, в ряде микроконтроллеров AVR отсутст- вует встроенный источник опорного напряжения — вместо этого в них использует- ся внешнее опорное напряжение. В принципе, все вышесказанное можно отнести к АЦП всех микроконтроллеров AVR. Особенности каждого конкретного типа можно узнать из технического описа- ния устройства. Характеристики АЦП микроконтроллеров AVR Аналого-цифровые преобразователи микроконтроллеров AVR имеет следую- щие характеристики: • до восьми входных каналов (в зависимости от типа микроконтроллера); • возможность работать в режиме одиночных преобразований (Single Conver- sion Mode) или в автономного режиме (Free Running Mode); • в кристалл интегрирована схема выборки и хранения, обеспечивающая по- стоянство входного напряжения во время цикла преобразования; • в некоторых микроконтроллерах AVR реализован встроенный источник опорного напряжения, вместо которого, при желании, можно использовать внешнее опорное напряжение; • после завершения преобразования может быть вызвано прерывание; • в режиме ожидания можно значительно повысить эффективность подавления помех.
3.1. Встроенный АЦП микроконтроллеров AVR с разрешением десять разрядов 65 Основные характеристики и эксплуатационные параметры аналого-цифровых реобразователей микроконтроллеров AVR представлены в табл. 3.1. Как видно из аблицы, точность зависит в первую очередь от скорости преобразования, которая свою очередь определяется рабочей тактовой частотой преобразователя. Габлица 3.1. Характеристики АЦП микроконтроллера ATmega8 Символ Параметр Условие Мин. Тип Макс. Единица Разрешение 10 1) Бит Тактовая частота 50 200 кГц Время преобразования 65 260 мкс Абсолютная точность Vref = 4 В, Тдцп = 200 кГц ±2 +3 LSB Абсолютная точность Vref = 4 В, 1ацп = 1 МГц ±4 LSB Абсолютная точность Vref= 4 В, Тдцп = 2 МГц +16 LSB Интегр. нелинейность Vref > 2 В ±0,5 ±1 LSB Дифференц. нелинейность Vref > 2 В +0,5 ±1 LSB Погрешность смещения -2 -2,5 LSB AVcc Аналоговое напряжение усиления 2,7 В < AVcc 6,0 В Vcc - 0,3 В Vcc + 0,3 В В Uref Опорное напряжение 2 AVcc В U|NT Внутр, опорное напряжение 2,45 2,56 2,8 В Rref Сопротивление на AREF 32 кС Rain Сопротивление на аналого- вом входе ADC0 ... ADC7 2) 100 MQ ’Точность каналов ADC4 и ADC5 микроконтроллера ATmega8 ограничивается 8 разрядами. ’ В корпусе PDIP микроконтроллера ATmega8 каналы ADC6 и ADC7 отсутствуют. Результат аналого-цифрового преобразования входного напряжения UE пред- тавляется в виде десятиразрядного двоичного числа в регистрах данных ADCH и VDCL. Характер выравнивания результата (вправо или влево) в регистровой паре UDCH:ADCL определяется с помощью разряда ADLAR регистра ADMUX. Определяемое в процессе аналого-цифрового преобразования двоичное число Z ычисляется согласно уравнению (3.1): Z = 1024 -^-, (3.1) U REF гт 1023 тт де UEaaol = 1Q24 ' Uref •> поскольку наибольшее число, которое можно получить помощью десяти разрядов, — Zmax = 1023= 3FFh. Принцип работы Аналого-цифровые преобразователи микроконтроллеров AVR работают по ринципу последовательного приближения или по методу “взвешивания”. Благода- я этому методу удается достичь относительно небольшой длительности преобразо- ания при высокой точности и небольшой сложности процесса. В начале цикла преобразования схема управления АЦП через ключ S схемы вы- орки и хранения (S&H) подает на внутренний накопительный конденсатор С схе- [ы S&H входное напряжение, выбранное аналоговым мультиплексором MUX2 эис. 3.1). Конденсатор заряжается входное напряжением UE выбранного канала. За- Измерение
66 Измерение напряжения с помощью микроконтроллеров AVR тем схема управления замыкает ключ S, а напряжение на входе Ue остается на кон- денсаторе всю продолжительность преобразования. Рис. 3.1. Блок-схема аналого-цифрового преобразователя микроконтроллера АТтедав Метод “взвешивания” по своей сути является методом “проб и ошибок”. В на- чале цикла схема управления преобразователя записывает во внутренний регистр двоичное число Z = 10 0000 0000ь. Это число подается на внутренний ЦАП, кото- рый преобразовывает его в аналоговое напряжение Uz соответствующее половине диапазона измерения. Компаратор К сравнивает значение Uz аналоговым напряже- нием Ue, хранимым в схеме выборки и хранения. Если значение Ue оказывается меньше значения Uz, то старший разряд Z сбрасывается в лог. 0, в противном случае в нем сохраняется лог. 1. На следующем шаге устанавливается в лог. 1 предпослед- ний разряд Z и значения Uz и Ue опять сравниваются с помощью компаратора. Если Ue оказывается больше Uz, то предпоследний разряд двоичного числа Z продолжает хранить лог. 1, в противном случае он сбрасывается в лог. 0 (рис. 3.2). Далее эта процедура повторяется для оставшихся восьми разрядов десятираз- рядного двоичного числа Z. В результате область вокруг определяемого числового значения все более “сужается”, что хорошо видно из рис. 3.3. К десяти этапам сравнения добавляется время, необходимое для опроса значе- ния Ue. Таким образом, для получения результата аналого-цифрового преобразова- ния требуется тринадцать шагов “взвешивания”. На рис. 3.2 изображены первые три шага “взвешивания”. Как видно из рисунка, установка или сброс очередного разряда не зависит от ранее установленных разрядов. Распределение отдельных этапов “взвешивания” во времени изображено на рис. 3.3. Кривая демонстрирует отношение выходного напряжения Uz ЦАП к опор- ному напряжению Uref- Ue = 0,3 Uref = 307 / 1024 • Uref, поскольку Z = 010011001 lb = 133h = 307d.
3.1. Встроенный АЦП микроконтроллеров AVR с разрешением десять разрядов 67 Рис. 3.3. Графическое представление процесса “взвешивания” Подача тактовых импульсов на АЦП Допустимые тактовые частоты ЦАП лежат в диапазоне 50-200 кГц. По этой гричине схема управления преобразователя использует не сам такт системной син- хронизации Ф, а тактируется от внутреннего предварительного делителя (рис. 3.4).
68 Измерение напряжения с помощью микроконтроллеров AVR Рис. 3.4. Подача тактовых импульсов на АЦП микроконтроллера AVR Предварительный делитель остается в сброшенном состоянии до тех пор, пока разряд ADEN (ADC Enable) регистра ADCSRA хранит лог. 0. После установки раз- ряда ADEN в лог. 1 предварительный делитель активизируется. Требуемая тактовая частота устанавливается с помощью разряде ADPS0, ADPS1 и ADPS2 регистра ADCSRA. Тактовая частота выше 200 кГц также возмож- на, но при этом точность результата существенно снижается. Как правило, прием- лемая точность составляет восемь разрядов при частоте 1 МГц и шесть разрядов при частоте 2 МГц (см. табл. 3.1). Тактовая частота ниже 50 кГц также ведет к снижению точности результата, что обусловлено значительным падением хранимого входного напряжения Ue на внут- реннем конденсаторе схемы выборки и хранения. Входные каналы АЦП В нижней части рис. 3.1 изображена входная схема аналого-цифрового преобра- зователя. Выбранное посредством MUX2 напряжение Ue должно быть способным зарядить конденсатор схемы выборки и хранения с входным сопротивлением 1...100 к£1 за время опроса. По этой причине выходной импеданс источника напряжения UE должен составлять максимум 10 кН, что необходимо для обеспечения небольшого времени опроса. Для устранения помех в составляющих сигнала, частота которых превышает частоту Найквиста fw — Гдцц/2, входное напряжение, соответствующее участкам спектра, расположенным выше частоты Найквиста, пропускается через подходящий фильтр низких частот. Режимы работы АЦП Аналого-цифровой преобразователь может работать в режиме одиночных пре- образований (Single Conversion Mode), при котором каждое новое преобразование выполняется отдельно, или в автономном режиме (Free Running Mode). Во втором случае преобразователь работает непрерывно, и новый цикл начинается автомати- чески сразу же после записи измеренного значения в регистр данных (ADCH:ADCL). Выбор одного из двух режимов осуществляется с помощью разряда ADFR регистре управления и состояния ADCSRA.
3.1. Встроенный АЦП микроконтроллеров AVR с разрешением десять разрядов 69 Для того чтобы разрешить использование АЦП, разряд ADEN устанавливается лог. 1. До тех пор, пока разряд ADEN не установлен, мультиплексоры MUX1 и 1UX2, используемые для выбора опорного напряжения и входного канала, отклю- ены, а питание на преобразователь не подается. Таким образом, перед переводом мкроконтроллера AVR в режим ожидания, АЦП следует отключить, сбросив раз- яд ADEN. Если в момент преобразования выбранный канал АЦП переключается мультип- ексором MUX2, то фактически смена осуществляется только после завершения те- ущего процесса. Перед первым преобразованием после активизации АЦП с помощью разряда JDEN происходит холостой прогон (рис. 3.5). Он необходим для инициализации реобразователя и для пользователя незаметен, если не учитывать того, что первое реобразование длится 25 тактовых циклов, что на 12 тактовых импульсов дольше бычного. Шаг Такт АЦП ADEN ADSC Sample &Hold ADIF ADCH ADCL 12; ; 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 1 2 Ьв результата Холостой • Первое преобразование прогон ** '— Настройки мультиплексора сохранены-----•~~~* 4------- Следующее преобразование Рис. 3.5. Временная диаграмма первого преобразования в режиме одиночных преобразований Дальнейшие преобразования в таком режиме происходят по схеме, представ- шной на рис. 3.6. Процесс преобразования начинается по следующему нарастаю- ему фронту тактового сигнала после установки разряда ADSC регистра ADCSRA. гот разряд в течение всего процесса преобразования содержит лог. 1 и автоматиче- м обнуляется по завершению процесса. После начала преобразования происходит опрос входного сигнала (управляется шналом “Sample&Hold” — см. рис. 3.5, рис. 3.6 и рис. 3.7). По возрастающему ронту сигнала “Sample&Hold” опрашиваемое входное напряжение “фиксируется” 1 конденсаторе схемы выборки и хранения и сохраняется неизмененным на протя- ении всего периода преобразования. По истечении 13 тактовых циклов схема управления сохраняет результат в ре- [стровой паре данных ADCH:ADCL, сбрасывает в лог. 0 разряд ADSC регистра щавления ADCSRA и одновременно устанавливает в том же регистре флаг ADIF, ?о сигнализирует об окончании преобразования.
70 Измерение напряжения с помощью микроконтроллеров AVR После этого установкой разряда ADCS может быть начат следующий цикл пре- образования. Отсюда следует, что для начала нового преобразования в режиме оди- ночных преобразований необходим как минимум один следующий тактовый им- пульс (такт 14 на рис. 3.6). Это обусловлено тем, что новый этап преобразован™ начинается только по очередному нарастающему фронту рабочего такта, следую- щему за установкой разряда ADSC. Шаг Такт АЦП ADSC Sample & Hold ADIF ADCH ADCL 1 2 3 4 5 6 7 8 9 10 11 12 13 14 1 2 ^результата j lSB результата ; Текущее преобразование 1 ; Следующее I ! преобразование Настройки мультиплексора сохранены Рис. 3.6. Временная диаграмма преобразования в режиме одиночных преобразования Как видно из рис. 3.7, в автономном режиме работы разряд ADSC постояннс установлен в лог. 1, а следующий цикл преобразования начинается сразу же после завершения тринадцатого такта текущего цикла. Рис. 3.7. Временная диаграмма преобразования в автономном режиме
3.1. Встроенный АЦП микроконтроллеров AVR с разрешением десять разрядов 71 Выбор входных каналов и источника опорного напряжения В зависимости от типа микроконтроллера AVR, в распоряжение пользователя южет быть предоставлено различное количество входных каналов. В любом случае ходной канал может соединяться через аналоговый мультиплексор MUX2 со вхо- ом АЦП, как показано на блок-схеме (см. рис. 3.1). Выбор входного канала осуще- твляется в регистре ADMUX с помощью четырех разрядов: MUXO, MUX1, MUX2 : MUX3. Кроме внешних напряжений, подаваемых на входные каналы lDC0...ADC7, через MUX2 в качестве входной величины преобразователя могут акже быть поданы базовые величины AGND аналогового блока микроконтроллера внутреннее межпороговое напряжение номиналом 1,23 В (1,15... 1,40 В). Межпо- оговое напряжение используется для распознавания провалов напряжения во внут- еннем детекторе микроконтроллера AVR. Именно на его основании формируется нутреннее опорное напряжение преобразователя Uint = 2,56 В. L । у Входные каналы АЦП составляют особую функцию соответствующих порта ввода- \!/ вывода микроконтроллера AVR. Так, например, в модели АТтедав один или не- V сколько выводов порта С используются в качестве входов для десятиразрядного АЦП. В этом случае другие выводы этого же порта, конфигурируемые как выходы, во время процесса преобразования переключены быть не могут! Это может повли- ять на точность результатов преобразования. Для того чтобы гарантировать, что возможное изменение адресов мультиплек- оров MUX1 и MUX2 в регистре ADMUX не повлияет на текущее преобразование, ни сохраняются во временном регистре и актуализируются только на последнем еред завершением преобразования такте. Благодаря этому, они действенны только ля следующего цикла преобразования. В начале же нового преобразования теку- ще настройки мультиплексора изменяются таким образом, чтобы обеспечить дос- рочный период дискретизации. . - у Новый цикл преобразования начинается по нарастающему фронту тактового сиг- \!/ нала АЦП, следующим после установки сигнала ADSC. По этой причине пользова- V тель может внести новые данные в регистр ADMUX только после того, как с мо- мента установки разряда ADSC прошел как минимум один тактовый импульс. В режиме одиночных преобразований настройки мультиплексора гарантированно изменяются после завершения одного и перед началом следующего преобразова- ния с помощью разряда ADSC. Источник опорного напряжения Uref выбирается с помощью MUX1 и разрядов EFS0 и REFS1 регистра ADMUX. В качестве опорного используется напряжение итания AVcc аналогового блока микроконтроллера AVR, внутреннее опорное на- ряжение Uint = 2,56 В, источник которого в случае модели ATmega8 интегрирован кристалл, или подаваемого на вывод AREF напряжение Uext (должно находиться диапазоне 2,0 В < Uext < AVcc- J"1 у В том случае, если с помощью мультиплексора MUX1 был выбран один из двух \!/ внутренних источников опорного напряжения, подавать внешнее напряжение на V вывод AREF недопустимо! Для того чтобы сделать опорное напряжение менее чувствительным к внешним «действиям и помехам, вывод AREF следует изолировать относительно AGND помощью конденсатора на 100 нФ. Преобразуемое аналоговое входное напряже- ie может при этом колебаться в диапазоне AGND.. .Uref.
72 Измерение напряжения с помощью микроконтроллеров AVR Регистр ADMUX АЦП Регистр ADMUX (ADC Multiplexer Select Register) в микроконтроллере ATmega8 расположен в области ввода-вывода по адресу $07 (адрес в области RAM — $27). После сброса инициализируется значением $00. В модели ATmega8 в регистре ADMUX фактически используются только раз- ряды 0.. .3 и 5 ... 7. Они доступны для записи и чтения. Разряд 4 зарезервирован для других целей и поэтому разрешено только его чтение (всегда содержит лог. 0). Разряд 76 543210 $07 ($27)|REFS1 |REFS0 ADLAR | - |MUX3 |MUX2 |MUX1 |MUX0 ] ADMUX Разряды REFS1, REFS0 (разряды 7 и 6 регистра ADMUX) определяют согласно табл. 3.2 источник опорного напряжения, используемый во внутреннем ЦАП (см. рис. 3.1). Таблица 3.2. Выбор опорного напряжения для аналого-цифрового преобразования REFS1 REFS0 Выбранное опорное напряжение Uref 0 0 Внешний источник опорного напряжения Uext на выводе AREF, внутренний источник опорного напряжения Uint отключен 0 1 Напряжение питания AVcc с внешним конденсатором на выводе AREF 1 0 Зарезервировано 1 1 Внутренний источник опорного напряжения Uint с конденсатором на выво- де AREF Разряд ADLAR (ADC Left Adjust Result, разряд 5 регистра ADMUX) определяет выравнивание результата в регистровой паре ADCH:ADCL. Если ADLAR содержи! лог. 1, то результат представляется с выравниванием по левому краю, в противном случае — по правому краю, как показано в следующем подразделе. Изменение этогс разряда мгновенно сказывается на содержимом ADCH:ADCL. Разряды MUX0...MUX3 позволяют выбрать входной канал аналогового муль- типлексора, как показано в табл. 3.3. Таблица 3.3. Выбор входного канала для аналого-цифрового преобразователя MUX[3 ...0] Выбранный вход АЦП 0000 ADC0 0001 ADC1 0010 ADC2 0011 ADC3 0100 ADC4 0101 ADC5 0110 ADC6 1) 0111 ADC7 1) 1000...1101 Зарезервировано 1110 Внутреннее межпороговое напряжение номиналом 1,23 В 1111 0 В (AGND) 1) Отсутствуют в микроконтроллерах ATmega8 с корпусом PDIP
3.1. Встроенный АЦП микроконтроллеров AVR с разрешением десять разрядов 73 Регистровая пара ADCH:ADCL Поскольку результат аналого-цифрового преобразования — десятиразрядное начение, его необходимо распределить между восьмиразрядными регистрами дан- [ых ADCH (старший байт) и ADCL (младший байт). Регистры данных ADCH и ADCL расположены в области ввода-вывода по ад- >есам $05 и $04 (адреса в памяти RAM — $25 и $24). После сброса инициализиру- отся значением $00. ADLAR = 0 15 14 13 12 11 10 9 8 $05 ($25) $04 ($24) — — — — — — ADC9 ADC8 ADCH ADCL ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADC1 ADC0 7 6 5 4 3 2 1 0 ADLAR = 1 15 14 13 12 11 10 9 8 $05 ($25) $04 ($24) ADC9 ADC8 ADC7 ADC6 ADC5 ADC4 ADC3 ADC2 ADCH ADCL ADC1 ADC0 — — — — — — 7 6 5 4 3 2 1 0 По разряду ADLAR регистра ADMUX можно установить, каким образом упо- >ядочены результаты в ADCH:ADCL. При ADLAR = лог. 1 результаты в ADCHzADCL выровнены по левому краю. 1сли не требуется точность выше 8 разрядов, то результаты могут быть считаны не- юсредственно из ADCH. Содержимое ADCL в таком случае просто не имеет значе- шя. г—т-у Для того чтобы при считывании результатов цифро-аналогового преобразования \ » / обе части результата гарантировано являлись итогом одного и того же преобразо- V вания, сначала происходит считывание младшего байта ADCL. Сразу же после этого схема управления блокирует доступ АЦП к его регистру данных ADCH:ADCL. Если к этому моменту новое преобразование уже завершилось, результат теряет- ся. При считывании ADCH вновь обеспечивается доступ АЦП к его регистру дан- ных. По этой причине после считывания ADCL необходимо также считывать ADCH. При желании, после завершения аналого-цифрового преобразования можно Бы- вать прерывание (см. ниже описание регистра ADCSRA). Если прерывание разре- пено, оно возникает также и в том случае, когда при выполненном ранее считыва- ши регистра ADCL регистры данных ADCH:ADCL были заблокированы, вследст- ше чего новое значение было утеряно. Регистр управления и состояния ADCSRA Регистр управления и состояния А аналого-цифрового преобразователя \DCSRA (ADC Control and Status Register А) в микроконтроллере ATmega8 распо- южен в области ввода-вывода по адресу $06 (адрес в памяти RAM — $26). После сброса инициализируется значением $00. Все разряды доступны на чтение и запись. Разряд 76543210 $06 ($26) | ADEN | ADSC | ADFR | ADIF | ADIE |ADPS2|ADPS1 |ADPSO| ADCSRA
Измерение напряжения с помощью микроконтроллеров AVR Аналого-цифровой преобразователь доступен, если разряд ADEN (ADC Enable) установлен в лог. 1. В случае лог. О устройство отключено. Если лог. О записывается в момент преобразования, текущий процесс прерывается. Разряд ADSC (ADC Start Conversion) должен быть установлен в лог. 1 для нача- ла преобразования в режиме одиночных преобразований (разряд ADFR = лог. 0). Если же выбран автономный режим работы АЦП (разряд ADFR = лог. 1), то первое преобразование начинается по запись лог. 1 в разряд ADSC. Первый запуск преоб- разователя после его разблокировки (разряд ADEN = лог. 1) или одновременно с ней инициирует холостой прогон, предшествующий реальному преобразованию (см. рис. 3.5). Во время холостого прогона происходит инициализация преобразователя. Разряд ADSC остается установленным в лог. 1 в течение всего процесса преоб- разования, по завершении которого схема управления сбрасывает его в лог. 0. Цифро-аналоговый преобразователь работает в автономном режиме, если раз- ряд ADFR (ADC Free Running Mode) установлен в лог. 1. В данном режиме сразу же после завершения одного цикла преобразования начинается следующий (см. рис. 3.7). Если же разряд ADFR содержит лог. 0, активен режим одиночных преоб- разований (см. рис. 3.6), при котором каждый последующий цикл должен быть ини- циирован отдельно. Лог. 1 в разряде ADIF (ADC Interrupt Flag) сигнализирует о том, что преобразо- вание завершено, а результат записан в регистровую пару ADCH:ADCL. Прерыва- ние по окончанию процесса преобразования возникает, если установлен разряд ADIE регистра ADCSRA, а также разряд I в регистре состояния SREG. При перехо- де к программе обработки прерываний разряд ADIF автоматически сбрасывается в лог. 0. Его можно также сбросить вручную, записав лог. 1. Прерывание по завершению преобразования может возникнуть при установ- ленных флагах ADIE (ADC Interrupt Enable) и I. Как только разряд ADIF укажет на завершение преобразования, происходит ветвление по соответствующему вектору прерывания. Разряды ADSP2...ADSP0 определяют коэффициент деления такта системной синхронизации Ф, что необходимо для формирования тактового сигнала АЦП. По- лучаемые значения представлены в табл. 3.4. Таблица 3.4. Выбор входного такта аналого-цифрового преобразователя ADSP2 ADSP1 ADSP0 Коэффициент деления ’ 0 0 0 2 0 0 1 2 0 1 0 4 0 1 1 8 1 0 0 16 1 0 1 32 1 1 0 64 1 1 1 128 Подавление/предотвращение помех при аналого-цифровом преобразовании В большинстве случаев микроконтроллеры AVR имеют отдельные выводы для подключения напряжения питания преобразователя. Аналоговая “земля” AGND при этом должна быть связана с “землей” схемы GND, а аналоговое напряжение пита- ния AVcc с питающим напряжением цифровой части Vcc- AVcc может отклоняться
3.1. Встроенный АЦП микроконтроллеров AVR с разрешением десять разрядов 75 >т Vcc максимум на ± 0,3 В и ни в коем случае не может быть меньше 2,7 В и боль- пе 6,0 В. Соединения осуществляется как это принято в смешанных аналого- щфровых схемах (рис. 3.8 и рис 3.9). Рис. 3.8. Рекомендуемое подключение линий питания при раздельном питании аналоговой и цифровой частей Рис. 3.9. Рекомендуемое подключение линий при общем питании аналоговой и цифровой частей Во всех переключательных схемах, состоящих из различных комбинаций ана- юговых и цифровых частей (в том числе и в случае с микроконтроллерами AVR), логут иметь место довольно сильные электромагнитные помехи в аналоговой части, )бусловленные резкими фронтами цифровых сигналов и относительно высокими выходными токами портов. Эти помехи могут оказывать заметное влияние на точ- юсть аналого-цифрового преобразования. Снизить помехи помогут следующие рекомендации. • Аналоговая часть микроконтроллера AVR вместе с другими аналоговыми схемами должна иметь собственное заземление (в идеальном случае — соб- ственную поверхность в многослойной плате), соединенное с заземляющей плоскостью цифровой части GND только в одной точке.
76 Измерение напряжения с помощью микроконтроллеров AVR • Аналоговые тракты должны быть максимально короткими и проходить, по возможности, над поверхностью “земли”. Они должны быть максимально удалены от линий передачи цифровых сигналов с высокими частотами и кру- тыми фронтами. • Выводы для подключения напряжения аналоговой части должны быть шун- тированы подходящими конденсаторами. Оптимально для этой цели, вслед- ствие незначительной собственной индуктивности, подходят керамические элементы в корпусе для поверхностного монтажа. Длина проводника, под- ключенного к выводу, должна быть минимальной (длины выше 5 мм счита- ются критическими). • Если обеспечить отдельный аналоговый источник питания AVCc (см. рис. 3.8) невозможно (Внимание! Отклонение напряжения питания AVcc от Vcc не должно превышать ±0,3 В!), вывод AVcc микроконтроллера AVR должен быть соединен с напряжением питания цифровой части VCc (рис. 3.10). Для развязки рекомендуется использовать LC-фильтр нижних частот (на рис. 3.10 изображен слева). Также при определенных обстоятельствах может быть ис- пользован RC-фильтр (на рис. 3.10 показан справа). Корпус PDIP-28 (вид сверху) со со сп ф Е э ADC5 (РС5) э ADC4 (РС4) □ ADC3 (РСЗ) 3 ADC2 (РС2) 3 ADC1 (РС1) 3 ADC0 (РСО) k AGND Ф с; to s ° Ф 100 nF VCC 3 ADC5 (РС5) 3 ADC4 (РС4) 3 ADC3 (РСЗ) 3 ADC2 (РС2) 3 ADC1 (РС1) 3 ADC0 (РСО) ^AGND ?AREF j AVCC Корпус PDIP-28 (вид сверху) С С УСС * с с с 3 3 100 о 100 nF с с Рис. 3.10. Монтаж аналоговых выводов питания на примере модели АТтедав в корпусе PDIP-28 Поскольку напряжение AVcc питает также выходные порты соответствую- щих регистров, при использовании отдельных выводов портов в качестве цифровых выходов должен фильтр низких частот должен отключаться. • Если для аналого-цифрового преобразования используются не все аналого- вые выводы, то использовать их в качестве входных или выходных цифровых портов в течение процесса преобразования не допускается! • Аналого-цифровой преобразователь имеет встроенную систему подавления помех, основная задача которого — снижение влияния помех, связанных с ЦПУ. В данном режиме преобразование происходит в “спящем” режиме ЦПУ. Возможные варианты этого режима: > шумоподавление АЦП (“ADC Noise Reduction”) — ЦПУ приостанавли- вается, однако АЦП, внешние прерывания, контроль за адресами двух- проводного интерфейса TWI, таймер/счетчик Т/С2 и сторожевой таймер остаются активными;
3.1. Встроенный АЦП микроконтроллеров AVR с разрешением десять разрядов 77 > холостой ход (“Idle”) — ЦПУ приостанавливается, однако интерфейс SP1, USART, аналоговый компаратор, двухпроводной интерфейс TWI, таймер/счетчик, сторожевой таймер и система прерывания остаются ак- тивными. Для их применения можно воспользоваться следующей процедурой: > С помощью регистра управления MCUCR разрешаем использование ре- жимов “Idle” или “ADC Noise Reduction”. > АЦП должен быть разрешен к использованию (ADEN = 1) и не должен находиться в процессе преобразования (ADSC = 0). При этом необходи- мо установить режим одиночных преобразований (ADFR = 0), а также разрешить прерывание по завершению преобразования (ADIE = 1). > Команда sleep переводит ЦПУ в режим “Idle” или “ADC Noise Reduc- tion”. Непосредственно после останова ЦПУ начинается преобразование. > При условии, что во время преобразования не происходит других преры- ваний, прерывание от преобразователя выводит ЦПУ из “спящего” ре- жима, после чего осуществляется обработка прерывания. Если же ЦПУ выводится из “спящего” режима каким-то другим прерыванием до пол- ного завершения текущего преобразования, то выполняется сначала со- ответствующая подцрограмма обработки прерывания, а затем, после за- вершения преобразования, — подпрограмма обработки прерывания от АЦП. Центральный процессор после этого остается активным до тех пор, пока опять не будет переведен в “спящий” режим следующей командой sleep. Примеры Практическое использование АЦП в автономном режиме описано в разделе 4.2. В этом случае микроконтроллер ATmega8 с помощью своего АЦП, работающего в автономном режиме, регулирует напряжение на конденсаторе таким образом, что удается получить стабильное выходное постоянное напряжение, номинальное зна- чение которого передается от ПК через интерфейс RS232. Ниже описан случай практического применения АЦП в режиме одиночных преобразований со встроен- ной системой подавления помех. Пример создан для тестовой схемы, описанной в разделе 4.3. Микроконтроллер ATmega8 принимает напряжение, устанавливаемое с помо- щью потенциометра Р1 (см. рис. 4.37), с помощью АЦП в “спящем” режиме, рабо- тающего в режиме одиночных преобразований со включенной системой подавления помех, и передает его программе HyperTerminal ПК через интерфейс RS232. Новое значение передается только в том случае, если измеренное значение изменится по сравнению с предыдущим результатом. С помощью перемычки MW можно выбрать, будет ли выводиться каждое изме- ряемое значение по отдельности, или же среднее значение после каждых 1024 цик- лов измерения. Соответствующая блок-схема алгоритма представлена на рис. 3.11, а текст про- граммы — в листинге 3.1. ФайлКЗ_1 AVR-ADC im Sleep-Modus . asm можно также найти на прилагаемом к книге W компакт-диске в папке Program.
78 Измерение напряжения с помощью микроконтроллеров AVR НР1: Передача заголовка / программы на ПК / ' Haupt: Среднее М\Л/[2..О] := О СпГГ.СпЮ := 1024 Аналого-цифровое преобра- зование в "спящем" режиме ' " I Результат аналого-цифрового преобразования - в adw1:adw0 Сложение adw1 :adw0 со средним значением MW[2..O] ~' т ' Cnt1 :CntO уменьшается на 1 adw1:adw0 = MW[2..O] /1024 (сдвиг вправо на 10 разрядов) Erg1:ErgO = adw1:adw0 1 Преобразование adw1 :adw0 в десятичное ASCII-число I ~ /Передача десятичного ASCII ' числа на ПК через UART Рис. 3.11. Блок-схема алгоритма для АЦП в “спящем” режиме, работающего в режиме одиночных преобразований при активной системе подавления помех
3.1 Встроенный АЦП микроконтроллеров AVR с разрешением десять разрядов 79 Листинг 3.1. Программа управления встроенным АЦП микроконтроллера AVR в режиме одиночных преобразованийК3_1 AVR-ADC im Sleep-Modus.asm /*Управление встроенным АЦП микроконтроллера AVR (одиночные преобразования* :* Версия: 1.0 ;* Целевое устройство: ATmega8 ;* Частота системной синхронизации: 12 Мгц ;* Описание: Значение входного напряжения на канале 1 встроенного АЦП ;* выводится на ПК после каждого цикла измерений или же ;* выводится среднее значение после каждых 1024 циклов. .nolist .include "С:\Programme\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc" . list *Описание .egu TxD = PD1 .equ MW = PD6 .equ Baud = 155 /Выход передатчика - вывод 1 порта D /Вход для перемычки MW /UBRR для скорости 4800 бод при 12 МГц /UBRR = (Fsys/16*Baud) - 1 /Содержимое регистров АЦП .equ ADCSM = 0Ы0001110 /ADEN=1 (ADC Enable), ADSC = 0 (не действует), / ADFR=0 (режим одиночных преобразований), ADIF=0 (не действует) / ADIE=1 (прерывание ри преобразователя разрешено) / ADPS[2..0]=110 (делитель частоты = 64) --> / Рабочая частота АЦП = 12 МГц : 64 = 187,5 кГц .equ ADMX = ObOlOOOOOl / REFS [ 1. . 0 ] =01 (Ref = AVcc), ADLAR = 0 / MUX[3..0]=0001 (ADC1 - вход) k* Регистровые переменные . def mulO = rO /Результат умножения, младший байт .def mull = rl /Результат умножения, старший байт .def ergO = г2 /Промежуточный результат умножения, младший байт . def ergl = гЗ /Промежуточный результат умножения, старший байт • def adwO = г4 /АЦП-результат, младший байт . def adwl = г5 /АЦП-результат, старший байт .def MW0 = гб /Среднее значение, младший байт .def MW1 = г 7 /Среднее значение, средний байт . def MW2 = г8 /Среднее значение, старший байт .def tO = г16 /Временный рабочий регистр .def tl = г17 /Временный рабочий регистр . def t2 = г18 /Временный рабочий регистр .def Rem = г19 /Остаток от деления .def CntO = г20 /Младший байт счетчика для вычисления среднего . def Cntl = г21 /Старший байт счетчика для определения среднего . def i0 = г24 /Временный рабочий регистр прерывания . def il = г25 /Временный рабочий регистр прерывания .*****код . cseg .org 0 rjmp Initial /Адрес перезапуска
80 Измерение напряжения с помощью микроконтроллеров AVR Листинг 3.1. Продолжение . org ADCCaddr Idi il,ObOOOlOOOO out MCUCR,il reti /Адрес вектора прерывания ADC Complete /SE=0 (запрет "спящего" режима), SM[2..0]=001 / ("Спящий" режим = шумоподавление АЦП) Initial /Инициализация микроконтроллера AVR Idi tl,low(RAMEND) out SPL,tl Idi tl,high(RAMEND) out SPH,tl InitPorts: /Инициализация младшего байта указателя стека /Инициализация старшего байта указателя стека Idi tl,l«TxD out DDRD,tl Idi tl,l«MW out PortD,tl InitUSART: /Конфигурируем направление передачи данных / через порт D /Подтягивающее сопротивление / для перемычки MW Idi tl,High(Baud) Idi tl,Low(Baud) out UBRRH,tl out UBRRH,tO /Старший байт для установки скорости передачи данных /Младший байт для установки скорости передачи данных /Разрешаем использование передатчика и приемника Idi tl, (1«RXEN) | (1«TXEN) out UCSRB,tl /Устанавливаем пределы передачи: 8 бит данных, 2 стоп-бита Idi tl, (1«URSEL) | (1«USBS) I (0bll«UCSZ0) out UCSRC,tl InitADC Idi tl,ADMX out ADMUX,tl Idi tl,ADCSM out ADCSR,tl clr ErgO clr Ergl sei /Настраиваем мультиплексор АЦП для опорного напряжения / и входного канала /Настраиваем регистр ADCSR АЦП / на режим одиночных преобразований /Последний результат = 0 /Общее разрешение прерываний ;*****Основная программа Start: Idi zH, High (Titel«l) /Устанавливаем указатель Z Idi zL, Low (Titel«l) / на начало текста во флэш-памяти rcall Out_Text /Вывод текста на ПК Haupt: Idi CntO,Low(1024) Idi Cntl,High(1024) clr MWO clr MW1 clr MW2 HP1: /Инициализируем / счетчик среднего значения /Очищаем младший байт среднего значения /Очищаем средний байт среднего значения /Очищаем старший байт среднего значения Idi tl,0bl0010000 out MCUCR,tl sleep in adwO,ADCL in adwl,ADCH sbis PinD,MW ,-SE=l (разрешаем "спящиц" режим), SM[2..0]=001 ; ("Спящий" режим = шумоподавление АЦП) /Переходим в режим шумоподавления АЦП /Младший байт результата АЦ-преобразования /Старший байт результата АЦ-преобразования /Пропускаем следующую команду, если / вычисляется среднее значение rjmp HP2 /Переход при выводе отдельного значения
3.1. Встроенный АЦП микроконтроллеров AVR с разрешением десять разрядов 81 Листинг 3.1. Продолжение clr tl /Очищаем вспомогательный регистр для добавления ; переполнения add MWO,adwO /Добавляем adc MWl,adwl / новый результат adc MW2,tl / к среднему значению subi CntO,l /Уменьшаем на 1 sbci Cntl,0 / счетчик среднего значения brsh НР1 /Переход, если последующие значения Isr MW2 /Сдвиг среднего значения на 10 разрядов вправо, ror MW1 / если исключается MW0 -> соответствует / делению на 1024 Isr MW2 ; Результат - в ror MW1 / MW2:MW1 mov adwO,MWl /Копируем среднее значение mov adwl,MW2 / в adwl:adw0 НР2: ср adw2,Erg0 /Сравниваем данный результат срс adwl,Ergl / с последним результатом breg Haupt /Переход, если изменений нет mov Erg0,adw0 /Сохраняем данный результат для дальнейших mov Ergl,adwl / измерений в качестве "последнего" результата rcall CalcResult /Готовим результат rcall SendResult /Выводим результат через UART rjmp Haupt ;*****Подпрограммы Dut_Text: /Вывод текста на ПК Imp t0,z+ /Загрузить символ ASCII в tO ?pi t0,0 /Конец текста? 3req 0t2 /Переход, если готово ЭТ1: sbis UCSRA,UDRE /Пропускаем следующую команду, если буфер передачи / свободен rjmp ОТ1 /Ожидаем освобождения буфера 3ut UDR,tO /Передаем символ ASCII rjmp OUT_Text /Следующий символ IT 2 ret SendResult: /Вывод результат через USART Ldi zH,High(Ausgb«l) /Устанавливаем указатель Z Ldi zl, Low (Ausgb«l) / на начало текста rcall Out_Text /Выводим текст на ПК Ldi zH,High(Dig3) /Устанавливаем указатель Z Ldi zl,Low(Dig3) / на начало строковой константы в памяти SRAM ?lr tl /Загружаем символ конца текста в tl sts EndT,tl / в выходной буфер SR1: Ld tl,z+ /Загружаем символ ASCII в tl spi tl,0 /Конец строки? >req WaitlOms /Переход, если текст выведен 5R2: sbis UCSRA,UDRE /Пропускаем следующую команду, если буфер передачи / свободен rjmp SR2 /Ожидаем освобождения буфера передачи >ut UDR,tl /Передаем символ ASCII
82 Измерение напряжения с помощью микроконтроллеров AVR Листинг 3.1. Продолжение rjmp SR1 WaitlOms: ;Передаем следующий символ Idi tO,156 /Ожидаем 10 мс, пока не будут переданы все символы, Waitl: ; после чего "спящий" режим USART отключается dec tl ;Внутренний счетчик цикла brne Waitl dec tO brne Waitl ret /Внешний счетчик цикла CalcResult: /Преобразование результата в десятичное число Idi zl,low(Unit) /Младший байт со следующим после DigO адресом Idi zh,high(Unit) /Старший байт со следующим после DigO адресом Idi tl, 'V /Загружаем в выходной буфер st z,tl / обозначение единиц измерения HexBCDAscii: /Нех[З..О] ->BCD[4..O] ->ASC[4..O] rcall Mui 5 /Умножаем adwl:adwO на 5 Idi tl,3 HBA1: /Счетчик для 3-х разрядов после десятичной точки rcall DivlO /adwl:adwO/10, BCD-цифра - в Rem subi Rem, -'O' /Добавляем ASCII-смещение цифры "0" st -z,Rem /Сохраняем ASCII-цифру dec tl /Уменьшаем счетчик на 1 brne HBA1 /Переход, если не равно нулю Idi tl,',' /ASCII-символ запятой st -z,tl /Включаем единицу измерения "V" для напряжения rcall DivlO / adwH: adwL/Ю, цифра - в регистре Rem subi Rem, -'O' /Добавляем ASCII-смещение цифры "0" st -z,Rem ret /Сохраняем Ascii-цифру DivlO: /Делим adwH:adwL на 10, / результат - в adwH:adwL, остататок - в "Rest" clr Rem /Rest = 0 Idi tO,16 LooplO: /Счетчик для 16 разрядов adwHzadwL Isl adwO rol adwl /Сдвигаем делимое на 1 разряд влево rol Rem /Переполнение в Rem subi Rem,10 /Переполнение в Rem >=10? brio HB1 /Переход, если нет inc adwO rjmp HB2 HB1: /Сдвигаем лог. 1 в младший разряд subi Rem,-10 HB2: dec tO /Уменьшаем счетчик разрядов на 1 brne LooplO ret /Переход, если не все разряды Mui 5: /Умножение adwH:adwL на 5 Idi tO,5 /Загружаем 5 в t2 mul adwO,tO /Умножаем младший байт на 5 mov adwO,mul0 /Сохраняем младший байт произведения mov tl,mull /Старший байт - в tl mul adwl,tO /Умножаем старший байт на 5 add tl,mul0 /Прибавляем младший байт текущего произведения
3.1. Встроенный АЦП микроконтроллеров AVR с разрешением десять разрядов 83 1ИСТИНГ 3.1. Окончание aov adwl,tl :et ; к старшему байту предыдущего ?itel: .db 13,12,"ADC des ATmega8 im Noise Reduction Mode",13,10,0 msgb: .db 13,10,"Uin = ",0 dseg org $60 )ig3: .Byte 1 ;Цифра 3 [omm: .Byte 1 ;Точка )ig2: .Byte 1 ;Цифра 2 )igl: .Byte 1 ;Цифра 1 )ig0: .Byte 1 ;Цифра 0 >nit: .Byte 1 ;Единица измерения "V" IndT: .Byte 1 ;Символ конца текста Описание программы Часть инициализации После установки указателя стека вывод PD2 (сигнал TxD) конфигурируется как ыход. К этому выводу подключена перемычка MW и подтягивающий резистор. Аналогично части инициализации программы тестирования UART, описанной > разделе 2.3, с помощью регистра UBRRH:UBRRL устанавливается скорость пере- дни данных, регистр управления UCSRB разрешает использование приемника и гередатчика, а с помощью регистра UCSRC определяем передачу 8 бит данных при .вух стоп-битах. В итоге с помощью мультиплексора АЦП определяем в качестве опорного на- ряжения рабочее напряжение AVcc аналоговой части, а в качестве входа преобра- ователя — канал 1. Аналого-цифровой преобразователь с помощью регистра правления ADSCR конфигурируется на режим одиночных преобразований и час- оту 187,5 кГц. Поскольку в основной программе каждое новое получаемое значение сравнива- гся с предыдущим, это “последнее значение” Ergl:ErgO в начале программы олжно быть установлено в Ergl :ErgO = 0000. причем это должно быть сделано до ого как будут разрешены прерывания и начнет выполняться основная программа. Основная программа После передачи заголовка программы в программу HyperTerminal 16- иразрядный счетчик Cntl:Cnt0, используемый для определения среднего, ини- иализируется значением 1024d = 400ь, а три байта для хранения среднего значения W2 :MW1 :MW0 сбрасываются в ООООООь. После того как с помощью регистра управления MCUCR будет разрешено ис- ользование “спящего” режима (шумоподавления АЦП), для перехода в этот режим ожет быть выполнена команда sleep. Одновременно происходит автоматический шуск АЦП. Сразу после завершения преобразования вызывается соответствующая подпро- эамма обработки прерывания. При этом “спящее” состояние запрещено до сле- ующего цикла преобразования.
84 Измерение напряжения с помощью микроконтроллеров AVR Результат преобразования заносится в регистровую пару adwl: adwO. Если пе- ремычка MW разомкнута, то вычисление среднего значения происходит после каж- дого 1024-го измерения, в противном случае результат будет выводиться после ка- ждого отдельного измерения при условии, что он отличается от результата преды- дущего измерения. Если на входе порта, к которому подключена перемычка MW, установлен уро- вень лог. 1, то среднее значение определяется после каждого 1024-го измерения. Ре- зультат в adwl: adwO прибавляется к содержимому регистра среднего значения MW2 :MW1 :MW0. Состояние счетчика количества операций для определению среднего значения Cntl :CntO уменьшается на 1. Если оно достигает 0, то это означает, что все 1024 измерений были успешно выполнены, и среднее значение может быть про- считано согласно уравнению: 1024 У^(7И’1 adwl: adwO = —------------ . 1024 Сдвиг регистра среднего значения MW2:MW1:MWO на 10 разрядов вправо легко осуществить путем деления на 1024 = 210. При этом восемь разрядов регистра MW0 полностью исчезают и оказывается достаточным сдвинуть содержимое MW2 :MW1 на два разряда вправо. Содержимое MW2 :MW1 переносится в adwl: adwO в качестве ус- редненного результата. Поскольку для АЦП в режиме одиночных преобразований, согласно рис. 3.6, требуется четырнадцать тактовых импульсов преобразователя при Ццн = 187,5 кГц, то для определения среднего значения после 1024 измерений требуется время 14-1024 14-1024 „„ t MW - ~ . т /АЦП 181,5 кГц Новый результат может быть получен только через этот промежуток времени. Отдельное значение измерения (перемычки MW = 0) или среднее значение по- сле 1024 измерений (перемычка MW = 1) в adwl:adwO сравнивается с последним результатом в Ergl :ErgO. Если окажется, что по сравнению с последним измерени- ем результат изменился, новый результат в adwl:adwO сохраняется в Ergl:ErgO в качестве “предыдущего” для следующего измерения. При этом в подпрограмме CalcResult он преобразуется в десятичное число, в виде строковой ASCII- константы записывается в память SRAM и выдается через USART на ПК с помо- щью подпрограммы SendResult. После завершения цикла программы происходи возврат к ее началу, то есть, организован бесконечный цикл. Подпрограмма Out_Text Подпрограмма Out lext передает хранящийся во флэш-памяти текст в про- грамму HyperTerminal. Адрес начала текста определяется указателем Z, а конец тек- ста должен быть обозначен символом ООь Подпрограмма CalcResult Согласно представленному выше описанию, АЦП микроконтроллера AVR име- ет разрешение десять разрядов.
3.1. Встроенный АЦП микроконтроллеров AVR с разрешением десять разрядов 85 Входное напряжение UE на канале 1 АЦП при напряжении питания аналоговой части микроконтроллера AVR 5,12 В (соответствует Vcc) на выводе AVcc (см. рис. 4.37) преобразуется, согласно уравнению (3.1), в число Z = 1024.----— = 400. —. и и и REF и REF В инициализационной части программы это напряжение питания посредством аналогового мультиплексора ADMUX выбирается в качестве опорного напряжения Uref Для АЦП. Младший значащий разряд (LSB) соответствует входному напряжению UE = 5 мВ при Uref = 5,12 В. Соответственно, для того чтобы получить корректный результат UE = О...5,115 В на основании содержимого adwl:adw0 = O...3Fh = = 0... 1023d, необходимо умножить значение adwl:adw0 на 5 с помощью подпро- граммы Ми 15. Полученное в adwl: adwO в результате умножения шестнадцатеричное число посредством деления на 10 преобразуется в десятичное число, которое в свою оче- редь при добавлении 30h = 'О’ преобразуется в цифру, соответствующую ASCII-сим- волам, и сохраняется в памяти SRAM. Поскольку в микроконтроллерах AVR отсут- ствует непосредственная командой сложения константы с содержимым регистра, суммирование реализовано путем вычитания отрицательной константы. Для облег- чения восприятия в строку добавляется десятичная точка и единица измерения “V”. Подпрограмма SendResult Подпрограмма передает через последовательный интерфейс ASCII-текст, хра- нимый во флэш-памяти, а после него — ASCII-строку, записанную в память SRAM под именем Dig3. В подпрограмму SendResult передается начальный адрес текста во флэш-памяти, конец текста обозначается в SRAM как 00Е. V Поскольку буфер передачи USART в микроконтроллере АТтедав двойной, по за- вершению подпрограммы SendResult передачи ожидают еще два символа. При выходе из подпрограммы в основной программе начинается новый цикл измере- ния, для которого по команде sleep микроконтроллер переводится в “спящий” ре- жим. Однако в этом режиме USART отключен, что не позволяет переслать послед- ние два символа. По этой причине перед выходом из подпрограммы SendResult необходимо выждать некоторое время, необходимое для отправки всех символов, и только после этого переводить микроконтроллер в “спящий” режим. Подпрограмма Divio Деление осуществляется посредством последовательности операций вычитания и сдвига (подробно описаны в книге Вольфганга Трамперта “AVR-RISC микрокон- троллеры”). Подпрограмма Mul_5 Умножение 16-тиразрядного значения adwl:adwO на константу 5 осуществля- ется с помощью команды умножения микроконтроллера ATmega8. Более подробно возможности этой команды описаны в документе “AVR201: Using the AVR Hard- ware Multiplier - Examples of using the multiplier for 8-bit arithmetic”. Файл AVR201. pdf можно также найти на прилагаемом к книге компакт-диске в папке Applicat.
86 Измерение напряжения с помощью микроконтроллеров AVR 3.2. Подключение микросхемы АЦП ADS7818 с разрешением 12 разрядов и интерфейсом SPI Интегральная схема ADS7818 от компании Texas Instruments — достаточно де- шевый, быстрый и точный аналого-цифровой преобразователь с разрешением 12 разрядов, встроенной схемой выборки и хранения, а также внутренним источником опорного напряжения. Микроконтроллер может управлять этой микросхемой через последовательный интерфейс SPI. Внутренняя структура ADS7818 показана на рис. 3.12. ЮкО±30% Рис. 3.12. Внутренняя структура АЦП ADS7818 от компании Texas Instruments Технические данные ADS7818 Основные характеристики микросхемы ADS7818: • до 500 000 преобразований в секунду; • внутренний источник опорного напряжения +2,5 В; • незначительная теряемая мощность в пределах 11 мВт при 500 000 преобра- зованиях в секунду; • дополнительное снижение теряемой мощности в режиме пониженного энер- гопотребления до 2,5 мВт; • работает на униполярном напряжении питания +5 В; • простой последовательный интерфейс. Так же как и встроенный АЦП микроконтроллеров AVR, микросхема ADS7818 работает принципу последовательного приближения (см. раздел 3.1). В кристалл интегрированы необходимые для этого устройство программного управления, циф- ро-аналоговый преобразователь и компаратор. В начале преобразования аналоговое входное напряжение Uin сохраняется как разница потенциалов между входами +1п и -In на конденсаторе встроенной схемы выборки и хранения. При этом вход —In, как правило, подключается к “земле” ана-
3.2. Подключение микросхемы АЦП ADS7818 с разрешением 12 разрядов и интерфейсом SPI 87 логовой части схемы. Для компенсации возможного смещения входного напряже- ния потенциал V_in может смещаться в диапазоне -0,2 В < V_in < +0,2 В. Входное напряжение Ujn = V+in - V _1п может находиться в диапазоне 0 < Vm < (2 • Vref - 1 LSB ), при этом 1 LSB = (2 • VreF)/212 = (2 2,5 В) 14096 = 1,22 мВ, если находит применение внутреннее опорное напряжение Vref = 2,5 В. Результат аналого-цифрового преобразования — числовое значение Z г/ U V -V Z = 212----- 4096---------= 2048 • . (3.1) 2-К 2-V V При этом потенциалы V+in и V jn не могут превышать абсолютных пределов -0,2 В < V+In < (Vcc + 0,2 В) и -0,2 В < V-щ < +0,2 В. Напряжение питания ADS7818 составляет +5 В ± 250 мВ. Длина проводников, соединяющих устройство с источником питания и “землей” аналоговой части схемы должна быть как можно меньшей. При этом необходимо придерживаться правил развязки аналогового напряжения питания (см. раздел 3.1) — особенно с использо- ванием керамического конденсатора на 0,1 мкФ и включенного параллельно танта- лового конденсатора на 1...10 мкФ. В случае необходимости можно использовать также фильтр нижних частот, состоящий из конденсатора на 10... 100 нФ и резисто- ра на 5... 10 Q или индуктивности на 10 мкГн (см. рис. 3.8 или рис. 3.9). В кристалл встроен источник опорного напряжения +2,5 В с температурным дрейфом не более 20 ррш/°С, соединенный с выводов Vref через резистор с сопро- тивлением около 10 kQ. Вместо внутреннего опорного напряжения на вывод Vref может быть подано внешнее опорное напряжение в диапазоне 2,0 В < Vext 2,55 В. В таком случае В выходное сопротивление должно быть меньше внутреннего со- противления 10 kQ. Для обеспечения стабильности опорного напряжения вывод Vref должен быть в любом случае заперт керамическим конденсатором на 0,1 мкФ и подключенным параллельно танталовым конденсатором на 2,2 мкФ. Обмен данными между микроконтроллером AVR и микросхемой ADS7818 осуществляется через последовательный интерфейс, напоминающий SPI. Поскольку предлагаемый в данном случае микроконтроллер AT90S2313 не располагает аппа- ратным интерфейсом SPI, он реализуется программно. Если ADS7818 временно не используется, экономия электроэнергии достигает- ся с помощью особого режима энергосбережения, в котором мощность потерь не превышает 2,5 мВт. Принцип работы ADS7818 Типичная схема подключения микросхемы ADS7818 к микроконтроллеру AVR представлена на рис. 3.13. Входное аналоговое напряжение Uin нагружается емкост- ным током конденсатора внутренней схемы выборки и хранения. Когда конденсатор оказывается полностью заряженным, входной ток ADS7818 почти нулевой, по- скольку входное сопротивление аналоговой части превышает 1 ГО. Источник вход- ного напряжения должен обеспечивать конденсатор схемы выборки и хранения ем- костным током такого уровня, чтобы он был в состоянии зарядить этот конденсатор в течение времени выборки 350 нс (в наихудшем случае, когда производительность составляет 500 000 преобразований в секунду).
88 Измерение напряжения с помощью микроконтроллеров AVR Аналоговое j входное 1п О напряжение ADS7818 Vref +Vcc +ln CLK -In DATA GND CONV +5V /Последовательный ^тактовый сигнал Последовател ьные данные / Начать \ преобразование > AVR Рис. 3.13. Подключение микросхемы ADS7818 к микроконтроллеру AVR Вход CONV обеспечивает переключение между состоянием выборки и хране- ния, а также используется для подачи сигнала о начале преобразования (см. рис. 3.14). Кроме того, вход CONV обеспечивает переход устройства в режим по- ниженного энергопотребления. Для осуществления преобразования устройству ADS7818 требуется передавае- мый микроконтроллером тактовый сигнал CLK, который синхронизирует последо- вательную передачу данных, а также определяет скорость преобразования. Послед- нее обусловлено тем, что сигнал CLK задает рабочую частоту устройства управле- ния последовательным приближением. Передаваемый последовательно выходной сигнал сразу же представляет результат текущего преобразования. Частота сигнала CLK находится в диапазоне 200 кГц (12 500 преобразований в секунду) ... 8 МГц (500 000 преобразований в секунду). Коэффициент заполнения некритичен до тех пор, пока длительность импульса высокого или низкого уровня больше 50 нс. Тактовая частота не должна быть меньше 200 кГц или же период T=l/f не дол- жен превышать 5 мкс, поскольку в данном случае падение напряжения на внутрен- нем конденсаторе схемы выборки и хранения, обусловленное токами утечки, может привести к искажению результатов. 12-тиразрядный результат аналого-цифрового преобразования по ниспадающе- му фонту сигнала CLK выводится через выход DATA и может быть получен микро- контроллером AVR по нарастающему фронту следующего импульса CLK. При этом первым передается старший значащий разряд (MSB). Микросхема ADS7818 обладает рядом свойств, выделяющих его среди других восьмиконтактных АЦП: • переход из состояния выборки в состояние хранения происходит по ниспа- дающему фронту сигнала CONV и не зависит от тактового сигнала CLK; • тактовый сигнал CLK не обязательно должен подаваться непрерывно во вре- мя всего процесса преобразования, что позволяет записывать 12 бит резуль- тата в два этапа с помощью восьмиразрядного аппаратного интерфейса SPI микроконтроллера AVR; • после завершения преобразования сигнал CLK может оставаться как на уров- не лог. 0, так и на уровне лог. 1.
3.2. Подключение микросхемы АЦП ADS7818 с разрешением 12 разрядов и интерфейсом SPI 89 Процесс аналого-цифрового преобразования в ADS7818 Процесс аналого-цифрового преобразования в микросхеме ADS7818 изображен на рис. 3.14. Рис. 3.14. Временная диаграмма процесса аналого-цифрового преобразования в ADS7818
90 Измерение напряжения с помощью микроконтроллеров AVR Преобразование начинается по ниспадающему фронту сигнала на входе CONV, который переключает внутреннюю схему выборки и хранения из состояния выбор- ки в состояние хранения. Этот процесс, обозначенный на рис. 3.14 как (2), асинхро- нен с тактовым сигналом CLK микросхемы ADS7818, т.е. состояние линии CLK в данном случае не имеет значения. Синхронизация тактового сигнала с собственно процессом преобразования происходит иначе. В данном случае сигнал низкого уровня на выводе CONV сопос- тавляется с ниспадающим фронтом импульса CLK (на рис. 3.14 — импульс “16”). До тех пор пока сохраняется сигнал низкого уровня на линии CONV, выход DATA из третьего состояния переходит в активное на уровень лог. 0. Следующий после этого тактовый импульс считается первым в новом цикле преобразования. По нис- падающему фронту этого импульса на выходе DATA появляется первый бит ре- зультата, откуда он может быть считан по нарастающему фронту следующего им- пульса CLK. Оставшиеся 11 бит результата, аналогично первому, передаются на вывод DATA по ниспадающему фронту сигнала CLK, а принимаются по нарастаю- щему фронту следующего импульса CLK. По ниспадающему фронту двенадцатого тактового импульса на выход DATA микросхемы ADS7818 выдается последний бит результата преобразования (млад- ший значащий разряд, LSB). При этом процесс считается завершенным, и схема управления преобразователя переходит в состояние холостого хода, обозначенного на рис. 3.14 как (3). Схема управления ожидает нового стартового импульса — сиг- нала CONV. Схема выборки и хранения переходит в состояние выборки. Во время холостого хода схема остается в активном состоянии, а потери мощности не умень- шаются. По нарастающему фронту тринадцатого импульса CLK микроконтроллером принимает только младший разряд. Сигнал CONV должен вернуться на высокий уровень максимум перед началом 13-го импульса CLK, поскольку низкий уровень в начале 13-го такта переведет ADS7818 в режим пониженного энергопотребления (см. ниже). Тактовые импульсы 14 и 15, обозначенные на рис 3.14 как (1), после заверше- ния преобразования принимаются исключительно ради завершенности. В работе схемы они роли не играют. Если продолжительность выборки Iacq до следующего сигнала CONV низкого уровня больше требуемого минимального значения 350 нс, то она может быть проигнорирована. Для полного цикла преобразования необходимы 12 импульсов CLK. При мак- симально возможной тактовой частоте ADS7818 fcLKmax = 8 МГц минимальная про- должительность цикла преобразования составляет tcoNvmin =12/8 МГц = 1,5 мкс. Режим пониженного энергопотребления ADS7818 Как уже упоминалось ранее, микросхема ADS7818 переходит режим понижен- ного энергопотребления в том случае, если сигнал CONV в момент текущего преоб- разования к началу тринадцатого импульса CLK имеет уровень лог. О (обозначено на рис. 3.15 как (1)). Выход устройства из режима пониженного энергопотребления происходит по нарастающему фронту сигнала CLK (обозначено на рис. 3.15 как (2)). Синхронно с этим происходит также переключение схемы выборки и хранения в режим выборки. Временная диаграмма описанного процесса изображена на рис. 3.15.
Рис. 3.15. Микросхема ADS7818 в режиме пониженного энергопотребления OONV ЦП DATA I (MSB) У Режим выборки/ хранения ВЫБОРКА^ Щ ХРАНЕНИЕ Внутреннее состояние ХОЛОСТОЙ I ХОД I РЕЖИМ ЭНЕРГОПОТРЕБЛЕНИЯ Выполняется преобразование ПОЛНОЕ ЭНЕРГОПОТРЕБЛЕНИЕ
3.2. Подключение микросхемы АЦП ADS7818 с разрешением 12 разрядов и интерфейсом SPI
92 Измерение напряжения с помощью микроконтроллеров AVR V После выхода из режима пониженного энергопотребления сигнал CONV должен быть на высоком уровне в течение времени Iacq min = 350 нс. Это необходимо для того, чтобы дать схеме достаточно времени для следующей выборки. Если микросхема ADS7818 должна выполнить меньшее количество выборок в секунду, чем максимально возможное 500 000, то достаточно уменьшить частоту следования тактовых импульсов CLK и таким образом увеличить длительность ка- ждого отдельного преобразования. Если же в некотором конкретном случае не тре- буется максимальная скорость обработки данных в пределах 500 000 циклов в се- кунду, то рекомендуется (особенно в устройствах с питанием от батареи) устано- вить максимально возможную тактовую частоту CLK, а между отдельными цикла- ми преобразования установить паузы, во время которых ADS7818 переходит в со- стояние пониженного энергопотребления. Благодаря этому удается существенно снизить затраты энергии, что продемон- стрировано в табл. 3.5. Таблица 3.5. Потери мощности ADS7818 при различных тактовых частотах Скорость обработки данных fsample Потери мощности при fcLK = 16 ' fSample Потери мощность при fcLK = 8 МГц 500 000 11 мВт 11 мВт 250 000 10 мВт 7 мВт 100 000 9 мВт 4 мВт Дополнительные режимы работы ADS7818 Изменение направления потока битов результата Если сигнал CONV в конце 12-го импульса CLK переключается на высокий уровень, а затем во время 13-го импульса (в тот момент, когда младший разряд на- ходится на выходе DATA) вновь возвращается на низкий уровень, передача битов данных происходит в обратной последовательности (обозначено на рис. 3.16 как (1)). По следующим 11 импульсам CLK биты только что определенного значения выдаются еще раз — но на этот раз уже в последовательности DI, D2, D3... После вывода старшего значащего разряда (MSB) выход DATA микросхемы ADS7818 остается в состоянии низкого уровня (на рис. 3.16 обозначен как (2)) до тех пор, пока на выводе CONV не появится высокий уровень сигнала. Сам преобразователь во время 13-го тактового импульса переходит в режим по- ниженного энергопотребления (на рис. 3.16 обозначен как (3)), из которого выхо- дит, когда на выводе CONV опять появляется высокий уровень сигнала. Описанный выше процесс изображен на рис. 3.16. Уменьшение разрешения ADS7818 Если в некотором случае необходимо уменьшить разрешение ADS7818 (сделать его меньше чем 12 разрядов), то можно сократить время преобразования. При этом сигнал CONV переключается на высокий уровень в течение процесса преобразова- ния и вновь возвращается на низкий уровень в тот момент, когда бит, на котором необходимо прекратить передачу, подается на выход DATA. Важно добиться того, чтобы перед началом 13-го импульса CLK на выводе CONV опять установился низ- кий уровень сигнала, поскольку переход сигнала CONV от высокого к низкому уро- вню во время 13-го тактового импульса изменит направление передачи битов дан- ных (см. рис. 3.16).
3.2. Подключение микросхемы АЦП ADS7818 с разрешением 12 разрядов и интерфейсом SPI 93 Рис. 3.16. Временная диаграмма работы ADS7818 в режиме “начиная с LSB” При переходе сигнала CONV на низкий уровень выход DATA мгновенно пере- ключается в третье состояние, а микросхема ADS7818 — в режим пониженного энергопотребления. Именно поэтому сигнал на линии CONV переключается на низ-
94 Измерение напряжения с помощью микроконтроллеров AVR кий уровень только тогда, когда требуемый бит из передаваемых данных действи- тельно записан в память, т.е. только после нарастающего фронта соответствующего тактового импульса. Соответствующий процесс изображен на рис. 3.17. Рис. 3.17. Уменьшение длительности преобразования и разрешения ADS7818
3.2. Подключение микросхемы АЦП ADS7818 с разрешением 12 разрядов и интерфейсом SPI 95 Управление ADS7818 через интерфейс SPI микроконтроллера AVR Управлять ADS7818 возможно двумя способами: • сигнал CONV синхронизован с сигналом CLK, а тактовый сигнал CLK по- ступает непрерывно (см. рис. 3.14) — этот режим работы типичен для про- цессора обработки сигналов; • сигнал CONV не синхронизован с сигналом CLK, а действует как разрешаю- щий сигнал для такта CLK, передаваемого в качестве импульсного пакета (см. рис. 3.19) — этот режим работы типичен для интерфейса SPI микрокон- троллера. Для управления микросхемой ADS7818 с помощью микроконтроллера AVR второй вариант гораздо проще и потому предпочтительней. Реализация последовательной передачи с помощью аппаратного интерфейса SPI Для использования аппаратного интерфейса SPI, присутствующего во многих микроконтроллерах AVR, достаточно соединить выводы согласно табл. 3.6. Таблица 3.6. Соединение микроконтроллера AVR и микросхемы ADS7818 Вывод ADS7818 Вывод SPI мш роконтооллеоа AVR CLK SCK DATA MISO CONV /SS Применение аппаратного интерфейса SPI микроконтроллеров AVR подробно и с наглядными примерами рассматривается в книге “AVR-RISC микроконтроллеры”, поэтому здесь о нем будет упомянуто кратко. В качестве протокола передачи в случае ADS7818 следует выбрать формат SPI СРНА = О, CPOL = 0 (прием бита данных по нарастающему фронту, сдвиг — по ниспадающему фронту сигнала SCK). На рис. 3.18 изображен процесс ввода данных через интерфейс SPI микрокон- троллера AVR. Как уже было отмечено ранее, ниспадающий фронт сигнала /SS (Slave Select), подаваемый на вывод CONV, переключает схему выборки и хранения ADS7818 в состояние хранения. Начиная с этого момента, сохраненное внутренним конденсатором напряжение начинает плавно уменьшаться. Это приводит к погреш- ности в процессе аналого-цифрового преобразования. Для того чтобы удержать ее в пределах 0,1 LSB, изображенная на рис. 3.18 длительность ниспадающего фронта сигнала CONV, ограниченная нарастающим фронтом первого тактового импульса, не должна превышать tDRP = 5 мкс. Микроконтроллер AVR в качестве ведущего устройства начинает передачу, за- писывая произвольное значение в регистр данных SPDR, а аппаратное обеспечение SPI при этом выдает первый тактовый импульс на выход SCK. Само аналого-цифровое преобразование микросхема ADS7818 начинает только тогда, когда на его входе CONV перед ниспадающим фронтом тактового импульса на входе CLK будет зарегистрирован низкий уровень сигнала. При непрерывном тактовом сигнале (см. рис. 3.14) это, как правило, — последний тактовый импульс (обозначен на рис. 3.14 как “16”) предыдущего цикла преобразования. При передаче по протоколу SPI этот последний тактовый импульс отсутствует, поскольку в дан- ном случае микросхема ADS7818 перед ниспадающим фронтом сигнала CONV на-
96 Измерение напряжения с помощью микроконтроллеров AVR ходилась в режиме пониженного энергопотребления. По этой причине первый им- пульс восьмиразрядного тактового пакета служит здесь исключительно для индика- ции, что на выводе CONV установлен низкий уровень сигнала. По ниспадающему фронту этого первого тактового импульса микросхема AS7818 активирует свой вы- ход DATA, переходящий на длительность второго тактового импульса в состояние лог. 0. Сама передача начинается только по второму импульсу CLK. Описанный процесс иллюстрируют рис. 3.18 и рис. 3.19. Рис. 3.18. Управление микросхемой ADS7818 через интерфейс SPI микроконтроллера AVR CONV В отличие от изображенного на рис. 3.14 процесса, при передаче по протоколу SPI происходит смещение на один тактовый импульс. Микросхема ADS7818 в дан- ном случае переходит в режим пониженного энергопотреблении только в том слу- чае, если на выводе CONV к началу 14-го тактового импульса все еще находится низкий уровень сигнала. Ниспадающий фронт второго тактового импульса перемещает старший знача- щий разряд (MSB) результата (бит 11) на выход DATA, откуда он по нарастающему фронту третьего тактового импульса принимается микроконтроллером AVR. Ана- логичным образом этот процесс протекает и для битов D10...D6. По нарастающему фронту восьмого тактового импульса D6 результата записывается в буфер приема SPI, и по ниспадающему фронту на выходе DATA появляется D5. После этого SPI- передача, охватывающая восемь бит, считается завершенной, о чем также символи- зирует флаг SPIF. Теперь микроконтроллер AVR считывает данные из регистра SPDR и сохраняет этот промежуточный результат. После этого он начинает SPI-передачу, для чего в регистр SPDR записывается еще одно произвольное значение, необходимое для ввода оставшихся 6 бит результата. По нарастающему фронту первого такта второй SPI-передачи происходит за- пись оставшегося на выходе DATA бита результата D5. По его ниспадающему фронту на выход перемещается следующий бит D4. По нарастающему фронту шес- того тактового импульса второй SPI-передачи (всего 14-го тактового импульса со- гласно рис. 3.18) выполняется запись последнего бита данных DO. Поскольку сигнал CONV в начале 14-го тактового импульса все еще имеет низкий уровень, микросхе- ма ADS7818 переходит в режим пониженного энергопотребления. При ниспадаю- щем фронте 14-го тактового импульса выход DATA переходит в третье состояние. Аппаратный SPI выполняет, согласно своему протоколу, еще два (фиктивных) сдви-
3.2. Подключение микросхемы АЦП ADS7818 с разрешением 12 разрядов и интерфейсом SPI 97 до тех пор, пока о завершении передачи не будет сообщено установкой флага Микроконтроллер AVR завершает лишь тот процесс, в котором он переключает шнию CONV на высокий уровень. Он опять считывает содержимое регистра SPDR 4 получает из него и уже сохраненного после первого цикла промежуточного ре- зультата окончательный результат аналого-цифрового преобразования. Прежде чем по ниспадающему фронту сигнала CONV будет начато следующее преобразование, должно тройти время выборки tAcq- Реализация последовательной передачи с помощью программного интерфейса SPI Как уже было сказано выше, анало- о-цифровой преобразователь ADS7818 i данном режиме должен быть подклю- чи к микроконтроллеру AT90S2313 i тестовой плате, описанной в разде- чЗ.З. Поскольку данный тип микро- контроллеров не имеет требуемого ап- [аратного SPI, интерфейс в данном слу- :ае должен быть создан с помощью [рограммного обеспечения. Соответст- ующая блок-схема подпрограммы ,ead_SPl изображена на рис. 3.20. Тестовая схема для проверки интерфейса АЦП микроконтроллера На рис. 3.21 показана описанная разделе 3.3 часть тестовой платы, не- бходимой для управления микросхе- ой ADS7818. Перемычки J21-1, J21-2, J21-3 пла- ы, описанной в разделе 3.3, должны ыть замкнуты, а не обозначенная на ис. 3.21 перемычка INH должна оста- аться разомкнутой. Аналого-цифровой реобразователь ADS7818 соединяется микроконтроллером AVR по линиям LK, DATA (=DOUT) и CONV соглас- орис. 3.13. Подтягивающие резисторы цепи RN41 обеспечивают требуемый ясокий уровень на выводах, если пе- гмычки разомкнуты. Рис. 3.20. Блок-схема программной реализации интерфейса SPI 1змерение
98 Измерение напряжения с помощью микроконтроллеров AVR Рис. 3.21. Схема управления аналого-цифровым преобразователем ADS7818
3.2. Подключение микросхемы АЦП ADS7818 с разрешением 12 разрядов и интерфейсом SPI 99 Реализованный с помощью транзисторов Т31 и Т32 интерфейс RS232 (см. эис. 3.21), благодаря простоте своей структуры и независимости от вспомогательно- го источника напряжения, в большинстве случаев вполне достаточен для передачи данных на ПК даже несмотря на то, что требуемый уровень напряжения согласно термам RS232 (см. рис. 2.22) не достигается. Многие приемники RS232 распознают входной уровень менее +2 В как лог. 1, а уровень выше +2 В — как лог. 0. Фильтр нижних частот, состоящий из катушки индуктивности L51 и конденса- горов С54, С43 и С44, развязывает напряжение питания V4- АЦП и ADS7818 от на- 1ряжения питания Vcc цифровой части. В этом случае, учитывая высокую чувствительность и разрешение применяемо- о АЦП, необходимо также тщательно разделить “землю” схемы по правилам, изо- >раженным на рис. 3.8 и рис 3.9. На входе Vref преобразователя ADS7818 с помощью потенциометра Р41 совме- стно с внутренним резистором на 10 Q может быть установлено опорное напряже- те на уровне 2,048 В (см. рис. 3.12). Согласно уравнению (2.1), результатом аналого-цифрового преобразования яв- [яется числовое значение Z: и U V -V Z = 212----= 4096---------— = 2048 • ----=^- 2-7 2-V V Младшему разряду (LSB) соответствует числовое значение Z = 1, таким обра- ом для выбранного опорного напряжения Vref = 2,048 В: 1 LSB = (2 Vref) / 212 = (2 • 2,048 В) / 4096 = 1 мВ. Наибольшее преобразуемое напряжение UEmax для значения Zmax = 212 - 1 = 4095 оставляет: 212 -1 4095 t/£max = —гг- • 2 • 2,048В =---4,096В = 4,095В 22 4096 Таким образом, входное напряжение Uin = V+щ - V-щ может находиться в диа- азоне 0 < Цп < (2 • Vref - 1 LSB). Микроконтроллер AT90S2313 считывает установленное с помощью потенцио- етра Р51 тестовое напряжение через АЦП ADS7818 и выдает результат аналого- ифрового преобразования через интерфейс RS232 в программу HyperTerminal на [К, а также на светодиодный дисплей через “однопроводный интерфейс”, описан- ый в разделе 2.2. Выдача сигнала ClockData, объединяющего в одной линии такт и анные, осуществляется через вывод 7 порта В, подключенный к разъему Х21 (см. ис. 3.22). Тестовая программа управления ADS7818 и выдачи результата аналого-цифрового преобразования Чк Файл К3_2 ADC 7818. asm можно также найти на прилагаемом к книге компакт-диске в папке Program. Текст программы К3_2 ADC 7 818. asm представлен в листинге 3.2.
100 Измерение напряжения с помощью микроконтроллеров AVR Листинг 3.2. Программа управления микросхемой ADS7818 К3_2 ADC 7818.asm ;**** Программный интерфейс SPI для подключения микросхемы ADS7818 ***** f * ;* Версия: 1.0 ;* Целевое устройство: AT90S2313 /* Частота системной синхронизации: 10 МГц ;* Описание: Интерфейс SPI реализуется программно для подключения АЦП ;* ADS7818. Результат выдается через один вывод на светодиодный ;* дисплей и дополнительно, для контроля, - на ПК через UART. . ****************************-*************************************** Г .nolist .include "С:\Programme\Atmel\AVR Tools\AvrAssembler\Appnotes\2313def.inc" . list .equ TxD = PD1 ;Выход передатчика - вывод 1 порта D .equ Bd48 = 129 ;UBRR для 4800 бод при 10 МГц ;UBRR = (fSys / 16*Baud) - 1 .equ ClkD = PB7 ;Вывод 7 порта В - выход для сигнала "такт+данные" .equ Time = 195 ;Делитель=64, fSys=10Mru -> Прерывание каждые 1,25 мс .equ Daur = 250 .•Длительность задержки 312 мс .equ Ablf = 0 ;Разряд 0 в регистре флагов указывает на ; завершение задержки .equ PSPI = PortD ;Порт ввода-вывода для SPI .equ DSPI = DDRD ;Регистр направления передачи данных через ; порт ввода-вывода SPI .equ PinSPI = PinD .•Входные выводы порта SPI .equ CLK = PD3 /SCK = вывод 3 порта D .equ DATA = PD4 ;MISO = вывод 4 порта D .equ CONV = PD5 ;/SS = вывод 5 порт D .equ KO = ObOOOOlOOO ;Катод 0 - разряд 3 выходного байта .equ KI = ОЬОООООЮО ;Катод 1 - разряд 2 выходного байта .equ K2 = ОЬООООООЮ ; Катод 2 - разряд 1 выходного байта .equ КЗ = 0Ь00000001 ;Катод 3 - разряд 0 выходного байта .equ К 4 = ОЬЮОООООО ; Катод 4 - разряд 7 выходного байта .equ K5 = ОЬОЮООООО ;Катод 5 - разряд 6 выходного байта .equ K6 = ОЬООЮОООО ;Катод 6 - разряд 5 выходного байта .equ K7 = ObOOOlOOOO ; Катод 7 - разряд 4 выходного байта .equ a = 2 ;Сегмент А - разряд 2 выходного байта . equ b = 1 ;Сегмент В - разряд 1 выходного байта . equ c = 4 /Сегмент С - разряд 4 выходного байта .equ d = 6 /Сегмент D - разряд 6 выходного байта . equ e = 5 /Сегмент Е - разряд 5 выходного байта . equ f = 0 /Сегмент F - разряд 0 выходного байта . equ g = 3 /Сегмент G - разряд 3 выходного байта .equ dp = 7 /Сегмент DP - разряд 7 выходного байта .def Save = гЮ /Буфер для хранения SREG при прерывании .def Verz = rll /Счетчик для времени задержки .def RefO = Г12 /Младший байт (сегменты) для регенерации дисплея .def Refl = г13 /Старший байт (катоды) для регенерации дисплея .def spiO = г14 /Младший байт для SPI .def spil = г15 /Старший байт для SPI .def tO = Г16 /Рабочий регистр .def tl = г17 /Рабочий регистр .def t2 = г18 /Рабочий регистр .def Flag = г19 /Регистр флагов
3.2. Подключение микросхемы АЦП ADS7818 с разрешением 12 разрядов и интерфейсом SP) 101 Листинг 3.2. Продолжение .def ADO = r20 /Младший байт результата АЦ-преобразования .def ADI = r21 /Старший байт результата АЦ-преобразования .def Rem = r22 /Остаток от деления .def DPtr = r23 /Указатель на цифру дисплея .def iO = r24 /Временный рабочий регистр прерывания .def il = r25 /Временный рабочий регистр прерывания Код . CSEG leset: rjmp Initial . org OVFOaddr display: ЬП Save,SREG )ush zl >ush zh .di il,-Time )Ut TCNTO,il .di zl,Low(Kath<<l) .di zh, High (Kath«l) :lr il idd zl,DPtr ide zh, il .pm IOV Refl,rO di zl, Low(DO) di zh,High (DO) .dd zl,Dptr d RefO,z nc DPtr ndi DPtr,$07 di iO, 16 Flanke: bi PortB,ClkD si RefO ol Re fl rcc LowLang ighLang: op OP op op op op op op op op Di PortB,ClkD Ls3: dc i0 /Адрес вектора прерывания при переполнении Т/СО /Регенерация дисплея при переполнении Т/СО /Сохраняем регистр состояния /Сохраняем указатель Z, поскольку он также / используется в главной программе /Время до следующего прерывания /Загружаем счетчик ТС1 /Загружаем в указатель Z / адрес таблицы катодов * 2 /Прибавляем к указателю Z текущее состояние / указателья дисплея /Битовая комбинация для катодов - в г0 /Загружаем битовую комбинация для катодов в Refl /Загружаем в указатель Z / адес буфера SRAM /Прибавляем указатель дисплея /Загружаем соответствующую цифру в RefO /Увеличиваем указатель дисплея /Очищаем разряды 3..7 /Устанавливаем счетчик на выводимые биты /Формируем нарастающий фронт сигнала "такт+данные" г /Сдвигаем влево младший байт /Сдвигаем влево старший байт /Переход, если флаг С=0, т.е. более длительная / часть сигнала с низким уровнем /В противном случае, более длительная / часть сигнала с высоким уровнем /Команды пор - для удлинения импульса /Формируем ниспадающий фронт сигнала "такт+данные" ;Все биты выведены?
102 Измерение напряжения с помощью микроконтроллеров AVR Листинг 3.2. Продолжение brne H Flanke /Переход, если нет dec Verz /Уменьшаем счетчик задержки brne Exitlnt /Переход, если не равно нулю Idi il,Daur ;Загружаем mov Verz,il ; длительность задержки sbr Flag, l«Ablf /Флаг указывает на завершение задержки Exitlnt: POP zh pop zl /Восстанавливаем указатель Z out SREG,Save /Восстанавливаем регистр состояния reti LowLang: /Более длительная часть с низким уровнем cbi PortB,ClkD /Формируем ниспадающий фронт сигнала "такт+данные" nop nop nop nop /Команды пор - для удлинения импульса nop nop nop rjmp Dis3 Initial: ,-СРНА = 0, CPOL = 0 Idi tl,low(RAMEND) out SPL,tl /Инициализируем указатель стека InitPorts: Idi tl, l«Conv out PortD, tl /CONV = 1, Rest = 0 Idi tl, (l«TxD) | (1«CLK) | (l«Conv) out DDRD,tl /Конфигурируем направление передачи для порта D Idi tl, l«ClkD out DDRB,tl /Конфигурируем направление передачи для порта В InitUSART: Idi tl,Bd48 /Скорость передачи = 4800 out UBRR,tl /Устанавливаем скорость передачи /Разрешаем использовать приемник и передатчик Idi tl, (1«RXEN) | (1«TXEN) out UCR, tl InitTCO: Idi tl,-Time /Отрицательное значение, поскольку Т/СО - ; суммирующий счетчик out TCNTO,tl /Загружаем счетчик Idi tl,$03 /Коэффициент деления частоты = 64 out TCCRO,tl /Инициализируем регистр управления Т/СО Idi tl, KCTOIEO /Разрешаем прерывание при переполнении Т/СО out TIMSK,tl sei /Общее разрешение прерываний Haupt: Idi tl,$08 ;Сохраняем код 7 сегментов для дефиса Sts D4,tl / в неиспользуемых Sts D5,tl / разрядах дисплея Sts D6, tl Idi tl,$01 /Сохраняем код 7 сегментов первого светодиода sts D7, tl / дисплея clr DPtr /Очищаем указатель дисплея HP1:
3.2. Подключение микросхемы АЦП ADS7818 с разрешением 12 разрядов и интерфейсом SPI 103 Листинг 3.2. Продолжение rcall Read_SPI /Считываем 12-тиразрядный результат в AD1:ADO rcall CalcResult /Результат как 4 BCD-числа - в буфер SRAM rcall SendResult /Результат в ASCII-коде передаем на ПК rcall Code_4 /Преобразуем 4 разряда результата в код 7 сегментов Wait_Ablauf: sbrs Flag,Ablf /Пропускаем следующую команду, если задержка истекла rjmp Wait_Ablauf /Ожидаем появления флага Ablf cbr Flag,l«Ablf /Сбрасываем флаг Ablf rjmp НР1 /Следующее значение /**** Подпрограммы Read_SPI: /Считывание 14 бит через SPI ldi tl,14 /Инициализируем счетчик битов cbi PSPI,CONV /На выводе CONV микросхемы ADS7818 - лог. 0 SPI_Loop: sbi PSPI,CLK /Выдаем нарастающий фронт CLK Isl AD0 /Сдвигаем влево младший байт, D0 = лог. 0, D7 -> С rol AD1 /Сдвигаем влево старший байт, С -> D8, D15 -> С sbic PinSPI,DATA /Пропускаем следующую команду, если бит данных = лог.О inc ADO /Поскольку D0=0 (из-за Isl), устанавливаем DO = 1 cbi PSPI,CLK /Выдаем нспадающий фронт CLK dec tl /Счетчик битов - 1 brne SPI_Loop /Следующий бит, если счетчик битов не равен 0 sbi PortD,CONV /CONV - неактивен (лог. 1) sbr AD1,$FO /Очищаем старший полубайт результата ret CalcResult: /Преобразование результата в BCD-число Ldi zl,low(DigO+1) /Младший байт адреса, следующего после DigO Ldi zh,high(DigO+1) /Старший байт адреса, следующего после DigO lexBCDAscii: /Нех[З..О] ->BCD[3..O] ->ASC[3..O] Ldi tl,4 /Счетчик для 4 цифр десятичного числа 1ВА1: :call DivlO /adl:ad0 / 10, BCD-цифра - в Rem 5t -z,Rem /Сохраняем ASCII-цифру iec tl /Уменьшаем счетчик на 1 )rne НВА1 /Переход, если не равно 0 set SendByte: /Передача символа на ПК ibis USR, UDRE rjmp SendByte /Ожидаем освобождения буфера передачи >ut UDR,tO /Передаем символ ret SendResult: /Передача результата на ПК .di yl,Low(Dig3) /Загружаем в указатель Y di yh,High(Dig3) / адрес начала BCD-буфера di t2,4 /Счетчик для 4 цифр R1: d tO,y+ /BCD-цифра - в tO ubi t0,-$30 /Прибавляем ASCII-смещение к цифрам 0..9 call Sendbyte /Передаем цифру на ПК ес t2 rne SRI di tO,13 /Передаем на ПК
104 Измерение напряжения с помощью микроконтроллеров AVR Листинг 3.2. Продолжение rcall Sendbyte ; символ возврата каретки Idi to,10 ;Передаем на ПК rcall Sendbyte ; символ новой строки ret Code 4: Idi yl, Low(Dig3) ;Загружаем в указатель Y Idi yh,High(Dig3) ; адрес начала BCD-буфера C4 1: Id tO,y+ ;BCD-цифра - в tO rcall Get 7 Segm ;В г0 - код 7 сегментов std y+(D0-Dig3-l) , rO /Записываем код 7 сегментов для цифры cpi yl,D0 /Указатель Y указывает на D0? brne C4 1 /Переход, если нет Ids tl,D0 /Первая цифра - в tl sbr tl,l<<dp /Устанавливаем десятичную точку sts DO, tl /Записываем обратно ret Get 7 Segm: Idi zl,Low(Segm<<l) /Загружаем в указатель Z Idi zh, High (Segm« 1) / адрес начала таблицы кодов 7 сегментов clr rO add zl, tO /Добавляем BCD-цифру как adc zh, rO ; смещение к адресу начала таблицы 1pm /Код 7 сегментов - в г0 ret DivlO: /Деление adl:ad0 на 10, /результат - в adl:ad0, остаток - в Rem clr Rem /Остаток = 0 Idi tO, 16 /Счетчик для 16 разрядов adwH:adwL LooplO: Isl adO ;Сдвигаем делимое на 1 разряд влево rol adl rol Rem /Переполнение - в Rem subi Rem,10 /Переполнение в Rem >= 10 ? brio HB1 /Переход, если нет inc adO /Сдвигаем лог. 1 в младший разряд rjmp HB2 HB1: subi Rem,-10 /Отменяем вычитание HB2: dec to /Декрементируем счетчик битов brne LooplO /Переход, если еще не все биты ret /Таблицы кодировки Kath: .db KO,KI,K2,КЗ, К4,К5,К6,К7 /Порядок следования катодов Segm: ;Таблица преобразования в код 7 сегментов ;Порядок следования: dp-d-e-c-g-a-b-f 9 а г 9 fl lb
3.2. Подключение микросхемы АЦП ADS7818 с разрешением 12 разрядов и интерфейсом SPI 105 Листинг 3.2. Окончание / f г 1 е | g 1 1 с f г г 1 dp о d 1 о dp (альтернативно) Z0_l: .db 1«а | l«b 11«с | l«d| 1<<е | l«f, l«b|l«c Z2_3: .db 1<<а | l«b | l<<d | l«e | l<<g, l<<a | l«b | l«c | l<<d | l«g Z4_5: .db l«b | l«c | l«f | l«g, l«a 11<<с | l«d | l«f | l«g Z6_7: .db l«a | l«c | l«d | l«e | l«f | l«g, K<a|l«b|l«c Z8_9: .db l«a | l«b | l«c I l«dI l«e | l«f 11<<д, l«a 11<<Ь 11<<с | l«d I l<<f I l<<g ZA_B: .db l«a | l«b | l«c | l«e | l<<f | l«g, l«c | l«d | l<<e | l«f | l«g ZC_D: .db l«a | l«d| l«e | l«f, l«b | l«c | l«d| l«e | l<<g ZE_F: .db l«a | l«d| 1<<е | l«f | l«g, l«a | l«e | l«f I !<<g . dseg .org $60 Dig3: Dig2: .Byte 1 .Byte 1 ;BCD-число 3 ;BCD-число 2 Digl: .Byte 1 ;BCD-число 1 DigO: .Byte 1 ;BCD-число 0 DO: .Byte 1 ;Сегменты цифры DO DI: .Byte 1 ;Сегменты цифры Dl D2 : .Byte 1 ;Сегменты цифры D2 D3: .Byte 1 ;Сегменты цифры D3 D4 : .Byte 1 ;Сегменты цифры D4 D5: .Byte 1 ;Сегменты цифры D5 D6: .Byte 1 ;Сегменты цифры D6 D7: .Byte 1 /Сегменты отдельных светодиодов D7 Описание программы Часть инициализации После установки указателя стека выводы PD1, PD3 и PD5 (сигналы TxD, CLK и CONV) порта D, а также вывод РВ7 порта В (сигнал ClkD в качестве общего выхода для данных и тактовых сигналов для дисплея) конфигурируются как выходы. Поскольку линия управления CONV в данном случае считается активной при низком уровне сигнала, она вначале переводится в состояние лог. 1. Аналогично описанной в разделе 2.3 тестовой программе для UART, с помо- щью регистра управления UBRR выполняется установка скорости передачи данных, а также с помощью регистра управления UCR разрешается использование приемни- ка и передатчика. Таймер Т/СО обеспечивает синхронизацию для регулярной (каждые 1,25 мс) ре- генерации мультиплексной индикации (см. раздел 2.2). Делитель частоты устанав- ливается равным 64, что необходимо для тактирования Т/СО с частотой fsvs/64 = = 10 МГц / 64 = 156,25 кГц. Поскольку таймер/счетчик считает только в сторону увеличения, в его счетный регистр загружается отрицательное значение Time, т.е. -195, что необходимо для обеспечения переполнения после 195 / 156,25 кГц = = 1,248 мс. Для того чтобы разрешить прерывание при переполнении Т/СО, необхо- димо установить разряд TOIEO в регистре TIMSK. При этом при переходе счетчика
106 Измерение напряжения с помощью микроконтроллеров AVR из состояния $FF в $00 выполняется соответствующая подпрограмма обработки прерывания, в которой в счетный регистр загружается значение -195. Таким обра- зом подпрограмма выполняется каждые 1,25 мс. После общего разрешения преры- ваний выполняется основная программа. Основная программа Четырехзначный результат 0000...4095 (соответственно устанавливаемому по- тенциометром Р51 входному напряжению 0...4,095 В) аналого-цифрового преобра- зования выводится на левый дисплей схемы, описанной в разделе 2.2. Поэтому в на- чале основной программы для трех позиций правой половины индикатора в соот- ветствующие ячейки памяти SRAM заносятся три дефиса. Кроме того, во время вы- полнения программы должен гореть светодиод LED1, поскольку в памяти SRAM сохранен код семи сегментов для разряда D7. Указатель дисплея, поочередно указывающий на требующие регенерации раз- ряды индикатора, в начале устанавливается в 0, что означает запуск процесса с ин- дикатора D0. Через АЦП ADS7818 с помощью подпрограммы Read_SPl непрерывно считы- ваются значения — 12-тиразрядные шестнадцатеричные числа, которые затем пре- образуются подпрограммой CalcResult в четыре BCD-числа 0000.. .4095d, сохра- няемые в буфере SRAM. Подпрограмма SendResult передает эти четыре числа в ASCII-коде на ПК, а подпрограмма Code_4 преобразует их в код семи сегментов и сохраняет в памяти SRAM в четырех ячейках, соответствующих левой половине дисплея D0...D3. При каждом вызове подпрограммы обработки прерывания от Т/СО счетчик Verz уменьшается на 1. После того как его значение после 250 циклов достигнет 0, Verz вновь будет присвоено 250, а также будет установлен флаг Ablf, сигнализи- рующий об истечении времени задержки tv = 250 • 1,25 мс = 312 мс. После завершения цикла основная программа ожидает установки метки Ablf, прежде чем будет запущен новый цикл. Таким образом, каждую секунду поступает три измеряемых величины — частота, которая еще воспринимается человеческим глазом без мерцания. Подпрограмма обработки прерывания Display Подпрограмма обработки прерывания от Т/СО обеспечивает мультиплексный режим работы светодиодного дисплея и контроль за временем задержки до поступ- ления следующей измеряемой величины. Эта подпрограмма практически идентична подпрограмме Display, описанной в разделе 2.2, поэтому повторно рассматривать ее мы не будем. Подпрограмма Read_SPl Подпрограмма ResdSPl реализует интерфейс SPI в соответствии с диаграм- мой, представленной на рис. 3.18, и схемой последовательности операций, пред- ставленной на рис. 3.20. 12-тиразрядное шестнадцатеричное число передается ана- лого-цифровым преобразователем ADS7818 в регистровую пару ADI: ADO. Подпрограмма CalcResult 12-тиразрядное шестнадцатеричное число, переданное ADS7818 в регистровую пару ADI: ADO, с помощью деления на 10 преобразуется в четыре десятичных числа, которые последовательно сохраняются в ячейках памяти D3...D0.
3.2. Подключение микросхемы АЦП ADS7818 с разрешением 12 разрядов и интерфейсом SPI 107 Подпрограмма SendByte Подпрограмма SendByte посылает символ в программу HyperTerminal. Она ожидает освобождения буфера передачи USART и начинает передачу, записывая хранимый в tO символ в регистр данных UDR. Подпрограмма SendResult Подпрограмма SendResult передает через последовательный интерфейс деся- тичные цифры, сохраненные в ячейках памяти D3...D0 памяти SRAM, после сложе- ния с ЗОь = ’О' для преобразования BCD- цифр в соответствующие им ASCII- символы, а также символы возврата каретки и перевода строки. Поскольку микроконтроллеры AVR не имеют прямой команды сложения кон- станты с содержимым регистра, эта операция заменяется вычитанием отрицатель- ной константы. Подпрограмма Code_4 Подпрограмма Code_4 определяет коды семи сегментов, соответствующие че- тырем десятичным значениям и сохраняет их в памяти SRAM в ячейках от D0 (старшая цифра) до D3 (младшая цифра). Кроме того, происходит индикация деся- тичной точки в наибольшем разряде. Подпрограмма Get_7_Segm Код семи сегментов для каждого шестнадцатеричного числа 0...F хранится во флэш-памяти в таблице Segm. Поскольку каждая ячейка флэш-памяти занимает 16 бит, по одному адресу всегда хранятся два числа (сначала младший байт). Какой из байтов текущей ячейки памяти будет считан, определяет младший разряд указателя Z. Подпрограмма Get_7_Segment выдает код семи сегментов для одного из шест- надцатеричных чисел 0...F, записанных в регистр tO. При этом tO прибавляется к начальному адресу таблицы Segm, а соответствующий код семи сегментов с по- мощью команды 1pm загружается в регистр г0. Подпрограмма Divio Деление реализовано путем последовательных операций вычитания и сдвига. Выводы Благодаря микросхеме ADS7818 в сочетании с микроконтроллером AVR, ста- новится возможным достичь высокой скорости обработки данных при считывании аналоговых величин с разрешением 12 разрядов! Если же микроконтроллер AVR работает на тактовой частоте fsys =16 МГц, а данные преобразователя ADS7818 записываются в память через аппаратный интер- фейс SPI с максимальной тактовой частотой 0,5 • fsys = 8 МГц (разряд SPI2X в реги- стре управления SPSR содержит лог. 1) в два этапа по восемь бит каждый (см. рис. 3.19), то всего на передачу 16 бит уходит чуть больше 2 мкс (для записи ре- зультата поступают еще некоторые команды). Это значение тождественно частоте дискретизации (почти) 500 кГц, чего более чем достаточно для большинства задач, связанных с измерениями.
108 Измерение напряжения с помощью микроконтроллеров AVR 3.3. Тестовая плата для микроконтроллера AT90S2313 и микросхемы АЦП ADS7818 Тестовая плата имеет европейский формат 100 х 160 мм и предназначена для проверки прикладных программ, описанных в разделах 2.2, 2.3 и 3.2. Схемы соеди- нений платы представлены на рис. 3.22-3.26. Рис. 3.22. Тестовая плата для подключения микросхемы ADS7818. Схема соединений 1: контроллер На рис. 3.22 показан монтаж микроконтроллера AT90S2313 на тестовой плате. Тактовый сигнал и сигнал сброса формируются по схеме, типичной для всех микро- контроллеров AVR (см. книгу Вольфганга Трамперта “AVR-RISC микроконтролле- ры”). Поскольку плата имеет дополнительную тестовую схему (будет подробно описана в следующей книге из серии “Измерение, управление и регулирование с помощью микроконтроллеров AVR”), используются четыре перемычки для конфи- гурирования программной среды тестирования. Перемычки J21-1, J21-2, J21-3 (см. рис. 3.22) перед началом теста должны быть замкнуты. Перемычка J11 (INH) (см. рис. 3.26) должна оставаться разомкнутой. Элементы схемы, которые при указанной конфигурации перемычек в рассматри- ваемых тестах не используются, значения не имеют. Порты ввода-вывода микро- контроллера AT90S2313, к которым они подключены, используются как входы в высокоомном состоянии. Часть схемы, отвечающая за управление преобразователем ADS7818, подробно рассмотрена в разделе 3.2. Входное напряжение UE, используемое для тестирования АЦП, формируется потенциометром Р51 (см. рис. 3.25). Для бесперебойной работы
3.3. Тестовая плата для микроконтроллера AT90S2313 и микросхемы АЦП ADS7818 109 схемы необходимо надежно отделить аналоговую “землю” AGND от цифровой GND, а также аналоговое напряжение питания V4- от цифрового Vcc- Рис. 3.23. Тестовая плата для подключения микросхемы ADS7818. Схема соединений 2: АЦП
110 Измерение напряжения с помощью микроконтроллеров AVR Рис. 3.24. Тестовая плата для подключения микросхемы ADS7818. Схема соединений 3: интерфейс RS232 Простой последовательный интерфейс, представленный на рисунке 3.24, как правило, может применяться на небольших расстояниях (до 3 м), хотя при этом и не выполняются требования RS232 относительно уровней напряжения (см. рис. 2.22), поскольку большинство RS323-cxeM принимающих устройств интерпретируют вхо- дящее напряжение выше +2 В как низкий уровень, а менее +2 В — как высокий. Линия передачи TxD ПК (вывод 3 SUBD-гнезда Х31) соединена с базой транзи- стора Т31 через резистор R31, что необходимо для ограничения тока через базу. Ес- ли в линии TxD ПК установлен низкий уровень сигнала, что соответствует напря- жению выше +3 В (см. рис. 2.22), потенциал коллектора Т31 приближается к 0, и на входе RxD микроконтроллера AVR появляется лог. 0. Если же в линии TxD ПК ус- тановлен высокий уровень сигнала, то эта линия получает потенциал около -12 В. В этом случае диод D31 ограничивает напряжение между базой и эмиттером ТЗ1 на значении примерно -0,7 В, транзистор ТЗ 1 блокируется, а на вход RxD микрокон- троллера AVR через R32 выдается лог. 1. Если же микроконтроллер передает данные через последовательный интерфейс, то Т32 функционирует как простой транзистор-инвертер, выдающий лог.1 микро- контроллера AVR как потенциал “земли”, а лог. 0 как уровень Vcc для линии прие- ма RxD ПК (вывод 2 SUBD-гнезда Х31). VKaK видно из рис. 3.24, линия приема ПК соединена с линией передачи микрокон- троллера непосредственно в схеме. Аналогичным образом линия передачи ПК со- единена с линией приема микроконтроллера. По этой причине в рассматриваемых примерах для передачи не допускается применять так называемый “нуль- модемный” кабель, в котором линии RxD и TxD перекрещиваются. В схемах, состоящих, подобно данной тестовой плате, из аналоговой и цифро- вой частей, необходимо обращать особое внимание на надежное разделение линий “земли” и подачи питания согласно правилам, проиллюстрированным на рис. 3.8 и рис. 3.9. Кроме того, конденсаторы в интегральных схемах необходимо включать по возможности ближе к выводам питания, как это показано на рис .3.25. Напряжение питания Vх аналоговой части формируется из напряжения питания цифровой части Vcc- Их оптимальная развязка обеспечивается с помощью фильтра нижних частот, состоящего из элементов L51 и С54.
3.3. Тестовая плата для микроконтроллера AT90S2313 и микросхемы АЦП ADS7818 111 IC12P ш V+ С53 AGND ЮОп GND GND GND.1 GNDJ2 0 0 AGND1 AGND2 0 ф AGND AGND AGND AGND Рис. 3.25. Тестовая плата для подключения микросхемы ADS7818. Схема соединений 4: подача питания Части схемы, изображенные на рис. 3.26, в рассматриваемых примерах не ис- пользуются. Их практическое применение — тема следующая книга из серии “Из- мерение, управление и регулирование с помощью микроконтроллеров AVR”. ХО X Х1 Х2 ХЗ Х4 Х5 Х6 Х7 INH А В С з |-----1_ J 100k R15 P12 150k AGND GNDJN V+ «3--- UZZ [cZZ VOFS UIN_2 UIN_3 UIN_4 UIN_1 IC12 4051N C14 UC R16 —I I--1 Comp > 220k 220n Рис. 3.26. Тестовая плата для подключения микросхемы ADS7818. Схема соединений 5: дополнительные компоненты для будущих задач, связанных с измерениями На рис. 3.27 показан общий вид платы со всеми схемными компонентами и на- весными перемычками верхней и нижней стороны, а также размещением печатных проводников. Фотография опытного образца платы показана на рис. 3.28.
112 Измерение напряжения с помощью микроконтроллеров AVR Рис. 3.27. Общий вид печатной платы 1Л16 a-ans
3.3. Тестовая плата для микроконтроллера AT90S2313 и микросхемы АЦП ADS7818 113 Рис. 3.28. Фотография опытного образца тестовой платы Монтажная схема платы со всеми компонентами и навесными перемычками представлена на рис. 3.29 (вид сверху). Разводка платы показана на рис. 3.30 (вид снизу, со стороны печатных проводников), а фотография ее нижней стороны — на рис. 3.31.
114 Измерение напряжения с помощью микроконтроллеров AVR I/Мб a-ans Рис. 3.29. Монтажная схема платы с указанием размещения компонентов и навесных перемычек
3.3. Тестовая плата для микроконтроллера AT90S2313 и микросхемы АЦП ADS7818 115 Рис. 3.31. Фотография нижней стороны платы
ГЛАВА 4 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR 4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции Принцип цифро-аналогового преобразования с помощью ШИМ-сигнала Существует способ преобразования имеющихся значений в аналоговые напря- жения, не требующий больших затрат. Он заключается в изменении пропорцио- нально цифровому значению коэффициента заполнения импульсов прямоугольного напряжения, следующих с постоянной частотой Гщим = 1/ТШим (рис. 4J). Рис. 4.1. Прямоугольные импульсы с переменным коэффициентом заполнения Коэффициент заполнения g определяется как отношение длительности импуль- сов к длительности промежутков между ними: g = th/T. (4.1) Амплитудный спектр прямоугольных импульсов Анализ Фурье сигнала, состоящего из периодических прямоугольных импуль- сов (см. рис. 4.1), показывает, что этот сигнал может быть представлен как сумма участка постоянного напряжения А() и отдельных косинус-колебаний An cos (п • cot) с различными периодами и амплитудами.
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 117 2U th со- — -^+- 2 th sin со • — sin со • 2 — - cos cot + th 2 —-COs2<j9/ + 1 2 л sin369 t, л • — sm 4со th + 3 —— • cos 3cot + 4 2 •cos 4cot +... (4.2) Косинус-сигнал с большим периодом, т.е. A] cos (cot), обозначается при этом как основное колебание или первая гармоника. Остальные косинус-составляющие обо- значаются как высшие гармоники или второе, третье, четвертое и т.д. гармониче- ские колебания. Ряд Фурье представляет собой также гармонический ряд колебаний, в котором частоты высших колебаний являются целыми кратными основной гармоники. В примере, изображенном на рис. 4.1, th = Т/4. Если подставить это значение в (4.2), то получим: 2U 2л Т . 2л Т -------sin--------- Т 8 ! Т 8 2 1 • COS COt + 2л 7Л Г 8J •COS469/ +... U 2U U{t} ~ 4 + 77 4 Л sm — ___4 1 sm — 2U э • cos cot -l---— • cos 2cot + л 2 . Зя sm— 2U 4 л 3 „ 2U sin л cos 3cot +----------cos 4cot +... л 4 u(t) = — + 0,45-t/ • coscot + 0,32 U cos2<y/ + 0,15f/-cos369Z+0-U -cos4<y/ + ... Таким образом, сигнал, представленный на рис. 4.1, может быть разложен на составляющую постоянного напряжения А() = 0/4,. на которую накладываются со- ставляющие переменного напряжения с амплитудами Ai = 0,45 U; А2 = 0,32 • U; A3 = 0,15U... На рис. 4.2 изображен амплитудный спектр напряжения, показанного на рис. 4.1. Составляющая постоянного напряжения А() и амплитуды Ап гармоник от- кладываются в зависимости от частоты. Сложив составляющую постоянного напряжения А() и найденную гармонику, можно воссоздать исходный сигнал напряжения. Частичная реконструкция до третьей гармоники включительно представлена на рис. 4.3. С каждой последующей гармоникой суммарный сигнал (рис. 4.3) еще больше приближается к оригинальной форме, продемонстрированной на рис. 4.1.
118 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Рис. 4.3. Реконструкция сигнала, представленного на рис. 4.1, из составляющей постоянного напряжения До, основной гармоники соо, и двух высших гармоник сщ и о)2 Если отфильтровать составляющую переменного напряжения из составного сигнала, показанного на рис. 4.2, то в идеальном случае остается составляющая по- стоянного напряжения А(), обозначенная на рис. 4.4 линией ТР1. Под ТР1 подразумевается активный фильтр нижних частот Баттерворта четвер- того порядка с граничной частотой fg = 0,25 • fb, где fo — частота первой гармоники. Уменьшение усиления ТР1 составляет 80 дБ на десятичный разряд, т.е. при увели- чении частоты в 10 раз выходная амплитуда составляет всего лишь около одной де- сятитысячной доли входной амплитуды. Фильтр нижних частот ТР2 — это также активный фильтр Баттерворта с гра- ничной частотой fg = 0,25 • fo, но второго порядка. В данном случае усиление ампли- туды падает только на 40 дБ на десятичный разряд. Как видно из рис. 4.4, с помо- щью фильтра нижних частот ТР2 отфильтровать все гармонические составляющие не удается. Особенно при этом выделяются амплитуды высшей гармоники, которые выражаются в остаточной пульсации, наложенной на постоянное напряжение.
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 119 Рис. 4.4. Подавление составляющих переменного напряжения в составном сигнале с помощью фильтрации нижних частот Еще менее благоприятен случай с фильтром нижних частот ТРЗ, который также является активным фильтром Баттерворта второго порядка с граничной частотой всего fg = 0,5 • fo. Составляющие высших гармоник и вместе с ними наложение оста- точной пульсации еще выше чем в ТР2. Из рис. 4.4 также видно, что фильтрация прямоугольных импульсов простым пассивным RC-фильтром нижних частот (см. рис. 4.7) приемлема только в тех слу- аях, когда предъявляются невысокие требования к остаточной пульсации и к точ- ности результата. Затухание составляет здесь всего около 20 дБ на десятичный раз- ряд, т.е. при десятикратном увеличении частоты оно возрастает на коэффициент 10. Понятно, что при использовании фильтра нижних частот с достаточно высокой крутизной фронта импульса и/или достаточно низкой граничной частотой можно добиться такого подавления гармоник, что точность сигнала постоянного напряже- ния будет достаточно высокой. Может создаться впечатление, что для оптимального гашения гармоник доста- очно произвольно уменьшить граничную частоту фильтра низших частот. При этом необходимо принимать во внимание, что время установления выходного на- пряжения фильтра зависит от нового уровня постоянного напряжения, полученного после изменения предыдущего значения граничной частоты. На рис. 4.5 показана переходная характеристика фильтра Баттерворта четвертого порядка, из которой можно определить время запаздывания tv и длительность фронта ta. Время запазды- вания tv — это время, в течение которого выходное напряжение возрастает до 50% своего конечного значения. Длительность фронта ta — это время, в течение которо- го происходит возрастание выходного напряжения с 10% до 90% его конечного зна- чения. Для фильтра Баттерфорта второго порядка ta = 0,342 Tg и tv = 0,228 Tg, причем время обратного значения граничной частоты Tg = l/fg нормировано. В данном слу- чае выброс для такого фильтра составляет 4,3%. Для фильтра Баттерворта четверто- го порядка ta = 0,387 Tg и tv = 0,449 Tg. Выброс составляет 10,8%.
120 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR иа Рис. 4.5. Примерная переходная характеристика фильтра Баттерворта четвертого порядка Если кроме времени задержки tv и длительности фронта ta принимать также во внимание переходный процесс до достижения установившегося предела, время ус- тановления выходного напряжения после скачка входного напряжения достигает значения около 3 Tg. В табл. 4.1 указаны значения задержки и длительности фронта для фильтра Баттерворта второго порядка для различных граничных частот. Как ви- дим, здесь достигаются значения, как правило, приемлемые для задач управления. При определенных обстоятельствах можно обойтись фильтрами нижних частот бо- лее высоких порядков, в которых благодаря амплитудно-частотной характеристике с крутым фронтом возможны более высокие граничные частоты. На практике же приходится находить компромисс между желаемым разрешени- ем АЦП с ШИМ и, следовательно, частотой ШИМ и граничной частотой фильтра нижних частот и, следовательно, скоростью изменения и временем установления нового выходного значения. Среднее арифметическое выходного напряжения Сигнал постоянного напряжения после прохождения фильтра нижних частот представляет собой среднее арифметическое. Не все генераторы прямоугольных импульсов способны создать сигнал, изображенный на рис. 4.1. Чаще всего выход- ной сигнал приближается к сигналу, представленному на рис. 4.6. Рис. 4.6. Среднее арифметическое 11м импульсного сигнала в зависимости от коэффициента заполнения д
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 121 В идеальном случае UL = О В, как показано на рис. 4.1. Если же выходной кас- кад генератора прямоугольных импульсов не может обеспечить О В вследствие на- пряжения насыщения транзистора оконечного каскада или же сопротивления канала МОП-транзистора оконечного каскада, то в этом случае наблюдается остаточное напряжение, не входящее в среднее значение Um- В данном случае для ЦАП с ШИМ невозможно получить выходное напряжение О В. Среднее арифметическое значение Um (см. рис. 4.6) определяется по уравнению Uu = +l =(uH-UL)-g + UL, (4.3) где коэффициент заполнения g = tH/T. Следовательно, UM, в отличие от UL, прямо пропорционально к ширине им- пульса tH ШИМ-сигнала. ШИМ-сигнал очень легко реализовать с помощью микро- контроллера AVR, благодаря чему можно получить простую и экономичную аль- тернативу интегрированному ЦАП, выдающему медленно изменяющиеся аналого- вые величины. Практическая реализация АЦП с ШИМ В простейшем случае для формирования аналогового выходного напряжения Um используется непосредственно выходной каскад порта микроконтроллера AVR с последующим RC-фильтром нижних частот (рис. 4.7). Простой RC-фильтр нижних частот, изображенный на рис. 4.7, как правило, недостаточно хорошо фильтрует амплитуды составляющих переменного напряже- ния, содержащихся в ШИМ-сигнале. При десятикратном увеличении частоты гаше- ние увеличивается всего лишь на коэффициент 10, т.е. на 20 дБ на десятичный раз- ряд. Этого, как показывает представленная на рис. 4.4 частотная характеристика усиления простого пассивного RC-фильтра нижних частот, обычно недостаточно для требуемой в большинстве случаев точности цифро-аналогового преобразования, поскольку накладывающаяся на постоянное напряжение остаточная пульсация должна быть ниже половины LSB. Еще одним недостатком простых RC-фильтров нижних частот является их зависимость от нагрузки, что обусловливает необходи- мость подключения буферного каскада, например, операционного усилителя, ис- пользуемого в качестве повторителя напряжения. Если выходной сигнал порта AVR (как показано на рис. 4.7) используется непо- средственно как входное напряжение фильтра нижних частот, то удается достичь очень незначительной точности цифро-аналогового преобразователя. Это обуслов- лено погрешностью и зависимостью цифрового выходного напряжения от нагрузки.
122 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR На выходе микроконтроллера AVR не удается достичь ни полного значения рабоче- го напряжения для высокого уровня Uh, ни значения О В для низкого уровня Ul. По- скольку выходное напряжение микроконтроллера AVR зависит от свойств материа- лов, температуры и нагрузки, его значение колеблется в достаточно широком диапа- зоне. Учитывая упомянутые выше ограничения, в представленной на рис. 4.8 схеме вместо простого RC-элемента следует использовать активный фильтр Баттерворта второго порядка. Кроме того, выходное ШИМ-напряжение иШим входного сигнала фильтра нижних частот переключается с помощью аналогового КМОП-ключа (на- пример, 74Н4053) между постоянным опорным напряжением и чистым сигналом “земли”. Рис. 4.8. Фильтр нижних частот второго порядка, предназначенный для обработки ШИМ-сигнала Усиление постоянного напряжения схемы фильтра нижних частот примерно равно Vo = -R2/R1. Оно имеет отрицательное значение, поскольку базируется на ин- вертирующей принципиальной схеме операционного усилителя. Для того чтобы по- лучить положительные значения ЦАП, КМОП-ключ переключается между значени- ем О В и отрицательным опорным напряжением. Операционный усилитель позволя- ет добиться независимости схемы от нагрузки. Внутренний резистор КМОП-ключа S соединен последовательно с резистором R1 и также участвует в усилении. Его номинал находится в пределах 60... 100 £1 При расчете параметров с относительно высокими показателями сопротивления резисторами R1 и R2 можно пренебречь. Для расчета параметров фильтра нижних частот следует задать номиналы кон- денсаторов С1 и С2 и рассчитать сопротивления R1 и R2 согласно следующим уравнениям: (4.4) (4.5) А 4л-242С,С2Л2 ’ При этом Vo является наиболее предпочтительным усилением постоянного на- пряжения фильтра (имеет отрицательное значение, поскольку базируется на инвер-
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 123 тирующей принципиальной схеме операционного усилителя), ai и а2 — коэффици- енты фильтра, значения которых можно найти по табл. 4.1. Таблица 4.1. Коэффициенты для фильтра Баттерворта второго порядка a1 Ь1 1,4142 1,0000 При выборе конденсаторов фильтра С1 и С2 необходимо соблюдать следующее соотношение: (4.7) 1 а\ Если же амплитудно-частотная характеристика фильтра второго порядка (см. рис. 4.8) не соответствует требованиям некоторого случая применения, следует вос- пользоваться фильтром четвертого или более высокого порядка. Это можно реали- зовать, подключив последовательно два или больше фильтра второго порядка. Для фильтра Баттерворта четвертого порядка с граничной частотой fg, получен- ного последовательным подключением двух фильтров ТРа и ТРь (см. рис. 4.8), кон- денсаторы С1а, С2а (или С1ь, С2ь) задаются согласно уравнению (4.7), а номиналы резисторов R1.. .За (ил R1.. .Зь) — согласно уравнениям (4.4) - (4.6). Коэффициенты для фильтров ТРа с граничной частотой fga или ТРь с граничной частотой fgb указаны в табл. 4.2. Таблица 4.2. Коэффициенты для фильтра Баттерворта четвертого порядка Й1х bix fgx Фильтр ТРа 1,8478 1,0000 0,719 fg Фильтр ТРь 0,7654 1,0000 1,390 fg Результирующая общая граничная частота fg для фильтра Баттерворта четверто- го порядка равна: fga • fgb = 0,719 fg • 1,390 fg = fg. Калибровка схемы Для упрощения схемы, изображенной на рис. 4.8, можно отказаться от компен- сации напряжения смещения операционного усилителя. Однако это не означает, что напряжением смещения усилителей можно просто пренебречь, поскольку его поря- док может находиться в пределах нескольких LSB. Выходом из положения может быть применение усилителей в отдельном корпусе, имеющих выводы для компен- сации напряжения смещения. Кроме того, интересную альтернативу представляет собой программная калибровка ЦАП. Поправка для нулевой точки и усиления зано- сятся в виде числовых значений во внутреннюю память EEPROM (см. главу 1), и программа перед выводом результата корректирует погрешность нулевой точки и усиления. Если же при компенсации отказаться от потенциометра и выполнить программ- ную калибровку согласно главе 1, то во время фазы низкого уровня tL ШИМ-сигна- ла можно вместо Ul = 0 В подать небольшое положительное напряжение смещения, выделяемое из положительного опорного напряжения с помощью резисторов R5 и Rb. В данном случае в схеме, изображенной на рис. 4.8, следует соединить точку А с точкой С вместо точки В. Делитель напряжения, состоящий из резисторов R5 и R/„
124 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR нагружается входным сопротивлением фильтра нижних частот. Соответственно, его параметры должны быть более низкоомными, чем для Rb Для tH = 0 (т.е. когда ключ S постоянно находится в положении “иШим - О” — см. рис. 4.8), выходное напряжение ua = Vo • (R$ / (R5 + R^)) • Uref+. Поскольку Vo в данном случае имеет отрицательное значение, появляется возможность использо- вать для коррекции смещения напряжения операционного усилителя небольшой от- рицательный резерв (продемонстрировано в главе 1). Пример расчета параметров фильтра нижних частот Рассмотрим расчет параметров на конкретном примере. Для расчета фильтра достаточно рассмотреть представленную на рис. 4.4 основную гармонику спектра, имеющую наибольшую из всех частичных колебаний амплитуду. Амплитуды выс- ших гармоник не только значительно меньше, но в большей степени зависят от ха- рактеристик фильтра нижних частот, что видно из рис. 4.4. Амплитуда Ai основной гармоники рассчитывается из уравнения (4.2): ~ sm&>- А, = ™--------- 1 Это выражение имеет максимальное значение для th = 0,5 Т. Для Aimax: д = ''Чтах 2U . 2тг Т 2U . 77 2U ----sin-----=----sin—=----- 77 Т А 77 2 77 = 0,64-(Л Эта амплитуда должна быть погашена фильтром нижних частот настолько, что- бы остаточная амплитуда Ai Rest была меньше 0,5 LSB. В табл. 4.3 и табл. 4.4 представлены результирующие характеристики фильтра Баттерворта второго и четвертого порядка при высоте импульса напряжения U = 5,12 В для различных разрешений ЦАП с ШИМ. Максимальная амплитуда Ai Rest основной гармоники на выходе фильтра ниж- них частот, которая должна быть меньше или равна половине LSB, составляет: где N — соответствующее разрешение преобразователя, в разрядах. Усиление переменного напряжения V фильтра нижних частот, необходимое для соблюдения условий подавления амплитуды Ai Rest основной гармоники, рассчиты- вается из уравнения: у_ ^0,5ZSB Ue Атах Временной интервал между двумя прерываниями от таймера обозначается как Tint. Результирующую частоту ШИМ 1шим для разрешения А разрядов можно рас- считать из уравнения: Г _ 1 ШИМ ~ ~N р 2 ' 1 Int (4.8)
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 125 Если ШИМ-сигнал формируется с помощью таймера/счетчика Т/Cl микрокон- троллера AVR, то возможно добиться более высокой частоты широтно-импульсной лодуляции. Благодаря этому становится также возможно увеличить граничную час- тоту фильтра нижних частот. Время запаздывания и длительность фронта (см. эис. 4.5) могут быть сокращены до достижения нового уровня постоянного напря- жения. Данный метод представлен ниже в подразделе “Формирование ШИМ-сигна- ia с помощью Т/С1 ”. Чтобы получить квадрат значения усиления V используемого фильтра Баттер- ворта п-го порядка используется уравнение: V1 м =-/~ (4-9) | + fpWM I л > где fg — граничная частота фильтра, при которой его усиление составляет -3 дБ, а Vo — усиление постоянного напряжения фильтра согласно уравнению (4.5). Для fg это же уравнение принимает вид: (4.Ю) Из этих уравнений получаем данные, представленные в табл. 4.3 и табл. 4.4. Таблица 4.3. Характеристики фильтра Баттерворта второго порядка при Vo = -1 Разре- шение, разряды Tim, мкс 1LSB, мВ Almax, мВ V(TP) fuwM, Гц fgmax, Гц tg, МС tv, мс 8 15 20 10 0,003068 260,42 14,42 23,71 15,81 8 20 20 10 0,003068 195,31 10,82 31,61 21,08 9 15 10 5 0,001534 130,21 5,10 67,06 44,71 9 20 10 5 0,001534 97,66 3,82 89,42 59,61 10 15 5 2,5 0,000767 65,10 1,80 189,68 126,45 10 20 5 2,5 0,000767 48,83 1,35 252,91 168,60 11 15 2,5 1,25 0,000383 32,55 0,64 536,50 357,66 11 20 2,5 1,25 0,000383 24,41 0,48 715,33 476,89 Таблица 4.4. Характеристики фильтра Баттерворта четвертого порядка при Vo - 1 Разре- шение, оазоядь Тм, мкс 1 LSB, мВ At max, мВ V(7P) fiiiHM, Гц fgmaxi гц tg, мс tv, МС 8 15 20 10 0,003068 260,42 61,29 6,31 7,33 8 20 20 10 0,003068 195,31 45,97 8,42 9,77 9 15 J 10 5 0,001534 130,21 25,77 15,02 17,42 9 20 10 5 0,001534 97,66 19,33 20,02 23,23 10 15 5 2,5 0,000767 65,10 10,83 35,72 41,44 10 20 5 2,5 0,000767 48,83 8,13 47,63 55,26 11 15 2,5 1,25 0,000383 32,55 4,56 84,96 98,57 11 20 2,5 1,25 0,000383 24,41 3,42 113,27 131,42
126 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Например, если необходимо установить фильтр Баттерворта четвертого порядка для разрешения 11 разрядов с паузой между двумя прерываниями от таймера 20 мкс, его граничная частота должна составлять -3,42 Гц (см. табл. 4.4). Параметры первого фильтра Согласно табл. 4.2, fga = 0,719 fg = 0,719 • 3,42 Гц = 2,46 Гц. Выбираем Cia =100 нФ и определяем согласно уравнению (4.7) номинал для конденсатора С2а. Коэффициенты фильтра аь и bia можно найти по табл. 4.2. Си 4М1-Г0) = 4 1,0000(!-(-!)) = 7 z. 7 ’ С1а at (1,8478)2 С2а > 2,343 • 100 нФ = 234,3 нФ. Выбираем для С2а ближайшее значение из стандартного ряда: С2а = 270 нФ. Теперь можно определить значение R2a по формуле (4.4): R2a = «,2«С22. -4CuC2„61o(1-K0) -----------------------= 4^„С1ОС2„ Ближайшее значение из стандартного ряда: Е24: R2a = 390 kQ. Значение R3a рассчитываем по формуле (4.6): *1. = —5—------------= 407,538кГ2 Ближайшее значение из стандартного ряда Е24 : R3a = 390 kQ. Для R3a = 412 kQ Значение Ria рассчитываем по формуле (4.5): Я. = = R,a = 380,398к£2 Ближайшее значение из стандартного ряда Е24: Ria = 390 kQ. Для Ria =383 kQ. Параметры второго фильтра Согласно таблице 4.2, fga = 1,390 fg = 1,390 • 3,42 Гц = 4,75 Гц. Выбираем Сщ = 22 нФ и определяем согласно уравнению (4.7) параметры Е96: Е96: кон- денсатора Сгь С2Ь > 46№(1-К0) = 4 1,0000• (!-(-!)) =;3656. C1S at, (0.7654)2 ’ ’ С2Ь > 13,656 • 22 нФ = 300,4 нФ. Выбираем для С2ь ближайшее значение из стандартного ряда: С2ь = 330 нФ. Теперь по уравнению (4.4) можно определить значение И2ь: «1ЛС2Л - Ja*Cl, - 4С1ЛС2/Д. (1 - К) р = lb 2Ь Л/ _2Ъ---------------------GJ_ = 408 368a.Q 4#рйС1ЛС2Л J gb Lb lb
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 127 Ближайшее значение из стандартного ряда Е24: Игь = 390 к£2. Для Е96: R.2b = 412 kQ. Значение R3b рассчитываем по формуле (4.6): Ближайшее значение из стандартного ряда Е24: R3b = 390 кП. Для Е96: R3b = 383 кП. Значение Rib рассчитываем по формуле (4.5): R., = = Rlh = 408,368кГ2 ID уг 2Ь 7 Ближайшее значение из стандартного ряда Е24: Rib = 390 кП. Для Е96: Rib = 412 kQ. Допуски компонентов и погрешности, неизбежно возникающие при использо- вании резисторов из стандартного ряда Е24 или Е96, приводят к искажению пара- метров фильтров aix и Би и вместе с ними — характеристик фильтрации. В результате в нашем распоряжении уже не чистый фильтр Баттерворта. Тем не ме- нее, в большинстве случаев эти отклонения вполне приемлемы. Фильтр Баттерворта четвертого порядка с полностью определенными парамет- рами для граничной частоты fg = 3,42 Гц изображен на рис. 4.9. Рис. 4.9. Фильтр Баттерворта четвертого порядка с граничной частотой fg = 3,42 Гц Формирование ШИМ-сигнала с помощью Т/С1 С помощью микроконтроллера AVR очень просто формировать ШИМ-сигналы, поскольку большинство микроконтроллеров располагают таймерами/счетчиками во взаимодействии со специальной “аппаратной частью ШИМ”. Настройка режима ШИМ Т/Cl подробно рассматривается в книге Вольфганга Трамперта “AVR-RISC микроконтроллеры”, поэтому здесь будет дано только крат- кое объяснение метода и рассмотрен пример для десятиразрядного ЦАП. Для начала затронем аналоговый метод управления коэффициентом заполнения прямоугольных импульсов напряжения и генерации ШИМ-сигнала.
128 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Аналоговое управление коэффициентом заполнения прямоугольных импульсов напряжения Принцип формирования ШИМ-сигнала в аналоговой схемотехнике представлен на рис. 4.10. Генератор пило- образного сигнала UD Upwm О “st О Широтно-импульсный модулятор состоит из генератора пилообразного сигнала и компаратора. До тех пор, пока уровень управляющего сигнала USt, подаваемого на неинвертированный вход компаратора, выше уровня пилообразного сигнала UD, выходное напряжение Upwm компаратора имеет положительную полярность U^. Когда же напряжение UD превышает уровень управляющего сигнал USt, компаратор “опрокидывается”, а его выходное напряжение Upwm принимает отрицательную по- лярность Ua-. В таком состоянии он находится до тех пор, пока уровень пилообраз- ного сигнала UD опять не превысит уровень управляющего сигнала Ust, и описан- ный процесс повторяется циклически. Время включения fa ШИМ-сигнала, продемонстрированного на рис. 4.10, опре- деляется из следующего соотношения: t = Т- 1Н 1 uD+uSt 2 (4-11) Управление коэффициентом заполнения прямоугольных импульсов напряжения с помощью Т/С1 Точно таким же образом, но в цифровых понятиях, организовано и формирова- ние ШИМ-сигнала с помощью таймера/счетчика Т/Cl микроконтроллера AVR. При этом Т/Cl может использоваться в качестве как инвертирующего, так и неинверти- рующего широтно-импульсного модулятора. Это соответствует перестановке вхо- дов компаратора, продемонстрированного на рис. 4.10. Нас, однако, интересует в первую очередь неинвертирующий широтно-импульсный модулятор.
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 129 В качестве неинвертирующего модулятора Т/Cl работает как реверсивный четчик: он циклически выполняет подсчет от нуля до максимального значения 'ОР, зависящего от задаваемого программно разрешения 8, 9 или 10 разрядов, а за- ем вновь возвращающийся к нулю. Пилообразный сигнал (см. рис. 4.10) в данном :лучае также формируется в цифровом виде. Максимальное значение ТОР ШИМ-счетчика рассчитывают для N разрядов >азрешения: ТОР = 2*-1. (4.12) Принцип работы в точности соответствует аналоговому варианту. Когда со- тояние счетчика, хранимое в регистре TCNT1, совпадает с содержимым регистра равнения OCR1, на выводе ОС1 микроконтроллера устанавливается лог. 0, завер- пая импульс ШИМ-сигнала. Таким образом, функция регистра сравнения соответ- твует аналоговому компаратору (см. рис. 4.10). Счетчик продолжает выполнять юдсчет до достижения максимального значения ТОР, после чего меняет направле- ше счета. Как только состояние счетчика опять совпадет с содержимым регистра равнения OCR1, на выводе ОС1 устанавливается лог. 1, начинай новый импульс ПИМ-сигнала. Принцип работы широтно-импульсного модулятора на основе Т/С1 [роиллюстрирован на рис. 4.11 на примере четырехразрядного ЦАП. Рис. 4.11. Формирование ШИМ-сигнала с помощью Т/С1 для двух значений регистра сравнения OCR1 В данном случае разрешение 4 разряда было выбрано только с целью наглядно- ги. В реальности же в микроконтроллерах AVR реализованы режимы ШИМ с раз- ешением 8, 9 и 10 разрядов. Частота повторения счетных циклов Гщим составляет л™• (4ЛЗ) де frci — тактовая частота счетчика Т/С1. Измерение
130 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Таким образом, для одного цикла выходной частоты Гщим требуется (2N+1 - 2’ тактовых импульсов. В нашем случае, согласно рис. 4.11, необходимо (24+1 - 2) = 3( тактовых импульсов, а для десятиразрядного выходного ШИМ-сигнала, соответст- венно, — (210+1 - 2) = 2046. Если содержимое регистра OCR1 равно Z, то длительность импульса ШИМ- сигнала tH составляет 2 • Z тактовых импульсов. Благодаря этому, коэффициентом заполнения ШИМ-сигнала g с разрешением ? разрядов можно управлять с помощью содержимого регистра OCR1: g = -^- = ^\Z =-^—fi<Z<TOP. (4.14 ° rrt ~ N+l 19^ 1 ’ v 1PWM Z I Z 1 Таким образом, коэффициент заполнения прямо пропорционален содержимому Z регистра сравнения OCR1. Для обоих особых случаев Z = 0 и Z = ТОР для неин вертируютцего широтно-импульсного модулятора действительно: • для Z = 0 на ШИМ-выходе ОС1 — постоянный лог. 0; • для Z = ТОР на ШИМ-выходе ОС1 — постоянная лог. 1. Среднее арифметическое Um выходного напряжения Т/Cl на выводе ОС1 мик роконтроллера AVR, которое получается при прохождении ШИМ-сигналом фильт ра нижних частот, может быть определено по уравнению (4.3): U., =(ЦН -UL)-g+U, =(UH-U,)—~+UL, (4.15 М V/7 Ь/О L V tl Z 2 1 V где Uh — уровень лог. 1; Ul — уровень лог. 0; g — коэффициент заполнения прямо угольных импульсов напряжения; Z — содержимое регистра OCR1; А— разреше ние ШИМ в разрядах. При использовании широтно-импульсного модулятора на основе Т/Cl следуе обращать внимание на частоту Гщим (см. формулу (4.13)). Так, в случае микроконтроллера AT90S2313 максимальная тактовая частот; Т/Cl равна частоте системной синхронизации и составляет 10 МГц. Даже при мак симальном разрешении ШИМ в десять разрядов частота модуляции согласно (4.13 равна: f _ А/d io мп/ юмп/ /шим 2"+1-2 210+1-2 2046 ’ ц' В микроконтроллерах AVR серии “Mega” с технологией производства 0,35 мк? (например, ATmega8) возможны значительно более высокие частоты модуляции Соответственно, могут быть увеличены граничные частоты фильтров нижних час тот, предназначенные для выделения составляющей постоянного напряжения. Режим быстрой широтно-импульсной модуляции В микроконтроллерах последнего поколения, кроме всего прочего, можно пере вести Т/Cl в режим “быстрой широтно-импульсной модуляции”, частота которо1 увеличивается вдвое. При этом Т/Cl ведет подсчет в обычном» режиме ШИМ, ка: уже было описано выше (от исходного значения BOTTOM до значения ТОР), а за тем сразу же возвращается к BOTTOM (см. рис. 4.12). Благодаря отказу от счет; в обратном направлении, удается достичь удвоения выходной частоты ШИМ.
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 131 В общем случае частота ГШим на выходе ОС1 микроконтроллера в режиме бы- грой модуляции составляет: с =—1 Тшим N-(TOP + l) (ТОР + 1) SYS ТС1 (4.16) це frci — тактовая частота Т/Cl, получаемая путем деления частоты системной инхронизации fSYs на коэффициент N (1, 8, 64, 256 или 1024), предустановленный помощью разрядов CS1[2..O] регистра управления TCCR1B. При неинвертирующем режиме быстрой широтно-импульсной модуляции на ыходе ОС1х микроконтроллера AVR лог. 1 устанавливается при достижении счет- иком значения ТОР, а лог. 0 — при совпадении содержимого счетного регистра CNT1 и регистра сравнения OCRlx (рис. 4.12). TCNT1 а Состояние счетчика 15- 14- 13- 12-- 11 - 10- 9- 8- 7- 6- 5- 4- 3- 2- 1 - °4 0123456789 10 Tt/ci 14 1|6 18 20 22 24 26 28 30 Ц2 34 36 Лог. 1 t Тт/С1 Лог. 0 Лог. 1 Лог. 0 ОС1А а ШИМ-ВЫХОД для [OCR1A] = 12 Т т/ci Tt/ci ОС1А а ШИМ-выход для [OCR1A] = 0 (BOTTOM) Лог. 1 - -1 Лог. 0 —' —" 0 ОС1А а ШИМ-выход для [OCR1A] = 15 (ТОР) 0 16 32 Рис. 4.12. Формирование ШИМ-сигнала с помощью Т/С1 в режиме быстрой модуляции В новых микроконтроллерах AVR пользователь уже не привязан к описанному 1ше строго определенному разрешению 8, 9 или 10 разрядов, как в случае с “клас- [ческими” микроконтроллерами серии AT90Sxxxx. В данном случае максимальное
132 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR значение ТОР счетчика ШИМ может быть произвольным в диапазоне 3...65535, что соответствует разрешению 2... 16 разрядов. Значение ТОР записывается в регистро- вую пару OCR1A или альтернативную ей ICR1, а с помощью управляющих регист- ров TCCR1A (WGM1[1..O]) и TCCR1B (WGM1[3..2]) устанавливается соответст- вующий режим формирования сигнала: WGM1[3..2] = 1111ь — для ICR1; WGM1[3..O] = 111 lb — для OCR1 А. Так, если необходимо получить 12-тиразрядный результат ШИМ, в регистро- вую пару OCR1A или ICR1 записывается значение ТОР = 212 - 1 = 4095. Таким об- разом, благодаря изменению значения Z в диапазоне О...ТОР можно получить им- пульсы длительностью tH = (1/4096 ... 4096/4096) • Тщим- Значение ТОР при этом не обязательно должно быть привязано к целочисленной степени 2. Для произвольного значения ТОР в диапазоне 3...655335 разрешение ШИМ, выражаемое в разрядах, может быть рассчитано по формуле (4.17): log(7V2P + l) Разрешение =------------бит. (4.17) log 2 В рассмотренной ниже программе K4_1_2_pwm-dac mit TCl.asm тай- мер/счетчик Т/Cl микроконтроллера ATmega8 в режиме быстрой ШИМ настроен на максимальное значение ТОР = 8. В таком случае, разрешение равно: log(TOP + l) log(8 + l) _17 ---:— -----= ——— = 3,17 разрядов. log 2 log 2 На рис. 4.21 продемонстрированы представляемые на экране осциллографа сиг- налы на выходе ОС1х для случаев Z = 0, Z = 1, Z = 2 и Z = 3. Измеренные значения Um выходного напряжения ШИМ для девяти возможных значений Z при рабочем напряжении VCc = + 5,05 В представлены в табл. 4.5. При этом, учитывая нагрузку из-за подключенного фильтра нижних частот, выходное напряжение на выходе ОС1х микроконтроллера AVR составляет Upwm = 4,99 В. Кав видим, значения UM соответствуют теоретическим расчетам согласно формуле (4.20) для UH = 4,99 В и UL = 0 В. Таблица 4.5. Средние величины постоянного напряжения Um для возможных значений Z в режиме быстрой ШИМ при ТОР = 8 Z Um, В Um/Upwm (измеренное) Um/Upwm (расчетное) 0 0,548 0,110 0,111 1 1,105 0,221 0,222 2 1,662 0,333 0,333 3 2,21 0,443 0,444 4 2,77 0,555 0,555 5 3,32 0,665 0,666 6 3,88 0,778 0,777 7 4,43 0,888 0,888 8 4,99 1 1 Процесс четырехразрядной ШИМ в режиме быстрой модуляции показан ш рис. 4.12. В данном случае значение ТОР = 15 содержит регистровая пара OCR1? или ICR1. Длительность выходного импульса tH ШИМ-сигнала для значения Z в регистро- вой паре OCRlx в диапазоне 0 .. .ТОР можно получить из формулы (4.18):
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 133 Z + 1 ТОР + 1 •Т 1 ШИМ ’ $<Z<TOP. (4-18) Таким образом в режиме быстрой ШИМ получить импульсы нулевой длины евозможно, поскольку совпадение со значением Z = 0 может быть распознано олько по ниспадающему фронту тактового сигнала, а выходной сигнал устанавли- ается в лог. 1 при достижении значения ТОР (см. рис. 4.12 и уравнение (4.18)). Коэффициентом заполнения g “быстрого” сигнала можно управлять, как и в лучае “обычного” сигнала, с помощью содержимого регистра OCRlx (значение Z): Z +1 Т ~ ТОР + 1’ 1 шим * 1 1 0<Z<TOP. (4-19) Таким образом, коэффициент заполнения, если не учитывать смещение /(ТОР+1), прямо пропорционален содержимому Z регистра сравнения OCRlx. Для собого случая Z = ТОР для неинвертирующего широтно-импульсного модулятора быстром режиме на ШИМ-выходе ОС1х постоянно находится лог. 1. Среднее арифметическое значение UM выходного напряжения ШИМ на выводе »С1х микроконтроллера AVR, оставшееся после фильтрации нижних частот ШИМ- игнала, определяется на основании уравнения (4.3): UM=(.UH-UL)-g + UL=(UH-UL)- Z + 1 +^£ > (4.20) je UH — высокий, a UL — низкий уровень выходного напряжения микроконтрол- зра AVR; g — коэффициент заполнения прямоугольных импульсов напряжения; — содержимое регистра OCRlx. Программа Программа K4_1_2_PWM-DAC mit TCI.asm, представленная в листинге 4.1, эиводит в действие микроконтроллер ATmega8 на тестовой плате (см. раздел 4.3) качестве ЦАП в режиме быстрой ШИМ с последовательно подключенным фильт- )м нижних частот Чебышева четвертого порядка. Программа имеет следующие характеристики: • Номинальное значение напряжения Usoii вводится с ПК через интерфейс RS232. В ходе “быстрой” широтно-импульсной модуляции оно преобразуется в ШИМ-сигнал с пропорциональной USoii длительностью импульса tH и после прохождения фильтра нижних частот подается на выход в качестве значения постоянного напряжения. • Циклический вывод через интерфейс RS232 на ПК численных значений (до восьми) замеряемых аналоговых напряжений. • Программная калибровка АЦП с ШИМ в соответствии с представленным в главе 1 методом без использования компенсационного потенциометра. • Использование Т/Cl в режиме быстрой ШИМ с максимальным значением ТОР = 8 с целью проверки значений, представленных в табл. 4.5. • Постоянный вывод симметричных прямоугольных импульсов на выход TxD для проверки USART и последовательного интерфейса. Файл K4_1_2_PWM-DAC mit TCI. asm можно также найти на прилагаемом к книге компакт- I диске в папке Program.
134 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Листинг 4.1. Реализация ЦАП с помощью Т/С1 в режиме быстрой ШИМ — программа K4_1_2_PWM-DAC mit TCI.asm • ******************************************************************* г ;* Программа: ЦАП с использованием Т/Cl в режиме быстрой ШИМ ; * Версия: 1.0 /* Целевое устройство: ATmega8 ;* Частота системной синхронизации: 12 MHz ;* Описание: Т/Cl используется в качестве ЦАП, благодаря своей функции ;* широтно-импульсного модулятора. .****★*************************★************************************ .nolist .include "С:\Programme\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc" . list ;***** Определения .equ PTCI = PortB ;Выходной порт для ШИМ-сигнала от Т/С1 .equ DTC1 = DDRB ;Регистр направления передачи данных для ШИМ-сигнала .equ OC1A = PB1 ;ШИМ-выход А счетчика Т/С1 .equ TOP = 4999 ;Максимальное значения для ШИМ-счетчика .equ MAX = 4500 /Максимальное допустимое вводимое значение для UDAC .equ Dflt = 20 ;Значение по умолчанию для задержки в цикле Repeat .equ ClkO = 03 /Содержимое регистра TCCR0 для fTCO = fSys / 64 .equ Vims = 187 /Содержимое регистра TCNT0 для получения 1 мс до / момента переполнения ClkO .equ PUART = PortD /Выходной порт для последовательного интерфейса .equ DUART = DDRD ;Регистр направления передачи данных для / последовательного интерфейса .equ TxD = PD1 /Выход передатчика - вывод 1 порта D .equ Baud = 155 /UBRR для 4800 Baud при 12 МГц /UBRR = (fSys / 16*Baud) - 1 .equ JO = PB2 /Перемычка J0 - на выводе 2 порта В .equ JI = PB3 /Перемычка Л - на выводе 3 порта В .equ Ua = 1250 /Исходное значение дляг ЦАП с ШИМ .equ OFlow = 0 /Разряд 0 в регистре флагов указывает на переполнение / при делении .equ RCV = 7 /Разряд 7 в регистре флагов указывает на успешное ; завершение приема .***** регистровые переменные .def mulO = r4 /Результат перемножения 2 байта * 2 байта .def mull = r5 /Результат перемножения 2 байта * 2 байта .def mul2 = r6 /Результат перемножения 2 байта * 2 байта .def mul3 = r7 ;Результат перемножения 2 байта * 2 байта .def rCnt = rl3 /Счетчик для цикла повторов .def tCnt = rl4 /Счетчик для времени задержки .def Save = rl5 /Буфер для хранения содержимого регистра SREG на / время обработки прерывания .def tO = Г16 /Временный рабочий регистр 0 .def tl = rl7 /Временный рабочий регистр 1 .def t2 = rl8 /Временный рабочий регистр 2 .def Flag = rl9 /Различные флаги .def ErgO = r20 /Старший байт результата
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 135 Истин г 4.1. Продолжение def Ergl def DivO = r21 = r22 /Младший байт результата ;Старший байт делимого def Divl = r23 /Младший байт делимого def iO = r24 /Временный рабочий регистр прерывания 0 def il = r25 /Временный рабочий регистр прерывания 1 ***** Код cseg org О jmp initial ;Адрес рестарта org OVFladdr eti ;Адрес вектора прерывания при переполнении Т/С1 nitial: /Инициализация микроконтроллера AVR di tl,Low(RAMEND) ut SPL,tl /Инициализация младшего байта указателя стека di tl,High(RAMEND) ut SPH,tl /Инициализация старшего байта указателя стека nitPorts: di tl,l«TxD /Конфигурируем направление передачи данных ut DDRD,tl / через порт D di tl,l«OClA /Конфигурируем направление передачи данных ut DDRB,tl / через порт В di tl, (1<<JO) I (1«J1) /Подтягивающее сопротивление ut PortB, tl ; для перемычек JO и JI nitTCl: COM1A[1..0] = 10 -> Т/Cl в режиме неинвертирующей ШИМ WGM[3..O] = 1110 -> Быстрая ШИМ, ТОР - в ICR1 di tl, (0Ы0«Сош1А0) | (0bl0«WGM10) ut TCCR1A,tl 0S1 [2 !. .0] = 001 -> • Т/Cl тактируется с частотой системной синхронизации di ut tl, (0bll«WGM12) | (0b001«CS10) TCCR1B,tl di tl,High(TOP) /Старший байт максимального значения ШИМ di ut tO,Low(TOP) ICR1H, tl /Младший байт максимального значения ШИМ ut ICR1L,tO /Загружаем максимальное значение ШИМ в регистр ICR1 ii tl, High(Ua) /Старший байт исходного значения di ut tO,Low(Ua) OCR1AH,tl /Младший байт исходного значения ut OCRlAL,tO litUSART: /Загружаем выходное значение в регистр сравнения ii tl,High(Baud) /Старший байт значения,определяющего скорость передачи ii tO,Low(Baud) /Младший байт значения,определяющего скорость передачи it UBRRH,tl it UBRRL,tO Разрешаем использование приемника и передатчика ii tl, (1«RXEN) | (1«TXEN) it UCSRB,tl Останавливаем параметры передачи: 8 бит данных, 1 стоп-бит ii tl, (1«URSEL) | (0bll«UCSZ0) it UCSRC,tl _i /Общее разрешение прерываний
136 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Листинг 4.1. Продолжение Главная программа Haupt Idi zH,High(Titel<<l) /Устанавливаем указатель Z Idi zL,Low(Titelccl) ; на начало текста во флэш-памяти rcall Out Text ;Выводим текст на ПК Hauptl: sbis PinB,JI ;Пропускаем следующую команду, если Л в лог. 1 rjmp Test /Выбор программы тестирования Idi zH,High(Txtlaccl) /Устанавливаем указатель Z Idi zL,Low(Txtlaccl) / на начало текста во флэш-памяти rcall Out Text /Выводим текст на ПК Idi zH,High(Txtlbccl) /Устанавливаем указатель Z Idi zL,Low(Txtlbccl) / на начало текста во флэш-памяти rcall Out Text /Выводим текст на ПК Wait Receive: ,* Ожидание ответа от ПК Idi zH,High(Input) /Устанавливаем указатель Z Idi zL,Low(Input) / на буфер приема в памяти SRAM rcall In Text /Принимаем текст от ПК sbrs Flag,RCV ;Пропускаем следующую команду, / если текст без ошибок rjmp Hauptl /Новая попытка Idi tl,High(TOP) /Старший байт максимального значения ШИМ Idi tO,Low(TOP) /Младший байт максимального значения ШИМ out ICR1H,tl out ICR1L,tO /Максимальное значение ШИМ - в регистр ICR1 Ids tO,Input /Переводим символы входной строки sbr tO,lcc5 / в символы ASCII в нижнем регистре Check c: cpi tO,'c’ /’с' для калибровки? breq Kalibrierung /Если да, то переходим к процессу калибровки Check r: cpi tO,'r’ /'г' цикла повторения? brne Haupt2 /Если нет, - простое входное значение rjmp RepeatLoop /К циклу повторения Haupt2: Idi zH,High(Input) /Устанавливаем указатель Z на первую цифру Idi zL,Low(Input) / в буфере приема в памяти SRAM rcall Dekodieren /Преобразовываем ASCII-символы в / шестнадцатеричные значения rcall Korrektur /Загружаем в регистр сравнения out 0CRlAH,mul3 / номинальное значение, откорректированное out 0CRlAL,mul2 ; с помощью параметров в памяти EEPROM rjmp Hauptl /Опрос Л Test: sbis PinB,JO ;Пропускаем следующую команду, если J0 в лог. Z rjmp Test Stufen /Тест: быстрая ШИМ Idi zH,High(Text3ccl) /Устанавливаем указатель Z Idi zL,Low(Text3ccl) ; на начало текста во флэш-памяти rcall Out Text /Выводим текст на ПК TxD Test: sbis UCSRA,UDRE rjmp TxD Test /Ожидаем освобождения буфера передачи Idi tl,$55 /Тестовый символ out UDR,tl /Начинаем передачу in tl,PinB /Опрашиваем состояние перемычки
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 137 1истинг 4.1. Продолжение ndi tl, 1«J111«JO ;Маска для перемычки pi tl, 1«JO ;J1=O, J0=l? •req TxD Test /Переход, если далее - постоянный тест jmp Haupt ;Новый выбор 'est Stufen: di tl,00 /Старший байт контрольного значения ШИМ di to,01 /Младший байт контрольного значения ШИМ •ut OCR1AH,tl •ut OCR1AL,tO /Загружаем длительность в регистр сравнения di tl,0 /Старший байт максимального значения ШИМ di tO,8 /Младший байт максимального значения ШИМ ut ICR1H,tl ut ICR1L,tO /Загружаем максимальное значение ШИМ в ICR1 di zH, High (Text 4«1) /Устанавливаем указатель Z di zL, Low (Text4«l) / на начало текста во флэш-памяти call Out Text /Выводим текст на ПК dgh Impuls: di zH, High (Text5«l) /Устанавливаем указатель Z di zL, Low (Text5«l) ; на начало текста во флэш-памяти call Out Text /Выводим текст на ПК lait kv: call GetByte /Принимаем ASCII-символ от ПЕ ubi t2,$30 /Контрольное значение для Compare Low ndi t2,$0F /Очищаем полубайт максимального значения :lr tl /Контрольное значение для Compare High •ut OCR1AH,tl •ut OCR1AL,t2 /Загружаем длительность в регистр сравнения di zH, High (CRLF«1) /Устанавливаем указатель Z di zL,Low (CRLF«1) / на начало текста во флэш-памяти call Out Text /Выводим текст на ПК n tO,PinB /Опрашиваем состояние перемычки ndi tO, (1«J1) | (l«J0) /Маска для Л и J0 •req High_Impuls /Новый опрос 'jmp Haupt /Новый выбор lalibrierung: di tl,High(TOP) /Старший байт максимального значения ШИМ di tO,Low(TOP) /Младший байт максимального значения ШИМ •ut ICR1H,tl •ut ICR1L,tO /Загружаем максимальное значение ШИМ в ICR1 .di tl,High(MAX) /Старший байт максимального вводимого значения .di tO, Low(MAX) /Младший байт максимального вводимого значения •ut OCR1AH,tl /Загружаем в регистр сравнения •ut OCR1AL,tO / максимальное вводимое значение .di zH,High(Cal<<l) /Устанавливаем указатель Z .di zL, Low (Cal«l) / на начало текста во флэш-памяти •call iall: Out_Text /Выводим текст на ПК di zH, High (UImax«l) /Устанавливаем указатель Z di zL, Low (UImax«l) / на начало текста во флэш-памяти call Out Text /Выводим текст на ПК Wait Receive: /Ожидание ответа от ПК .di zH,High(Input) /Устанавливаем указатель Z .di zL,Low(Input) / на буфер приема в SRAM call In Text /Принимаем текст от ПК •brs Flag,RCV /Пропускаем следующую команду, если текст без ошибок
138 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Листинг 4.1. Продолжение rjmp Kall ;Новая попытка Idi tl,0 /Старший байт минимального вводимого значения Idi to, о /Младший байт минимального вводимого значения out OCR1AH,tl /Загружаем минимальное вводимое значение out 0CR1AL,tO / в регистр сравнения Idi zH,High(Input) /Устанавливаем указатель Z Idi zL,Low(Input) / на буфер приема в SRAM rcall Dekodieren /Преобразовываем ASCII-цифры в / шестнадцатеричное число sts Umax,Erg0 /Измеряем Umax sts Kal2: Umax+l,Ergl /Сохраняем значение Ulst Idi zH, High (UImin«l) /Устанавливаем указатель Z Idi zL, Low (UImin«l) / на начало текста во флэш-памяти rcall Out Text /Выводи текст на ПК ; Wait Receive: /Ожидаем ответ от ПК Idi zH,High(Input) /Устанавливаем указатель Z Idi zL,Low (Input) ; на начало буфера приема в SRAM rcall In Text /Принимаем текст от ПК sbrs Flag,RCV /Пропускаем следующую команду, если текст / без ошибок rjmp Kal2 /Новая попытка Idi zH,High(Input) /Устанавливаем указатель Z Idi zL,Low(Input) / на начало буфера приема в SRAM rcall Dekodieren /Преобразовываем ASCII-цифры / в шестнадцатеричное число sts Umin,ErgO /Измеряем Umin sts Umin+l,Ergl /Сохраняем Ulst rcall Calc KF /Рассчитываем поправочный коэффициент rcall Store_Param /Сохраняем все поправочные параметры / в память EEPROM Idi zH,High(C End«l) /Устанавливаем указатель Z Idi zL,Low(C End«l) / на начало текста во флэш-памяти rcall Out_Text rjmp Haupt1 RepeatLoop: /Выводим текст на ПК Idi tO,8 /Максимум 8 выводимх значений в цикле mov rCnt,tO /Инициализируем счетчик цикла Idi yH,High(Ual) /Устанавливаем указатель Y на первое Idi yL,Low(Ual) / выводимое значение в SRAM Idi zH,High(Input+2) /Устанавливаем указатель Z на первое Idi RP1: zL,Low(Input+2) / значение в буфере приема в SRAM rcall Dekodieren /Преобразовываем ASCII-цифры / в шестнадцатеричное число rcall Korrektur /Используя параметры из памяти EEPROM, st y+,Ergl / записываем в mul3:mul2 в SRAM st y+,ErgO / откорректированное выходное значение, / (первым - старший байт) dec rCnt /Уменьшаем счетчик циклов Id tO, z /Загружаем ASCII-символ в tO cpi to,'t' /Символ длительности? brne RP2 /Переход, если да adiw zH:zL,1 /Увеличиваем указатель Z rcall Dekodieren /Преобразовываем ASCII-цифры / в шестнадцатеричное число
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 139 1истинг4.1. Продолжение jmp RP3 lP2: .st rCnt ;Счетчик циклов = 0? >rne RP1 /Следующее значение, если не равно нулю .di ErgO,Dflt ;Значение по умолчанию IP3: IOV tCnt,ErgO /Загружаем в счетчик времени значение задержки .di t2,8 /Максимальное число выходных значений >ub t2,rCnt /Уменьшаем счетчик циклов .di zH,High(Txt6a<<l) /Устанавливаем указатель Z .di zL, Low (Txt6a«l) / на начало текста во флэш-памяти rcall Out Text /Выводим текст на ПК .di zH,High(Txt6b<<l) /Устанавливаем указатель Z .di zL, Low (Txt6b«l) / на начало текста во флэш-памяти rcall Out Text /Выводим текст на ПК <P4: IOV rCnt,t2 /Фактическое количество выходных значений .di yH,High(Ual) /Устанавливаем указатель Y на первое .di yL,Low(Ual) / выходное значение в SRAM Jiederholen: .d tl,y+ /Извлекаем выходное значение Ld tO,y+ / из памяти SRAM DUt OCR1AH,tl /Загружаем откорректированный номинал JUt OCR1AL,tO / в регистр сравнения rcall Verzoegerung /Ожидаем завершения задержки sbis UCSRA,RXC /Пропускаем следующую команду, rjmp RP6 / если ASCII-символ от ПК /Продолжаем цикл Ln tO,UDR /Загружаем полученный символ в tl rcall SendByte /Передаем эхом байт в ПК sbr tO, 1«5 /Преобразовываем в строчные ASCII-буквы -Pi tO,'x* /Выход? эгпе RP5 /Продолжаем цикл, если нет Ldi zH, High (CRLF«1) /Устанавливаем указатель Z Ldi zL, Low(CRLF«l) / на начало текста во флэш-памяти rcall Out Text /Выдаем на ПК символ перехода на новую строку rjmp Hauptl /Прерываем цикл, если да 3.P5: Ldi zH,High(Txt6b<<l) /Устанавливаем указатель Z ldi zL, Low (Txt6b«l) / на начало текста во флэш-памяти rcall Out Text ;Выдаем текст на ПК AP6: dec rCnt /Уменьшаем счетчик циклов эгпе Wiederholen /Следующее значение, если не равен нулю rjmp RP4 /Опять начинаем цикл / Подпрограммы: SendByte: /Передача символа на ПК sbis UCSRA,UDRE rjmp SendByte /Ожидаем освобождения буфера передачи sut UDR,tO /Передаем символ ret SetByte: /Прием символа sbis UCSRA,RXC /Ожидаем ASCII-символ от ПК jmp GetByte
140 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Листинг 4.1. Продолжение in t2,UDR ;Сохраняем считанный символ mov tO, t2 /Копируем символ в tO rcall SendByte /Передаем символ эхом обратно на ПК ret Out Text: /Вывод текста на ПК 1pm tO, z + /Загружаем ASCII-символ в tO cpi to, 0 /Конец текста? breq ОТ 2 /Переход, если готово OT1: •» rcall SendByte /Передаем символ rjmp Out Text /Следующий символ OT2: ret In Text: sbr Flag, 1«RCV /Устанавливаем флаг "Прием прошел успешно" ldi tl, 48 /Максимум 47 символов в буфере 4-возврат каретки I_T1: dec tl /Уменьшаем счетчик символов breq Fehler2 /Переход, если символов больше, чем допустимо I_T2: rcall GetByte /Принимаем ASCII-символ от ПК st z+, t2 /Сохраняем символ cpi t2,13 /Возврат каретки? brne I_T1 /Если нет, то следующий символ Wait LF: rcall GetByte /Ожидаем от ПК символ перехода на новую строку cpi t2,10 /Символ перехода на новую строку? breq I_T4 /Переход, если да Fehlerl: ldi zH,High(Txt2b<<l) /Устанавливаем указатель Z ldi zL,Low (Txt2b«l) / на начало текста во флэш-памяти rjmp I_T3 Fehler2: ldi zH, High (Txt2a«l) /Устанавливаем указатель Z ldi zL, Low (Txt2a«l) / на начало текста во флэш-памяти I_T3: rcall Out_Text /Выводим текст на ПК cbr Flag, 1«RCV /Сбрасываем флаг "Прием завершен" rjmp I_T5 I_T4: ldi zH, High (CRLF«1) /Устанавливаем указатель Z ldi zL,Low (CRLF«1) / на начало текста во флэш-памяти rcall Out_Text /Выводим текст на ПК I_T5: ret Dekodieren: /Преобразование ASCII-числа / в шестнадцатеричное число clr ErgO /Очищаем старший и младший байты clr Ergl / результата Id to , Z-l- /Загружаем в tO первый символ cpi tO,13 /Возврат каретки? breq Deko2 /Переход, если да De koi subi tO,$30 /Вычитаем ASCII-смещение
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 141 Листинг 4.1. Продолжение □ 1г tl /Прибавляем к результату add ErgO,tO ; цифру и adc Ergl,tl ; возможный перенос Id tO , 7.+ /Загружаем в tO следующий символ cpi tO, 13 /Возврат каретки? □ req De ко 2 /Переход, если да □pi to,' ' /ASCII-пробел? □req De ко 2 /Переход, если да rcall Mul 10 /Умножаем Ergl:ErgO на 10 rjmp De koi /Прибавляем следующую цифру De ко 2 ret /Результат - в Ergl:ErgO Korrektur: /С помощью параметров в памяти EEPROM Idi tO,Low(ZOffL) /Младший и старший байты адреса Idi tl,High(ZOffL) / смещения ZOffL rcall ReadEEPROM /t2 содержит ZOffL mov DivO,t2 /Сохраняем во вспомогательном регистре Idi tO,Low(ZOffH) /Младший и старший байты адреса Idi tl,High(ZOffH) / смещения ZOffH rcall ReadEEPROM /t2 содержит ZOffH mov Divl,t2 /Сохраняем во вспомогательном регистре add ErgO,DivO /Вычитаем (отрицательное!) смещение adc Ergl,Divl / из номинала Idi tO,Low(KFBL) /Младший и старший байты адреса Idi tl,High(KFBL) / KFBL rcall ReadEEPROM /t2 содержит KFBL mov DivO,t2 /Сохраняем KFBL во вспомогательном регистре Idi tO,Low(KFBH) /Младший и старший байты адреса Idi tl,High(KFBH) / KFBH rcall ReadEEPROM /t2 содержит KFBH mov Divl,t2 /Сохраняем KFBH во вспомогательном регистре Idi tO, Low(KFG) /Младший и старший байты адреса Idi tl,High(KFG) / KFG rcall ReadEEPROM /t2 содержит KFG bst t2, 0 ;Копируем разряд 0 KFG в флаг Т bld Flag,OFlow /Копируем флаг Т в флаг OFlow rcall Mul 2x2 Bytes /Divl:DivO * Ergl:ErgO Isl mull /Проверяем наличие округления brcc Korl /Переход, если нет inc mul2 /Округляем mul2 brne Korl /Переход, если нет переполнения inc mul3 /Добавляем переполнение brne Korl /Переход, если нет .переполнения sbr Flag, l«OFlow /Устанавливаем целочисленную часть в 1 Korl: sbrs Flag,OFlow /Пропускаем следующую команду, / если целочисленная часть = 1 rjmp Kor2 add mul2,ErgO /Прибавляем к произведению adc mul3,Ergl / частичный результат Kor2: Idi tO,Low(TOP) /Младший и старший байты Idi tl,High(TOP) / максимального значения ШИМ cp mul2,tO /Сравниваем cpc mul3,tl / с результатом коррекции brio Kor3 /Переход, если mul3:mul2 < ТОР
142 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Листинг 4.1. Продолжение mov mov КогЗ: ret mul2,tO mul3,tl /Устанавливаем результат коррекции ; в максимальное значение ШИМ /Откорректированный номинал - в mul3:mul2 Calc_ KF: ;Рассчет поправочного коэффициента KF cbr Flag, l«OFlow ;Сбрасываем переполнение при делении Ids ErgO,Umax /Фактическое значение MAXist для Ids Ergl,Umax+1 / Usoii = МАХ Ids tO,Umin /Фактическое значение MINist для Ids tl,Umin+1 / Usoii = 0 add ErgO,tO /Сумма (MAXist+MINist) - в Ergl:ErgO, adc Ergl,tl / поскольку смещение всегда отрицательное ldi DivO,Low(MAX) /Максимальное допустимое ldi Divl,High(MAX) ; входное значение МАХ sub DivO,ErgO /Сравниваем МАХ и (MAXist+MINist) sbc Divl,Ergl brio CC1 /Переход, если (MAXist+MINist) > МАХ sbr Flag, l«OFlow /Целочисленная часть = 1 rjmp CC2 CC1: ldi DivO, Low (MAX) /Отменяем вычитание ldi Divl,High(MAX) CC2: rcall Div 2 D 2 Byt /МАХ или MAX-(MAXist+MINist) делим / на (MAXist+MINist) ret /Флаг OFlow указывает на то, что целочисленная / часть KF - в Divl:DivO KF Store _Param: / Записываем поправочный параметр в EEPROM ldi t2,0 /Целочисленная часть поправочного коэффициента / KFG := 0 sbrc Flag,OFlow /Пропускаем следующую команду, если KFG = 0 inc t2 /Целочисленная часть поправочного коэффициента / KFG := 1 ldi tO,Low(KFG) /Младший и старший байты ldi tl,High(KFG) / целочисленной части поправочного коэффициента rcall WriteEEPROM /Записываем KFG в память EEPROM mov t2,Divl /Старший байт части KF после точки ldi tO,Low(KFBH) /Младший и старший байты адреса ldi tl,High(KFBH) / части KFBH после точки rcall WriteEEPROM /Записываем KFBH в память EEPROM mov t2,DivO /Младший байт части KF после запятой ldi tO,Low(KFBL) /Младший и старший байты адреса ldi tl,High(KFBL) / части KFBL после точки rcall WriteEEPROM /Записываем KFBL в память EEPROM Ids t2,Umin+1 /Старший байт фактического значения для Umin ldi tO,Low(ZOffH) /Младший и старший байты адреса ldi tl,High(ZOffH) ; смещения ZOffH rcall WriteEEPROM /Записываем ZOffH в память EEPROM Ids t2,Umin /Младший байт фактического значения для Umin ldi tO,Low(ZOffL) /Младший и старший байты адреса ldi tl,High(ZOffL) / смещения ZOffL rcall WriteEEPROM /Записываем ZOffL в память EEPROM ret Verzoegerung:
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 143 Листинг 4.1. Продолжение mov tO,tCnt /Загружаем длительность задержки в tO ldi tl,ClkO /Загружаем fTCO = fSys / 64 в out TCCRO,tl / регистр управления ТСО VZ1: ldi tl,-Vims /Загружаем в счетный регистр ТСО out TCNTO,tl / содержимое счетчика для 1 мс VZ2: in tl,TIFR sbrs tl,TOVO /Пропускаем следующую команду, если / переполнение счетчика rjmp VZ2 /Ожидаем переполнения sbr tl,l«TOVO /Сбрасываем флаг переполнения out TIFR,tl /Записываем TIFR dec to /Задержка истекла? brne ret VZ1 /Переход, если нет Div 2 D 2 Byt: /Divl:DivO / Ergl:ErgO ldi to,о /Вспомогательный регистр ldi tl,0 /Вспомогательный регистр ldi t2,32 /Счетчик делений Dvl: Isl DivO /Сдвигаем делимое на 1 разряд влево, LSB=0 rol Divl rol to /Сдвигаем MSB влево rol tl / в tl:tO sub tO,ErgO /Вычитаем sbc tl,Ergl / делитель brio Dv2 /Переход, если разность < 0 inc DivO /Устанавливаем в лог. 1 LSB DivO rjmp Dv2: Dv3 add tO,ErgO /Отменяем adc tl,Ergl / вычитание Dv3: dec t2 /Следующий прогон, если t2 > 0 brne Dvl Isl to /Остаток tl:tO сдвигаем на 1 разряд влево,LSB=0 rol tl sub tO,ErgO ;Вычитаем sbc tl,Ergl / делитель brio Dv4 /Переход, если разность < 0 inc DivO /Округляем результат в Divl:DivO brne DV4 /Переход, если нет переполнения из DivO inc Divl /Учитываем переполнение в Divl brne DV4 /Переход, если нет переполнения из Divl sbr Flag, l«OFlow /Разряд 0 в регистре "Flag" указывает на / переполнение при делении DV4: ret /Результат — в Divl:DivO, Mui 2x2 Bytes: /Divl:DivO * Ergl:ErgO clr t2 /Очищаем вспомогательный регистр mul Divl,Ergl /Divl * Ergl = произведение (старший байт) movw mul3:mul2,rl:rO ;сохраняем в общем результате mul DivO,ErgO /DivO * ErgO = произведение (младший байт) movw mull:mulO,rl:rO /сохраняем в общем результате
144 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Листинг 4.1. Продолжение mul Divl,ErgO ;Прибавляем частное произведение add mull,rO ; общего результата adc mul2,rl ; к предыдущему adc mul3,t2 ; общему результату mul DivO,Ergl ;Прибавляем частное произведение add mull,rO ; общего результата adc mul2,rl ; к предыдущему adc mul3,t2 ; общему результату ret Mul 10: •» Idi t2,10 ;Загружаем 10 в tO mul ErgO,t2 /Умножаем ErgO на 10 mov ErgO,rO /Младший байт произведения - в ErgO mov tl,rl /Старший байт произведения - в tl mul Ergl,t2 /Умножаем Ergl на 10 add tl,r0 /Прибавляем младший байт этого произведения к mov Ergl,tl / старшему байту предыдущего ret WriteEEPROM: sbic EECR,EEWE /Пропускаем следующую команду, если предыдущий / процесс записи завершен rjmp WriteEEPROM /Переход, если память к записи не готова cli /Общий запрет прерываний out EEARH, tl out EEARL,tO /Записываем адрес EEPROM out EEDR,t2 /Записываем байт данных в EEPROM sbi EECR,EEMWE /Разрешаем запись sbi EECR,EEWE /Начинаем программирование sei /Общее разрешение прерываний ret ReadEEPROM: sbic EECR,EEWE / Пропускаем следующую команду, если предыдущий / процесс записи завершен rjmp ReadEEPROM /Переход, если еще не завершен cli /Общий запрет прерываний out EEARH,tl out EEARL, tO ;Записываем адрес EEPROM sbi EECR,EERE /Начинаем считывание in t2,EEDR /Байт из EEPROM загружаем в t2 sei /Общее разрешение прерываний ret ;Тексты: CRLF: .db 13,10,0,0 Titel: .db 13,12,"PWM-D/A-Wandler",13,10, 0 Txtla: .db 13,10,"Eingabe:", 13,10, "- UDAC (in mV, 4500 max.) oder",13,10, 0 Txtlb: .db "- 'c' zur Kalibrierung Oder",13,10,'r' fuer Spannungsreihe: ",0 Txt2a: .db 13,10,"*** Fehler: Nach 46. Eingabe wird CR erwartet! *** ",13,10,0 Txt2b: .db 13,10,"*** Fehler: Nach CR wird LF erwartet! ***",13,10,0 Text3: .db 13,10,"Dauersignal $55 an TxD",13,10,0 Text4: .db 13,10,"PWM-Stufentest ",13,10,0 Text5: .db 13,10,"Dauer des High-Impulses (0..8): ",0 Txt6a: .db 13,10,"Spannungswerte werden in Repeat-Loop ausgegeben", 0
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 145 Листинг 4.1. Окончание ГхЬбЬ: .db 13,10,"Schleife abbrechen mit 'x' -> ",0 Jal: .db 13,10,"Kalibrierung des D/A-Wandlers",13,10,10,0 Umax: .db 13,10,"Geben Sie Umax (gemessen in mV) ein: ",0 JImin: .db 13,10,"Geben Sie |Umin| (gemessen in mV) ein: ",0 J_End: .db 13,10,"Kalibrierung beendet!",13,10,10,0 ;***** Данные . dseg Input: .byte 48 ;Буфер приема Jmax: .byte 2 /Действительное значение для Usoii = MAX Jmin: .byte 2 /Действительное значение для Usoii = 0 Jal: .byte 2 /Выходное значение для ЦАП с ШИМ Ja2: .byte 2 /Выходное значение для ЦАП с ШИМ Ja3: .byte 2 /Выходное значение для ЦАП с ШИМ Ja4: .byte 2 /Выходное значение для ЦАП с ШИМ Ja5: .byte 2 /Выходное значение для ЦАП с ШИМ Ja6: .byte 2 /Выходное значение для ЦАП с ШИМ Ja7: .byte 2 ;Выходное значение для ЦАП с ШИМ Ja8: .byte 2 ;Выходное значение для ЦАП с ШИМ . eseg Константы в памяти EEPROM <FG: .db 01 /Целочисленная часть поправочного коэффициента (KF) <FBH: .db 00 /Старший байт части KF справа от десятичной точки <FBL: .db 00 /Младший байт части KF справа от десятичной точки 50ffH: .db 00 /Старший байт смещения для коррекции ошибок 50ffL: .db 00 /Младший байт смещения для коррекции ошибок . exit Описание программы Часть инициализации После установки указателя стека вывод PD1 (сигнал TxD) порта D вывод РВ7 торта В (выход ОС1А таймера/счетчика Т/Cl) конфигурируются как выходы. К пе- >емычкам J1 и J0 на выводах 2 и 3 порта В бит2 подключаются внутренние подтя- гивающие резисторы. Таймер Т/Cl инициализируется как неинвертирующий широтно-импульсный юдулятор, работающий в “быстром” режиме (СОМ1А[1..0] = 10ь в регистре управ- 1ения TCCR1A). Максимальное значение ТОР находится в регистровой паре ICR1. Три этом в разряды WGMl[3..0], распределенные по регистрам управления TCCR1A и TCCR1B, должно быть записано двоичное значение 1110ь- Установкой ?S1[2..O] = 001ь в регистре управления TCCR1B в качестве частоты тактирования тс1 таймера/счетчика Т/Cl выбирается частота системной синхронизации fSvs- Максимальное ШИМ-значение ТОР = 4999 должно быть загружено в регистр CR1H.ICR1L, а начальное значение Ua = 1250 — в регистровую пару сравнения CR1AH:ICR1AL. Это необходимо для того, чтобы в качестве исходного значения ia выход схемы подать напряжение Ишим = 4,99 В • 1251 / 5000 = 1,248 В. Аналогично части инициализации тестовой программы UART, описанной (разделе 2.3, скорость передачи данных устанавливается с помощью регистра ^правления UBRRH:UBRRL, а использование приемника и передатчика разрешает-
146 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR ся с помощью регистра управления UCSRB. Кроме того, формат передачи устанав- ливается с помощью регистра управления UCSRC в пределах 8 бит данных и одного стоп-бита. Основная программа После отправки заголовка программы в программу HyperTerminal выполняется опрос состояния перемычки Л, чтобы определить, какая программа будет выпол- няться: тестовая (перемычка Л замкнута, лог. 0) или ШИМ (перемычка Л разомк- нута, лог. 1). Это продемонстрировано на блок-схеме программы (рис. 4.13). Рис. 4.13. Выбор вариантов в основной программе
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 147 Если выбрана программа ШИМ, далее ожидается указание пользователем тре- буемого действия. • Если пользователь вводит десятичное значение (в мВ, максимум 4500), до- полненное символом перевода на новую строку (клавиша <Enter>), то данное значение преобразуется в аналоговое напряжение с помощью Т/Cl, рабо- тающего в “быстром” режиме ШИМ с последующим фильтром нижних час- тот. Полученное напряжение подается на выход Upwm тестовой платы. Пример ввода: 200 <Enter>. На выход UPWm тестовой платы подается по- стоянное напряжение 200 мВ. Вид окна HyperTerminal при прохождении этого этапа программы представлен на рис. 4.14. Рис. 4.14. Результат работы ЦАП с ШИМ при выводе отдельного значения • Если пользователь вводит букву “с”, дополненную символом перевода на но- вую строку (клавиша <Enter>), то программа выполняет автоматическую ка- либровку ЦАП. Пример ввода: с <Enter>. Программа выполняет калибровку. Вид окна HyperTerminal при прохождении процесса калибровки представлен на рис. 4.15. Для того чтобы получить возможность рассчитать поправочный коэффици- ент, программа калибровки подставляет на первом этапе максимальное вы- ходное напряжение Usoii - 4500 мВ посредством записи в регистр сравнения OCR1А таймера/счетчика Т/Cl значения МАХ = 4500. Фактическое напря-
148 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR жение Umax измеряется пользователем с помощью вольтметра и передается через программу HyperTerminal. На втором этапе выдается минимальное вы- ходное напряжение Usoii = О В. Фактическое напряжение Umin, соответствую- щее смещению схемы, измеряется пользователем и передается через про- грамму HyperTerminal. Поскольку делитель напряжения R16-R17 выдает на фильтр нижних частот тестовой платы, описанной в разделе 4.3, довольно большое отрицательное смещение, понятно, что напряжение Umin в любом случае будет отрицатель- ным. По этой причине достаточно только опросить значение Umin- Оба значе- ния Umin и Umax сохраняются в памяти SRAM для расчета поправочного коэф- фициента с помощью подпрограммы Calc_KF. Рис. 4.15. Процесс калибровки • Если пользователь вводит букву “г”, дополненную пробелом, это соответст- вует вводу до восьми численных значений (все в мВ, максимальное 4500, раз- деляются пробелом). Эти значения подаются на выход UPWm тестовой платы и повторяются в бесконечной последовательности. Ввод завершается буквой “t”, сразу же после которой следует численное зна- чение в диапазоне между 1 и 255, задающее время включения отдельных ве- личин напряжения (в мс), и символ перевода строки (клавиша <Enter>). Пример ввода: 4500 2000 1000 500 t20 <Enter> (рис. 4.16). Программа устанавливает на выходе UPWm тестовой платы ряд значений напряжения 4500 мВ, 2000 мВ, 1000 мВ, 500 мВ длительностью по 20 мс. Этот ряд на- пряжений повторяется в виде бесконечного цикла.
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 149 Рис. 4.16. Экран ПК при выводе ряда напряжений В процессе бесконечного цикла программа непрерывно проверяет, получен ли через USART сигнал от ПК. При вводе символа “х” цикл может быть прерван, что продемонстрировано на рис. 4.17. Рис. 4.17. Экран ПК при завершении вывода ряда напряжений
150 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Введенный первым символ “у” (см. рис. 4.17) игнорируется, а вывод ряда на- пряжений прерывается и происходит переход к основной программе только после ввода “правильного” символа “х”. На рис. 4.18 показана фотография экрана осциллографа в случае ввода пользо- вателем следующей инструкции: г 4500 2000 1000 500 1000 2000 4500 t20 <Enter> Рис. 4.18. Ряд напряжений ЦАП на экране осциллографа: по вертикали — 1 В/дел., по горизонтали — 20 мс/дел. На рис. 4.18 четко просматривается всплеск в неустановившемся процессе фильтра нижних частот Чебышева до нового значения — особенно при большом скачке (см. также рис. 4.5). Поскольку фильтр нижних частот, описанный в разде- ле 4.3, — это фильтр Чебышева с пульсацией 0,5 дБ, большее затухание по другую сторону граничной частоты fg должно быть достигнуто при еще большем выбросе, чем в случае, представленном на рис. 4.5. Как видно из рис. 4.18, всплеск постепен- но затухает через 20 мс — время, в течение которого поддерживается заданное зна- чение напряжения. Тестовая программа Если перемычка Л замкнута (лог. 0), что соответствует выполнению обеих тес- товых программ (см. рис. 4.13), то выбор между тестом “быстрой” ШИМ (J0 = 0) или TxD-тестом (J0 = 1) определяется по состоянию перемычки J0. • TxD-тест, по сути, идентичен тесту, рассмотренному в разделе 2.3. Тестовая программа непрерывно выдает через USART ASCII-символ “U” (01010101ь = = 55b). В результате на выходах TxAVR передатчика USART и RxD-PC тес- товой платы из раздела 4.3 регистрируются симметричные прямоугольные импульсы напряжения с коэффициентом заполнения g = 0,5 (см. рис. 2.26). В данном случае скорость передачи установлена на 4800 бод. • Во время теста “быстрой” ШИМ таймер/счетчик Т/Cl используется в качест- ве широтно-импульсного модулятора. Значение ТОР в этом случае равно 8 и записано в регистр управления ICR1, что необходимо для четкого определе- ния ширины создаваемых “ступеней”. В данном случае возможны девять зна- чений Z = 0.. .8, хранимого в регистре сравнения OCR1 А. Вводя одно из зна-
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 151 чений в программе HyperTerminal (рис. 4.20), пользователь может изменять длительность tH импульсов на выходе широтно-импульсного модулятора. Рис. 4.19. Экран ПК во время прохождения TxD-теста Рис. 4.20. Установка длительности tH импульсов на выходе широтно-импульсного модулятора
152 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR На рис. 4.21 показаны характеристики выходного напряжения, на выводе ОС1А микроконтроллера ATmega8 для четырех случаев: Z = 0; Z = 1; Z = 2 и Z = 3. Рис. 4.21. Характеристики выходного напряжения на выводе ОС1А микроконтроллера АТтедав для че- тырех случаев: Z =0; Z = 1; Z = 2 и Z = 3. По вертикали — 1 В/дел., по горизонтали — 0,2 мкс/дел. Как видно из рис. 4.21, длительность импульса напряжения tH при каждом при- ращении Z увеличивается на девятую часть общего периода ТШим- начиная с одной девятой периода при Z = 0 она возрастает до девяти девятых периода при Z = 8. В случае Z = ТОР полученное постоянное напряжение равно напряжению питания Vcc- Согласно уравнению (4.16), частота выходного ШИМ-сигнала £шим при fTCi = = fSys (т.е. когда частота тактирования Т/Cl равно частоте системной синхрониза- ции 12 МГц на тестовой плате, описанной в разделе 4.3) составляет < _ 1 ШИМ гр ‘ ШИМ (TOR + X} 12Мгц =-------= 1,333 Мгц , (8 + 1) и соответственно Тщим р 0,75 мкс. J ШИМ Таким образом шаг приращения Z увеличивает длительность импульса tH вы- ходного напряжения на одну девятую периода ШИМ, т.е. на 83,333 мкс. Этот ре- зультат соответствует величинам средних значений, представленных в табл. 4.5.
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 153 Подпрограмма SendByte Подпрограмма SendByte передает символ в программу HyperTerminal. Она ожидает освобождения буфера USART и начинает передачу, копируя символ из ре- гистра tO в регистр данных UDR. Подпрограмма GetByte Подпрограмма GetByte ожидает приема символа от программы HyperTerminal. Как только символ поступает, он копируется из регистра данных USART UDR в регистр t2 и отправляется эхом с помощью подпрограммы SendByte обратно про- грамме HyperTerminal. Подпрограмма Out_Text Подпрограмма Out Text пересылает хранящийся во флэш-памяти текст в про- грамму HyperTerminal. Адрес начала текста хранится в указателе Z, конец текста должен быть обозначен символом ООь Подпрограмма In_Text Подпрограмма in Text записывает максимум 47 ASCII-символов в буфер input в памяти SRAM. Если же выдается большее количество символов, чем до- пускается, или после символа возврата каретки отсутствует символ перевода на но- вую строку, то в программу HyperTerminal передается сигнал об ошибке. Если тек- стовая строка считывается без ошибок, то устанавливается флаг RCV. В противном случае он сбрасывается. Подпрограмма Dekodieren Подпрограмма Dekodieren преобразует состоящее из ASCII-символов число в шестнадцатеричное число. ASCII-символы должны находиться в памяти SRAM, указатель Z указывает на наибольшую цифру числа. Число завершается символом возврата каретки (шестнадцатеричный код ODh), и не может быть больше FFFFh (65536а). Блок-схема применяемого в данном случае метода преобразования деся- тичного числа в шестнадцатеричное посредством непрерывного умножения на 10 представлена на рис. 4.22. Сам процесс подробно описан в книге Вольфганга Трам- перта “AVR-RISC микроконтроллеры”. Результат передается в вызывающую про- грамму в регистровой паре Ergl.-ErgO. Подпрограмма Korrektur Подпрограмма Korrektur задействует хранимые в памяти EEPROM смещение поправочного параметра ZoffH:ZoffL, дробную часть KFBH:KFBL и целочисленную часть KFG поправочного коэффициента KF. Смещение прибавляется к Ergl.'ErgO, поскольку смещение фильтра нижних частот имеет отрицательный знак из-за дели- теля напряжения R16-R17. Дробная часть поправочного коэффициента умножается подпрограммой Mul_2x2_Bytes на частичный результат в ErgkErgO. При необхо- димости результат округляется. Если же поправочный коэффициент больше 1, что приводит к установке флага OFlow, то частичный результат в Ergl.‘ErgO складывает- ся с произведением в mul3:mul2. В результате получается общий результат. Общий результат в mul3:mul2 ограничивается максимальным значением ТОР режима “бы- строй” ШИМ.
154 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Подпрограмма Calc_KF Подпрограмма Calc_KF рассчитывает поправочный коэффициент на основании фактических значений Umin и Umax, определяемых в процессе калибровки в основной программе. Поскольку напряжение Umin — отрицательное, для расчета поправочно- го коэффициента по уравнению (1.6), считанная сумма смещений должна быть при- бавлена к установленному значению Umax. ^5 max Z -Z ЛЛ/тах ^Off MAX ^max +(-^min) На первом этапе подпрограмма Calc_KF рассчитывает сумму Umax + (-Umin). Ре- зультат этой операции находится в регистровой паре Ergl :ErgO. На следующем эта- пе выполняется проверка, действительно ли МАХ > Ergl:ErgO. Если это так и МАХ
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 155 = ErgkErgO + Ах (т.е. Ах = МАХ - ErgkErgO > 0), то частное от деления целочис- ленной составляющей содержит МАХ _ Ergl: ErgO) + Ах _ Ах Ц™ + ErgO Ergl: ErgO Целочисленная часть “1” сохраняется в качестве флага OFlow, а разность Ах = = МАХ - ErgkErgO делится на ErgkErgO. Если же МАХ < Ergl :ErgO, то выполняет- ся полное деление МАХ/Ergl :ErgO, целочисленная составляющая частного в данном случае отбрасывается, флаг OFlow сбрасывается. Требуемая из-за смещения схемы и ошибки усиления погрешность Ах фактического значения Umax + (-Umin) по сравнению с МАХ в любом случае незначительно мала. Таким образом Ах « Ergl: ErgO В качестве результата деления дробная часть поправочного коэффициента на- ходится в Divl :DivO, а целочисленная часть — во флаге OFlow. Подпрограмма Store_Param Подпрограмма Store_Param сохраняет определяемый поправочный коэффици- ент в памяти EEPROM микроконтроллера AVR. При этом он занимает три ячейки памяти KFG:KFBH:KFBL, где KFG — целочисленная составляющая (т.е. только 0 или 1), a KFBH:KFBL содержит дробную часть. Смещение zoff разделено на две ячейки памяти ZOffH :ZOffL. Подпрограмма Verzoegerung Подпрограмма ожидает время, установленное с помощью опции “t” в про- граммной части RepeatLoop, и потом опять передает управление основной про- грамме. Для этого заданное в миллисекундах время сокращается в течение прохож- дения цикла программы до показания счетчика 0. Во время этого цикла в тай- мер/счетчик Т/СО загружается значение (-V1 мс) = —187d. При дополнении до двух - 187а = 45ь = 69а. Начиная с этой исходной величины, таймер до наступления пере- полнения (переход из состояния FFh в состояние 00ь) подсчитывает 187 тактовых импульсов. Частота синхронизации Т/СО составляет 1/64 частоты системной син- хронизации, т.е. 12 МГц / 64 = 187,5 кГц. Таким образом, для 187 тактовых импуль- сов требуется время t = 187 / 187,5 кГц = 1 мс. Цикл программы ожидает переполне- ния Т/СО, и как только о нем просигнализирует флаг TOVO, декрементируется счет- чик цикла tO. Подпрограмма Div_2_D_2_Byt Подпрограмма Div_2_D_2_Byt делит содержимое регистровой пары Divl :DivO на содержимое регистровой пары Ergl :ErgO. Деление осуществляется путем после- довательных операций смещения и вычитания. В зависимости от остатка от деле- ния, частное может быть округлено и хранится в Divl :DivO. Поскольку пересылае- мое в DivkDivO значение МАХ равно содержимому делителя ErgkErgO, значение частного приближается к 1. Подпрограмма Mul_2x2_Bytes Умножение 16-тиразрядного значения в DivkDivO на 16-тиразрядное значение в ErgkErgO выполняется с помощью команд умножения микроконтроллера
156 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR ATmega8. Общий процесс умножения при этом делится на четыре частных умноже- ния 8 • 8 разрядов, а суммы этих произведений складываются “поразрядно” в одно целое: (Divl : DivO) * (Ergl : ErgO) (DivO * EgrO) + (Divl * Ergl) + (Divl * ErgO) + (DivO * Ergl) mul3 : mul2 mull : mulO Дополнительные рекомендации по использованию высокопроизводительных команд умножения можно найти в документе “AVR201: Using the AVR Hardware Multiplier - Examples of using the multiplier for 8-bit arithmetic” на \¥еб-сайте компа- нии Atmel. Файл AVR2 01. pdf можно также найти на прилагаемом к книге компакт-диске в папке Applicat. Подпрограмма Mul_10 Умножение 16-тиразрядного значения в ErgT.ErgO на константу 10 выполняется с помощью команды умножения микроконтроллера ATmega8. Общий процесс ум- ножения при этом делится на два частных умножения по 8 • 8 разрядов, а суммы по- лученных произведений складываются “поразрядно” в одно целое: (Ergl : ErgO) * 10 (ErgO * 10) + (Ergl * 10)___________________ - : Ergl : ErgO Поскольку результат умножения ни в коем случае не должен превышать чис- ленного значения константы МАХ = 4500а = 1194h, он “подходит по размеру” 16-тиразрядной регистровой паре Ergl:ErgO. Подпрограмма WriteEEPROM Подпрограмма WriteEEPROM ожидает завершения текущего процесса записи в память EEPROM, для чего постоянно опрашивает флаг EEWE в регистре управле- ния EECR. Как только флаг EEWE будет сброшен, с целью защиты от сбоев на вре- мя процесса программирования выполняется общий запрет прерываний. После это- го хранимый в tl :t0 адрес ячейки памяти EEPROM может быть записан в адресную регистровую пару EERH:EERL. Хранимый в t2 байт данных записывается в регистр данных EEDR, и затем начинается программирование посредством записи лог. 1 в разряды EEMWE и EEWE регистра EECR. После этого можно разрешить преры- вания. Технология памяти EEPROM и доступ к ней в микроконтроллерах AVR под- робно рассматривается в книге Вольфганга Трамперта “AVR-RISC микроконтрол- леры”. Подпрограмма ReadEEPROM Подпрограмма ReadEEPROM ожидает завершения текущего процесса записи в память EEPROM, для чего постоянно опрашивает флаг EEWE в регистре управле-
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 157 ния EECR. Как только флаг EEWE будет сброшен, с целью защиты от сбоев на вре- мя процесса программирования выполняется общий запрет прерываний. После это- го хранимый в tl :t0 адрес ячейки памяти EEPROM может быть записан в адресную регистровую пару EERH:EERL. Процесс чтения из памяти EEPROM начинается ус- тановкой в лог. 1 разряда EERE в регистре EECR. Считанный байт данных копиру- ется из регистра данных EEDR в t2. После этого можно разрешить прерывания. ЦАП с управлением по прерыванию при использовании ШИМ-аккумулятора В предыдущем подразделе был показан очень простой способ широтно- импульсной модуляции прямоугольных импульсов напряжения. Им можно восполь- зоваться во всех случаях, когда таймер/счетчик Т/С 1 не требуется для других целей и применяется как широтно-импульсный модулятор. Если же востребованы другие цифро-аналоговые входные каналы или есть необходимость в повышении разреше- ния, ШИМ можно реализовать программно, при условии, что при этом допускается значительно более низкая скорость установления выходного напряжения. Данный метод также очень прост, если в качестве “виртуальной периферии” используется ЦАП. Под виртуальной периферией следует понимать программную реализацию отсутствующего аппаратного обеспечения, незаметно работающего “на фоне” основной программы (например, интерфейс 12С, дополнительный таймер или, как в данном случае, — ЦАП с ШИМ). В общем случае, для реализации одной или нескольких виртуальных перифе- рийных функций текущая программа через равные промежутки времени прерывает- ся таймером, после чего выполняется виртуальная функция и происходит возврат к основной программе. Для того чтобы достичь точной периодичности повторений зависимых от вре- мени функций, в начале подпрограммы обработки прерывания целесообразно раз- мещать те функции, время выполнения которых постоянно. Периферийные же функции, время выполнения которых варьируется на основании ветвления, добав- ляются к части с постоянной кодовой последовательностью. Алгоритм формирования ШИМ-сигнала В данном случае для реализации ШИМ-сигнала с разрешением N разрядов ис- пользуется переполнение при сложении N-разрядного числа Z с некоторым ШИМ- аккумулятором. Алгоритм проиллюстрируем на следующем примере. Если ШИМ имеет разрешение 3 разряда, то длительность 23 = 8 шагов сумми- рования должна соответствовать коэффициенту заполнения g = 5/8. При этом выполняются следующие операции сложения: Шаг ШИМ-аккумулятор + z = Переполнение Upwm] Результат сложения 1 ОООь + 101b = 0] 101b 2 101ь + 101b = 1] 010b 3 010ь + 101b 0] 111b 4 111ь + 101b = 1] 100b 5 ЮОь + 101b 1] 001b 6 001b + 101b 0] 110b 7 110ь + 101b = 1] 011b 8 011b + 101b = 1] 000b 9 = 1 000b + 101b = 0] 101b
158 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Как видим, при непрерывном сложении числа Z = 5 с трехразрядным аккумуля- тором из восьми операций пять приводят к появлению лог. 1 ШИМ-сигнала в виде переполнения (рис. 4.23). PWM О —т —Т 8 PWM 2 PWM UPWM2 — Т 2 ’PWM t 2Трмм 5 -г т 3 т 2 ' pwm д’ ’pwm PVVM 2 PWM Рис. 4.23. Два разных ШИМ-сигнала с одинаковым коэффициентом заполнения g = 5/8 Как видно из рис. 4.23, форма сигнала upwmi заметно отличается от известного по рис. 4.1 ШИМ-сигнала uPWM2 с непрерывными уровнем лог. 1 или лог. 0. Среднее арифметическое значение UM, имеющее большое значение для цифро- аналогового преобразования, для обоих сигналов равно, поскольку коэффициент за- полнения upwmi может быть рассмотрена как соотношение длительности всех им- пульсов к общей длительности периода, т.е. У t. / jem S = — 1 PWM (4-21) Еще одно из преимуществ — высокочастотные составляющие в сигнале upwmi, которые в значительной мере подавляются при прохождении фильтра нижних час- тот. Переполнение возникает в граничных случаях Z=1hZ = 2n-1, а также при каждой 2n-K операции сложения. В связи с этим, граничная частота фильтра нижних частот должна быть связана с этой ШИМ-частотой. В общем случае считается, что при непрерывном сложении N-разрядного числа Zee N-разрядным ШИМ-аккумулятором для формирования ШИМ-сигнала с раз- решением 2n при каждой “2/2”-й операции сложения возникает переполнение в N+1 разряде аккумулятора. Благодаря этому, ШИМ-сигнал при каждой 2N-fi опе- рации сложения, охватывающей период TPWM, содержит ровно Z уровней лог. 1 в виде переполнения при сложении. Уравнение (4.21) при этом принимает вид: У t Z / j ет ГТ1 1 PWM (4-22) Среднее арифметическое значение Um такого ШИМ-сигнала с учетом уравне- ний (4.3) и (4.22) может быть представлено в виде: 7 UM=QJH -UL)-g + UL=(UH+ М \ /7 L 7 О L X Ц L 7 L 7 (4.23)
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 159 где, UH — уровень лог. 1; Ul — уровень лог. 0; g — коэффициент заполнения; Z — количество лог. 1 в ШИМ-сигнале; N— разрешение в разрядах. Пример ШИМ-генератора в качестве “виртуальной периферии” В данном случае с помощью прерывания от таймера формируются два ШИМ- сигнала PWM0 и PWM1. Сигнал PWM0 должен иметь разрешение 11 разрядов, а для PWM1 достаточно разрешения 8 разрядов. С целью контроля, на выходе Toggle дополнительно устанавливается сигнал с периодом, соответствующим двойному периоду между двумя прерываниями от таймера/счетчика Т/СО. Счетный регистр TCNT0 таймера/счетчика Т/СО переполняется в данном случае каждые 10 мкс, благодаря чему на выходе Toggle регистрируются импульсы с час- тотой 50 кГц. Программа К4_1_3 DAC per PWM-Akku. asm для микроконтроллера ATmega8 реализуется на тестовой плате, описанной в разделе 4.3. Файл K4_l_3 DAC per PWM-Akku. asm можно также найти на прилагаемом к книге компакт- диске в папке Program. Листинг 4.2. Реализация ШИМ-генератора в качестве “виртуальной периферии” — С программаК4_1_3 dac per PWM-Akku.аят ;* Программа: ЦАП с ШИМ в качестве "виртуальной периферии" ;* Версия: 1.0 ;* Целевое устройство: ATmega8 ;* Частота системной синхронизации: 12 MHz ;* Описание: Два ШИМ-счетчика в подпрограмме обработки прерывания ;* циклически увеличиваются на выходную величину Z. Бит ; * переполнения выдается в качестве ШИМ-сигнала. ;* ЦАПО имеет разрешение 11 разрядов. ; * ЦАП1 имеет разрешение 8 разрядов. г * nolist include "С:\Programme\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc" list ;***** Определения equ PPWM = PORTD /Выходное порт для'ШИМ-сигнала equ pwmO = PD3 ;Вывод 3 порта D - выход для канала 0 equ pwml = PD5 /Вывод 5 порта D - выход для канала 1 equ Toggle = PD4 /Вывод 4 порта D - контрольный equ zO = 778 /Выходное значение = $30А -> U арифм. = 1,899 В / при Vcc = 5 В equ zl = 74 /Выходное значение = $4А -> U арифм = 1.445 В / при Vcc = 5 В equ Takte = 120 /Количество тактовых импульсов до следующего / прерывания. /120 импульсов при f = 12МГц -> интервал 10 мкс Регистровые переменные
160 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Листинг 4.2. Продолжение def zrOL = rlO def zrOH = rll def zrl = rl2 def accOL = rl3 def accl = rl4 def Save = rl5 def to = Г16 def tl = rl7 def accOH = rl8 def iO = r20 def il = r21 Код /Младший байт значения перезагрузки PWM0 /Старший байт значения перезагрузки PWM0 /Значение перезагрузки PWM1 /Младший байт аккумулятора PWM0 /Аккумулятор PWM1 /Буфер для сохранения SREG в случае прерывания /Временный рабочий регистр /Временный рабочий регистр /Старший .байт аккумулятора PWM0 /Временный рабочий регистр прерывания /Временный рабочий регистр прерывания . cseg . org 0 rjmp Initial /Адрес рестарта . org OVFOaddr /Адрес вектора прерывания при переполнении ТСО in Save,SREG /Сохраняем SREG in iO,TCNTO /Извлекаем текущее содержимое счетчика Т/СО subi iO,Takte-3 /Заново устанавливаем таймер: out TCNTO,iO / длительность интервала минус / время выполнения первых трех команд in iO,PPWM /Извлекаем последнее содержимое порта ШИМ cbr iO, l«pwm0 | l«pwml ;Очищаем все разряды ШИМ cbr accOH,$F8 /Очищаем разряды 3..7 в старшем байте / аккумулятора PWM0 add accOL,zrOL /Прибавляем к аккумулятору PWM0 младший байт / значения перезагрузки adc accOH,zrOH /Прибавляем к аккумулятору PWM0 старший байт / значения перезагрузки bst accOH,3 /Переполнение (разряд 3) - в флаг Т bld i 0, pwmO /переполнение = ШИМ-выход канала 0 add accl,zrl /Прибавляем к аккумулятору PWM1 / значение перезагрузки brcc Ml /Переход, если нет переполнения sbr Ml: iO,l<<pwml /Переполнение = ШИМ-выход канала 1 eor iO, il /Переключаем контрольный выход out PPWM,iO /Выводим новое ШИМ-значение out reti SREG,Save /Восстанавливаем SREG Initial: /Инициализация микроконтроллера AVR ldi tO,Low(RAMEND) out SPL,tO /Инициализируем младший байт указателя стека ldi tO,High(RAMEND) out SPH,tO /Инициализируем старший байт указателя стека InitPorts: ldi tO, (l<<pwm0) | (l<<pwml) | (l«Toggle) /Конфигурируем выводы out DDRD,tO / порта D как выходы InitDAC:
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 161 Пиггин~ 4.2. Окончание Ldi tO,Low(zO) /Выходное значение для ШИМ-канала 0 nov zrOL,tO Ldi tO,High(zO) nov zrOH,tO Ldi tO, zl /Выходное значение для ШИМ-канала 1 nov zrl,tO LnitTCO: Ldi tO, 1«TOIEO /Разрешаем прерывания от Т/СО out TIMSK,to /Разрешаем прерывание при переполнении Т/СО Ldi to,$01 /CSO[2..O] = $01 - Т/СО тактируется out TCCRO,tO / с частотой системной синхронизации sei /Общее разрешение прерываний • ★ * ★ ** Основная программа Haupt: ldi il,l«Toggle /Вспомогательный регистр для связи по ; "Исключающему ИЛИ" rjmp Haupt /Ожидаем прерывания от Т/СО .exit Описание программы Часть инициализации После установи указателя стека происходит конфигурирование выводов PD3 (сигнал pwmO), PD5 (сигал pwml) и PD4 (сигнал Toggle) порта D как выходов. Регистр перезагрузки zrOH:zrOL 11-тиразрядного и zrl 8-миразрядного широтно- импульсного модулятора инициализируется стартовым значением zO =778d =30Ah или zl =74d = 4 Ah. Согласно уравнению (4.23), это соответствует среднему арифметическому зна- чению: L' =(ин-и,)-Д- + и, =5B-2Z°- = 1,899В МО \ Н LJ L 2048 выходного напряжения pwmO и Z 74 UMX =(Uh-Ul)—- + Ul=5B------------= 1,4455 Ml v li L S L 256 5 выходного напряжения pwml при условии, что Uh = 5 В и UL = 0 В. Разрешение pwmO составляет: 1LSB = 5В —!— = 2,44 мВ. 2048 А разрешение pwml равно: ILSB = 5В •— = 19,53 мВ. 256 ) Измерение
162 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Стартовые значения zO и zl выбираются произвольно так, чтобы после включе- ния получить определенное значение для проверки функции. При измерении с по- мощью мультиметра оба тестовых значения могут быть сопоставлены с достаточно высокой точностью. Таймер Т/СО генерирует такт для широтно-импульсных модуляторов pwmO и pwml. Установка в лог. 1 разряда TOIEO в регистре TIMSK разрешает прерывание при переполнении Т/СО, благодаря чему при переходе счетчика от FFh к 00ь выпол- няется соответствующая подпрограмма обработки прерывания. Предварительный делитель Т/СО инициализируется записью в регистр управле- ния TCCR0 значения 01ь, что соответствует тактирования с частотой системной синхронизации fSYs = 12 МГц. При такой частоте для 120 тактовых импульсов в про- межутке между двумя прерываниями требуется 10 мкс. После общего разрешения прерываний может быть начато выполнение основ- ной программы. Основная программа Основная программы состоит из бесконечного цикла, внутри которого непре- рывно устанавливается разряд 4 (Toggle) вспомогательного регистра il. Конечно же, эту маску, необходимую лишь для инвертирования Toggle в подрограмме об- работки прерываний с помощью операции “Исключающее ИЛИ”, можно было бы определить один раз в начале основной программы вне цикла повторений, однако в этом случае основной программе нечего делать. Подпрограмма обработки прерывания при переполнении Т/СО Вначале подпрограммы обработки прерывания выполняется сохранение регист- ров состояния и загрузка значения Takte в таймер Т/СО, что необходимо для уста- новки времени до следующего прерывания. Благодаря этому между двумя прерыва- ниями выдерживается постоянный интервал 10 мкс. При вызове подпрограммы обработки прерывания счетный регистр TCNTO имеет состояние $04 или $05, что обусловлено четырьмя тактами на обработку за- проса на прерывание и, возможно, еще одним тактом в том случае, если переполне- ние возникает во время выполнения команды длительностью один или два тактовых цикла. Для того чтобы загрузить точное значение интервала, из загруженного ранее в рабочий регистр 10 содержимого регистра TCNT0 вычитается выходная величина Takte = 120, поскольку Т/СО — суммирующий счетчик. С учетом времени выпол- нения трех команд in Save, SREG in iO, TCNTO subi iO, Takte-3 длительность интервала, представленная константой Takte, перед получением раз- ности и загрузки ее в счетный регистр TCNTO дополнительно уменьшается на 3. Интервал между двумя прерываниями таймера обозначается как Tint и в данном случае составляет 10 мкс. Результирующая частота Гщим для разрешения N разрядов рассчитывается по формуле: f =________!___ Jшим ~N т 2 ‘ hnt
4.1. Цифро-аналоговое преобразование с использованием широтно-импульсной модуляции 163 В таком случае, частота для широтно-импульсный модулятор pwmO с разреше- ием 11 разрядов составляет: PWMO — 1 211 -10 мкс = 48,83 Гц, для модулятора pwml с разрешением 8 разрядов: 1 PWMl ~N т 2 ' *Int 1 28 10 мкс = 390,6 кГц. Учитывая эти частоты, фильтры нижних частот должны быть установлены та- им образом, чтобы сглаживать выходное напряжение. На следующем этапе выполняется подготовка операций ШИМ-сложения. Те- ущее содержимое порта D, через который происходит передача выходных сигна- ов pwmO и pwml, загружается в рабочий регистр Ю. Оба разряда pwml и pwmO очи- щются, чтобы в итоге быть сгенерированными заново. После очистки пяти старших разрядов в ac0H:acc0L (аккумулятор pwmO) значе- ие перезагрузки в zrOH:ztOL, соответствующее среднему значению выдаваемого остоянного напряжения, прибавляется к старому содержимому accOH:accOL. Пере- олнение, возникающее после прибавления 11-го разряда аккумулятора ccOH:accOL, является выходным сигналом 11-тиразрядной ШИМ. Таким образом азряд 3 ассОН копируется в разряд pwmO = PD3 выходного порта модулятора. Аналогичная методика применяется и для значением перезагрузки zrl: оно уммируется со старым содержимым accl (аккумулятора pwml). В этом 8-мираз- ядном широтно-импульсном модуляторе возможна оценка переполнения непо- редственно с помощью флага С регистра состояния. Если после операции сложе- ия этот флаг установлен, то установленный в Ю выходной разряд выводится через орт pwml = PD5, в противном случае он остается в состоянии лог. 0. В конце подпрограммы обработки прерывания формируется выходной сигнал oggle. Поскольку связь по операции “Исключающее ИЛИ” с лог. 1 приводит к ин- ертированию, можно легко получить прямоугольный импульс на выходе Toggle = D4 микроконтроллера AVR, связав таким образом разряд 4 выходного порта регистре Юс маской 0001 0000b в il. Остальные разряды в il остаются незадей- гвованными, поскольку связь по “Исключающему ИЛИ” не затрагивает лог. 0. Вы- од Toggle инвертируется при каждом прогоне подпрограммы обработки прерыва- ия, и, таким образом, после двух прерываний возвращается в исходное состояние. 1о этой причине на Toggle выдается прямоугольный импульс напряжения, период оторого составляет удвоенный интервал между двумя прерываниями от Т/СО. Та- им образом, при интервале между двумя прерываниями 10 мкс частота импульсов а выходе Toggle составляет 50 кГц. Сформированные значения pwmO, pwml и Toggle выдаются на выходной порт PWM, и после восстановления регистра состояния подпрограмма обработки пре- ывания завершается. В данном случае сохранение регистра состояния излишне, поскольку основная рограмма не оценивает флаги, однако из соображений безопасности поучиться та- ому подходу не помешает.
164 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR 4.2. Цифро-аналоговое преобразование с помощью встроенного АЦП микроконтроллера AVR Хотя в микроконтроллерах AVR и предусмотрена возможность использование таймера/счетчика Т/Cl в качестве широтно-импульсного модулятора (см. предыду щий раздел) и преобразования цифрового числа в аналоговое значение, конкретной аппаратного средства, выполняющего функции ЦАП не предлагается. Тем не менее для облегчения цифро-аналогового преобразования может быть использована ещ одна особенность аппаратного обеспечения микроконтроллеров AVR. Речь идет о представленном в разделе 3.1 встроенном АЦП микроконтроллер! AVR, который в данном случае представляет собой часть замкнутого контура регу лирования и выдает “действительные” или управляющие величины х системы регу лирования, представленной на рис. 4.25. Программное обеспечение микроконтрол лера AVE берет на себя задачу передавать выходное напряжение Ыцап (регулируе мая величина X) в установленное “плановое” значение (задающее воздействие W) i поддерживать его. На рис. 4.24 представлена обобщенная блок-схема контура регулирования. Рис. 4.24. Принципиальная блок-схема контура регулирования Регулятор корректирует объект регулирования (в нашем случае — выходно напряжение ЦАП) посредством управляющего воздействия Y исполнительного эле мента так, что рассогласование W - X относительно задающего воздействия W ми нимально. Возможное влияние возмущений на контур регулирования обозначено Hi рис. 4.24 в виде возмущающего воздействия Z. Если же в контуре регулирования присутствует микроконтроллер, то регулято] может быть выполнен согласно рис. 4.25. Рис. 4.25. Замкнутый контур регулирования с микроконтроллером AVR в качестве регулятора
4.2. Цифро-аналоговое преобразование с помощью встроенного АЦП микроконтроллера AVR 165 Практическая реализация ЦАП с помощью встроенного АЦП микроконтроллера AVR В простейшем случае для формирования аналогового напряжения Ицдп исполь- уется непосредственно выходной каскад порта микроконтроллера AVR с подклю- енным к нему RC-фильтром нижних частот (рис. 4.26). Рис. 4.26. Простой ЦАП с использованием встроенного АЦП микроконтроллера AVR в контуре регулирования Даже в этом простом примере можно найти компоненты из рис. 4.25. Объектом егулирования в данном случае является конденсатор С, на котором сохраняется ыходное напряжение Оцап, соответствующее регулируемой величине X. Исполни- ельный элемент состоит из резистора R и управляется сигналом на выходе порта [икроконтроллера AVR, выступающего в данном случае “одноразрядным ЦАП”. (ля преобразования аналоговой регулируемой величины X в цифровое значение используется встроенный АЦП микроконтроллера AVR, а возмущающее воздей- твие Z формируется нагрузочным сопротивлением RL конденсатора (на рис. 4.26 не оказано). Оно приводит к понижению регулируемой величины X в случае, если онденсатор С не подзаряжается через R. Встроенный АЦП микроконтроллера AVR в данном случае работает в автоном- ом режиме, в котором он в цикле с периодом Tw выдает последнее цифровое зна- ение х для аналоговой регулируемой величины X = Оцан- Одно преобразование в автономном режиме АЦП длится Tw = 13/Гдцп, причем \цп = Е“ Делитель” — частота тактирования АЦП, установленная с помощью разря- рв ADPSO, ADPS1 и ADPS2 регистра ADCSRA (см. табл. 4.4). Из этого отношения южно получить Tw: _ \Ъ- Делитель lw ~ 7 J Sys В зависимости от того, положительна или отрицательна разность D = W - X за- анного значения W и фактического значения X, на резистор R через выход порта [икроконтроллера подается напряжение UY = VCc или UY = О В, и в результате кон- енсатор, соответственно, заряжается или разряжается. Это приводит к появлению нежелательного переменного напряжения Ubiss, ревышающего выходное постоянное напряжение Пцан- Он тем больше, чем ближе 1цап находится к границам диапазона Ub или “земле”. Если же незаряженный конденсатор С заряжается через резистор R до рабочего апряжения Ub, то напряжение Uc возрастает согласно формуле
166 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR £ мС(/) = Uв • (1 - е т), где т = R С. Если же заряженный конденсатор С разряжается до рабочего напряжения Ц через резистор R, напряжение Uc падает в соответствии с формулой t ис(п = ив'е т> г^е т — R’с. Рис. 4.27. Зарядка и разрядка конденсатора С через резистор R Если на конденсаторе перед началом зарядки уже есть напряжение Uco, то nocni подачи напряжения Ub > Uco напряжение Uc(t) возрастает согласно формуле wc(o в (Цв Uсо)е тj где т — R • С. (4.24 Соответственно, напряжение заряженного до уровня Uco конденсатора С пр] его разрядке через резистор R падает согласно формуле t uc(t) = ^со 'е т-> г^е г = RC. (4.25 Как видно из рис. 4.27, напряжение Uco на конденсаторе, заряженном до не большого уровня, в пределах четко установленного времени преобразования Ц АЦП возрастает быстрее, чем напряжение на конденсаторе, заряженном до боле' высокого уровня. И наоборот, напряжение на конденсаторе, заряженном до невысо кого уровня, падает значительно медленнее, чем напряжение на конденсаторе, за ряженном до высокого уровня. На рис. 4.29 представлены неустановившиеся процессы для трех различных вы ходных напряжений: Нцаго = 0,1 • UB; Uqxm = 0,5 • UB и Нцалз = 0,9 • UB, — если в< всех трех случаях скорость преобразования встроенного АЦП микроконтроллер. AVR находится в пределах Tw = 0,1 • т = 0,1 • R • С, а алгоритм регулирования мик
4.2. Цифро-аналоговое преобразование с помощью встроенного АЦП микроконтроллера AVR 167 роконтроллера предусматривает разрядку или зарядку конденсатора С за время Tw при переходе через заданное значение W. Блок-схема этого простого алгоритма регулирования представлена на рис. 4.28. Рис. 4.28. Блок-схема подпрограммы для простого ЦАП, продемонстрированного на рис. 4.26 Как видно из рис. 4.29, переменное напряжение для выбранной в данном при- мере скорости преобразованияTw = 0,1 • т = 0,1 • R • С чрезмерно высоко, особенно в области границ диапазонов О В и UB. Выйти из этой ситуации можно, уменьшив Tw до 0,01 т или 0,001 т, но при этом будет увеличиваться период установления. Рис. 4.29. Переходный процесс ЦАП, показанного на рис. 4.26, для трех различных выходных напряжений: Оцап! = 0,1 UB; ОцАпг = 0,5 • UB и иЦАпз = 0,9 UB — при Tw = 0,1 • т
168 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Поясним это на следующем примере. Максимальная возможная частота такти- рования АЦП микроконтроллера AVR составляет Гдцп = 200 кГц, соответственно время преобразования в автономном режиме составляет Tw = 13/ Гдцп = 65 мкс. Если при этом выбрать постоянную времени RC-звена т = 1000 • Tw = 65 мс, то зарядка предварительно разряженного конденсатора С до значения Пцап = 0,9 • Ub становит- ся возможна только через время: t = - т • In (1 - Пс/ UB) = - 1000 • 65 мкс • In (1 - 0,9 • UB/ UB), т.е. t = 0,15 с. За время преобразования Tw, требуемое преобразователю для получения нового результата, в ходе выполнения подпрограммы, соответствующей рис. 4.28, возника- ет дополнительный “простой” в регулировании. В результате за период преобразо- вания Tw выходное напряжение продолжает изменяться в установленном направле- нии, хотя при переходе через заданную величину потребовалась бы коррекция в другом направлении. Вследствие этого эффекта дополнительно повышается нало- женное переменное напряжение. На рис. 4.30 представлено увеличенное изображе- Рис. 4.30. Напряжение UC(t) на конденсаторе С ЦАП, показанного на рис. 4.26, и результат аналого- цифрового преобразования этого напряжения Полезным может быть переключение выхода микроконтроллера AVR во время аналогово-цифрового преобразования в высокоомное состояние для измерения фак- тического выходного напряжения. В данном случае при измерении выходное на- пряжение не изменяется, а процесс регулирования разделятся на периоды измерения и зарядки/разрядки. Лучшее решение поэтому представляет собой схема, продемонстрированная на рис. 4.31. В данном случае конденсатор С заряжается и разряжается линейно через ре- зистор R, поскольку он находится в линии отрицательной обратной связи операцион- ного усилителя VI. Операционный усилитель интегрирует выходное напряжение порта микроконтроллера UY, которое в противном случае составляет 0 В или VCc- Неинвертирующий вход операционного усилителя VI, включенного в качестве инвертирующего интегратора, имеет потенциал 0,5Vcc. Исходя из этого, выходное напряжение UY = 0 В микроконтроллера AVR имеет потенциал - 0,5VCc, а выходное напряжение UY = VCc — потенциал +0,5VCc- Благодаря этому существует возмож-
4.2. Цифро-аналоговое преобразование с помощью встроенного АЦП микроконтроллера AVR 169 ность управлять интегратором с помощью униполярного рабочего напряжения мик- роконтроллера в обоих направлениях от ицдп = О В до иЦАп = Vcc- Если в качестве VI используется операционный усилитель типа “Rail-to-Rail” [то есть, с размахом выходного сигнала, достигающим напряжения питания), как, например, ОРА3240 производства Texas Instruments, то схема может работать на единственном рабочем напряжении Vcc- В случае использования традиционного эперационного усилителя (например, LF356 или TL081), схема требует двойного напряжения питания V" > VCc + 2 В и V < -(VCc + 2 В). Для Ицап = Usoii (т.е., когда выходное напряжение Ицап имеет то же значение, что и требуемое значение W) выходной порт микроконтроллера переключается в высокоомное состояние. В таком случае С — это высококачественный пленочный конденсатор с малыми токами утечки, что необходимо для минимизации дрейфа выходного напряжения Ицап в третьем состоянии порта микроконтроллера, вызван- ного саморазрядкой. Если мгновенное выходное напряжение Оцдп ниже требуемого значения W, то напряжение на конденсаторе Uc должно возрастать, поскольку Ицап = Vcc/2 + Uc- При этом выходное напряжение UY порта микроконтроллера составляет О В. При этом ток IR = 1с течет в указанном на рис. 4.31 направлении через R и С, конденса- тор С заряжается, напряжение иЦАп возрастает. Рис. 4.31. Улучшенный исполнительный элемент для ЦАП Если мгновенное выходное напряжение Ицап выше требуемого значения Ц, на- пряжение на конденсаторе Uc должно падать. Напряжение Uy устанавливается на эдном уровне с Vcc, что необходимо для изменения направления тока IR = 1с через R и С (см. рис. 4.31), конденсатор С разряжается, и Ицап уменьшается. Если необходимо переключить выход UY в высокоомное состояние, соответст- вующий вывод переключается с помощью регистра управления DDRx (х — имя порта, например, D) конфигурируется как вход. В результате порт будет иметь вы- сокое сопротивление, поскольку микроконтроллеры AVR изготавливаются по тех- нологии КМОП. Если необходимо переключить выход UY из высокоомного состояния в О В, дос- таточно установить в лог. О соответствующий разряд в регистре управления PORTx х — имя порта, например, D), а вывод сконфигурировать с помощью регистра /правления DDRx как выход. Если необходимо переключить выход UY из высокоомного состояния в UY = = Vcc, достаточно установить в лог. 1 соответствующий разряд в регистре управле- ния PORTx, а вывод сконфигурировать с помощью регистра управления DDRx как эыход(лог. 1).
170 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR По сравнению со схемой, представленной на рис. 4.26, схема, изображенная на рис. 4.31 имеет дополнительное преимущество: конденсатор С не нагружается по- следующими частями схемы, поскольку операционный усилитель VI действует как буфер, понижающий полное выходное сопротивление. Выходное напряжение иЦАп имеет разрешение встроенного АЦП, т.е. десять разрядов, что соответствует диапазону величин: 0<W<210- 1, то есть 0<W< 1023. Для W = 0 выходное напряжение Пцап = 0 В, а для W = 1023 — VCc - 1 LSB = = 5,12 В - 5 мВ = 5,115 В, при условии, что Vcc равно 5,12 В. В целом Ицап имеет значение: V W UIun=~^-W = Vcc-!—, где 0<W<1023. (4.26) 2io сс Ю24’ Поскольку неинвертирующий вход VI имеет постоянный потенциал 0,5 VCc, а инвертирующий вход из-за отрицательной обратной связи имеет такой же потенци- ал, для тока Ir, протекающего через резистор R (а значит и для тока 1с, что обуслов- лено высоким полным сопротивлением входа VI), получаем: Ir = 1с = (0,5 Vcc - Uy) / R = неизменный для Uy = константна. Если конденсатор С заряжается неизменным током 1с, то действительно сле- дующее отношение: A Jc А Awr = — А/ с с Это — уравнение прямой с наклоном 1С / С. В соответствии с этим, конденсатор С разряжается и заряжается линейно, а для его напряжения Uqt) действительно: (1/2Ксс-Сг) < . С<,) ЯС со (4.27) где Uco — напряжение, до которого был заряжен конденсатор С к моменту t = 0 пе- ред началом зарядки. Выходное напряжение Пцап схемы составляет: TI — ^сс । — (Усс . jj (лэпл Uцап ~ э +uc(t) ~ ~ + t/co • (4-28) z z • ЛС где UY может принимать значение 0 В или Vcc- Микроконтроллер ATmega8 должен иметь частоту системной синхронизации в пределах fSys =12 МГц. Период для fSys составляет TSys = 1/fsvs = 83,3 нс. Для АЦП fsys делится на 64, и в результате его частота тактирования составляет Гацп = 12 МГц / 64 = 187,5 кгГц. В автономном режиме работы АЦП для проведения полного преобразования требуется 13 тактов с частотой Гдцп- Таким образом, время Tw, затрачиваемое на по- лучение результата, составляет: Tw = 13 • 1/Ццп = 69,3 мкс.
4.2. Цифро-аналоговое преобразование с помощью встроенного АЦП микроконтроллера AVR 171 На выполнение команд sbi и cbi, отвечающих за установку и сброс некоторого разряда порта ввода-вывода, уходит два такта системной синхронизации микрокон- троллера. За время этих двух тактов выходное напряжение Пцап должно измениться ровно на один младший разряд (LSB). Это необходимо для того, чтобы иметь воз- можность откорректировать небольшие изменения Оцагъ возникающие при дрейфе выходного напряжения. При опорном напряжении АЦП в пределах 5,12 В и разрешении десять разрядов 1 LSB = 5,12 В / 210 = 5 мВ, если Vcc = 5,12 В. Требуемая скорость возрастания Auqt/At напряжения на конденсаторе может найдено из уравнения: 1 LSB 5 мВ мВ At 1TSYS 2 • 83,3 нс мкс Значение Auqt/At можно также определить по формуле (4.27): ДиС(,) (\!2Vcc-Vy) Ы RC Разрешая эти два уравнения относительно RC, при UY = 0 В получаем: Rс = (0,5Fcc-Kr) = (1/2^12В-0В) = 85>3 мкс &uC(t) 30 мВ /мкс At Для R следует выбирать значение достаточно большое по отношению к выход- ному сопротивлению активного порта микроконтроллера, хотя и меньшее входного сопротивления операционного усилителя и высокоомного выхода микроконтролле- ра. Так, при R = 18 kQ, получаем выражение для С: С = 85,3 мкс /18 кП = 4,74 нФ. Ближайшее значение из стандартного ряда С = 4,7 нФ. При этих значениях R и С для Auqt/At получаем: Дг/С(() (0,5Ксс-Кг) 2,56 В At RC 18 к£1-4,7 нФ мкс За время преобразования Tw = 69,3 мкс значение AuC(t) теоретически может из- мениться на: Auc(t)max= 30,26 мВ / мкс ' 69,3 мкс = 2,097 В. Таким образом, весь диапазон входного напряжения 0 В < иЦАП < 5,115 В мож- но пройти за период меньше 2,5 • Tw. Получаем значение W из уравнения (4.26): W - Ццли . 210 V г сс При VCc = 5,12 В и Пцап = Auc(t) = 2,097 В ширина шкалы smax, которая может быть перекрыта за время Tw, составляет:
172 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR smax =^^=i-.210 = 2,097В 1024 = 419rf =lA3h m“ Vcc 5,12В " h (4.29) Алгоритм регулирования ЦАП Блок-схема алгоритма для объекта регулирования (см. рис. 4.31) представлена на рис 4.32. Рис. 4.32. Улучшенный алгоритм управления ЦАП в контуре регулирования
4.2. Цифро-аналоговое преобразование с помощью встроенного АЦП микроконтроллера AVR 173 АЦП микроконтроллера работает в автономном режиме, в котором он при вы- бранной тактовой частоте преобразователя 187,5 кГц генерирует новое фактическое значение х каждые 69,3 мкс. Значительного улучшения качества регулирования можно добиться, если вклю- чить в процесс регулирования значение разности d между требуемой заданной ве- личиной w и фактической величиной х = Ицап. Время, в течение которого выход Uy микроконтроллера AVR остается активным в состоянии лог. О или лог. 1, выбирает- ся пропорционально разности d между заданной величиной w и фактической вели- чиной х. По этой причине в подпрограмме обработки прерывания для каждого нового фактического значения х рассчитывается разность от заданного значения w, а на пе- риод времени, пропорциональный этой разности, на выход UY микроконтроллера выдается напряжение О В или Vcc- Подпрограмма обработки прерывания от АЦП прерывает программу по истече- нии времени преобразования Tw (каждые 69,3 мкс). Время выполнения подпро- граммы должно быть меньше периода Tw между двумя прерываниями, чтобы у ос- новной программы в распоряжении был достаточный запас времени. По этой до- пускается только ограниченное количество команд sbi и cbi, чтобы перекрыть оп- ределенную ширину шкалы. Выберем ширину шкалы максимум 64 LSB. Во время выполнения команды sbi напряжение на конденсаторе С возрастает на 1 LSB. На поочередное выполнение 64-х команд sbi затрачивается время: tbmax = 64 • 2 • Tsys = 128 83,3 мкс = 10,67 мкс. За это время напряжение на конденсаторе возрастает согласно формуле (4.27) на _ (0,5 Ксс - VY )tL _ (2,56 В - 0 В) • 10,67 мкс А^Стах — RC 84,6 мкс = 323 мВ. После (5,115 В / 323 мВ) = 15,85 вызовов подпрограммы обработки прерывания диапазон для выходного напряжения теоретически составляет 0 В < иЦАп < 5,115 В. В зависимости отклонения d от заданной величины w, для установки разности, пропорциональной временному интервалу, применяют три способа. • Значительное отклонение фактической разности d от заданного значе- ния w (d > 64). В этом случае на выходе микроконтроллера AVR на время выполнения максимум 64 следующих друг за другом команд sbi устанавли- вается уровень напряжения UY = 0 В или UY = VCc, поскольку разность между фактическим и заданным значением в период одного цикла аналого-цифро- вого преобразования не может быть уравновешена. • Умеренное отклонение фактической разности d от заданного значения w (2 < d < 64). Поскольку, согласно принятому выше соглашению, выходное напряжение Ицап в течение двух тактов системной синхронизации при UY = 0 В возрастает на 1 LSB, a Uy= Vcc уменьшается на 1 LSB, а команда sbi, отвечающая за установку разряда порта ввода-вывода микроконтроллера AVR, длится два такта, то отклонение d = п LSB от заданного значения w может корректироваться с помощью п последовательных команд sbi. В данном случае выходной порт включается на время, пропорциональное d, и выключается, благодаря изменению направления передачи данных с помо- щью команд sbi и cbi.
174 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Если же фактическое значение х на d = 5 меньше заданного значения w, то порт Uy переключается в состояние лог. О (Uy = О В), после чего выполняют- ся пять команд sbi, что переводит порт в состояние активного выхода. Затем следует команда cbi, вновь переводящая порт Uy в состояние высокоомного входа. • Небольшое отклонение фактической разности d от заданного значения w (d<2). В этом случае требуемое заданное значение практически достигнуто. Оставшееся расстояние преодолевается в пошаговом режиме с шагом в один LSB, что позволяет избежать колебания иЦАП около заданного значения. Таким образом можно добиться очень точной настройки заданного значения, когда достаточно компенсировать лишь небольшие отклонения, вызванные падением напряжения на конденсаторе вследствие саморазрядки. При обычной регулировке, алгоритм которой изображен на рис 4.28, возникает простой, при котором новое значение напряжения Ицап и вместе с ним фактическое значение х всегда выдается только по истечении времени преобразования Tw. В случае расширенного алгоритма данного эффекта удается избежать благодаря то- му, что образуемые во время активной фазы выхода микроконтроллера значения АЦП в оценке не используются. Если же в течение текущего преобразования возни- кает необходимость в изменении Оцап, то значение преобразования объявляется “некорректным” посредством сброса флага VALID. После завершения преобразова- ния подпрограмма обработки прерывания опрашивает этот флаг и отвергает полу- ченный результат. Однако следующий результат опять считается корректным, по- скольку в ходе выполнения подпрограммы обработки прерывания не происходит никакой активности, и устанавливается флаг VALID. Соответственно, чередуются и интервалы интеграции и измерения. Ход процесса регулирования во времени фактического выходного значения от х = 0 до нового заданного значения w = 0,90652-Vcc проиллюстрирован на рис. 4.33. Рис. 4.33. Регулирование согласно алгоритму, представленному на рис. 4.32 К моменту t = 0 новое заданное значение устанавливается для иЦАП = 0,90625 • Vcc = 4,64 В, соответственно w = 928d = 3A0h. Фактическое напряжение UilAn к это- му моменту имеет заранее установленное значение Ицап = 0 В (см. рис. 4.33). К мо- менту tl первое преобразование встроенного АЦП завершено, и аналоговое значе- ние Uцап = 0 В представляется в виде цифрового значения х = 0.
4.2. Цифро-аналоговое преобразование с помощью встроенного АЦП микроконтроллера AVR 175 Согласно алгоритму, продемонстрированному на рис. 4.32, в момент tl начатая подпрограмма обработки прерывания проверяет, получено ли в результате только что законченного преобразования корректное фактическое значение (флаг VALID =1), или же во время последнего интервала был активен выход UY (флаг VALID = 0), в результате чего выходное напряжение было изменено и результат преобразования недействителен. Если флаг VALID = 1 и результат х корректен, то происходит расчет значения и знака разности d между заданным значением w и фактическим значением х. В дан- ном примере d = 928d - 0d = 928d. Если же d = 0, то фактическое значение идентично заданному, операции для коррекции результата не нужны, что позволяет выйти из подпрограммы обработки прерывания. Если установленная разность d < 2, то фактическое значение х или Ицап очень близко к заданному значению w, и окончательное приближение к конечному ре- зультату выполняется пошагово по 1 LSB, что необходимо для предупреждения ко- лебания ЕГцап около заданного значения w. В конце концов d устанавливается на 1. Если же расчетная разность d = w - х > 2, то необходимо убедиться, что при этом d > 64, что свидетельствует о превышении в процессе преобразования допус- тимой высоты шкалы. Если это так, то d ограничивается значением 64. В случае 2 < d < 64 разность d изменять не обязательно. Новое заданное значе- ние может быть достигнуто в процессе текущего преобразования. В случае, если новое заданное значение w больше фактического значения, флаг VZ в подпрограмме Differenz сбрасывается в лог. 0, сигнализируя о положитель- ном знаке. В противном случае VZ устанавливается (лог. 1) и сигнализирует об от- рицательном знаке разности d = w - х. В первом случае, при d = w - х > 0 (VZ = 0), на выходе UY микроконтроллера AVR должен быть установлен уровень лог. 0 = 0 В. Это необходимо для зарядки конденсатора С и повышения выходного напряжения интегратора. В противном случае (VZ = 1) на выходе UY должен быть установлен уровень лог. 1 = VCc- В этом случае конденсатор С разряжается, выходное напряжение интегратора падает. После установки разряда UY в соответствии со значением VZ происходит n-кратное выполнение команды sbi для перевода порта в состояние активного вы- хода. В завершение следует команда cbi, возвращающая порт UY в третье состоя- ние. Флаг VALID сбрасывается, чтобы сигнализировать при следующем прерывании от АЦП, что напряжение иЦЛп было изменено в ходе преобразования, и в связи с этим следующее значение недействительно. К началу преобразования “tl —> t2” напряжение 0 В сохраняется внутренним конденсатором выборки и хранения АЦП. В соответствии с этим, в момент t2 ре- зультат аналого-цифрового преобразования х = 0, хотя Ицап за это время возрастает до 0,323 В соответственно 64 LSB. Это (некорректное) значение игнорируется, и флаг VALID сбрасывается. Следующее значение уже действительно. Поскольку в процессе “t2 —> t3” выходное напряжение в результате интеграции не изменяется, устанавливается флаг VALID. Таким образом, за интервалом интеграции “tl —> t2” следует интервал измерения “t2 —> t3”, в завершение которого (к моменту t3) факти- ческое значение составляет х = 64. Это чередование интервала интеграции с последующим интервалом измерения повторяется до тех пор, пока к моменту t29 фактическое значение х не будет при- мерно равно 869d, а разность d от заданного значения w = 928d в пределах высоты шкалы, достигаемой во время одного преобразования, не составит 64.
176 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Будет ли достигнуто точное значение х = 869d, зависит от допусков компонен- тов С и R, а также делителя напряжения, используемого для формирования напря- жения Vcc/2. Разность d между заданным значением w и фактическим значением х вычисля- ется согласно описанному выше процессу и составляет d = 928d - 869d = 32d. С уче- том положительного знака, на выходе микроконтроллера Uy устанавливается на- пряжение О В. Порт Uy микроконтроллера переводится из высокоомного в активное состояние выхода, а для того, чтобы достичь значения выходного напряжения Пцап, максимально приближенного к заданному значению 4,64 В, необходимо выполнить 32 последовательных команды sbi. Флаг VALID сбрасывается, чтобы в момент t30 указать следующей подпро- грамме обработки прерывания, что результат этого преобразования недействителен. Как было отмечено выше, результат преобразования в момент t31 несколько от- личается от 928а (соответственно выходному напряжению Ицап = 0,90625-Vcc), что обусловлено погрешностями компонентов интегратора. Предположим, что в резуль- тате преобразования фактическое значение х = 925d. Полученная разность составля- ет d = 3, и с помощью трех последовательных команд sbi удается установить точ- ное значение заданного значения. Итак, в процессе регулирования было получено искомое заданное значение, однако выходное напряжение ЦАП изменяется вследствие воздействия возмущаю- щих величин (саморазрядка конденсатора и т.п.). Тем не менее, все отклонения компенсируются циклом регулирования, что позволяет достичь стабильного выход- ного напряжения ЦАП со значением х = w ± 1 LSB. Пример применения Пример рассмотренного способа цифро-аналогового преобразования реализован с помощью микроконтроллера ATmega8 на тестовой плате, продемонстрированной в разделе 4.3. В данном случае для исследования динамического поведения схемы во время продолжительного теста с помощью перемычки Л можно выбрать, будет ли заданная величина w записываться через последовательный интерфейс и выдаваться в качестве аналогового значения Пцдп, или же будут поочередно выдаваться заданные величины wl = 1 и w2 = 980 (соответствует напряжению Пцдп = = 4,9 В). Дополнительно для проверки выдается прямоугольный импульс с длительно- стью, равной двойному интервалу между соседними прерываниями по завершению аналого-цифрового преобразования. В данном случае временной интервал между двумя прерываниями после анало- го-цифрового преобразования составляет 69,3 мкс, что позволяет получить на выхо- де Toggle сигнал с частотой 7,215 кГц. Программа К4_2 adc - dac . asm, представленная в листинге 4.3., реализуется с помощью микроконтроллера ATmega8 на тестовой плате, рассмотренной в разделе 4.3. iCw Файл К4_2 ADC - DAC. asm можно также найти на прилагаемом к книге компакт-диске в пап- ке Program. Листинг 4.3. Реализация ЦАП с томощью АЦП в контуре регулирования — программа К4_2 ADC - DAC.asm Программа: ЦАП с помощью АЦП в контуре регулирования
4.2. Цифро-аналоговое преобразование с помощью встроенного АЦП микроконтроллера AVR 177 Листинг 4.3. Продолжение * Версия: 1.0 * Целевое устройство: ATmega8 * Частота системной синхронизации: 12 МГц * Описание: Напряжение на конденсаторе С измеряется с помощью * встроенного АЦП и подстраивается в соответствии с * искомым заданным значением. .nolist .include "С:\Programme\Atmel\AVR Tools\AvrAssembler\Appnotes\m8def.inc" . list ;***** Определения equ DUy equ DDAC = DDD2 = DDRD equ ADCIn = PC2 equ Toggl = PD5 equ PVali = PD3 equ TxD = PD1 equ JI = PB3 equ d_VZ = 7 equ d_EQ = 6 equ Valid = 5 equ RCV = 0 equ dmax = 64 equ wl = 300 equ ClkO = 03 equ Verz = 187 equ Min = 1 equ Max = 980 equ Baud = 155 ;Разряд направления передачи данных для Uy ;Регистр направления передачи данных для Uy /Входной канал встроенного АЦП ;Вывод 5 порта D - контрольный выход /Вывод 3 порта D - выход для флаг Valid /Выход передатчика = PD1 /Перемычка Л - на выводе 3 порта В /Разряд 7 регистра "Flag" - знак d /Разряд 6 регистра "Flag" указывает на w = d /Разряд 5 регистра "Flag" - "Корректность результата" /Разряд 5 регистра "Flag" - "Прием успешный" /Максимальная длина шага на интервал АЦП /Начальное значение = 1,5 В при Vcc = 5,12 В /Содержимое TCCR0 для fTCO = fSys / 64 /Содержимое TCNT0 для 1 мс до переполнения /Минимальное значение для динамического теста (1 LSB) /Максимальное значение для динамического теста ; (= 4,9В при Vcc = 5,12В) /UBRR для скорости 4800 бод при 12 МГц / UBRR = (fSys / 16*Baud) - 1 /Содержимое регистра управления АЦП: .equ ADCFR = 0Ы1111110 /ADEN=1 (Разрешаем АЦП), ADSC=1 (запуск), /ADFR=1 (автономный режим), ADIF=1 (сбрасываем флаг) /ADIE=1 (Разрешаем прерывание от АЦП), /ADPS[2..0]=110 (Делитель=64) —> /Частота тактирования АЦП = 12 МГц:64 = 187,5 кГц .equ ADMX = ОЬОЮОООЮ / REFS [1. . 0] =01 (Ref=AVcc) , ADLAR=0 : по правому краю /MUX[3..0]=0010: ADC2 - вход Регистровые переменные .def zLSave = г8 /Буфер для записи zL при прерывании .def zHSave = г9 /Буфер для записи zH при прерывании def Save def d0 def dl def xO def xl = rlO = rl2 = rl3 = rl4 = rl5 /Буфер для записи SREG при прерывании /Младший байт разности w-x /Старший байт разности w-x /Младший байт фактического значения х /Старший байт фактического значения х def tO = rl 6 /Временный рабочий регистр def tl = rl7 /Временный рабочий регистр 1 Измерение
178 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Листинг 4.3. Продолжение .def t2 = rl8 •def Flag = rl9 •def ErgO = r20 .def Ergl = r21 .def iO = r24 .def il = r25 /Временный рабочий регистр ;Различные флаги /Младший байт результата /Старший байт результата /Временный рабочий регистр прерывания /Временный рабочий регистр прерывания • ★ ★ ★ Код . csec I . org 0 /Адрес рестарта rjmp initial . org ADCCaddr /Адрес вектора прерывания от АЦП in Save,SREG /Сохраняем SREG mov zLSave,zL /Сохраняем здесь указатель Z mov zHSave,zH / при прерывании sbis PortD,Toggl /Пропускаем следующую команду, если / контрольный выход = 1 rjmp ADC1 /Переход, если контрольный выход = 0 cbi PortD,Toggl /Сбрасываем контрольный выход rjmp ADC1: ADC2 sbi ADC2 : PortD,Toggl /Устанавливаем контрольный выход sbrs Flag,Valid /Пропускаем следующую команду, если / результат АЦ-преобразования корректный rjmp ADC 4 /Следующий результат - корректный sbi PortD,PVali /Выдаем флаг Valid in xO,ADCL /Сохраняем младший байт фактич. значения в хО in xl,ADCH /Сохраняем старший байт фактич. значения в Х1 real] . Differenz /d = w - х sbre Flag,d EQ ;Пропускаем следующую команду, если w о х rjmp Next_Valid /Завершаем прерывание без действия, если w = X ldi i0,2 /Загружаем в регистровую пару il:iO ldi il,0 ; значение сравнения 0002 cp iO,dO /Сравниваем разность dl:dO epe il,dl / с 0002 brio ADC3 /Переход, если разность > 0002 clr dO /Устанавливаем разность в 0001 setzen, так как inc dO / остаток определяется на первом шаге rjmp ADC3: Sprungtab ldi iO,Low(dmax) /Загружаем в регистровую пару il:i0 / значение сравнения ldi il,High(dmax) cp iO,dO / Сравниваем содержимое dl:dO с dmax epe il,dl brsh Sprungtab /Переход, если dl:d0 <= dmax mov dO,iO mov dl,il /Ограничиваем разность d максимальным значением Sprungtab: ldi zH,High(JEnd) /Старший байт адреса таблицы переходов ldi zL,Low(JEnd) /Младший байт адреса таблицы переходов sub zL, dO /Вычитаем dl:dO содержимого sbe zH,dl / указателя Z
4.2. Цифро-аналоговое преобразование с помощью встроенного АЦП микроконтроллера AVR 179 Ausgabe: cbi PortD,DUy /Переключаем Uy на 0 В, если w > x sbrc Flag,d_VZ ;Пропускаем следующую команду, ; если d - положительное sbi PortD,DUy /Переключаем Uy на Vcc, если w < х ijmp /Включаем и опять отключаем Uy JTab: sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy ;Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy ;Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy ;Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy 7*
180 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Листинг 4.3. Продолжение sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC,DUy /Включаем Uy sbi DDAC, DUy /Включаем Uy JEnd • cbi DDAC, DUy /Включаем Uy (вывод - высокоомный вход) cbi PortD,DUy /Подключаем подтягивающий резистор cbr Flag, l«Valid /Сбрасываем флаг "Корректный результат" rjmp Int End /Завершаем прерывание ADC4 z cbi PortD,PVali Next Valid: sbr Flag, l«Valid /Устанавливаем флаг "Корректный результат" Int ] End: mov zL,zLSave /Восстанавливаем ранее сохраненные mov zH,zHSave / указатель Z out SREG,Save / и SREG reti Initial: /Инициализация микроконтроллера AVR ldi tl,Low(RAMEND) out SPL,tl /Инициализируем младший байт указателя стека ldi tl,High(RAMEND) out SPH,tl /Инициализируем старший байт указателя стека InitPorts: ldi tl, (!<<TxD) | (l«Toggl) | (!<<PVali) /Конфигурируем направление out DDRD,tl / передачи данных через порт D ldi tl, 1«J1 /Подключаем подтягивающее сопротивление out PortB,tl / для перемычки Л InitUSART: ldi tl,High(Baud) /Старший байт для установки скорости передачи out UBRRH,tl ldi tl,Low(Baud) /Младший байт для установки скорости передачи out UBRRL,tl ;Разрешаем использование приемника и передатчика ldi tl, (1«RXEN) | (1«TXEN) out UCSRB,tl /Устанавливаем формат передачи: 8 бит данных, 2 стоп-бита ldi tl, (1«URSEL) | (1«USBS) | (3«UCSZ0) out UCSRC,tl InitADC: ldi tl,ADMX /Записываем в регистр мультиплексора значения out ADMUX,tl / для опорного напряжения и входного канала ldi tl,ADCFR /Устанавливаем автономный режим работы out ADCSR,tl / и запускаем АЦП cbr Flag, l«Valid /Сбрасываем флаг "Корректный результат" / -> Первое значение игнорируется
4.2. Цифро-аналоговое преобразование с помощью встроенного АЦП микроконтроллера AVR 181 Листинг 4.3. Продолжение sei ;Общее разрешение прерываний ldi tl,High(wl) sts Soll,tl ldi tl,Low(wl) sts Soll+l,tl ;***** Главная программа Haupt: ldi zH,High (Grossed) ldi zL, Low (Grussdl) rcall Out_Text Hauptl: ;Сохраняем в сегменте данных старший байт ; заданного значения ;Сохраняем в сегменте данных младший байт ; заданного значения /Устанавливаем указатель Z на начало текста ; во флэш-памяти ;Выводим текст на ПК sbis PinB,JI rjmp Dauertest Loop: ldi zH, High (Textl«l) ldi zL, Low (Textldl) rcall Out_Text Wait_Receive: ldi yH,High(Input) ldi yL,Low(Input) rcall In_Text sbrs Flag,RCV rjmp Loop rcall Dekodieren ;Пропускаем следующую команду, если Л = лог. 1 /Выбираем динамический тест, если Л=0 /Устанавливаем указатель Z на начало текста / во флэш-памяти /Выводим текст на ПК /Ожидаем ответ от ПК /Устанавливаем указатель Z на начало буфера / приема в памяти SRAM /Принимаем текст от ПК /Пропускаем следующую команду, если / текст без ошибок /Новая попытка /Преобразовываем ASCII-символ / в шестнадцатеричное число rcall Div_5 andi Ergl,$03 ldi zH, High (Okay«l) ldi zL, Low (Okayed) rcall Out_Text sts Soil,Ergl sts Soll+l,ErgO /Делим результат на 5 /Ограничиваем максимальное значение / десятиразрядным числом /Устанавливаем указатель Z на начало текста / во флэш-памяти /Выводим текст на ПК /Сохраняем заданное значение sbic PinB,JI /Пропускаем следующую команду, если Л = лог. 0 rjmp Loop rjmp Haupt Dauertest: Ldi zH,High(TextDeel) Ldi zL,Low (TextDeel) ccall Out_Text Dauerl: Ldi tl,High(Min) 5ts Soll,tl Ldi tl,Low(Min) 5ts Soll+l,tl rcall Verzoegerung -di tl,High(Max) sts Soll,tl .di tl,Low(Max) its Soll+l,tl rcall Verzoegerung /Считываем следующее значение /Начинаем с начала /Устанавливаем указатель Z на начало текста / во флэш-памяти /Выводим текст на ПК /Сохраняем в сегменте данных старший байт / минимального заданного значения /Сохраняем в сегменте данных младший байт / минимального заданного значения /Выжидаем время установления /Сохраняем в сегменте данных старший байт / максимального заданного значения /Сохраняем в сегменте данных младший байт / максимального заданного значения /Выжидаем время установления ibis PinB,JI rjmp Dauerl /Пропускаем следующую команду, если Л = лог. 1 /Выбираем динамический тест, если Л=0
182 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Листинг 4.3. Продолжение rjmp Haupt ;Начинаем с начала ; Подпрограммы: Differenz: cbr Flag, l«d_EQ | l<<d_VZ /Сбрасываем флаги равности и VZ Ids il,Soll /Старший байт заданного значения w Ids iO,Soll+l /Младший байт заданного значения w sub iO,xO /Определяем младший байт разности d=w-x sbc il,xl /Определяем старший байт разности d=w-x breq Gleich /Переход, если w = х brio Kleiner mov dO,iO /Переход, если w < х mov dl,il ret Kleiner: clr dO clr dl /Копируем результат в dl:dO sub dO,iO /Вычисляем значение разности sbc dl,il / d=w-x в dl:dO sbr Flag, l«d_VZ ret Gleich: /Знак разности d=w-x - отрицательный sbr Flag, l«d_EQ ret /Флаг указывает на то, что w = х SendByte: sbis UCSRA,UDRE /Передача символа на ПК rjmp SendByte /Ожидаем освобождения буфера передачи out UDR,tO ret /Передаем символ GetByte: /Прием символа sbis UCSRA, RXC /Ожидаем от ПК rjmp GetByte / ASCII-символ in t2,UDR /Сохраняем считанный символ mov tO, t2 /Копируем символ в tO rcall ret SendByte /Передаем символ эхом на ПК Out Text: /Вывод текста на ПК 1pm tO, z + /Загружаем ASCII-символ в tO cpi to,o /Конец текста? breq 0T1: ОТ 2 /Переход, если готово rcall SendByte ;Передаем символ rjmp 0T2: Out_Text /Следующий символ ret In_Text: sbr Flag, 1«RCV ; Устанавливаем флаг "Прием успешный" Idi tl,6 /Максимум 5 символов, включая возврат каретки 1_Т1: dec tl /Уменьшаем счетчик символов breq Fehler2 /Переход, если символов больше, чем допустимо I Т2:
4.2. Цифро-аналоговое преобразование с помощью встроенного АЦП микроконтроллера AVR 183 Листинг 4.3. Продолжение rcall GetByte /Принимаем ASCII-символ от ПК st y+,t2 /Сохраняем символ cpi t2,13 /Возврат каретки? brne I_T1 Wait LF: /Если нет, считываем следующий символ rcall GetByte /Ожидаем от ПК символ перехода на новую строку cpi t2,10 ;Переход на новую строку? breq I_T4 Fehlerl: /Переход, если да ldi zH, High (Txt2b«l) /Устанавливаем указатель Z на начало текста ldi zL, Low (Txt2b«l) rjmp I_T3 Fehler2: / во флэш-памяти ldi zH, High (Txt2a«l) /Устанавливаем указатель Z на начало текста ldi zL, Low (Txt2a«l) I T3: / во флэш-памяти rcall Out Text /Выводим текст на ПК cbr Flag, 1«RCV rjmp I_T5 I T4: /Сбрасываем флаг "Прием успешный" ldi zH, High (CRLF«1) /Устанавливаем указатель Z на начало текста ldi zL,Low (CRLF«1) / во флэш-памяти rcall Out_Text I_T5: ret /Выводим текст на ПК Dekodieren: /Преобразовываем ASCII-число в / шестнадцатеричное число clr ErgO /Очищаем старший и младший байты clr Ergl / результата ldi yH,High(Input) /Устанавливаем указатель Y на начало ldi yL,Low(Input) / буфера приема в памяти SRAM Id tO,y+ /Загружаем символ в tO cpi tO,13 /Возврат каретки? breq Deko2 Dekol: /Переход, если да subi tO,$30 /Вычитаем ASCII-смещение clr tl /Прибавляем к результату цифру add ErgO,tO ; и возможный adc Ergl,tl / перенос Id t0,y+ /Загружаем в tO следующий символ cpi tO,13 /Возврат каретки? breq Deko2 /Переход, если да rcall Mul 10 /Умножаем Ergl:ErgO на 10 rjmp Dekol Deko2: ret Mul 10: /Прибавляем следующую цифру ldi t2,10 /Загружаем 10 в tO mul Erg0,t2 /Умножаем ErgO на 10 mov Erg0,r0 /Младший байт произведения - в ErgO mov tl,rl /Старший байт произведения - в tl mul Ergl,t2 /Умножаем Ergl на 10 add tl,r0 /Прибавляем младший байт этого произведения к mov Ergl,tl ret / старшему байту предыдущего
184 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Листинг 4.3. Окончание Div 5: ldi tl, 16 ldi Divl: to,о Isl ErgO /Сдвигаем делимое на 1 разряд влево, LSB=0 rol Ergl rol to /Сдвигаем MSB влево в tO subi tO,5 /Вычитаем 5 brio Div2 /Переход, если разность < 0 inc ErgO /Устанавливаем в лог. 1 LSB ErgO rjmp Div2: Div3 subi tO, -5 /Отменяем действие вычитания Div3: dec tl brne ret Divl Verzoegerung: ldi t0,3 /Загружаем длительность задержки для 3 мс ldi tl,ClkO /Загружаем в регистр управления TC0 out TCCRO,tl / fTCO = fSys / 64 VZ1: ldi tl,-Verz /Загружаем в счетный регистр TC0 out TCNTO,tl / содержимое счетчика для 1 мс VZ2: in sbrs tl,TIFR tl,TOVO /Пропускаем следующую команду, если rjmp VZ2 / есть переполнение счетчика /Ожидаем переполнения sbr tl, l«TOV0 /Сбрасываем флаг переполнения out TIFR,tl /Восстанавливаем TIFR dec to /Задержка истекла? brne VZ1 /Переход, если нет ret • * * * * Gruss * Тексты : .db 13, 12, "D/A-Wandlung per ADC",13,10,0 Textl : .db 13, 10, "UDAC (in 5mV-Schritten, 5115 max.): ",0 Txt2a : .db 13, 10, "*** Fehler: Nach 4. Ziffer wird CR erwartet! *** ",13,: Txt2b 10, 0 : .db 13, 10, "*** Fehler: Nach CR wird LF erwartet! ***",13,10,0 CRLF : .db 13, 10, 0,0 Okay: .db 13, 10, "Neuer Sollwert wurde eingestellt",13,10,0 TextD : .db 13, 10, "Dauertest laeuft",13,10,0 Daten . dseg Soli: .byte 2 /2 байта для заданного значения, первый - старший байт Input: .byte б /Буфер приема
4.2. Цифро-аналоговое преобразование с помощью встроенного АЦП микроконтроллера AVR 185 Описание программы Часть инициализации После установки указателя стека выводы PD1 (сигнал TxD), РВ5 (сигнал Toggl) и PD3 (сигнал Pvali) порта D конфигурируются как выходы. К перемычке Л на выводе 3 порта В подключается внутренний подтягивающий резистор. Аналогично части инициализации тестовой программы UART, описанной в разделе 2.3, скорость передачи данных устанавливается с помощью регистра управления UBRRH:UBRRL, использование приемника и передатчика разрешается с помощью регистра управления UCSRB. Кроме того, с помощью регистра управле- ния UCSRC устанавливается формат передачи: 8 бит данных и один стоп-бит. Рабочее напряжение аналоговой части устанавливается с помощью мультип- лексора АЦП в качестве опорного напряжения, а в качестве входа АЦП выбирается канал ADC2. Этот канал конфигурируется с помощью регистра управления ADCSR для автономного режима и частоты преобразования 187,5 кГц. В конце процесса инициализации сбрасывается флаг VALID, благодаря чему результат первого преобразования игнорируется. В качестве заданного значения ус- танавливается произвольно выбираемое значение wl = 300 = 1,5 В при Vcc = 5,12 В. Основная программа После передачи заголовка программы в HyperTerminal опрашивается состояние перемычки Ли выносится решение о том, будет ли выводиться тестовая программа аналогового вывода одной из заданных величин w, сохраненных после передачи от ПК через последовательный интерфейс (перемычка Л разомкнута, лог. 1), или же будет выполняться продолжительный тест с поочередным выводом значений min и мах (перемычка Л замкнута, лог. 0). Во время обоих тестов для проверки на выход PD5 (Toggl) непрерывно пода- ются прямоугольные импульсы с частотой 7,215 кГц, а на выход PD3 (PAvi) — со- стояние флага VALID. В случае выбора программы “отдельного значения” пользователю будет вы- дан запрос на ввод заданной величины. Если ввести десятичное значение (в мВ, максимум 5115), дополненное символом перевода на новую строку (клавиша <Enter>), то значение, состоящее из цифр в ASCII-коде, преобразуется с помощью подпрограммы Dekodieren в шестнадцатеричное число, а подпрограмма Div_5 разделит это число на 5 (это необходимо для ограничения вводимого значения мак- симальным пределом для десятиразрядного числа). В результате деления заданное значение может передаваться шагами по 5 мВ. С помощью описанной выше программы регулирования результат деления пре- образуется в аналоговое напряжение, выдаваемое на выход ЕГцап тестовой платы, рассмотренной в разделе 4.3. Пример ввода: 1985 <Enter>. В результате на выход ЕГцап тестовой платы бу- дет выдано постоянное напряжение 1,985 мВ. Этот этап выполнения программы в окне HyperTerminal продемонстрирован на рис. 4.34. Если для проверки динамического поведения схемы выбран продолжительный тест, то программа в цикле попеременно выдает выходные значения wl = 1 (соот- ветствует напряжению ЕГцап = 5 мВ) и w2 = 980d (соответствует напряжению Ицдп = = 4,9 мВ). Этот этап выполнения программы в окне HyperTerminal продемонстриро- ван на рис. 4.35.
186 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Рис. 4.34. АЦП-ЦАП во время вывода отдельных значений Рис. 4.35. АЦП-ЦАП во время продолжительного теста (последовательность заданных величин w1 = 0001d —> w2 = 980d —> w1 = 0001d....)
4.2. Цифро-аналоговое преобразование с помощью встроенного АЦП микроконтроллера AVR 187 Между выводом значения min и мах каждый раз выдерживается задержка про- должительностью 3 мс. На рис. 4.36 показана фотография экрана осциллографа, отображающего процесс цифро-аналогового преобразования во время продолжи- тельного теста. Рис. 4.36. Процесс регулирования во времени (фотография экрана осциллографа): по вертикали — 1 мс/деление, по горизонтали — 1 В/деление Из рис. 4.36 видно, что скачок с min = 1 до мах = 980 происходит в течение 1,9 мс и требует около 14,5 ступеней по 64 разряда. Этот результат идеально совпа- дает с описанными выше теоретическими выкладками. Подпрограмма обработки прерывания по завершению АЦ-преобразования В начале подпрограммы обработки прерывания происходит сохранение регист- ров состояния, а также рабочих регистров, используемых в программе. Затем инвер- тируется сигнал Toggl на контрольном выходе PD5. Если результат только что завершенного преобразования недействителен (флаг VALID = 0), то подпрограмма обработки прерываний завершается после сброса управляющего выхода PD3 (PVali), указывающего на текущее состояние флага VALID, и установки флага VALID, чтобы указать на действительность следующего результата. В противном случае происходит установка управляющего выхода PD3 (PVali), запись фактического значения х и расчет его разности d относительно заданного значения w. Если разность d = 0, то устанавливается флаг VALID, поскольку сле- дующее значение также будет действительным, и подпрограмма обработки преры- вания завершается. На следующем этапе разность d исследуется для трех частных случаев: d < 2; 2 < d < 64 и d > 64 (см. рис. 4.32). Выполняется соответствующее количество команд sbi DDRD, DUy, отвечающих за конфигурирование вывода UY порта D в качестве выхода, после чего разряд Uy порта D (знаку разности) устанавливается в 0 или 1. В итоге вывод UY опять конфигурирует как вход, а разряд UY порта D сбрасы- вается, чтобы отключить подтягивающее сопротивление. Поскольку во время этого преобразование значение иЦАп меняется, флаг VALID должен быть сброшен. В этом
188 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR случае он еще до завершения обработки прерывания указывает, что следующее зна- чение недействительно. Подпрограмма Dif ferenz Подпрограмма Differenz рассчитывает разность между заданным значением w и фактическим значением х. Если разность равна нулю, то устанавливается флаг d_EQ, в противном случае он сбрасывается. Для демонстрации знака разности в случае w > х флаг d_vz сбрасывается, а в случае w < х — устанавливается. Подпрограмма SendByte Подпрограмма SendByte передает символ в программу HyperTerminal. Она ожидает освобождения буфера передачи USART и инициирует передачу, копируя передаваемый символ из регистра tO в регистр данных UDR. Подпрограмма GetByte Подпрограмма GetByte ожидает приема символа от программы HyperTerminal. Как только символ поступил, он копируется из регистра данных USART UDR в ре- гистры tO и t2 и эхом передается с помощью подпрограммы SendByte обратно про- грамме HyperTerminal. Подпрограмма Out_Text Подпрограмма Out Text пересылает хранящийся во флэш-памяти текст в про- грамму HyperTerminal. Адрес начала текста хранится в указателе Z, конец текста должен быть обозначен символом 00ь Подпрограмма In_Text Подпрограмма In Text считывает максимум пять ASCII-символов в буфер input в памяти SRAM. Если же передается больше символов, чем допускается, или после символа возврата каретки отсутствует символ перевода строки, то в програм- му HyperTerminal выдается сообщение об ошибке. Если текстовая строка считыва- ется без ошибок, то устанавливается флаг RCV. В противном случае он сбрасывает- ся. Подпрограмма Dekodieren Подпрограмма Dekodieren преобразует число, состоящее из ASCII-символов, в шестнадцатеричное число. ASCII-символы должны находиться в памяти SRAM, указатель Z указывает на старшую цифру числа, а само число завершается симво- лом возврата каретки (шестнадцатеричный код 0Dh), и не может превышать FFFFh или 65536d. Алгоритм используемого метода преобразования десятичного числа в шестнадцатеричное путем непрерывного умножения на 10 представлена на рис. 4.22. Сам процесс подробно описан в книге Вольфганга Трамперта “AVR-RISC микроконтроллеры”. Результат передается в вызывающую программу в регистровой паре Ergl :ErgO. Подпрограмма MuI_10 Умножение 16-тиразрядного значения в Ergl .ErgO на константу 10 выполняется с помощью команды умножения микроконтроллера ATmega8. В общем, процесс умножения делится на два частных умножения 8 • 8 разрядов каждое, а их суммы “поразрядно” складываются в одно целое:
4.3. Тестовая плата для различных применений микроконтроллера АТтедав 189 (Ergl : ErgO) * 10 (ErgO * 10) + (Ergl * 10)____________ : Ergl : ErgO Поскольку результат умножения ни в коем случае не должен превышать значе- ния 13FBh = 5115d , поскольку напряжение питания Vcc - 1 LSB = 5,12 В - 5 мВ = = 5115 мВ, то результат умножения “помещается” в 16-ти разрядах регистровой па- ры Ergl:ErgO. Подпрограмма Div_5 Операция деления выполняется путем последовательных операций смещения и вычитания (см. книгу “AVR-RISC микроконтроллеры”). Подпрограмма Verzoegerung Подпрограмма Verzoegerung задерживает выполнение программы на 3 мс и вновь передает после этого управление основной программе. Для этой цели в ре- гистр tO загружается число 3, которое затем в цикле уменьшается до 0. В цикле в таймер/счетчик Т/СО загружается значение (-Verz) = -187d. В дополнительном коде —187d = 45h = 69d. Для достижения таймером переполнения, начиная с этого исход- ного значения, требуется 187 тактовых импульсов. Частота тактирования Т/СО со- ставляет 1/64 частоты системной синхронизации, т.е. 12 МГц / 64 = 187,5 кГц. Для прохождения 187 тактовых импульсов требуется время t = 187 / 187,5 кГц » 1 мс. В цикле ожидается переполнение Т/СО. Как только разряд TOVO указывает на это переполнение, счетчик циклов уменьшается на 1. Выводы Как видно из рис. 4.36, с помощью этой методики можно получить эффектив- ный ЦАП с разрешением 10 разрядов внутреннего АЦП микроконтроллера AVR. Преобразователь управляется по прерываниям, и потому нагрузка на систему не- значительна. Можно относительно легко расширить выходные каналы, поскольку большинство микроконтроллеров AVR располагают аналоговым мультиплексором, с помощью которого можно выбрать дополнительные входные каналы для АЦП, а также измерить и подстроить в продемонстрированном контуре регулирования до- полнительные выходные напряжения. 4.3. Тестовая плата для различных применений микроконтроллера АТтедав Тестовая плата имеет европейский формат 100 х 160 мм и собрана на печатной плате с базовой сеткой. Она предназначена для тестирования программ, рассмот- ренных в разделах 3.1, 4.1 и 4.2. Схемы соединений тестовой платы представлены на рис. 4.37 - 4.39. На рис. 4.37 показан монтаж микроконтроллера ATmega8 на тестовой плате. Тактовый импульс и сигнал сброса формируются по типичной для всех контролле- ров AVR схеме (см. книгу “AVR-RISC микроконтроллеры”). Перемычки JO, JI, MW и CAL на плате позволяют сконфигурировать окружение тестирования. Поскольку плата может универсальна и может применяться для тестирования различных программ, в каждой отдельной программе не обязательно используются
190 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR все компоненты схемы. Порты ввода-вывода микроконтроллера ATmegaS, к кото- рым подключаются эти неиспользуемые компоненты, работают как входы в высо- коомном состоянии. Рис. 4.37. Тестовая плата для АТтедав. Схема 1: микроконтроллер
4.3. Тестовая плата для различных применений микроконтроллера АТтедав 191 На рис. 4.38 продемонстрирован последовательный интерфейс, используемый для обмена данными с программой HyperTerminal ПК (см. также раздел 2.3). Рис. 4.38. Тестовая плата для АТтедав. Схема 2: исполнительный элемент и последовательный интерфейс
192 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR На рис. 4.38 слева показан исполнительный элемент для ЦАП, реализованного с помощью встроенного в микроконтроллер AVR АЦП в контуре регулирования, который описан в разделе 4.2. Резисторы R5 и R6 устанавливают потенциал на неинвертирующем входе опе- рационного усилителя 1С2а на уровне Vcc/2. Резисторы R4 и СЮ определяют постоянные времени интегратора согласно рис. 4.31. Определение параметров осуществляется согласно расчетам, представ- ленным в разделе 4.2. Резистор R18, а также диоды D3, D4 защищают входной канал АЦП микрокон- троллера, через который осуществляется измерение выходного напряжения Ицап ЦАП, от слишком высоких напряжений, поскольку на IC2 подается V+ = +12 В и V = -12 В. Для бесперебойной работы схемы необходима надежное отделение аналоговой “земли” AGND от цифровой GND, а также аналогового напряжения питания V* от цифрового Vcc согласно правилам, продемонстрированным на рис. 3.8 и 3.9. Интегральные схемы с конденсаторами следует шунтировать максимально близко к выводам питания, что продемонстрировано на рис. 4.37-4.39. Чтобы отказаться от третьего напряжения питания в образцах тестовой платы, построенных согласно рис. 4.42, напряжение VCc формируется в самой схеме с по- мощью регулятора постоянного напряжения LM7805 из напряжения V. Этот вари- ант не обозначен на схеме соединений, однако его можно увидеть на фотографии платы слева внизу (см. рис. 4.41). При аккуратном монтаже благодаря этому реше- нию удается достичь достаточно приемлемых результатов. Однако по возможности рекомендуется обеспечивать раздельное питание цифровой и аналоговой частей платы. Для подавления присутствующих в ШИМ-сигнале на выходе PWM (ОС1А) микроконтроллера AVR составляющих переменного напряжения используется фильтр нижних частот Чебышева четвертого порядка с пульсацией 0,5 дБ и гранич- ной частотой 385 Гц (рис. 4.39). Схема 3: фильтр нижних частот Чебышева четвертого порядка с пульсацией 0,5 дБ и fg = 385 Гц Поскольку фильтр нижних частот Чебышева по другую сторону своей гранич- ной частоты имеет более резкое, по сравнению с фильтром Баттерворта, нарастание затухания, преимущество отдается именно ему, даже несмотря на большие выбросы
4.3. Тестовая плата для различных применений микроконтроллера ATmega8 193 его переходной характеристики (см. рис. 4.18). Расчет фильтра нижних частот Бат- терворта четвертого порядка подробно рассмотрен в разделе 4.1. Для определения параметров представленного фильтра нижних частот Чебыше- ва используются те же формулы, что и для фильтра Баттерворта. Отличие — только в коэффициентах. Коэффициенты фильтрации для частных фильтров ТРа и ТРь с граничной частотой fga и fgb для требуемого фильтра нижних частот Чебышева чет- вертого порядка с пульсацией 0,5 дБ представлены в табл. 4.6. Таблица 4.6. Коэффициенты фильтрации фильтра нижних частот Чебышева четверто- го порядка с пульсацией 0,5 дБ Six 6lx Частный фильтр ТРа 2,6282 3,4341 0,538 fg Частный фильтр ТРь 0,3648 1,1509 1,419 fg Используя уравнения (4.4) - (4.7) с требуемым усилением А = 1 и граничной частотой fg = 385 кГц всего фильтра, для частного фильтра а второго порядка, изо- браженного на рис 4.9, получаем следующие параметры конденсаторов: С1а=10нФ; С2а = 47нФ. Значения для резисторов Ria, R2a и R3a: Ria = 33,021 kQ (выбрано значение 33 kQ); R2a = 33,021 kQ (выбрано значение 33 kQ); R3a = 33,813 kQ (выбрано значение 39 kQ). Для второго частного фильтра b второго порядка с предварительно заданными С1Ь = 2,2нФ; С2Ь = 220нФ получаем значения для резисторов Rib, R2b и R3b: Rib = 15,248 kQ (выбрано значение 15 kQ); R2b = 15,248 kQ (выбрано значение 15 kQ); R3b = 26,650 kQ (выбрано значение 27 kQ). Значение граничной частоты для фильтра нижних частот, изображенного на рис. 4.39, с перечисленными выше параметрами, составляет fg = 383 кГц. Делитель напряжения R16-R17 обеспечивает незначительное отрицательное смещение всей схемы, что необходимо для гарантированного достижения значения Upwm = 0 В по- средством автоматической калибровки (см. раздел 4.1 или главу 1). Измеренное вы- ходное напряжение в случае 0 В на входе фильтра нижних частот в опытном образ- це, изображенном на рис 4.39 составляет -16 В. Общий вид платы со всеми схемными компонентами и навесными перемычка- ми верхней и нижней стороны представлен на рис. 4.40. Здесь также показано раз- мещение проводящих дорожек. Фотография образца представлена на рис. 4.41. Схема монтажа всех компонен- тов и навесных перемычек (вид сверху) показана на рис. 4.42. Топография платы (вид снизу) представлена на рис. 4.43, а фотография ее ниж- ней стороны — рис. 4.44. Как видим, рис 4.43 и рис. 4.44 не полностью соответствуют друг другу, по- скольку в процессе разработки плата совершенствовалась, однако функции обеих схем абсолютно идентичны.
194 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Рис. 4.40. Общий вид печатной платы
4.3. Тестовая плата для различных применений микроконтроллера АТтедав 195 Рис. 4.41. Фотография образца тестовой платы
196 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR МУ Рис. 4.42. Схема монтажа на печатной плате навесных компонентов и перемычек
4.3. Тестовая плата для различных применений микроконтроллера АТтедав 197 Рис. 4.43. Топография печатной платы (вид снизу)
198 Цифро-аналоговое преобразование с помощью микроконтроллеров AVR Рис. 4.44. Фотография нижней стороны печатной платы
Содержимое прилагаемого к книге компакт-диска Папка Applicat Здесь находятся некоторые указания к применению микроконтроллеров семей- ства AVR, предоставленные компанией Atmel: • AVR000. pdf — определения регистров и имен разрядов для микроконтрол- леров AVR; • AVR032. pdf — командные файлы компоновки для компилятора IAR ICCA90; • AVR034 . pdf — смешивание ассемблерного и С-кода с помощью встроенных средств IAR для AVR; • AVR0 7 0. pdf — модификация AT90ICEPRO для поддержки эмуляции AT90S8535; • AVR100.pdf — доступ к памяти EEPROM микроконтроллера AT90S1200; • AVR10 2. pdf — подпрограммы копирования блоков данных; • AVR128.pdf — настройка и использование аналогового компаратора; • AVR134. pdf — часы реального времени с использованием асинхронного таймера; • AVR18 0. pdf — внешняя защита от провалов напряжения; • AVR2 00.pdf — подпрограммы умножения и деления; • AVR2 01. pdf — использование аппаратного умножителя; • AVR2 02.pdf — 16-разрядная арифметика; • AVR2 04.pdf — BCD-арифметика; • AVR2 2 0. pdf — сортировка методом “пузырька”; • AVR2 22.pdf — фильтр на восемь позиций с применением метода скользяще- го среднего; • AVR2 36.pdf — проверка памяти программ с помощью циклического избы- точного кода; • AVR2 4 0. pdf — кнопочная панель 4x4 для выхода из режима пониженного энергопотребления; • AVR2 42. pdf — 8-разрядная схема управления светодиодными индикаторами в мультиплексном режиме с применением кнопочной панели 4x4; • AVR300. pdf — программная реализация интерфейса ведущего устройства ГС; • AVR302. pdf — программная реализация интерфейса ведомого устройства 12С;
200 Содержимое прилагаемого к книге компакт-диска • AVR3 04.pdf — программная реализация полудуплексного приемопередатчи- ка UART, активируемого по прерыванию; • AVR3 05.pdf — программная реализация полудуплексного компактного приемопередатчика UART; • AVR313.pdf — взаимодействие с клавиатурой PC АТ; • AVR32 0. pdf — программная реализация ведущего устройства SPI; • AVR3 6 0. pdf — контроллер шагового двигателя; • AVR4 0 0. pdf — дешевый АЦП; • AVR4 01. pdf — АЦП с точностью 8 разрядов; • avr 910.pdf — внутрисистемное программирование; • ICEPRO. pdf — понимание регистров ввода/вывода AVR ICEPRO; • L_Delay. pdf — формирование долгих задержек с помощью микроконтрол- леров AVR. Папка Datasheets В этой папке находятся описания микросхем, упомянутых в этой книге, а также микроконтроллеров AVR: • подпапка avr\at90 — микроконтроллеры семейства “Classic”; • подпапка AVR\ATmega — микроконтроллеры семейства “Mega”; • подпапка AVR\ATtiny — микроконтроллеры семейства “Tiny”. Папка Program Исходные ассемблерные коды программ, рассмотренных в этой книге. Папка Tools Средства программирования, распространяемые компанией Atmel бесплатно: • AVR Assembler; • AVR Studio 4.