leoniv (leoniv) wrote,
leoniv
leoniv

Category:

ДБ-95 – частотно-фазовый детектор



Когда вы в последний раз делали частотно-фазовый детектор (PFD)? Нет, не применяли готовый, а именно делали сами?



С системой PLL я знаком давно. Приходилось применять готовые синтезаторы частоты на основе PLL, например, вот в этом узкополосном FM-приемнике диапазона 140 - 170 МГц использовал готовую микросхему PLL типа MC12202DT фирмы Motorola.



Когда-то давно делал проект автоматического проверочного комплекса для УКВ-радиостанций. В качестве генераторов плавного диапазона там применял DDS-driven PLL.



Сегодня страшно становится от вида управляющего софта (кликабельно). Глянул на файлы, прошло уже 17 лет...



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

Но это всё примеры применения полностью готовых решений. Был некоторый опыт и в самостоятельной реализации PLL. Например, делал на CPLD источник опорной частоты 100 МГц, привязанный к высокостабильному генератору 12.8 МГц. Внутри CPLD я скопировал фазовый детектор микросхемы AD9901.



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

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



Но весь этот опыт в данном случае не помог. Практика использовать готовые кубики, не зная их внутреннего устройства, дает свои плоды.

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

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

Среди любительских конструкций нашел лишь один похожий проект External module for Twin Quartz Reference Speed Control (designed by Boris Ribov), но никаких подробностей по нему нет.

В точности мою задачу решил человек с ником kagrukeit с форума rt22.ru. Он сделал небольшую плату на основе микроконтроллера, заменяющую штатный блок управления двигателем магнитофона "Электроника-004". Насколько видно по фотографии, вся аналоговая «обвязка» сохранена такой, как на оригинальной плате. Получается, микроконтроллер просто повторяет работу жесткой логики, которая применяется на оригинальной плате.

Других подходящих решений на микроконтроллерах или ПЛИС я не нашел. Основная проблема заключалась в построении цифрового частотно-фазового детектора, который бы сразу выдавал ошибку фазы. Чаще всего в проектах использовались аппаратные фазовые детекторы типа той же CD4046, или их аналоги в ПЛИС. На выходе таких детекторов формируется последовательность импульсов, а я искал варианты, где на выходе был бы многоразрядный цифровой код. Нашел всего одну публикацию «A FPGA implementation of a phase locked loop for DC motor control», где сделано именно то, что мне надо. Но основная проблема (phase unwrap) решена там не совсем красиво.

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



Более совершенные детекторы строятся и на основе триггеров. Не буду здесь углубляться в описание разных схем детекторов, приведу лишь базовую схему детектора на двух D-триггерах.



Каждый из триггеров работает для своего знака отклонения фазы. Если верхний по схеме сигнал опережает, на выходе верхнего триггера будет формироваться импульс с шириной, пропорциональной ошибке фазы. Если опережает нижний сигнал, аналогично будет работать нижний триггер. Каждый триггер обслуживает диапазон фазового сдвига 180 градусов. Чтобы получить полный диапазон 360 градусов, используются оба выхода, характеристика «сшивается» в области нулевого сдвига фаз.

На первый взгляд, это плохо, лучше бы весь рабочий диапазон был бы непрерывным, как у фазового детектора на основе элемента «исключающее или», где при номинальном сдвиге фаз на выходе наблюдается меандр. Если выделить постоянную составляющую выходного сигнала детектора, получим значение ошибки фазы. Для этого обычно используется ФНЧ. Но чтобы получить низкие пульсации, его частота среза должна быть низкой. А это ухудшает динамику петли PLL.

Неожиданного у PFD на D-триггерах здесь появляется преимущество. При нулевом сдвиге фаз оба триггера будут давать на выходе короткие «иголки». Обычно выходы триггеров управляют ключами, которые заряжают или разряжают емкость (это называется «зарядовый насос»). Быстродействие ключей ограничено, поэтому на короткие «иголки» они практически не реагируют. Можно сказать, что в режиме синхронизма на выходе такого частотного детектора вообще нет сигнала, следовательно, не будет и пульсаций в сглаженном выходном напряжении.

