Главная              Рефераты - Коммуникация и связь

Система ПЭВМ IBM PCAT автоматический фазометр - курсовая работа

Национальный Технический Университет Украины

«Киевский Политехнический институт»

Курсовая работа по курсу:

«Специализированные и промышленные микропроцессорные системы»

тема: «Система ПЭВМ IBM PC / AT – автоматический фазометр»

Киев 2009

Содержание

Введение

Выбор структуры автоматического фазометра

Расчет блока питания

Расчетная часть

Описание алгоритма программы для МК

Программа для МК

Описание алгоритма программы для ПК

Программа для ПК

Выводы

Схема электрическая принципиальная


Введение

Фазометр - это устройство, которое измеряет разность фаз между эталонным и исследуемым гармоническими сигналами.Фазой гармонического напряжения U(t)=Um sin(щt+ц0 ) называется аргумент функции U(t), описывающей колебательный процесс. Фаза гармонического напряжения является линейной функцией времени. Угол сдвига фаз представляет собой модуль разности фаз двух гармонических сигналов U1 (t) bU2 (t) одинаковой частоты. Таким образом, если U1 (t)=U1 m sin(щt+ц1 ), a U2 (t)=U2 m sin(щt+ц2 ), то согласно определению угол сдвига фаз Дц равен Дц=|ц1 - ц2 |. Если ц1 и ц2 постоянны во времени, то Дц+ от времени не зависит. При Дц = 0 гармонические напряжения называются синфазными, при Дц = ±р - противофазными. Выбор метода измерения угла сдвига фаз зависит отдиапазона частот, амплитуды сигнала и, главным образом, от требуемой точности измерения. Измерение угла сдвига фаз может выполняться как методом непосредственной оценки, так и методом сравнения. Результат измерения выражается либо в градусах, либо в радианах. Измерительные приборы, специально предназначенные для измерения угла сдвига фаз, называются фазометрами.

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

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

Выбор структуры автоматического фазометра

Для нахождения фазы сигнала проще всего измерять время между прохождением эталонного и измеряемого сигналов через ноль t± . При этом зная частоту измеряемого сигнала можно найти его фазу исходя из следующей формулы:

(1),

где t± - время между прохождением эталонного и измеряемого сигнала через ноль, f – частота измеряемого сигнала, множитель 360 переводит безразмерную величину в градусы.

Исходя из того, что данные измерений следует передавать в компьютер через COM-порт, то фазометр будет содержать микроконтроллер, так как с помощью него наиболее просто реализовать связь с компьютером по интерфейсу RS-232.

Также микроконтроллер можно использовать для измерения фазы, так как почти каждый микроконтроллер имеет интегрированный таймер-счетчик. Возможность этого нужно проверить исходя из поставленного задания, а именно – максимальных частоты сигнала f max =100кГц и погрешности измерения фазы д=0.2%. Используя эти данные можно определить минимальное время, которое необходимо измерять, чтобы выполнить вышеуказанные условия. Это время находится по формуле:

нс (2).

Для измерения такого времени микроконтроллер должен обладать таким же или меньшим временем цикла. При этом он должен иметь частоту f =50·n МГц, где n – количество тактов в машинном цикле микроконтроллера, то есть как минимум 50 МГц (микроконтроллеры с RISC архитектурой). Микроконтроллеры с такой частотой очень дороги и их нецелесообразно использовать для данной задачи. Поэтому для измерения фазы следует использовать отдельный таймер и генератор прямоугольных импульсов с тактовой частотой 50 МГц или выше, при этом требования к микроконтроллеру по времени цикла смягчаться. В данном случае микроконтроллер, раз за период сигнала, фаза которого измеряется, должен считать со счетчика данные. Так как максимальная частота сигнала 100 кГц, то это он должен суметь сделать за 10 мкс. К тому же этот микроконтроллер должен иметь встроенный контроллер интерфейса RS-232C для связи с компьютером. Согласно этим требованиям подходит широко известный микроконтроллер фирмы AtmelAT89C51 с тактовой частотой 12МГц и временем цикла 1 мкс.

Обоснование структурной схемы

Структурная схема проектируемого устройства изображена на рис. 1

Рис. 1. Структурная схема фазометра


Объясним работу автоматического фазометра по структурной схеме. На систему определения перехода напряжений через ноль подается эталонное напряжение и напряжение, фазу которого нужно измерять. Эта система включает таймер в интервале времени, начиная с момента, когда эталонное напряжение перешло через ноль (например, при переходе напряжения из области отрицательных положений в положительную область), а измеряемое напряжение – еще нет. В этот интервал времени таймер считает такты генератора импульсов, а при исчезновения сигнала запуска от системы перехода через ноль – в таймере будет храниться число, которое соответствует разности фаз эталонного и измеряемого сигналов. Это число считывается микроконтроллером и передается по интерфейсу RS-232C, через преобразователь уровней, компьютеру. В компьютере это число переводится в градусы и записывается в область памяти, которая указана в задании.

