Разработка цифрового вольтметра

Тип работы:
Курсовая
Предмет:
Коммуникации, связь, цифровые приборы и радиоэлектроника


Узнать стоимость

Детальная информация о работе

Выдержка из работы

1. Исходные данные

Требуется разработать цифровой вольтметр, обладающий следующими характеристиками:

— Диапазоны измерения напряжения: ±10 В, ±1 В, ±100 mВ;

— Переключение диапазонов: ручное;

— Точность измерения в диапазоне 100 мВ…10 В: не хуже 1%;

— Входное сопротивление: не менее 1 МОм;

— Индикация: светодиодная, семисегментная;

— Напряжение питания: 5 В.

2. Функциональная схема

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

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

Для обеспечения требуемой точности во всех диапазонах входных напряжений необходимо предусмотреть дополнительное усиление входного аналогового тракта с коэффициентом 10 для диапазона 1 В, и с коэффициентом 100 — для диапазона 100 мВ.

Для оцифровки входного напряжения схема должна содержать аналого-цифровой преобразователь (АЦП). При этом для обеспечения требуемой точности 1% в районе нижней границе измерительного диапазона, разрядность АЦП не должна быть меньше 10. Тогда для входного напряжения, близкого к верхней границе диапазона, точность измерения будет приближаться к 0. 1%. Для нормальной работы АЦП в схеме необходимо предусмотреть источник опорного напряжения (ИОН). Кроме того, так как измеряемое напряжение может быть как положительной, так и отрицательной полярности, сигнал с выхода аналогового тракта должен поступать на схему сдвига уровня, обеспечивающую изменение сигнала на входе АЦП в диапазоне от 0 В до напряжения, генерируемого ИОН.

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

Для цифрового вывода измеренного напряжения, по заданию должен использоваться семисегментный светодиодный индикатор. Для обеспечения точности не хуже 1%, необходимо и достаточно чтобы разрядность индикатора составляла три десятичных разряда. Кроме того, необходим дополнительный разряд, для вывода символа «-» (минус) в случае измерения отрицательных напряжений. Для индикации текущего диапазона необходимо также предусмотреть дополнительный светодиодный индикатор, показывающий размерность (вольты или милливольты) выводимых данных.

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

Для организации автоматической работы устройства в целом, а именно — поддержки переключения диапазонов, обеспечения работы АЦП, преобразования полученного кода и вывод данных на индикатор — функциональная схема должна содержать устройство управления.

Функционально входную согласующую цепь удобно совместить с устройством защиты, входным фильтром нижних частот и схемой сдвига уровня для диапазона ±10 В. Усилители с коэффициентом усиления 10 и 100 удобно совместить со схемами сдвига уровня для диапазонов ±1 В и ±100 мВ. Таким образом, функциональная схема может иметь вид, изображенный на рисунке 1.

Рисунок 1 — Функциональная схема цифрового вольтметра

где: ВУ — входное устройство, осуществляющее деление входного сигнала, защиту схемы от перенапряжений, фильтрацию и сдвиг уровня для диапазона 10 В;

У1 — усилитель для диапазона 1 В и схема сдвига уровня;

У2 — усилитель для диапазона 100 мВ и схема сдвига уровня;

М — мультиплексор, осуществляющий подключение сигналов аналогового тракта к входу АЦП;

АЦП — аналого-цифровой преобразователь;

ИОН — источник опорного напряжения;

КД — кнопка выбора диапазонов;

УУ — цифровое устройство управления;

И1 — четырехразрядный семисегментный индикатор;

И2 — светодиодный индикатор для определения размерности выводимых данных;

ИН — инвертор напряжения, предназначенный для преобразования питающего напряжения +5 В в напряжение -5 В для питания усилителей.

3. Разработка и расчет принципиальной схемы

3. 1 Устройство управления

В современных малогабаритных цифровых приборах обычно в качестве устройства управления используют микроконтроллер. При этом стараются подобрать модель таким образом, чтобы его периферийные устройства использовались в максимальной степени и наиболее полно замещали функциональные узлы, предусмотренные в разработанной структуре устройства. Немалую роль в выборе той или иной модели микроконтроллера играют такие характеристики, как быстродействие, энергопотребление, объем встроенной памяти программ и данных, его цена. Кроме того, немалое значение следует уделить наличию или доступности инструментальных средств, таких как трансляторы, отладчики, программаторы. Для решения поставленной задачи хорошим выбором является AVR-микроконтроллер типа AT90S8535 фирмы Atmel, так как он содержит в своем составе следующие блоки [1]:

— Flash-памяти программ объемом 8 килобайт;

— ОЗУ объемом 512 байт;

— EEPROM-память данных, объемом 512 байт;

— один 16-битный и два 8-битных таймера-счетчика;