Для цифрового PFD сглаживание пульсаций не является актуальным, так как там сразу получается код ошибки фазы, а не его представление в виде ШИМ. Но остается другая проблема, которая есть и в детекторах на логике. Она касается поведения при отличающихся частотах. Если бы частоты были равны и отличались только фазой, найти ошибку фазы было бы очень просто. В моем случае опорный сигнал генерирует таймер, достаточно по внешнему сигналу делать его захват. Но что будет, если входная частота будет отличаться? Ведь этом случае надо получить выходной сигнал нужной полярности и желательно максимальной амплитуды, так как в этом случае фактическое отклонение фазы большое.

Простой PFD на D-триггерах будет правильно отрабатывать ситуации с пониженной и повышенной входной частотой. Тогда на выходе одного из триггеров будут короткие «иголки», а на выходе другого – сигнал переменной скважности, среднее значение которого равно примерно 0.5. Это не очень хорошо, при большой расстройке воздействие будет не максимальным, да еще и с пульсациями. Но подстройка будет происходить куда надо. Хотя было бы лучше, если бы при большой расстройке на выходе был постоянный уровень.

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

Но ведь PFD на логике как-то работают, там такого поведения нет! Только самый простой детектор на элементе «исключающее или» работает похоже, у него узкая полоса захвата, а за ее пределами на выходе лишь бы что. А более серьезные детекторы на триггерах нормально отрабатывают отклонение частоты. Никогда не вникал, как именно они это делают. Но вот теперь пришлось.

Решил для примера взять PFD со штатной платы управления ведущим двигателем магнитофона «Электроника-004». Для начала проверил его в работе. Подал на его вход сигнал датчика скорости со своего макета. Скорость я мог менять произвольно, вручную управляя двигателем. Медленно прошелся по скоростям вблизи опорного значения. Детектор отработал на отлично. Когда скорость занижена, на выходе постоянно висит единица. В момент пересечения номинальной скорости на выходе быстро пробежал ШИМ от широкого импульса до узкого, затем постоянно установился ноль. Как это у него получается?



Не знаю, как вас, но меня принципиальная схема этого PFD вводит в смертную тоску. Здесь надо понять идею построения. А из внешнего вида этой схемы идея не вырисовывается. Вообще, умение читать схемы вряд ли может быть абсолютным. В схеме можно заложить безграничные хитрости, додуматься до которых будет тяжело. А когда хитрости перемешаны с глупостями, тогда еще хуже. Глупости отнимают уйму ресурсов анализа.

Решил посмотреть, как сделано в других аппаратах. Фирменная техника тут мало чем может помочь. Чаще всего в прямом приводе используются специализированные микросхемы. Например, в Revox A700 (прототипе наших «Электроник» и «Олимпов») использована некая TDA1000, о которой никакой информации нет. В более поздних Studer A820 и A827 применяется сложный аналоговый фазовый детектор на основе УВХ.



Схема PFD из «Олимп-004» немного отличается, в ней уже применяются микросхемы готовых триггеров вместо собранных из логики. Но эта схема тоже особо не пролила свет на проблему.



Схема PFD из «Олимп-005С» содержит еще больше триггеров и меньше простой логики. Выполнена она на логике КМОП с применением некоторых трюков типа резистора 120 кОм последовательно с логическим входом.



Схема PFD из «Олимп-005С1» резко отличается по оформлению. Наконец-то на заводе им. Лепсе появился культурный чертежник. Советская манера рисовать схемы сейчас иногда трактуется как попытка запутать вероятного противника в случае утечки документации. Логически эта схема не отличается от предыдущей, но наконец-то в ней начал просматриваться классический PFD на двух триггерах, схема которого приводилась выше. Только он дальше зачем-то дополнен еще двумя триггерами.



Похожая схема PFD и в «Олимп-700» – последнем слове советской промышленности. В схеме осталось только три триггера, а таинственный резистор 120 кОм перекочевал в другое место схемы.

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



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

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

На диаграмме работы детектора зацикленные на себя крайние состояния означают ситуацию с полным отсутствием входного или опорного сигнала. В ситуации завышенной или заниженной частоты он переключается между двумя крайними состояниями. И даже когда частота возвращается в норму, он продолжает переключаться между этими двумя состояниями. Выход при этом неизменен (здесь это первая цифра в маленьких кружочках). Выйти из этого цикла детектор может только при отклонении частоты в другую сторону. Для меня это было неожиданно. Тут я хочу выразить упрек в адрес доступных материалов по теме – книг, статей. Нигде, ни в одной публикации явно это не сказано. Ни в Хоровице с Хиллом, ни в Титце с Шенком. Откуда это знание брать?