Рассмотрим каждый функциональный узел автоматического фазометра более подробно.

Система определения перехода напряжений через ноль

Данная система должна выполнять следующие действия:

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

2)Таймер продолжает работать пока эталонное напряжение не перейдет из отрицательных значений напряжения в положительные.

Также в этом узле целесообразно выполнить гальваническую развязку.

Функциональная схема этого узла изображена ниже.


Рис.2. Функциональная схема системы определения перехода через ноль

Функциональная схема системы определения перехода напряжений через ноль

Объясним работу системы определения перехода напряжений через ноль.

Измеряемое и эталонное напряжение подается на вход компараторов через ограничители напряжения, который обрезает напряжения большие некоторой величины. Это сделано из-за того, что максимальное значение напряжения сигнала может достигать 100В, а на компараторы нельзя подавать напряжение большей величины чем значение напряжения питания. После компараторов сделана гальваническая развязка. Гальваническая развязка сделана в этом месте из таких соображений:

1) по этим линиям передается цифровой сигнал, что дает возможность использовать оптическую развязку;

2) гальванически развязанной с измеряемыми напряжениями будет почти вся измерительная система (кроме 2-ух компараторов).

Эти компараторы выдает сигнал высокого уровня если соответствующее напряжение больше нуля или сигнал низкого уровня – если меньше нуля. То есть на выходе компараторов будет меандр. С выходов компараторов эти сигналы поступают на вход защелки CD-триггеров DD2.1 и DD2.2. По переднему фронте на входе С этих триггеров на их прямых выходах появится уровень сигнала, который подавался на его вход D (при условии, что на входы асинхронной установки триггеров S и R будут подаваться неактивные уровни сигналов).

Триггер 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 МГц, никто не производит. Поэтому таймер в данной работе будет реализован следующим образом. В качестве генератора импульсов будет использован генератор/делитель фирмы DALLASSemiconductorDS1065-60, частоту которого можно менять программным способом в широком диапазоне частот (30 кГц..60МГц). Программирование этой микросхемы осуществляется по однопроводному интерфейсу MicroLan. К выходу этого генератора будет подсоединен счетчик импульсов, который будет считать такты этого генератора, когда на выходе системы перехода через ноль будет высокий уровень напряжения. В конце цикла счета МК считает число тактов с выхода счетчика и определит эквивалентное время разности фаз эталонного и измеряемого сигналов.

Определим разрядность счетчика для того, чтобы разность фаз определялась с заданной точностью. Так как погрешность измерения фазы 0.2%, то число которое должен хранить счетчик минимум должно быть

Но учитывая, что частота генератора не может быть установлена в точности в 500 раз большая чем у измеряемого сигнала, но может, максимум, отличаться в 2 раза то число которое должен хранить счетчик соответственно удваивается и равно N=1000. Разрядность счетчика для такого числа равна

Так как в качестве секций счетчика будут использованы 4-разрядные счетчики, то для полного использования их возможностей надо взять Np =12. Тогда N=212 =4096. Учитывая, что минимальная частота генератора равна 30кГц, то минимальная частота измеряемого сигнала равна

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

Принцип измерения фазы

Измерение фазы ведется в такой последовательности:

1) микроконтроллер с помощью встроенного таймера измеряет частоту сигнала;

2.1) если частота сигнала меньше 7.5 Гц, то разность фаз между сигналами он измеряет сам;

2.2) если частота сигнала находиться в промежутке от 7.5 Гц до 15кГц (60МГц/4000), то МК записывает в генератор импульсов константу так, чтобы его частота была в 4096 раз больше чем частота сигнала (точнее в Nраз, гдеN – максимально возможное число меньшее 4096);

2.3) если частота сигнала больше 15кГц, то в генератор импульсов записывается константа так, чтобы его частота равнялась 60МГц;

3) микроконтроллер в конце цикла измерения считывает значение фазы;

4) микроконтроллер передает по каналу 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. Микроконтроллер будет настроен так, чтобы прерывание вызывалось когда на этом выводе будет сигнал низкого уровня. А подпрограмма обработки прерывания будет иметь вид:

Freq:

IncDPTR

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<7), то в 9-разрядный регистр MUX генератора, с помощью которого определяется режим работы программного делителя частоты, загружается число 000110010В. При занесении в регистр MUX данного числа частота генератора будет равна 60 МГц.