— последовательный интерфейс UART;

— последовательный интерфейс SPI;

— 10-битный 8-канальный АЦП;

— аналоговый компаратор;

— четыре 8-битных порта ввода/вывода.

Индикаторы И1 и И2, изображенные на рис. 1. могут подключаться к портам контроллера, настроенным на режим вывода данных. Переключатель диапазонов КД может подключаться к линии какого-либо порта, настроенного на ввод с включением внутреннего подтягивающего резистора. В схеме с успехом может использоваться встроенный 10-ти битный АЦП, а в качестве мультиплексора М может выступать порт РА микроконтроллера.

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

3. 2 Источник опорного напряжения

Микроконтроллер AT90S8535 не имеет встроенного источника опорного напряжения, и поэтому необходимо, чтобы эту роль выполняла внешняя дополнительная микросхема. По техническим требованиям для микроконтроллера напряжение на его входе AREF, используемого в качестве опоры встроенного АЦП, не должно превышать напряжения питания, то есть 5 В в данном случае. Поэтому в качестве источника опорного напряжения можно выбрать микросхему REF198 фирмы Analog Devices с напряжение стабилизации 4. 096 В [2].

3. 3 Инвертор напряжения

Инвертор напряжения предназначен для выработки напряжения -5 В, необходимого операционным усилителям, входящим в состав блоков ВУ, У1 и У2 (рис. 1). В этом качестве может выступить микросхема ADM660 фирмы Analog Devices [3]. Данная микросхема совместно с двумя внешними конденсаторами, емкостью 10 мкФ, вырабатывает напряжение, инверсное по отношению к своему питающего напряжения. При этом питающее напряжение микросхемы может находиться в диапазоне от +1.5 В до 7 В. Микросхема может обеспечить ток в нагрузке до 20 мA. Включение микросхемы — стандартное, рекомендованное фирмой-изготовителем.

3. 4 Входное устройство

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

— делить входной сигнал так, чтобы его уровень по абсолютному значению, по крайней мере, не превосходил питающее напряжение ±5 В;

— защищать входные цепи от перегрузок в случае подключения высокого напряжения к входу вольтметра;

— фильтровать входной сигнал, то есть выступать в качестве фильтра нижних частот;

— смещать входной сигнал в область положительных напряжений так, чтобы весь диапазон изменения входного напряжения ±10 В укладывался в диапазон рабочих напряжений АЦП: 0 …4,096 В.

Устройство, обеспечивающее все эти функции, может быть реализовано по схеме, изображенной на рисунке 2.

Рисунок 2 — Схема входного устройства

Каскад на операционном усилителе DA1 построен по схеме инвертирующего усилителя. Известно, что коэффициент передачи такой схемы определяется как K=-R3/R1, а ее входное сопротивление равно R1. Если выполняется условие R1> R3, то коэффициент передачи становится меньше 1. Таким образом, можно получить входной делитель напряжения с высоким входным сопротивлением и очень малым выходным. Кроме того, ОУ в схеме инвертирующего усилителя работает без синфазной составляющей напряжения на его входах, что дает возможность преобразовывать входное напряжение U1, значительно превышающее напряжение питания ОУ.

В том случае, если ток инвертирующего входа ОУ, протекающий через высокоомные резисторы R1 и R3, вызывает заметное падение напряжения, необходимо компенсировать это смещение с помощью резистора R2, равного сопротивлению параллельно соединенных резисторов R1 и R3.

Диоды VD1 и VD2 служат для защиты входа от перегрузки высоким входным напряжением. В том случае, если входное напряжение находится в штатном диапазоне, операционный усилитель DA1 работает в активном режиме, отрицательная обратная связь замкнута, поэтому потенциал инвертирующего входа практически равен нулю. Поэтому диоды заперты, и их присутствие не влияют на работу схемы. Если высокое напряжение U1 выводит DA1 в режим насыщения, обратная связь не поддерживается, и напряжение на инвертирующем входе ОУ начинает расти. Однако при достижении значения примерно 0.7 В (порог открытия кремневых диодов) это напряжение стабилизируется, что предотвращает опасную ситуацию увеличения напряжения на входе усилителя сверх напряжения питания.

Конденсатор, включенный в обратную связь ОУ, ограничивает частоту пропускания каскада на уровне F=½рR1C3, таким образом, все устройство приобретает свойства фильтра нижних частот.

Схема сдвига уровня реализована на резисторах R4 и R5. Выходное напряжение устройства U3 можно определить по формуле

U3=(U2*R5+Vref*R4)/(R5+R4),

где Vref — опорное напряжение АЦП.

Если выполнить условие R4=R5, это выражение примет вид:

U3=(U2+Vref)/2.