Схема PFD в «Олимп-700» не использует никаких зарядовых насосов, как классическая схема PFD на двух D-триггерах. Тут используется сигнал с выхода только одного триггера, который тактируется опорным сигналом. В диапазоне отклонений фазы от 0° до 180° ширина импульса будет меняться, выделив среднее значение напряжения, получаем выходной сигнал PFD. При повышении входной частоты на выходе этого триггера будут короткие «иголки». Это не совсем красиво, но терпимо – среднее значение будет маленькое. Надо сказать, что у более древнего PFD из «Электроника-004» такого безобразия нет. А вот когда частота ниже – на выходе триггера будет хаос, среднее значение которого будет близким к половине питания. Это никуда не годится, поэтому ситуацию пофиксили третьим триггером. Не очень изящно, с использованием волшебного резистора 120 кОм, но как-то работает. Намного изящней это сделано в PFD микросхемы AD9901, структура которого была приведена выше, но тогда я не понимал назначения второй пары триггеров. А они включают на выходе PFD постоянный ноль или единицу в случае выхода из состояния захвата.

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

В результате я построил машину состояний, которую раньше не хотел строить, думал, ей здесь не место. Оказывается, PFD только так и строят. У этой машины должно быть как минимум 3 состояния – норма, повышенная частота и пониженная частота. На самом деле состояний больше, каждое из трех этих состояний – это периодическая циркуляция между двумя состояниями. Условия перехода несколько несимметричны, залететь в крайние пары состояний проще, чем оттуда выбраться.

Опорный сигнал у меня формирует Timer1. Входной сигнал (сигнал таходатчика) поступает на вход захвата ICP. Захваченное значение представляет собой текущую фазу сигнала. Эта фаза сравнивается с опорной (0°), в результате формируется значение ошибки фазы. Ошибка фазы может принимать значения от -180° до +180°. Частотно-фазовый детектор реализован в обработчиках прерывания по событию захвата (Capture) и событию
совпадения (Compare), которое означает переполнению таймера.

Когда система не находится в режиме захвата, частота таходатчика может сильно отличаться от опорной частоты. В таком режиме величина ошибки фазы теряет смысл. Поэтому когда частота выше номинальной, ее значение поддерживается -180°, а когда частота ниже номинальной – поддерживается +180°.

В обработчике прерывания Capture производится сохранение текущего значения таймера, а также увеличивается на 1 состояние фазового детектора vPfdState. В обработчике прерывания Compare состояние vPfdState уменьшаетя на 1. Затем оно сравнивается с нулем.

Если входная частота равна опорной, на каждое событие Capture приходится одно событие Compare. При этом значения vPfdState чередуются 1, 0 и т.д. В прерывании Compare после декремента значение vPfdState = 0, это означает номинальную частоту. Выходное значение PFD равно захваченному значению фазы.



Если входная частота становится выше опорной, между двумя событиями Compare происходят два (или больше) события Capture. При этом vPfdState становится больше 1. Сколько именно – не важно. Это все равно будет одно состояние. В прерывании Compare после декремента vPfdState > 0. Это означает повышенную частоту. Выходное значение PFD в этом случае устанавливается равным минимальному значению фазы (опережение). При выходе из обработчика Compare значение vPfdState ограничивается величиной 1.

Если входная частота восстанавливается и на одно событие Compare снова приходится одно событие Capture, работа детектора не восстанавливается. Для восстановления необходим один цикл, когда между событиями Compare не будет событий Capture. Только так значение vPfdState может снова уменьшиться до нуля.



Если входная частота становится ниже опорной, между двумя событиями Compare может вообще не быть событий Capture. При этом события Compare происходят два (или больше) раза подряд, после декремента значение vPfdState < 0. Это означает пониженную частоту. Выходное значение PFD в этом случае устанавливается равным максимальному значению фазы (отставание). При выходе из обработчика Compare значение vPfdState ограничивается величиной -1.

