Рисунок 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 кОм.
В качестве индикаторов диапазоном можно использовать два светодиода. Один
должен указывать что данные, выводимые на семисегментный индикатор, выражены в
вольтах, а второй - в милливольтах. Эти светодиоды можно подключить следующим
образом: аноды соединены с шиной питания, а катоды через токозадающий резистор
подключены к порту микроконтроллера. Для этого случая можно записать выражение
I*R+ Us =E,
где: I - ток через светодиод;
R - сопротивление токозадающего резистора;
Us - напряжение на открытом светодиоде;
E - напряжение питания.
Полагая I=5 мА и Us =1.5 В получим
R=(E- Us)/I = (5-1.5)/5 = 700 Ом
Округляя это значение до стандартного получим R=680 Ом.
Полная принципиальная схема устройства приведена в приложении.
Устройство управления представлено микросхемой 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 служит для переключения диапазонов.
Микроконтроллер под управлением программы должен выполнять следующие функции:
- периодически опрашивать состояние кнопки переключения диапазонов и подключать к входу АЦП нужный канал измерения;
- запускать АЦП и вычитывать результирующий код;
по полученному коду АЦП рассчитывать значение измеренного напряжения;
преобразовывать значение измеренного напряжения в семисегментный код и выводить результирующие данные на индикатор;
поддерживать процесс динамической индикации.
Для оптимального функционирования устройства необходимо распределить аппаратные и временные ресурсы микроконтроллера. Так как пользователем устройства является человек, нет смысла измерять напряжение и выводить его значение на индикатор с большой частотой. Разумной частотой циклической работы микропроцессора можно признать частоту 10 Гц. С этой же частотой можно проверять состояние кнопки переключения диапазонов. С другой стороны, поддерживать динамическую индикацию необходимо с гораздо более высокой частотой. Поэтому удобно задачи опроса кнопки переключения диапазонов, измерения напряжения и вывода данных осуществлять в основном цикле программы, а поддержку динамической индикации реализовать как процедуру обработки прерывания. Для организации интерфейса между основной программой и подпрограммой прерывания необходимо выделить три буферные ячейки памяти, в каждой из которых будут находиться данные для вывода на соответствующий индикатор. В этом случае основная программа принимает решение, что будет выводиться на индикатор, но она не «знает», как именно это будет сделано, а подпрограмма прерывания умеет выводить данные, но не может изменить содержимое буфера.
Рассчитаем время экспозиции каждого индикатора. Для того чтобы избежать эффекта мелькания данных на индикаторах, необходимо чтобы частота регенерации изображения была бы не ниже 25 Гц, что соответствует периоду 40 мс. Выберем этот период в несколько раз выше - например 15 мс. Учитывая, что индикаторов всего 3, время экспозиции каждого индикатора составит 5 мс. Таким образом, основная программа должна прерываться каждые 5 мс. Для выработки этих циклических прерываний можно использовать 8-ми битный таймер Т0 микроконтроллера. Временной интервал 5 мс будет соответствовать 5000 импульсов счета тактового генератора, учитывая, что микроконтроллер тактируется частотой 1 МГц. Эту величину можно представить как 19*256+136. Таким образом таймер Т0 должен 19 раз произвести свой полный цикл переполнения и еще просчитать 136 тактов.
Тактирование основной программы можно осуществить, подсчитывая 5-ти
миллисекундные временные интервалы, генерируемые таймером.
Для того чтобы рассчитать значение измеренного напряжения необходимо
вывести формулу, связывающую это значение с результирующим кодом АЦП. Для этого
определим напряжение, подключенное к входу АЦП
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=179571/256=701
По результату видно, что значение входного напряжения определено с
точностью 0.14%.
Как было сказано ранее, диапазоны измерения переключаются
последовательным нажатием на кнопку SB1. Для того, чтобы показать какой именно выбран диапазон используются два
светодиода и позиция запятой на семисегментном индикаторе. Рассмотрим состояние
этих индикаторов на примере максимальной величины напряжений, индицируемых в
каждом диапазоне. Эти состояния приведены в таблице 1.
Таблица 1. Состояние индикаторов диапазонов
|
Диапазон |
Индикатор «V» |
Индикатор «mV» |
Значение |
|
10 В |
Включен |
Выключен |
9,99 |
|
1 В |
Выключен |
Включен |
999 |
|
100 мВ |
Выключен |
Включен |
99,9 |
Из таблицы 1 видно, что состояние светодиодов и положение запятой
полностью определяют масштаб измерения.
Основная программа должна выполнять следующую инициализирующую последовательность действий:
- проинициализировать порты ввода/вывода;
- установить рабочий режим для АЦП;
установить начальный диапазон измерения 10 В;
инициализировать счетчик переполнения таймера tcou;
инициировать счетчик 5мс интервалов cou01;
инициализировать указатель адресом буфера индикации;
разрешить прерывание для таймера Т0;
запустить таймер;
глобально разрешить прерывания.
В рабочем цикле программа должна выполнять следующие действия:
- ожидать метку времени 100 мс;
- опросить состояние кнопки SB1, выработать критерий фронта ее нажатия и, в случае необходимости переключить диапазон;
измерить с помощью АЦП входное напряжение;
рассчитать код индицируемого значения;
определить необходимость включения символа «минус»;
разбить полученное значение на цифры, преобразовать их в семисегментный код и загрузить буфер индикации;
в зависимости от текущего диапазона включить светодиоды HL1 или HL2 и установить бит для индикации запятой.
Общая блок-схема алгоритма основной программы приведена на рисунке 4.
цифровой вольтметр микроконтроллер индикатор
Подпрограмма обработки прерывания таймера Т0 должна выполнять следующие действия:
- декрементировать счетчик переполнения таймера tcou и, в случае если 0 не был достигнут, закончить подпрограмму;
- перегрузить tcou и содержимое таймера Т0;
декрементировать счетчик cou01 и, в случае если был достигнут 0, перегрузит cou01 и установить признак метки времени 100 мс;
выключить все индикаторы;
выдать на порт РС данные по указателю данных индикатора;
включить соответствующий анод индикатора;
инкрементировать указатель данных индикатора и, в случае, если он
вышел за область буфера, загрузить его начальным адресом.
Рисунок 5. Блок-схема алгоритма основной программы
Блок-схема алгоритма подпрограммы обработки прерывания таймера Т0
приведена на рисунке 6.
Управляющая программа написана на языке ассемблера в среде AVR Studio версии 3.5. Полный текст программы приведен в приложении 1. Программа содержит 422 байта кода.
Рисунок 6. Блок-схема алгоритма обработки прерывания
Время выполнения основного цикла программы составляет не более 750 машинных циклов, время выполнения подпрограммы обработки прерывания - не более 35 машинных цикла.
В программе использовались следующие глобальные переменные:
- flag - регистр пользовательских флагов,
§ бит 0 (tf) - флаг метки времени 100 мс;
§ бит 1 (kre) - текущее состояние кнопки переключения диапазонов;
§ бит 3 (minus) - флаг отрицательного входного напряжения.
- tcou - счетчик переполнения таймера Т0, в программе обработки прерывания используется также как рабочий регистр;
- cou01 - счетчик для формирования интервала 100 мс из интервалов в 5 мс;
- mux - переменная хранения номера текущего интервала измерения;
- anod - переменная для хранения кода включения анодов семисегментных индикаторов;
- zero - регистр, содержащий 0
- buf - трехбайтовая переменная для хранения данных, выводимых на индикатор;
- Y - указатель видео буфера.
В программе использовались следующие подпрограммы:
- key - опрос кнопки переключения диапазонов, формирование флагов kre и kon в регистре flag;
- range - анализ состояния флага kon и переключение на следующий диапазон измерения;
- measure - запуск АЦП на измерение, ожидание конца измерения;
- calc - расчет бинарного кода величины, подлежащей индикации по формуле, приведенной в п. 4.3.