Если частота сигнала меньше 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.

При частотах сигнала в диапазоне f c =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%. Такая погрешность скорости не вызывает ошибок при передаче данных.

Описание алгоритма программы для МК

Микроконтроллер должен осуществлять такие действия:

1) начальную настройку своих узлов и периферийных устройств;

2) прием параметров измерения фазы от компьютера;

3) измерение частоты сигнала;

4) выбор режима измерения фазы;

5) выдача информации о частоте и фазе компьютеру.

Соответственно этому МК будет работать по алгоритму указанному на рис.5.


Рис.5. Блок-схема алгоритма программы для МК

Программа для МК

BSEG

ORG 0h

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 ; запрет всех прерываний

MovSp, #40h ; установка вершины стека

MovIP, #0 ; все приоритеты прерываний одинаковы

MovTCON,#0 ; внешние прерывания вызываются по низкому уровню

; на входах INT0,INT1

MovTMOD,#00100000B ; таймер/счетчик Т1 работает в режиме 8-битного с

; таймера c автоперезагрузкой

MovSCON,#11001100B ; 8-битовый приемопередатчик + бит паритета

MovPCON,#10000000B ; удвоенная скорость передачи данных (SMOD=1)

MovA, #243 ; настройка скорости последовательного интерфейса

MovTH1, A ; 4800 бод/с

SetbTR1 ; запуск таймера T1

MovDPTR, #0 ;

MovIE, #10000001B ; разрешение прерываний от INT0 измерение частоты

MovR0, #100 ; проверка правильности работы фазометра

Next_wait: ; при разрешенном прерывании

AcallDel_10 ; каждые 10 мс проверяется содержимое DPL

Mov A, R0 ;

Mov R1, A ;

Fr_beat:

NOP

DjnzR1, Fr_beat ; этот участок кода нужен для обнаружения частот

MovA, DPL ; с периодом кратным 10 мс

JnzWork ; если в DPL не ноль то фазометр работает нормально

DjnzR0, Next_wait ; иначе снова проверять

ClrEA ; запрет прерываний

ClrCell_tr ; сбросить флаг работоспособности

RjmpSend_error

Work:

SetbCell_tr ; установить флаг работоспособности

Send_error:

Acall Get_COM ; ждатьсообщенияотПК

Mov Acc.0, Cell_tr

AcallTransmit_COM ; послать сообщение ПК о работоспособности

JbCell_tr, To_do ; если фазометр работает, то продолжать работу

Ret ; иначе конец программы

To_do:

AcallGet_COM ; получить количество измерений

MovR1, A

AcallGet_COM ; получить период измерений

Mov R5, A

Clr A

Mov Contr_sum, A ; обнуляемконтрольнуюсумму

Next_measure:

Mov DPTR, #0 ; померятьчастоту

MovIE, #10000001B ; разрешение прерываний от INT0 измерение частоты

JnbIE0, $

JbIE0, $

ClrEA

Mov A, DPH

Acall Transmit_COM ; передачаПК

MovFr_high, A ; сохранить старший байт

Mov A, DPL

Acall Transmit_COM ; передачаПК

MovFr_low, A ; сохранить младший байт

Mov A, Fr_high

Subb A, #36h

Jnc Meas_MK ; если DPH > 36h, тофазумеряет MK

Mov A, Fr_high

Subb A, #1Bh ; если DPH > 1Bh, тофазумеряеттаймерс

JncMeas_T4 ; предделением частоты на 4

MovA, Fr_high

SubbA, #0Dh ; если DPH > Dh, то фазу меряет таймер с предделением

JncMeas_T2 ; частоты на 2

MovA, Fr_low

SubbA, #06h ; если DPL > 6, то фазу меряет таймер без предделения

JncMeas_T ; частоты, иначе таймер работает на

; максимальной частоте 60 МГц

AcallFirst_reset ; начальный сброс генератора

MovA, #1 ; код команды записи в регистр DIV

AcallWrite_Byte ; запись в генератор

MovA, #00110010В ; загрузка 8 бит константы для задания частоты

; генератора

AcallWrite_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 ; начальныйсброс

MovA, #1 ; код команды записи в регистр DIV

AcallWrite_Byte ; запись в генератор

MovA, #00110100В ; загрузка 8 бит константы для задания частоты

; генератора

AcallWrite_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

AcallFirst_reset ; начальный сброс

MovA, #1 ; код команды записи в регистр DIV

AcallWrite_Byte ; запись в генератор

MovA, #00111000В ; загрузка 8 бит константы для задания частоты