Если входная частота восстанавливается и на одно событие Compare снова приходится одно событие Capture, работа детектора не восстанавливается. Для восстановления необходим один цикл, когда между событиями Compare будут два события Capture.



Ниже приведен код обработчика прерывания Capture (из обработчиков выкинут код, служащий для вспомогательного измерения частоты входного сигнала):

#pragma vector = TIMER1_CAPT_vect
__interrupt void Capture(void)
{
TDpll::vCapV = ICR1;
TDpll::vPfdState++;
}


Код обработчика прерывания Compare:

#pragma vector = TIMER1_COMPA_vect
__interrupt void Compare(void)
{
TDpll::vPfdState--;
if(TDpll::vPfdState == 0) TDpll::vPfdOut = TDpll::vCapV;
else if(TDpll::vPfdState < 0) { TDpll::vPfdOut = OCR1A; TDpll::vPfdState = -1; }
else { TDpll::vPfdOut = 0; TDpll::vPfdState = 1; }
}


После таких модификаций программный PFD заработал точно так же, как и аппаратный детектор на штатной плате. В момент пересечения входной частотой опорного значения ошибка фазы линейно меняется, остальное время ошибка в насыщении. На рисунке масштаб графика скорости (зеленый график) увеличен, на самом деле микроскопическое изменение скорости ведет к «перескоку» выхода фазового детектора.



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



Синий график – это управляющий сигнал двигателя. Оранжевый – текущая фаза, которая поддерживается петлей PLL на значении 50%, это 0°. Красный график – требуемая скорость. Зеленый график – реальная скорость, он полностью слился с красным, никаких отклонений не видно.

Конечно, мгновенная скорость имеет некоторые небольшие отклонения. Чтобы их увидеть, я сильно увеличил масштаб. Для интереса снял часть графика с новым макетом, а часть – с штатной платой.



Видно, что пока макет проигрывает штатной плате. У нее колебания скорости от пика до пика составляют примерно 0.04%, а у макета – примерно 0.08%. Но надо понимать, что это фактически первое включение, коэффициенты петлевого фильтра выбраны от балды.

При разомкнутой обратной связи колебания скорости тоже порядка 0.04%, так что уменьшить их еще больше вряд ли получится. Наверное, сказывается фазовый шум датчика скорости. Даже захотелось попробовать поставить более качественный кольцевой датчик, но это сложно технически.



Для петли PLL характеристика петлевого фильтра более критична, чем для петли регулировки скорости. Здесь мы воздействуем на двигатель, регулируя его частоту вращения, а стабилизируем фазу, которая является интегралом частоты. Можно считать, что в петле присутствует интегратор, который дает сдвиг фазы 90°. Этот сдвиг вычитается из запаса устойчивости. Поэтому типичный петлевой фильтр простых аналоговых PLL второго порядка имеет резистор последовательно с конденсатором. Этот резистор добавляет нуль левее частоты единичного усиления, делая дальше наклон 6 дБ/окт., что требуется для получения устойчивости.



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

Tags: electronics, reel-to-reel, Электроника-004, катушечник, магнитофон
Subscribe

  • Измеритель уровня V0.1

    Сделал первую версию прошивки нового измерителя уровня для магнитофона "Электроника-004". Все еще очень-очень сырое, но уже полоски как-то…

  • Sharp GF-777

    Попал тут ко мне Sharp GF-777. Без преувеличения можно сказать, что это легенда. Обладать таким аппаратом могли лишь избранные. Стоил он когда-то…

  • JVC TD-V662

    Когда просят посмотреть кассетную деку, говорят удивительные вещи. Что не могут найти мастера, который за это бы взялся. Но ведь аналоговая…

  • Post a new comment

    Error

    default userpic
    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 58 comments

  • Измеритель уровня V0.1

    Сделал первую версию прошивки нового измерителя уровня для магнитофона "Электроника-004". Все еще очень-очень сырое, но уже полоски как-то…

  • Sharp GF-777

    Попал тут ко мне Sharp GF-777. Без преувеличения можно сказать, что это легенда. Обладать таким аппаратом могли лишь избранные. Стоил он когда-то…

  • JVC TD-V662

    Когда просят посмотреть кассетную деку, говорят удивительные вещи. Что не могут найти мастера, который за это бы взялся. Но ведь аналоговая…