Таким образом, если напряжение U2 будет меняться в пределах от -Vref до +Vref, это вызовет изменение U3 в пределах от 0 до +Vref, что и требуется для согласования выходного двуполярного сигнала U3 с диапазоном входных напряжений АЦП.

Заданная в исходных данных погрешность измерения вольтметра, равная 1%, практически полностью определяется использованием 10-битного АЦП, поэтому входной аналоговый тракт должен вносить погрешность во много раз меньшую. Для этого в схеме необходимо использовать прецизионный операционный усилитель и точные резисторы. В качестве операционного усилителя здесь может быть использована микросхема ОР177 фирмы Analog Devices. Этот усилитель обладает отличными точностными характеристиками [4]: сверхнизким напряжением смещения нуля < 25 мкВ, малым входным током < 1.5 нA, очень высоким коэффициентом усиления > 107, низкой стоимостью.

Так как входное сопротивление по условию должно быть? 1 МОм, а входное сопротивление каскада равно R1, зададим R1=1 МОм. Выбор большего номинала R1 приведет к возрастанию выходного смещения DA1 за счет протекания входного тока ОУ через резисторы R1 и R3.

Зададим требование, чтобы при максимальном значении входного напряжения, равного 10 В, напряжение U2 было бы близким к опорному напряжению Vref=4. 096 В, но несколько меньше этого значения. Примем эту величину, равной 4. 09 В. Тогда коэффициент передачи каскада будет равен К=4. 09/10=0. 409.

Отсюда отношение резисторов R1/R3 должно быть равно 2. 445. Следовательно, R3=K*R1=409 кОм. Резисторы R1 и R3 должны быть прецизионными, поэтому их значения необходимо выбирать из ряда номиналов E192. Тогда R1=1МОм, а R3=407 кОм.

Протекание входного тока ОУ, равного 2 нA, через резисторы R1 и R3 вызовет смещение выхода на значение

U0=Iвх*R1*R3/(R1+R3)=2*10-9*1*0. 407*106/(1+0. 407)=0. 58 мB.

Это величина значительно превышает статическую ошибку, определяемую собственным напряжением смещения (25 мкB). Поэтому для ее компенсации сопротивление резистора R2 должно быть

R2=R1*R3/(R1+R3)=1*0. 407/(1+0. 407)=289 кОм.

Так как резистор R2 не определяет коэффициент передачи устройства, его номинал может быть выбран из ряда Е24. Округляя рассчитанное значение до стандартного, получим R2=300 кОм.

Постоянна времени фильтра, равная ф=R3C1 не должна быть очень маленькой, так как в этом случае теряются фильтрующие свойства, и не должна быть слишком большой, так как в этом случае вольтметр будет вяло реагировать на изменение входного напряжения. Для определения ее значения можно принять следующий критерий: пусть при резком изменении входного напряжения выходное напряжение каскада установится за 0.4 секунды. Так как за время, равное 3ф, переходной процесс у фильтра первого порядка практически заканчивается, то ф =0. 4/3=133 мс. Тогда С1= ф / R3=133/0. 407= 326 нФ. Округляя до стандартного значения, получаем С1=330 нФ. При этом частота среза каскада составит

F=½рR1C3=1/(2*3. 14*0. 407*0. 33)=1.2 Гц.

Номиналы резисторов R4 и R5 должны быть не слишком малыми, так как это приведет к значительной нагрузке выходов DA1 и источника опорного напряжения, и не слишком высокими, так как это ведет к увеличению шумов и нестабильности результатов оцифровки. Оптимальным следует считать максимальный ток, протекающий через резисторы сдвига уровня, равным нескольким сотням микроампер. Поэтому примем сопротивление R4 и R5 равным 10 кОм. Заметим, что эти резисторы также должны быть прецизионными.

Для анализа эффективности работы схемы защиты рассмотрим случай, когда к входу прикладывается напряжение, равное 200 В. Тогда ток, протекающий через резистор R1, определится как I=200/1 = 200 мкА (падением напряжения на защитных диодах пренебрегаем). В этом случае мощность, рассеиваемая на резисторе R1 составит P=200 В * 200 мкА = 40 мВт. Эта величина является более чем приемлемой.

3. 5 Усилители диапазонов

Усилители для диапазонов 1 В и 100 мВ могут иметь одинаковую схему, но отличаться коэффициентом усиления. Так как отношение значений границ диапазонов равно 10 для канала 1 В и 100 для канала 100 мВ, коэффициенты усиления усилителей также должны быть 10 и 100 соответственно. Кроме того, усилители должны быть неинвертирующими для того, чтобы обработка кода АЦП для разных каналов была бы единообразной. Поэтому эти усилители могут быть собраны по схеме, приведенной на рисунке 3.

Рисунок 3 — Схема усилителей каналов

