Национальный Технический Университет Украины
«Киевский Политехнический институт»
Курсовая работа по курсу:
«Специализированные и промышленные микропроцессорные системы»
тема:«Система ПЭВМ IBMPC/AT– автоматический фазометр»
Киев 2009
Содержание
Введение
Выбор структуры автоматического фазометра
Расчет блока питания
Расчетная часть
Описание алгоритма программы для МК
Программа для МК
Описание алгоритма программы для ПК
Программа для ПК
Выводы
Схема электрическая принципиальная
Введение
Фазометр — это устройство, которое измеряет разность фаз между эталонным и исследуемым гармоническими сигналами. Фазой гармонического напряжения U(t)=Umsin(щt+ц0) называется аргумент функции U(t), описывающей колебательный процесс. Фаза гармонического напряжения является линейной функцией времени. Угол сдвига фаз представляет собой модуль разности фаз двух гармонических сигналов U1(t) b U2(t) одинаковой частоты. Таким образом, если U1(t)=U1msin(щt+ц1), a U2(t)=U2msin(щt+ц2), то согласно определению угол сдвига фаз Дц равен Дц=|ц1 — ц2|. Если ц1 и ц2 постоянны во времени, то Дц+ от времени не зависит. При Дц = 0 гармонические напряжения называются синфазными, при Дц = ±р — противофазными. Выбор метода измерения угла сдвига фаз зависит отдиапазона частот, амплитуды сигнала и, главным образом, от требуемой точности измерения. Измерение угла сдвига фаз может выполняться как методом непосредственной оценки, так и методом сравнения. Результат измерения выражается либо в градусах, либо в радианах. Измерительные приборы, специально предназначенные для измерения угла сдвига фаз, называются фазометрами.
В основе работы цифровых фазометров всех систем лежит принцип преобразования измеряемого угла сдвига фаз во временной интервал, длительность которого пропорциональна значению измеряемой величины. Длительность временного интервала определяется при этом методом дискретного счета непосредственно, или с промежуточным преобразованием длительности временного интервала в пропорциональное ему значение величины напряжения постоянного тока.
Фазометры с непосредственным преобразованием значения длительности временного интервала в код в свою очередь подразделяются на две группы: с измерением за один период входных напряжений и с измерением за несколько периодов входных напряжений. Фазометры первой группы называются фазометрами мгновенного значения, а второй группы — фазометрами среднего значения. Фазометры среднего значения, называемые также фазометрами с постоянным временем измерения, благодаря хорошим характеристикам получили наибольшее распространение.
Выбор структуры автоматического фазометра
Для нахождения фазы сигнала проще всего измерять время между прохождением эталонного и измеряемого сигналов через ноль t±. При этом зная частоту измеряемого сигнала можно найти его фазу исходя из следующей формулы:
/>(1),
где t± — время между прохождением эталонного и измеряемого сигнала через ноль, f – частота измеряемого сигнала, множитель 360 переводит безразмерную величину в градусы.
Исходя из того, что данные измерений следует передавать в компьютер через COM-порт, то фазометр будет содержать микроконтроллер, так как с помощью него наиболее просто реализовать связь с компьютером по интерфейсу RS-232.
Также микроконтроллер можно использовать для измерения фазы, так как почти каждый микроконтроллер имеет интегрированный таймер-счетчик. Возможность этого нужно проверить исходя из поставленного задания, а именно – максимальных частоты сигнала fmax=100кГц и погрешности измерения фазы д=0.2%. Используя эти данные можно определить минимальное время, которое необходимо измерять, чтобы выполнить вышеуказанные условия. Это время находится по формуле:
/>нс (2).
Для измерения такого времени микроконтроллер должен обладать таким же или меньшим временем цикла. При этом он должен иметь частоту f=50·n МГц, где n – количество тактов в машинном цикле микроконтроллера, то есть как минимум 50 МГц (микроконтроллеры с RISC архитектурой). Микроконтроллеры с такой частотой очень дороги и их нецелесообразно использовать для данной задачи. Поэтому для измерения фазы следует использовать отдельный таймер и генератор прямоугольных импульсов с тактовой частотой 50 МГц или выше, при этом требования к микроконтроллеру по времени цикла смягчаться. В данном случае микроконтроллер, раз за период сигнала, фаза которого измеряется, должен считать со счетчика данные. Так как максимальная частота сигнала 100 кГц, то это он должен суметь сделать за 10 мкс. К тому же этот микроконтроллер должен иметь встроенный контроллер интерфейса RS-232C для связи с компьютером. Согласно этим требованиям подходит широко известный микроконтроллер фирмы Atmel AT89C51 с тактовой частотой 12МГц и временем цикла 1 мкс.
Обоснование структурной схемы
Структурная схема проектируемого устройства изображена на рис. 1
Рис. 1. Структурная схема фазометра
Объясним работу автоматического фазометра по структурной схеме. На систему определения перехода напряжений через ноль подается эталонное напряжение и напряжение, фазу которого нужно измерять. Эта система включает таймер в интервале времени, начиная с момента, когда эталонное напряжение перешло через ноль (например, при переходе напряжения из области отрицательных положений в положительную область), а измеряемое напряжение – еще нет. В этот интервал времени таймер считает такты генератора импульсов, а при исчезновения сигнала запуска от системы перехода через ноль – в таймере будет храниться число, которое соответствует разности фаз эталонного и измеряемого сигналов. Это число считывается микроконтроллером и передается по интерфейсу RS-232C, через преобразователь уровней, компьютеру. В компьютере это число переводится в градусы и записывается в область памяти, которая указана в задании.
Рассмотрим каждый функциональный узел автоматического фазометра более подробно.
Система определения перехода напряжений через ноль
Данная система должна выполнять следующие действия:
Как только любой измеряемый сигнал перейдет из отрицательных значений напряжения в положительные, на выходе этого узла устанавливается сигнал, который запускает таймер.
Таймер продолжает работать пока эталонное напряжение не перейдет из отрицательных значений напряжения в положительные.
Также в этом узле целесообразно выполнить гальваническую развязку.
Функциональная схема этого узла изображена ниже.
Рис.2. Функциональная схема системы определения перехода через ноль
Функциональная схема системы определения перехода напряжений через ноль
Объясним работу системы определения перехода напряжений через ноль.
Измеряемое и эталонное напряжение подается на вход компараторов через ограничители напряжения, который обрезает напряжения большие некоторой величины. Это сделано из-за того, что максимальное значение напряжения сигнала может достигать 100В, а на компараторы нельзя подавать напряжение большей величины чем значение напряжения питания. После компараторов сделана гальваническая развязка. Гальваническая развязка сделана в этом месте из таких соображений:
по этим линиям передается цифровой сигнал, что дает возможность использовать оптическую развязку;
гальванически развязанной с измеряемыми напряжениями будет почти вся измерительная система (кроме 2-ух компараторов).
Эти компараторы выдает сигнал высокого уровня если соответствующее напряжение больше нуля или сигнал низкого уровня – если меньше нуля. То есть на выходе компараторов будет меандр. С выходов компараторов эти сигналы поступают на вход защелки C D-триггеров DD2.1 и DD2.2. По переднему фронте на входе С этих триггеров на их прямых выходах появится уровень сигнала, который подавался на его вход D (при условии, что на входы асинхронной установки триггеров S и R будут подаваться неактивные уровни сигналов).--PAGE_BREAK--
Триггер DD2.2 включен таким образом, что при появлении на его прямом выходе сигнала низкого уровня, через время равное задержке распространения сигнала через два инвертора на его выходе вновь установится сигнал высокого уровня. Это связано с тем, что сигнал с выхода этого триггера подается на его вход S асинхронной установки логической «1». Так как активный уровень сигнала у этого входа низкий, то при появлении на выходе этого триггера логического «0», он дважды проинвертировавшись (что сделано лишь для задержки сигнала)поступит на вход S и вызовет переключение триггера. Но при этом на выходе триггера DD2.2 появится кратковременный импульс отрицательной полярности.
Исходя из этого, узел на микросхемах DD1-DD3 работает следующим образом. Объяснение работы схемы лучше всего начать с момента прихода положительного фронта на вход защелки триггера DD2.2 (переход эталонного напряжения из отрицательного значения в положительное). В этот момент времени на прямом выходе триггера DD2.2 установится логический «0», что вызовет установку на выходе триггера DD2.1 логического «0» (так как выход триггера DD2.2 связан со входом сброса триггера DD2.1), на выходе триггера DD2.2 вновь появится сигнал высокого уровня. Фактически по первому переднему фронту на защелке триггера DD2.2 происходит инициализация этой системы. Теперь она готова к работе. При переходе измеряемого напряжения из отрицательных значений в положительные, на вход C триггера DD2.1 поступает положительный фронт. Так как на его вход D поступает сигнал логической «1», то и на выходе триггера DD2.1 появится сигнал логической «1». До этого на его выходе был логический «0». Так как сигналы с выходов триггеров DD2.1 и DD2.2 поступают на входы микросхемы 2И DD3.1, то на ее выходе в промежуток времени между переходами измеряемого и эталонного напряжения через ноль будет сигнал логической «1». После того как напряжение эталонного сигнала перейдет из отрицательного значения в положительное, то произойдет процесс инициализации и на выходе системы вновь появится сигнал логического «0». Согласно этому, на выходе системы будет сигнал логической «1» в промежуток времени между событиями перехода из отрицательного значения в положительное напряжений измеряемого и эталонного сигналов. Для научного представления представим этот процесс в виде временных диаграмм.
Рис.3. Временные диаграммы системы перехода через ноль
Реализация делителя напряжения, гальванической развязки
Так как следует сделать защиту от перенапряжения до 500В, а на вход компаратора нельзя подавать напряжение большее чем напряжение источника питания (5В), то на входе компаратора следует поставить ограничитель напряжения. Схема включения компаратора указана ниже.
Рис.4. Блок гальванической развязки
Опишем функциональное значение каждого компонента данного узла. В качестве компаратора в данном узле используется операционный усилитель (ОУ) DA1. Резисторы R1 и R2 предназначены для деления напряжения сигнала. Их соотношение должно быть таким, чтобы при максимальной амплитуде входного сигнала (500В), напряжение на прямом входе ОУ не превышало 5В. Исходя из этого />. Так как входное сопротивление ОУ составляет сотни килом, то сопротивление R2 можно взять достаточно большим. Возьмем R2=10 кОм. Тогда R1=990 кОм ≈1 МОм. Через сопротивление R3 заземляется инверсный вход ОУ. Сопротивление R4 используется как токозадающий элемент для оптопары. Его величину рассчитывают исходя из соотношения:
/>,
где /> — напряжение логической «1» на выходе компаратора (5В),
/>— напряжение на открытом светодиоде (около 1.5В),
/>— номинальный ток светодиода (30 мА).
Исходя из этого />Ом.
Описание таймера
В данное время большинство таймеров интегрированы в микроконтроллеры и являются его неотъемлемой периферией. Дискретные таймеры, тем более рассчитанные на частоту работы 50 МГц, никто не производит. Поэтому таймер в данной работе будет реализован следующим образом. В качестве генератора импульсов будет использован генератор/делитель фирмы DALLAS Semiconductor DS1065-60, частоту которого можно менять программным способом в широком диапазоне частот (30 кГц..60МГц). Программирование этой микросхемы осуществляется по однопроводному интерфейсу MicroLan. К выходу этого генератора будет подсоединен счетчик импульсов, который будет считать такты этого генератора, когда на выходе системы перехода через ноль будет высокий уровень напряжения. В конце цикла счета МК считает число тактов с выхода счетчика и определит эквивалентное время разности фаз эталонного и измеряемого сигналов.
Определим разрядность счетчика для того, чтобы разность фаз определялась с заданной точностью. Так как погрешность измерения фазы 0.2%, то число которое должен хранить счетчик минимум должно быть
/>
Но учитывая, что частота генератора не может быть установлена в точности в 500 раз большая чем у измеряемого сигнала, но может, максимум, отличаться в 2 раза то число которое должен хранить счетчик соответственно удваивается и равно N=1000. Разрядность счетчика для такого числа равна
/>
Так как в качестве секций счетчика будут использованы 4-разрядные счетчики, то для полного использования их возможностей надо взять Np=12. Тогда N=212=4096. Учитывая, что минимальная частота генератора равна 30кГц, то минимальная частота измеряемого сигнала равна
/>
Поэтому фазу сигналов, частота которых меньших 7.5 Гц, будет измерять сам микроконтроллер с помощью интегрированного таймера.
Принцип измерения фазы
Измерение фазы ведется в такой последовательности:
микроконтроллер с помощью встроенного таймера измеряет частоту сигнала;
если частота сигнала меньше 7.5 Гц, то разность фаз между сигналами он измеряет сам;
если частота сигнала находиться в промежутке от 7.5 Гц до 15кГц (60МГц/4000), то МК записывает в генератор импульсов константу так, чтобы его частота была в 4096 раз больше чем частота сигнала (точнее в N раз, гдеN – максимально возможное число меньшее 4096);
если частота сигнала больше 15кГц, то в генератор импульсов записывается константа так, чтобы его частота равнялась 60МГц;
микроконтроллер в конце цикла измерения считывает значение фазы;
микроконтроллер передает по каналу UART два числа соответствующие частоте сигнала и его фазе.
Расчет блока питания
Для данной системы понадобиться двухканальный блок питания. Напряжение обоих каналов +5В. Два канала питания берется для того, чтобы сделать гальваническую развязку системы измерения фаз с диагностируемым устройством. Так как до гальванической развязки стоят два компаратора, то для них нужен отдельный канал питания. Это компараторы NE5682N фирмы PHILIPS.Компаратор потребляютмаксимум 40 мА. Поэтому первый канал источника должен иметь нагрузочную способность минимум 40 мА. Второй канал источника будет запитывать всю остальную часть схемы. Посчитаем на какой ток должен быть рассчитан второй канал. Генератор потребляет 50 мА, каждый счетчик 15 мА, триггер – 8 мА, инвертор – 4 мА, микросхема 2И-НЕ 4 мА, система согласования сигнала с оптопары – 6 мА, микроконтроллер – 20 мА, преобразователь уровней – 10 мА. То есть суммарная нагрузка на второй канал блока питания равна 153 мА. Будем рассчитывать второй канал на ток 200 мА. Потребляемая мощность всех элементов платы чуть более 1 Вт.
Блок питания будет строиться по стандартной схеме – переменное напряжение 220В подается на вход трансформатора, где амплитуда этого напряжение уменьшается до необходимой величины, затем переменное напряжение выпрямляется с помощью мостового выпрямителя и сглаживается стабилизатором КР142ЕН8.
Для конструирования блока питания возьмем стандартные элементы. В качестве трансформатора – трансформатор питания типа ТПП – ТПП234-127/220-50 (ток вторичных обмоток 200 мА, номинальная мощность – 10Вт, напряжение вторичных обмоток 10В).
Каждый диод выпрямителя должен выдерживать обратное напряжение />и прямой ток />мА. Согласно этому в качестве диодов мостового выпрямителя был выбран диод КД504А (Iпр=0.16А, Uобр=40В). При стандартном подключении стабилизатора КР142ЕН8 на его входе и выходе следует включить конденсаторы номиналом 20 мкФ марки К50-6.
Расчетная часть
Рассмотрим алгоритм измерения фазы и частоты сигнала.
Частота сигнала будет измеряться с помощью сигнала с выхода усилителя на транзисторе VT2. Этот сигнал будет подсоединен к входу внешнего прерывания INT0. Микроконтроллер будет настроен так, чтобы прерывание вызывалось когда на этом выводе будет сигнал низкого уровня. А подпрограмма обработки прерывания будет иметь вид: продолжение
--PAGE_BREAK--
Freq:
Inc DPTR
reti
Перед измерением частоты сигнала в регистр DPTR заносится ноль, разрешается прерывание INT0 (причем срабатывает оно при низком уровне сигнала на выводе INT0). Когда на этом входе буде сигнал низкого уровня то прерывания будет вызываться и увеличивать значение регистра DPTR на 1. Как только значение на этом входе станет равным 1 следует сохранить значение DPTR. Подсчитаем сколько циклов занимает одно выполнение подпрограммы прерывания.
Один цикл занимает определение условия возникновения прерывания; по два цикла инкремент регистра и выход из подпрограммы прерывания. С учетом, что время цикла МК составляет 1 мкс, то подпрограмма обработки прерывания занимает 5мкс и позволяет измерить временные отрезки 5мкс (200 кГц)..5мкс·65536(3Гц). С учетом того, что меряется только время половины периода (отрицательный полупериод сигнала) диапазон измеряемых частот буде составлять 1-100 кГц. При этом значение регистра DPTR будет прямопропорционально периоду сигнала. Пересчет в частоту будет осуществляться следующим образом:/>, где N – содержимое регистра DPTR после измерения частоты сигнала. Исходя из этого частоте 15 кГц соответствует число 6, а частоте 7.5 Гц – 15333.
Фаза сигнала с помощью МК будет измеряться таким же методом, но с учетом, что МК измеряет фазы сигналов только с малой частотой. Сигнал с помощью которого определяется фаза подсоединен к входу внешнего прерывания INT1. Разность фаз прямопропорциональна сигналу низкого уровня. Подпрограмма обработки этого прерывания будет иметь следующий вид:
Fase:
Inc
DPTR
NOP
NOP
NOP
NOP
NOP
reti
Эта подпрограмма выполняется 10 мкс. Увеличение времени выполнения этой подпрограммы вызвано тем, что сигнал фазы может иметь максимальную длительность равную периоду сигнала (а не половине как при измерение частоты), что может привести к переполнению регистра DPTR в случае если подпрограмма занимает 5 мкс. Поэтому время выполнения этой подпрограммы увеличено вдвое.
Рассмотрим алгоритм нахождения константы пересчета для загрузки в генератор.
Если частота сигнала больше 15 кГц (N
Если частота сигнала меньше 15 кГц (N>6), то в 9-разрядный регистр MUX генератора, с помощью которого определяется режим работы программного делителя частоты, загружается число 000110100В. При занесении в регистр MUX данного числа частота генератора будет равна (60/(ND+2)) МГц, где ND – число загружаемое в 9-разрядный регистр-делитель. Так как необходимо получать частоту генератора равную />, и исходя из справочной документации частота генератора имеет зависимость от константы пересчета:
/>
то имеем систему исходя из которой найдем зависимость ND(N):
/>(1)
С учетом того, что вычисление по формуле (1) константы ND будет выполняться с погрешностью, то следует увеличить ее значение на 1, для того чтобы частота генератора гарантированно была меньше числа />, и не произошло переполнения счетчика. Тогда />(2). Посчитаем при каком N в формуле (2) ND будет неотрицательным/>. То есть фактически формулу (2) для пересчета можно применять для частот при которых N>6. Так как максимальное значение программного делителя составляет 513 (29+2), то минимальная частота генератора при которой применим этот алгоритм деления частоты составляет
/>кГц.
При этом из формулы (2)
/>
а частота сигнала равна />Гц.
Для получения более низкой частоты нужно изменить значение регистра MUX генератора на такое значение 000111000В. Тогда частота на выходе генератора будет меньше чем частота резонатора генератора (60 МГц) в 2·(ND+2) раза. Тогда уравнение, из которого вычисляется константа ND, изменится, и будет иметь вид:
/>
Поэтому значение ND согласно формуле (2) нужно поделить на 2 и добавить 1. Тогда
/>(3)
При этом константа ND, вычисленная по формуле (3) программируется в генератор при частоте сигнала в диапазоне />Гц, что соответствует значению N=3496..6977=0DA8h..1B41h.
При частотах сигнала в диапазоне fc=7.5..14.3 Гц в регистр MUX генератора программируется следующее значение 000110000В. Тогда частота на выходе генератора будет меньше чем частота резонатора генератора (60 МГц) в 4·(ND+2) раза. Поэтому значение ND согласно формуле (2) нужно поделить на 4 и добавить 1. Тогда/>что соответствует значению N=6978..13954=1B42h..3682h.
Рассчитаем, какое число нужно загрузить в регистр TH1 для настройки последовательного интерфейса на скорость 4800 бод/с. Частота передачи данных рассчитывается по формуле:
/>
Из этой формулы находим константу которую нужно загрузить в TH1.
/>
Так как число 243 округлялось найдем фактическую скорость передачи данных.
/>бод/с
Погрешность составляет 0.15%. Такая погрешность скорости не вызывает ошибок при передаче данных.
Описание алгоритма программы для МК
Микроконтроллер должен осуществлять такие действия:
начальную настройку своих узлов и периферийных устройств;
прием параметров измерения фазы от компьютера;
измерение частоты сигнала;
выбор режима измерения фазы;
выдача информации о частоте и фазе компьютеру.
Соответственно этому МК будет работать по алгоритму указанному на рис.5.
Рис.5. Блок-схема алгоритма программы для МК
Программа для МК
BSEG
ORG 0h продолжение
--PAGE_BREAK--
Cell_Tr: DBIT 1
DSEG
ORG 30h
Fr_low: DS 1
Fr_high: DS 1
Fase_low: DS 1
Fase_high: DS 1
Contr_sum: DS 1
CSEG
ORG 0h
Jmp On_Reset:
ORG 3h
Jmp Freq
ORG 0Bh
Reti
ORG 13h
Jmp Fase
ORG 1Bh
Reti
ORG 23h
Reti
ORG 40h
On_Reset :
MovIE, #0 ; запрет всех прерываний
Mov Sp, #40h; установка вершины стека
Mov IP, #0; все приоритеты прерываний одинаковы
Mov TCON,#0; внешние прерывания вызываются по низкому уровню
; на входах INT0,INT1
Mov TMOD,#00100000B; таймер/счетчик Т1 работает в режиме 8-битного с
; таймера c автоперезагрузкой
Mov SCON,#11001100B; 8-битовый приемопередатчик + бит паритета
Mov PCON,#10000000B; удвоенная скорость передачи данных (SMOD=1)
Mov A, #243; настройка скорости последовательного интерфейса
Mov TH1, A; 4800 бод/с
Setb TR1; запуск таймера T1
Mov DPTR, #0 ;
MovIE, #1000001B; разрешение прерыванийот INT0 измерение частоты
Mov R0, #100; проверка правильности работы фазометра
Next_wait:; при разрешенном прерывании
Acall Del_10; каждые 10 мс проверяется содержимое DPL
Mov A, R0;
Mov R1, A;
Fr_beat:
NOP
Djnz R1, Fr_beat; этот участок кода нужен для обнаружения частот
Mov A, DPL; с периодом кратным 10 мс
Jnz Work; если в DPL не ноль то фазометр работает нормально
Djnz R0, Next_wait; иначе снова проверять
Clr EA; запрет прерываний
Clr Cell_tr; сбросить флаг работоспособности
Rjmp Send_error
Work:
Setb Cell_tr; установить флаг работоспособности
Send_error:
Acall Get_COM; ждатьсообщенияотПК
Mov Acc.0, Cell_tr
Acall Transmit_COM; послать сообщение ПК о работоспособности
Jb Cell_tr, To_do; если фазометр работает, то продолжать работу
Ret; иначе конец программы
To_do:
Acall Get_COM; получить количество измерений
Mov R1, A
Acall Get_COM; получить период измерений
Mov R5, A
Clr A
Mov Contr_sum, A; обнуляемконтрольнуюсумму
Next_measure:
Mov DPTR, #0; померятьчастоту
MovIE, #1000001B; разрешение прерыванийот INT0 измерение частоты
Jnb IE0, $
Jb IE0, $
Clr EA продолжение
--PAGE_BREAK--
Mov A, DPH
Acall Transmit_COM; передачаПК
Mov Fr_high, A; сохранить старший байт
Mov A, DPL
Acall Transmit_COM; передачаПК
Mov Fr_low, A; сохранить младший байт
Mov A, Fr_high
Subb A, #36h
Jnc Meas_MK; еслиDPH > 36h, тофазумеряетMK
Mov A, Fr_high
Subb A, #1Bh; еслиDPH > 1Bh, тофазумеряеттаймерс
Jnc Meas_T4; предделением частоты на 4
Mov A, Fr_high
Subb A, #0Dh; если DPH > Dh, то фазу меряет таймер с предделением
Jnc Meas_T2; частоты на 2
Mov A, Fr_low
Subb A, #06h; если DPL > 6, то фазу меряет таймер без предделения
Jnc Meas_T; частоты, иначе таймер работает на
; максимальной частоте 60 МГц
Acall First_reset; начальный сброс генератора
Mov A, #1; код команды записи в регистр DIV
Acall Write_Byte; запись в генератор
Mov A, #00110010В; загрузка 8 бит константы для задания частоты
; генератора
Acall Write_Byte; запись в генератор
Acall Write_0; 9-ыйбит
Ajmp Meas_G
Meas_T:
Mov R2, Fr_low; вычисление/>
Mov R3, Fr_high
Mov R1, #4
Acall Dividing
Mov A, R2
Mov B, #75
MUL AB
Mov R2, A
Mov A, B
Mov R3, A
Mov R1, #5
Acall Dividing
Dec R2
Mov A, R3
Jnc Meas_G
Dec A
Mov R3, A
Acall First_reset; начальныйсброс
Mov A, #1; код команды записи в регистр DIV
Acall Write_Byte; запись в генератор
Mov A, #00110100В; загрузка 8 бит константы для задания частоты
; генератора
Acall Write_Byte; запись в генератор
Acall Write_0; 9-ыйбит
Ljmp Meas_G
Meas_T2:
Mov R2, Fr_low; вычисление/>
Mov R3, Fr_high
Mov R1, #5
Acall Dividing
Mov A, R2
Mov B, #75
MUL AB
Mov R2, A
Mov A, B
Mov R3, A
Mov R1, #5
Acall Dividing
Acall First_reset; начальный сброс
Mov A, #1; код команды записи в регистр DIV
Acall Write_Byte; запись в генератор
Mov A, #00111000В; загрузка 8 бит константы для задания частоты
; генератора
Acall Write_Byte; запись в генератор
Acall Write_0; 9-ыйбит
Ljmp Meas_G продолжение
--PAGE_BREAK--
Meas_T4:
Mov R2, Fr_low; вычисление/>
Mov R3, Fr_high
Mov R1, #6
Acall Dividing
Mov A, R2
Mov B, #75
MUL AB
Mov R2, A
Mov A, B
Mov R3, A
Mov R1, #5
Acall Dividing
Acall First_reset; начальный сброс
Mov A, #1; код команды записи в регистр DIV
Acall Write_Byte; запись в генератор
Mov A, #00110000В; загрузка 8 бит константы для задания частоты
; генератора
Acall Write_Byte; запись в генератор
Acall Write_0; 9-ыйбит
Meas_G:
Mov A, #2; код команды записи в программный делитель
Acall Write_Byte; запись в генератор
Mov A, R2; младшие 8 бит предделителя
Acall Write_Byte; запись в генератор
Mov A, R3; старшийбит
Jb Acc.0, Wr1
Acall Write_0; запись в генератор 0
Ljmp St_m
Wr_1:
Acall Write_1; запись в генератор 1
St_m:
Acall First_reset; начало работы генератора после программирования
Clr P0.1; сброс счетчиков
Jnb IE1, $; ждем пока не возникнет прерывания от изм. фазы
Setb P0.1; разрешение счета счетчиков
Jb IE1, $; ждем пока не завершиться прерывания от изм. фазы
Mov A, P1; считываем младший байт результата
Mov Fase_low, A
Mov A, P0; считываем старший байт результата
Anl A, #1111B; обнуляем незначащие биты
Mov Fase_high, A
Ljmp Transm_fase
Meas_MK:
Mov DPTR, #0; обнулениесчетчика
MovIE, #1000100B; пуск измерения фазы на частоте меньшей 28.6 Гц
Jnb IE1, $; с помощью аппаратных возможностей МК
Jb IE1, $
Clr EA
Mov A, DPН; считывания старшего байта фазы
Mov Fase_high, A; сохранение
Mov A, DPL; считывания младшего байта фазы
Mov Fase_low, A; сохранение
Transm_fase:
Mov A, Fase_high
Acall Transmit_COM; передачаПК
Mov A, Fase_low
Acall Transmit_COM; передачаПК
Acall Del_c; задаем период измерения
Djnz R1, Next_measure; следующее измерение
Mov A, Contr_sum; передача контрольной суммы
Acall Transmit_COM
Ljmp To_do
ret
; подпрограмма начального сброса генератора
First_reset:
Clr I/O
Mov R0, #139
Acall Del_any
Setb I/O
Mov R0, #12
Acall Del_any
Jnb I/O, Rst3
Mov A, #1 продолжение
--PAGE_BREAK--
Ret
Rst3:
Mov R0, #99
Acall Del_any
Jb I/O, Rst5
Mov A, #2
Ret
Rst5:
Mov A, #0
Ret
; подпрограмма записи бита #0 по однопроводному интерфейсу
Write_0:
Clr I/O
Mov R0, #15
Acall Del_any
Setb I/O
Ret
; подпрограмма записи бита #1 по однопроводному интерфейсу
Write_1:
Clr I/O
Mov R0, #1
Acall Del_any
Setb I/O
Mov R0, #14
Acall Del_any
Ret
; подпрограмма записи байта по однопроводному интерфейсу
Write_Byte:
Clr I/O; запрет прерывания
Mov R1, #8; 8 бит
Wb1:
Rrc A; А→С
Jc Wb2 ;
Acall Write_0 ;
Jmp Wb3
Wb2:
Acall Write_1 ;
Djnz R1, Wb1 ;
Setb EA ;
Ret
; прием байта по COM-порту в аккумулятор
Get_COM:
Jnb RI, Get_COM
Mov A, SBUF
Clr RI
Ret
; передача байта по COM-порту через аккумулятор
Transmit_COM:
Mov SBUF, A
SEND:
Jnb TI, SEND
Clr TI
Push A; контроль правильности передачи данных
Mov A, Contr_sum; поблочным суммированием
Pop R4
Add A, R4
Mov Contr_sum, A
Ret
; задержка5мкс
Del_5:
NOP
Ret
; подпрограмма задержки, параметр R0, задержка=5*R0 мкс
Del_Any:
Next_del:
Acall Del_5
Djnz R0, Next_del
Ret
; подпрограмма задержки на 10 мс
Del_10:
Push R1
Push R0
Mov R1, #10
To_next:
Mov R0, #199
Acall Del_any
Djnz R1, To_next
Pop R0
Pop R1
Ret
; подпрограмма задержки на R5 с
Del_c:
Mov A, R5
Mov R7, A
Del_sec:
Clr C
Mov R6, #100
Next_1c: продолжение
--PAGE_BREAK--
Acall Del_10
Dec R6
Jnc Next_1c
Mov R1, #10
Dec R7
Jnc Del_sec
Ret
; подпрограмма деления на 2n двухбайтового числа R3:R2 сдвигом n=R1
Dividing:
Clr C
Mov A, R3
Rrc A
Mov R3, A
Mov A, R2
Rr A
Mov R2, A
Djnz R0, Dividing
ret
; подпрограммы обработки прерываний
Freq:
Inc DPTR
reti
Fase:
Inc DPTR
NOP
NOP
NOP
NOP
NOP
reti
Описание алгоритма программы для ПК
Программа, которая будет выполняться ПК должна осуществить следующие действия:
определить у пользователя параметры измерения фазы;
инициировать начало работы фазометра;
считать сообщение о исправности фазометра;
в случае если он исправен послать сообщение о параметрах измерения фазы;
считать числа соответствующие фазе и частоте;
преобразовать частоту в герцы, а фазу в радианы и сохранить;
в конце измерения вывести на экран среднее значение фазы и частоты;
повторить все начиная с пункта 1.
Рис.6… Блок-схема алгоритма программы для ПК
Программа для ПК
uses crt;
var i,k,z,contr,l,ms:Byte;
Base: word ;
Value: byte;
t :Boolean;
fase,freaquency:integer;
fase_r,freaquency_r,divider:real;
data:array[1..100,1..2]of real absolute $6B00:$0000;
Procedure OpenCom(Base:word; Baudrate:word; Config :byte);
begin
while Port[Base+5] and $60 $60 do;
Port[Base+3] := $80;
Port[Base+1] := BaudRate shr 8;
Port[Base+0] := BaudRate and $FF;
Port[Base+3] := Config;
Port[Base+4] := 0;
Port[Base+1] := 0;
end;
Procedure send_char(Base: word; Value: byte);
begin
while ((Port[Base+5] and $20) = 0) do ;
Port[Base] := Byte(Value);
end;
Function get_char( Base: word ): Boolean;
var status: word;
begin
Status := Port[Base + 5];
if ((Status and $1E) 0) or ((Status and 1) = 0 ) then get_char := False
else
begin
Value := Port[Base];
contr:=contr+Value;
get_char := True;
end;
end;
begin
z:=1;
while(z=1) do
begin
clrscr;
contr:=0;
writeln('Progam measure of fase');
writeln;
writeln('Input count measures');
Readln(i); продолжение
--PAGE_BREAK--
writeln;
writeln('Input time of measurements');
Readln(l);
Base:=MemW[$40:2]; {COM2}
OpenCom(Base,24,3 + 0 + 0); {4800,8-bit,1 stop-bit,no control error}
send_char(Base, 0); {start}
if(get_char(BASE)=TRUE) then k:=Value; {meassage about working of device}
k:=k and 1;
if(k=0) then
begin
send_char(Base, i); {number of measurements}
send_char(Base, l); {time of measurement}
for k:=1 to i do
begin
if(get_char(BASE)=TRUE) then k:=Value; {higer byte of freaquency}
freaquency:=k*256;
if(get_char(BASE)=TRUE) then k:=Value; {lower byte of freaquency}
freaquency:=freaquency+k;
freaquency_r:=10e5/freaquency; {convertion in Hz}
if(get_char(BASE)=TRUE) then k:=Value; {higer byte of fase}
fase:=k*256;
if(get_char(BASE)=TRUE) then k:=Value; {lower byte of fase}
fase:=fase+k;
if(freaquency
begin
divider:=1;
end;
if(freaquency>6)and(freaquency
begin
divider:=(75*freaquency)/512+1;
end;
if(freaquency>$0DFF)and(freaquency
begin
divider:=(75*freaquency)/1024+2;
end;
if(freaquency>$1BFF)and(freaquency
begin
divider:=(75*freaquency)/2048+2;
end;
if(freaquency
else {fase measured MK}
begin
fase_r:=360*((2*fase)/freaquency);
end;
data[k][1]:=freaquency_r;
data[k][2]:=fase_r;
end;
if(get_char(BASE)=TRUE) then
begin
if(Valuecontr) then {control}
begin
z:=0;
writeln('Error COM port');
end
else
begin
l:=0;
while l=0 do
begin
clrscr;
writeln('Input number of measurements');
Readln(ms);
if(ms>100) then l:=1
else writeln('f=',data[ms,1],' fase=',data[ms,2]);
ReadKey;
end;
freaquency_r:=0;
fase_r:=0;
for k:=1 to i do {medium measurements}
begin
freaquency_r:=freaquency_r+data[k,1];
fase_r:=fase_r+data[k,2];
end;
freaquency_r:=freaquency_r/i;
fase_r:=fase_r/i;
Writeln('Medium f=',freaquency_r,' fase=',fase_r,' o');
end;
end;
end
else
begin
clrscr;
writeln('Error COM port');
z:=0;
end;
end;
end.
Выводы
В данной работе был спроектирован автоматический фазометр. Основной сложностью при его проектирование был выбор компонентой базы, так как данный фазометр должен измерять фазу у сигнала с частотой 100кГц с точностью 0.2%. Это эквивалентно измерению временных интервалов длительностью 20нс. Интегральных таймеров на такую частоту найдено не было. Из-за чего таймер был спроектирован на базе трех 4-разрядных счетчиков и генератора с программируемой частотой. Для измерения фазы сигнала вначале измеряется его частота с помощью микроконтроллера, а затем генератор программируется на частоту в 212 раз большую, чем частота сигнала. При активном уровне с выхода системы перехода напряжений через ноль, счетчик считает импульсы генератора, а затем микроконтроллер считывает их и передает компьютеру, где константы соответствующие частоте и фазе преобразуются в герцы и градусы и показываются оператору по его запросу.