; генератора

AcallWrite_Byte ; запись в генератор

Acall Write_0 ; 9-ыйбит

Ljmp Meas_G

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

AcallFirst_reset ; начальный сброс

MovA, #1 ; код команды записи в регистр DIV

AcallWrite_Byte ; запись в генератор

MovA, #00110000В ; загрузка 8 бит константы для задания частоты

; генератора

AcallWrite_Byte ; запись в генератор

Acall Write_0 ; 9-ыйбит

Meas_G:

MovA, #2 ; код команды записи в программный делитель

AcallWrite_Byte ; запись в генератор

MovA, R2 ; младшие 8 бит предделителя

AcallWrite_Byte ; запись в генератор

Mov A, R3 ; старшийбит

Jb Acc.0, Wr1

AcallWrite_0 ; запись в генератор 0

LjmpSt_m

Wr_1:

AcallWrite_1 ; запись в генератор 1

St_m:

AcallFirst_reset ; начало работы генератора после программирования

ClrP0.1 ; сброс счетчиков

JnbIE1, $ ; ждем пока не возникнет прерывания от изм. фазы

SetbP0.1 ; разрешение счета счетчиков

JbIE1, $ ; ждем пока не завершиться прерывания от изм. фазы

MovA, P1 ; считываем младший байт результата

MovFase_low, A

MovA, P0 ; считываем старший байт результата

AnlA, #1111B ; обнуляем незначащие биты

Mov Fase_high, A

Ljmp Transm_fase

Meas_MK:

Mov DPTR, #0 ; обнулениесчетчика

MovIE, #10000100B ; пуск измерения фазы на частоте меньшей 28.6 Гц

JnbIE1, $ ; с помощью аппаратных возможностей МК

JbIE1, $

ClrEA

MovA, DPН ; считывания старшего байта фазы

MovFase_high, A ; сохранение

MovA, DPL ; считывания младшего байта фазы

Mov Fase_low, A ; сохранение

Transm_fase:

Mov A, Fase_high

Acall Transmit_COM ; передачаПК

Mov A, Fase_low

Acall Transmit_COM ; передачаПК

AcallDel_c ; задаем период измерения

DjnzR1, Next_measure ; следующее измерение

MovA, 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

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:

ClrI/O ; запрет прерывания

MovR1, #8 ; 8 бит

Wb1:

Rrc A ; А0 →С

Jc Wb2 ;

Acall Write_0 ;

Jmp Wb3

Wb2:

Acall Write_1 ;

Djnz R1, Wb1 ;

SetbEA ;

Ret

; прием байта по COM-порту в аккумулятор

Get_COM:

Jnb RI, Get_COM

Mov A, SBUF

Clr RI

Ret

; передача байта по COM-порту через аккумулятор

Transmit_COM:

Mov SBUF, A

SEND:

JnbTI, SEND

ClrTI

PushA ; контроль правильности передачи данных

MovA, 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

DjnzR0, 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

PopR1

Ret

; подпрограмма задержки на R5 с

Del_c:

Mov A, R5

Mov R7, A

Del_sec:

Clr C

Mov R6, #100

Next_1c:

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) определить у пользователя параметры измерения фазы;

2) инициировать начало работы фазометра;

3) считать сообщение о исправности фазометра;

4) в случае если он исправен послать сообщение о параметрах измерения фазы;

5) считать числа соответствующие фазе и частоте;

6) преобразовать частоту в герцы, а фазу в радианы и сохранить;

7) в конце измерения вывести на экран среднее значение фазы и частоты;

8) повторить все начиная с пункта 1.


Рис.6. . Блок-схема алгоритма программы для ПК

Программа для ПК

usescrt;

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);

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<7) then {60MHz}

begin

divider:=1;

end;

if(freaquency>6)and(freaquency<$0E00) then {60/Nd+2}

begin

divider:=(75*freaquency)/512+1;

end;

if(freaquency>$0DFF)and(freaquency<$1C00) then {30/Nd+2}

begin

divider:=(75*freaquency)/1024+2;

end;

if(freaquency>$1BFF)and(freaquency<$3700) then {15/Nd+2}

begin

divider:=(75*freaquency)/2048+2;

end;

if(freaquency<$3700) then fase_r:=360*(freaquency_r*divider/6e7) {convertion}

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(Value<>contr) 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 раз большую, чем частота сигнала. При активном уровне с выхода системы перехода напряжений через ноль, счетчик считает импульсы генератора, а затем микроконтроллер считывает их и передает компьютеру, где константы соответствующие частоте и фазе преобразуются в герцы и градусы и показываются оператору по его запросу.