Коэффициент усиления данной схемы определится как K=1+R2/R1. Резисторы R3 и R4, так же как и для схемы на рис. 1 смещают выходное напряжение ОУ в положительную область на величину Vref/2. Также как и в предыдущей схеме R3=R4=10 кОм.

В качестве операционного усилителя можно использовать ОР177.

Отношение R2/R1 для канала 1 В должно составлять 9, а для канала 100 мВ соответственно 99. Резисторы R1 и R2 должны быть прецизионными и их номиналы следует выбирать из ряда Е192. Для того чтобы делитель R1 и R2 не сильно нагружали выход DA1, с одной стороны, и не вызывали смещения выходного напряжения за счет протекания входных токов ОУ, сопротивление R2 должно быть порядка десятков или сотен килоом. Тогда выбираем R2=18кОм и R1=2кОм для коэффициента усиления 10, и R2=198кОм и R1=2кОм для коэффициента усиления 100.

3. 6 Семисегментный индикатор

Как было обосновано ранее, устройство должно содержать трехразрядный семисегментный светодиодный индикатор. Выберем для этих целей индикаторы красного свечения с общим анодом. Для того чтобы не использовать большое количество портов ввода-вывода микроконтроллера удобно использовать принцип динамической индикации. В этом случае одноименные катоды всех индикаторов через токозадающие резисторы подключаются к каком-либо порту микроконтроллера, например к порту C. Включение того или иного индикатора осуществляется подачей на аноды выбранного индикатора напряжения, близкого к напряжению питания. Подключение анодов необходимо осуществлять через транзисторные ключи, так как одна линия порта микроконтроллера не способна запитать все восемь светодиодов индикатора. Подключить индикатор можно так, как это показано на рисунке 4.

Рисунок 4 — Схема подключения семисегментного индикатора

Для включения того или иного светодиодного сегмента необходимо установить в состояние логического нуля соответствующую линию порта С и включить транзистор VT1, установив в ноль линию РВ7. Резисторы R1… R8 задают ток через сегменты, а резистор R9 определяет базовый ток VT1. В данной схеме может отсутствовать резистор между базой и эмиттером VT1, так как на линии PB7 формируются жесткие логические уровни как нуля, так и единицы, с напряжениями очень близкими к потенциалам земли и питания.

Для обеспечения нормальной яркости свечения необходимо, чтобы через светодиод протекал ток порядка 5 мА. Однако при использовании динамическая индикация, имеет смысл увеличить ток этот ток до 10 мА. Для определения номиналов резисторов R1… R8 можно записать выражение

I*R+Uc+Us=E,

где: I — ток через светодиод;

R — сопротивление токоограничивающего резистора;

Uc — падение напряжения на открытом светодиоде;

Us — напряжение насыщения транзистора VT1

E — напряжение питания схемы.

Примем Uc=1.5 В, Us =0.4 В. Тогда величину сопротивления определится как

R = (E-Uc-Us)/I=(5−1. 5−0. 4)/10=310 Ом

Округляя эту величину до стандартного значения, получим R=300 Ом.

Максимальный ток, протекающий через транзистор VT1 равен 10 мА*8=80 мА. Положим, что коэффициент усиления по току транзистора равен 80. тогда ток базы составит 80/80=1 мА. С учетом коэффициента насыщения транзистора, равного, например, 2 получим ток базы 2 мА. Для базовой цепи транзистора VT1 можно записать

I*R9+Ub=E,

где: I — ток базы VT1;

Ub — напряжение база-эмиттер VT1.

Полагая Ub=0.7 В, получим

R9=(E-Ub)/I=(5−0. 7)/2=2. 25 кОм

Округляя это значение до стандартного, получим R9=2.2 кОм.

3. 7 Индикаторы диапазонов

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

I*R+ Us =E,

где: I — ток через светодиод;

R — сопротивление токозадающего резистора;

Us — напряжение на открытом светодиоде;

E — напряжение питания.

Полагая I=5 мА и Us =1.5 В получим

R=(E- Us)/I = (5−1. 5)/5 = 700 Ом

Округляя это значение до стандартного получим R=680 Ом.

3. 8 Работа принципиальной схемы

Полная принципиальная схема устройства приведена в приложении.

Устройство управления представлено микросхемой DD1. Питание встроенного АЦП осуществляется через фильтр R13С4. Номиналы этих элементов взяты по рекомендации фирмы изготовителя [1].

Входное устройство собрано на операционном усилителе DA3. Коэффициент передачи этого каскада определяется резисторами R1 и R6. Диоды VD1 и VD2 осуществляют защиту входных цепей. Конденсатор С1 используется для фильтрации входного сигнала. Резисторы R11 и R12 смещает выходной сигнал DA1 в положительную область.

