Техническое задание. Спроектировать цифровой измеритель частоты сети. На цифровые индикаторы выводятся три цифры (например, 51.7), т.е. значение частоты с точностью до десятых долей герца. Диапазон измеряемых частот от 20 до 99 Гц. Время измерения – не более 1 с.
Для получения требуемой точности можно подсчитать количество импульсов сетевого напряжения за 10 с. Такой алгоритм не проходит по быстродействию.
Другой способ основан на измерении периода сетевого напряжения и оценке частоты по формуле f = 1/T. Если период измерять в секундах, то получаем значение частоты в герцах. Точность определения частоты зависит от точности измерения периода и точности выполнения операции деления. При использовании микроконтроллеров следует ориентироваться на работу с целыми числами. Типичные погрешности, учитываемые при этом – погрешность дискретизации и погрешность округления.
Будем измерять период сети в микросекундах. Для типового значения частоты 50 Гц период T составляет 20000 мкс. С помощью 16-разрядного таймера, работающего на частоте 1 МГц, можно измерить период до 65 мс, что соответствует частоте порядка 17 Гц. При частоте 99 Гц период равен 10101 мкс, т.е. таймер позволит измерить его с высокой точностью (погрешность дискретизации порядка 0,01%).
Основное рабочее соотношение |
Для того чтобы работать с целыми числами и гарантировать точность цифры десятых долей герца после выполнения целочисленного деления и округления будем рассчитывать значение частоты по формуле
и после вычисления f в виде трехразрядного десятичного числа добавлять точку перед последней цифрой при выводе информации на табло. Например, при Т=20500 мкс получаем и . На цифровых индикаторах нужно зажечь значение частоты 48.8 Гц.
Выбираем микроконтроллер ATmega16 с кварцем на 8 МГц (время выполнения простейших команд 1/8 мкс). Функциональная схема устройства с распределением функций портов показана на рис.9. Порт РА используется для вывода информации на индикаторную панель. Порт РВ используется для программирования микроконтроллера (например, с помощью интерфейса «пять проводков» он подключается к СОМ-порту персонального компьютера).
Прямоугольные импульсы с частотой сети, формируемые на выходе триггера Шмитта, будем подавать на вход INT0 (вторая линия порта PD). Запустив в основной программе таймер/счетчик Т1 в требуемый режим работы, поручим основные функции по решению задачи подпрограмме внешнего аппаратного прерывания по нарастающему фронту INT0:
Полагаем, что на реализацию указанных действий будет затрачено время не более 10 мс и к началу нового периода микроконтроллер будет готов повторить описанный алгоритм в новой подпрограмме прерываний.
Рисунок 1 – Функциональная схема измерителя частоты сети
Последовательность шагов по разработке и отладке программы может быть следующей (проект формируем в папке z10):
Ниже приведен текст программы на языке Си. Для обеспечения возможности выводить на LCD-дисплей русские буквы в программу добавлена таблица кодов и функция void putchar(char c). Большую часть времени МК находится в цикле основной программы.
|
Ниже приведен файл проекта для симулятора. Для моделирования работы измерителя частоты сети к входу INT0 подключается генератор прямоугольных импульсов, период которого можно задавать программно. К порту РА подключен LCD-дисплей (две строки по 16 символов).
; файл z10_vm.prj
.MICRO "ATmega16"
.TOOLCHAIN "GENERIC"
.TARGET "z.hex"
.COFF "z.cof"
.SOURCE "z__.c"
.CLOCK 8meg
.POWER VDD = 5 VSS = 0
;V[inst_name] node VSS PULSE(v_initial v_final t_delay t_rise ;t_fall t_width ;t_period)
V1 PD2 VSS PULSE(0 5 0 0 0 5m 21m)
;X[inst_name] LCD(chars lines oscil_freq) RS RW E D7 D6 D5 D4 D3 D2 D1D0
Xdisp LCD(16 2 250K) PA0 PA1 PA2 PA7 PA6 PA5 PA4 nc3 nc2 nc1 nc0
Цель моделирования – проверка работоспособности выбранного алгоритма и оценка времени, которое микроконтроллер затрачивает на обработку информации. При проведении эксперимента раскрываем рабочие окна: Peripherals (окно периферийных устройств, чтобы пронаблюдать значение таймера Т1), I/O Ports (окно портов ввода/вывода, чтобы увидеть подачу импульсов на линию PD2), Control Panel (экран жидкокристаллического индикатора).
При моделировании подключался файл Z10.hex, сформированный при трансляции программы, подготовленной на языке Си, с выводом информации на русском языке (частота сети 47.6 Гц).
Рисунок 11.2 – Рабочие окна симулятора VMLAB
В окне Code (текст программы на языке Си) ставим точки останова перед открывающей и закрывающей скобкой подпрограммы прерывания и, проведя цикл измерения частоты (для этого дважды нажимаем зеленую кнопку светофора), определяем по данным окна Messages время выполнения подпрограммы прерывания. Оно составило 3,81 мс, что говорит о работоспособности выбранного алгоритма определения частоты. Практически каждый период сетевого напряжения обновляется значение рассчитываемой частоты.
В окне Program Memory можно увидеть машинные коды выполняемых команд и соответствующие им команды на языке ассемблера микроконтроллера. Можно реализовать пошаговое выполнение команд, нажимая кнопочку правее светофора.
При моделировании на вход прерывания INT0 подавался сигнал с генератора прямоугольных импульсов, частоту колебаний которого можно задавать с помощью соответствующих регулировок (сигнал униполярный амплитудой 5 В). Убеждаемся, что сразу после изменения частоты в диапазоне 17-120 Гц аналогичные изменения происходят на табло LCD-дисплея. При моделировании не требуется подключение кварцевого резонатора и источников питания микроконтроллера и LCD-дисплея.
Рисунок 11.3 – Рабочие окна симулятора Proteus VSM
При моделировании подключался файл Z10.hex, сформированный при трансляции программы, подготовленной на языке Си, с выводом информации на английском языке (power circuit frequency 49.0 Hz).