Каскад на микросхеме DA1 осуществляет усиление входного сигнала с коэффициентом усиления 10 для диапазона 1 В.

Каскад на микросхеме DA2 осуществляет усиление входного сигнала с коэффициентом усиления 100 для диапазона 100 мВ.

На микросхеме DA5 собран инвертор напряжения для обеспечения питания операционных усилителей напряжением -5 В. Подключение конденсаторов С5, С10 и С11 и выбор их номиналов осуществлен согласно рекомендациям фирмы-изготовителя [3].

На микросхеме DA4 собран источник опорного напряжения. Подключение этой микросхемы стандартное, согласно рекомендациям фирмы-изготовителя [2].

Светодиод HL1 является индикатором того, что данные выводятся в вольтах. Светодиод HL2 является индикатором того, что данные выводятся в милливольтах.

Семисегментные индикаторы HG2, HG3 и HG4 предназначены для вывода значения измеренного напряжения. Ключи VT1, VT2 и VT3 коммутируют аноды индикаторов для обеспечения динамической индикации. Резисторы R16… R23 задают токи через сегменты индикаторов. Будем считать, что индикатор HG2 предназначен для вывода сотен, HG3- для вывода десятков, а HG4 — для вывода единиц индицируемой величины.

Индикатор HG1 предназначен исключительно для вывода символа «минус» (сегмент G). Его управление осуществляется отдельной линией порта РВ4.

Кнопка SB1 служит для переключения диапазонов.

4. Разработка программного обеспечения

4. 1 Определение функций программы

Микроконтроллер под управлением программы должен выполнять следующие функции:

— периодически опрашивать состояние кнопки переключения диапазонов и подключать к входу АЦП нужный канал измерения;

— запускать АЦП и вычитывать результирующий код;

— по полученному коду АЦП рассчитывать значение измеренного напряжения;

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

— поддерживать процесс динамической индикации.

4. 2 Определение структуры программы

Для оптимального функционирования устройства необходимо распределить аппаратные и временные ресурсы микроконтроллера. Так как пользователем устройства является человек, нет смысла измерять напряжение и выводить его значение на индикатор с большой частотой. Разумной частотой циклической работы микропроцессора можно признать частоту 10 Гц. С этой же частотой можно проверять состояние кнопки переключения диапазонов. С другой стороны, поддерживать динамическую индикацию необходимо с гораздо более высокой частотой. Поэтому удобно задачи опроса кнопки переключения диапазонов, измерения напряжения и вывода данных осуществлять в основном цикле программы, а поддержку динамической индикации реализовать как процедуру обработки прерывания. Для организации интерфейса между основной программой и подпрограммой прерывания необходимо выделить три буферные ячейки памяти, в каждой из которых будут находиться данные для вывода на соответствующий индикатор. В этом случае основная программа принимает решение, что будет выводиться на индикатор, но она не «знает», как именно это будет сделано, а подпрограмма прерывания умеет выводить данные, но не может изменить содержимое буфера.

Рассчитаем время экспозиции каждого индикатора. Для того чтобы избежать эффекта мелькания данных на индикаторах, необходимо чтобы частота регенерации изображения была бы не ниже 25 Гц, что соответствует периоду 40 мс. Выберем этот период в несколько раз выше — например 15 мс. Учитывая, что индикаторов всего 3, время экспозиции каждого индикатора составит 5 мс. Таким образом, основная программа должна прерываться каждые 5 мс. Для выработки этих циклических прерываний можно использовать 8-ми битный таймер Т0 микроконтроллера. Временной интервал 5 мс будет соответствовать 5000 импульсов счета тактового генератора, учитывая, что микроконтроллер тактируется частотой 1 МГц. Эту величину можно представить как 19*256+136. Таким образом таймер Т0 должен 19 раз произвести свой полный цикл переполнения и еще просчитать 136 тактов.

Тактирование основной программы можно осуществить, подсчитывая 5-ти миллисекундные временные интервалы, генерируемые таймером.

4. 3 Определение формулы расчета напряжения

Для того чтобы рассчитать значение измеренного напряжения необходимо вывести формулу, связывающую это значение с результирующим кодом АЦП. Для этого определим напряжение, подключенное к входу АЦП

Uadc=(Vref-R6/R1*k*Uвх)/2,

где k — коэффициент усиления, в зависимости от включенного диапазона может принимать значение 1, 10, 100; Uвх — входное напряжение.

С другой стороны

Uadc=N*Vref/1024,

где N — результирующий код АЦП. Тогда

Uвх=R1*Vref*(512-N)/(512*R6*k).

Вместо учета в этой формуле значения коэффициента k, достаточно переключать светодиоды «В» «мВ», и изменять положение десятичной точки на индикаторе. Поэтому значение k для расчетов можно принять, равным 1. Так как в системе используется трех разрядный индикатор, единица младшего разряда, выводимого на индикатор, должна соответствовать десяткам милливольт (максимальное выводимое значение соответствует 9,99 В). В этом случае значение Vref необходимо представлять в десятках милливольт. Тогда, подставляя в формулу численные значения, получим

Uвх=1*409. 6(512-N)/(512*0. 407)=1. 9656*(512-N).

Используемый микроконтроллер не поддерживает арифметику с плавающей запятой, поэтому коэффициент, равный 1. 9656, необходимо округлить до целого значения. Однако если это значение округлить до 2, получим недопустимую ошибку счета, равную 1. 72%. Удовлетворительной ошибкой счета следует признать значение, много меньшее, чем заданная погрешность измерения 1%.

Для удовлетворения этим требованиям необходимо значение 1. 9656 сдвинуть влево на такое количество двоичных разрядов, чтобы округленное значение отличалось бы от исходного на величину не превышающую, например, 0. 1%. После выполнения операции умножения полученный результат необходимо сдвинуть вправо на такое же количество разрядов. Удобно производить масштабирование на 8 разрядов. В этом случае после умножения просто отбрасывается младший байт результата. Если значение 1. 9656 сдвинуть влево на 8 разрядов, что эквивалентно умножению на число 256, получим значение 503. 1936. Округляя это значение до числа 503, получим ошибку, равную 0. 038%, что является приемлемой величиной.

Таким образом, формула для расчета определиться так

Vвх=(503*(512-N)) > >8.

Где символ «> >8» означает сдвиг вправо на 8 разрядов.

Произведем проверку полученной формулы. Предположим ко входу вольтметра приложено напряжение, равное 7 В. В этом случае расчетная формула должна дать значение 700 (на индикатор выводится 7. 00).

Выходное напряжение микросхема DA3 составит, в этом случае, значение

U=- Uвх* R6/R1 =-7*0. 407/1=-2. 849 В.

Напряжение на входе АЦП составит

Uadc=(U+Vref)/2=(-2. 849+4. 096)/2=0. 6235 В.

При оцифровке получим код

N=1024*Uadc/Vref=1024*0. 6235/4. 096=155. 875=155.

Тогда по расчетной формуле получим

Vвх=503*(512−155)/256=179 571/256=701

По результату видно, что значение входного напряжения определено с точностью 0. 14%.

4. 4 Определение текущего диапазона измерения

Как было сказано ранее, диапазоны измерения переключаются последовательным нажатием на кнопку SB1. Для того, чтобы показать какой именно выбран диапазон используются два светодиода и позиция запятой на семисегментном индикаторе. Рассмотрим состояние этих индикаторов на примере максимальной величины напряжений, индицируемых в каждом диапазоне. Эти состояния приведены в таблице 1.

Таблица 1. Состояние индикаторов диапазонов

Диапазон

Индикатор «V»

Индикатор «mV»

Значение

10 В

Включен

Выключен

9,99

1 В

Выключен

Включен

999

100 мВ

Выключен

Включен

99,9

Из таблицы 1 видно, что состояние светодиодов и положение запятой полностью определяют масштаб измерения.

4. 5 Алгоритм основной программы

Основная программа должна выполнять следующую инициализирующую последовательность действий:

— проинициализировать порты ввода/вывода;

— установить рабочий режим для АЦП;

— установить начальный диапазон измерения 10 В;

— инициализировать счетчик переполнения таймера tcou;

— инициировать счетчик 5мс интервалов cou01;

— инициализировать указатель адресом буфера индикации;

— разрешить прерывание для таймера Т0;

— запустить таймер;

— глобально разрешить прерывания.

В рабочем цикле программа должна выполнять следующие действия:

— ожидать метку времени 100 мс;

— опросить состояние кнопки SB1, выработать критерий фронта ее нажатия и, в случае необходимости переключить диапазон;

— измерить с помощью АЦП входное напряжение;

— рассчитать код индицируемого значения;

— определить необходимость включения символа «минус»;

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

— в зависимости от текущего диапазона включить светодиоды HL1 или HL2 и установить бит для индикации запятой.

Общая блок-схема алгоритма основной программы приведена на рисунке 4.

4. 6 Алгоритм подпрограммы обработки прерывания

цифровой вольтметр микроконтроллер индикатор

Подпрограмма обработки прерывания таймера Т0 должна выполнять следующие действия:

— декрементировать счетчик переполнения таймера tcou и, в случае если 0 не был достигнут, закончить подпрограмму;

— перегрузить tcou и содержимое таймера Т0;

— декрементировать счетчик cou01 и, в случае если был достигнут 0, перегрузит cou01 и установить признак метки времени 100 мс;

— выключить все индикаторы;

— выдать на порт РС данные по указателю данных индикатора;

— включить соответствующий анод индикатора;

— инкрементировать указатель данных индикатора и, в случае, если он вышел за область буфера, загрузить его начальным адресом.

Рисунок 5. Блок-схема алгоритма основной программы

Блок-схема алгоритма подпрограммы обработки прерывания таймера Т0 приведена на рисунке 6.

4. 7 Описание программы

Управляющая программа написана на языке ассемблера в среде AVR Studio версии 3.5. Полный текст программы приведен в приложении 1. Программа содержит 422 байта кода.

Рисунок 6. Блок-схема алгоритма обработки прерывания

Время выполнения основного цикла программы составляет не более 750 машинных циклов, время выполнения подпрограммы обработки прерывания — не более 35 машинных цикла.

В программе использовались следующие глобальные переменные:

— flag — регистр пользовательских флагов,

§ бит 0 (tf) — флаг метки времени 100 мс;

§ бит 1 (kre) — текущее состояние кнопки переключения диапазонов;

§ бит 2 (kon) — флаг нажатия кнопки переключения диапазонов;

§ бит 3 (minus) — флаг отрицательного входного напряжения.

— tcou — счетчик переполнения таймера Т0, в программе обработки прерывания используется также как рабочий регистр;

— cou01 — счетчик для формирования интервала 100 мс из интервалов в 5 мс;

— mux — переменная хранения номера текущего интервала измерения;

— anod — переменная для хранения кода включения анодов семисегментных индикаторов;

— zero — регистр, содержащий 0

— buf — трехбайтовая переменная для хранения данных, выводимых на индикатор;

— Y — указатель видео буфера.

В программе использовались следующие подпрограммы:

— key — опрос кнопки переключения диапазонов, формирование флагов kre и kon в регистре flag;

— range — анализ состояния флага kon и переключение на следующий диапазон измерения;

— measure — запуск АЦП на измерение, ожидание конца измерения;

— calc — расчет бинарного кода величины, подлежащей индикации по формуле, приведенной в п. 4.3.

— visio — преобразование расчетной величины в цифры, кодированные семисегментным кодом, загрузка буфера индикации, включение светодиодов масштаба;

— tim0 — подпрограмма обработки прерывания, формирование меток времени 5 мс и 100 мс, поддержка динамической индикации;

— init — инициализация портов, АЦП, пуск таймера Т0;

— mulw — беззнаковое 16-битное умножение, является аналогом библиотечной функции, поставляемой в комплекте с AVR Studio (файл «avr200. asm»);

— div10 — деление двухбайтовой величины на 10, является модифицированной версией функций деления, представленных в файле «avr200. asm».

Литература

1. Atmel AVR.

2. Analog Devices REF198.

3. Analog Devices ADM660.

4. Analog Devices OP177.

Приложение 1. Текст программы

. include «8535def. inc»

. equ ledV =0; номер бита для светодиода «V»

. equ ledmV =1; номер бита для светодиода «mV»

. equ min =4; номер бита для сегмента «минус»

. def zero =r2

. def mux =r3

. def anod =r4

. def cou01 =r5

. def tcou =r22

. def flag =r23

; биты регистра flag

. equ tf =0

. equ kre =1

. equ kon =2

. equ minus =3

. equ buf =$ 60; буфер для индикации, 3 байта

rjmp start

. org OVF0addr

rjmp tim0

start: ldi r16, low (RAMEND)

out spl, r16

ldi r16, high (RAMEND)

out sph, r16

rcall init

sei

loop: sbrs flag, tf; ожидание метки времени

rjmp loop

cbr flag, 1< <tf; сброс флага

rcall key; опрос кнопки

rcall range; установка канала измерения

rcall measure; оцифровка

rcall calc; расчет выходного значения

rcall visio; формирование видео буфера

rjmp loop

; ********************************

; Out: биты kre и kon регистра flag

key: cbr flag, 1< <kon

sbic pinD, 0

rjmp ClrKre

sbrc flag, kre

ret

sbr flag, (1< <kre)|(1<<kon)

ret

ClrKre: cbr flag, 1< <kre

ret

; ********************************

range: sbrs flag, kon

ret

inc mux

ldi r16, 3

cp mux, r16

brne pc+2

clr mux

out ADMUX, mux

ret

; *********************************

; Out: r17: r16

calc: sbr flag, 1< <minus

in r16, ADCL

in r17, ADCH

subi r16, low (512)

sbci r17, high (512)

brpl ca1; если разность отрицательна

cbr flag, 1< <minus; взять модуль

ldi r18, 1; и сформировать признак минуса

com r16

com r17

add r16, r18

adc r17, zero

;

ca1: ldi r18, low (503)

ldi r19, high (503)

rcall mulw

mov r16, r19

mov r17, r14

lsl r18; округление после умножения

adc r16, zero

adc r17, zero

ret

; *********************************

visio: ldi r18, low (1000); проверка выхода за

ldi r19, high (1000); границы диапазона

cp r16, r18

cpc r17, r19

brsh vis2

ldi xl, buf+3; преобразование в цифры

vis1: rcall div10; семисегментного кода и

rcall code7; сохранение в buf

st -x, r0

cpi xl, buf

brne vis1

rjmp vis3

vis2: ldi r16, $ab; выход за диапазон

sts buf, r16; заполнение буфера

sts buf+1, r16; символами «ппп»

sts buf+2, r16

;

vis3: in r16, portB

sbr r16, (1< <min)|(1<<ledV)|(1<<ledmV)

sbrc flag, minus

cbr r16, 1< <min; включение минуса

;

tst mux

breq vis4

cbr r16, 1< <ledmV; включение светодиода «mV»

sbrs mux, 1

rjmp vis5

lds r17, buf+1; включение запятой

cbr r17, 1< <7; во второй позиции

sts buf+1, r17

rjmp vis5

;

vis4: cbr r16, 1< <ledV; включение светодиода «V»

lds r17, buf; включение запятой

cbr r17, 1< <7; в первой позиции

sts buf, r17

vis5: out portB, r16

ret

; *********************************

measure: sbi ADCSR, ADSC; старт АЦП

sbic ADCSR, ADSC

rjmp pc-1

; ldi r16, $ 9b

; out ADCL, r16

; ldi r16, 0

; out ADCH, r16

ret

; *********************************

; Преобразование в семисегментный код

; In: r18, Out: r0

code7: ldi zl, low (Tab7< <1)

ldi zh, high (Tab7< <1)

add zl, r18

adc zh, zero

lpm

ret

; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9

Tab7:. db $c0,$f9,$a4,$b0,$ 99,$ 92,$ 82,$f8,$ 80,$ 90

; ****************************

; Обработка прерывания

tim0: in r24, sreg

push r24

dec tcou

brne endtim

; вход в точку каждые 5 ms

ldi tcou, -(136−13); 13 — коррекция задержки

out TCNT0, tcou; на вхождение в прерывание

;

dec cou01

brne pc+4

; вход в точку каждые 100 ms

sbr flag, 1< <tf

ldi tcou, 20

mov cou01, tcou

;

in tcou, portB; выключить все аноды

ori tcou, $e0

out portB, tcou

ld r24, y+

out portC, r24; включить катоды

and tcou, anod

out portB, tcou; включить нужный анод

;

sec; подготовить следующий анод

ror anod

cpi yl, buf+3; все индикаторы ?

brne pc+4

ldi tcou, $ 7f; перегрузить анод и

mov anod, tcou; видео указатель

ldi yl, buf

;

ldi tcou, 19+1; перегрузить счетчик

; переполнения таймера

endtim: pop r24

out sreg, r24

reti

; ****************************

init: clr zero

ldi r17, $ff

; инициализация портов

ldi r16, $f8

out portA, r16

out ddrA, zero

out portB, r17

ldi r16, 0b11110011

out ddrB, r16

out portC, r17

out ddrC, r17

out portD, r17

out ddrD, zero

; инит. АЦП, 125 кГц тактирования

ldi r16, 0b10000011

out ADCSR, r16

;

ldi tcou, 1

mov cou01, tcou

clr flag

; диапазон 10V

clr mux

out ADMUX, mux

; начальные значения анодов и видео указателя

ldi yl, low (buf)

ldi yh, high (buf)

ldi r16, $ 7f

mov anod, r16

;

clr xh

; разрешить прерывание по таймеру Т0

ldi r16, 1< <TOV0

out TIMSK, r16

; запустить таймер Т0

ldi r16, 1

out TCCR0, r16

ret

; *****************************

; r19: r18*r17:r16=r15:r14:r19:r18

; Usage: r21 — count

mulw: clr r14

clr r15

ldi r21, 16

lsr r19

ror r18

brcc pc+3

add r14, r16

adc r15, r17

ror r15

ror r14

ror r19

ror r18

dec r21

brne pc-8

ret

; ***************************

; div10 r17: r16/10=r17:r16(r18)

div10: ldi r18, 11

dd0: subi r17, $ 28

brcc dd1

subi r17, -$ 28

clc

rjmp pc+2

dd1: sec

rol r16

rol r17

dec r18

brne dd0

mov r18, r17

lsr r18

lsr r18

lsr r18

andi r17, 7

ret

Приложение 2. Схема электрическая принципиальная

ПоказатьСвернуть
Заполнить форму текущей работой