Перейти к содержанию
    

Измерение фазы двух меандров

Как реализовать измерение фазы двух меандров,может есть готовые модули?, искал на опенкоре подходящего не нашел или не по тем словам искал.

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

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

Такой алгоритм работает но ловит много мусора. Сейчас думаю как сделать, но наверно изобретаю велосипед скорее всего есть что то готовое. Может кому что встречалось на эту тему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Такой алгоритм работает но ловит много мусора.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

проксорить два поступающих меандра, а как это уберет провалы или дребезг? , только когда два сигнала будут совпадать по фазе но тогда фаза = 0?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В качестве фазового детектора можно использовать

- xor

- выделение фронтов + RS-триггер

 

Далее интегратор, например с помощью пропорционально-интегрирующего звена. Или канитель со счетчиками.

 

Если сигналы зашумлены, то их надо фильтровать либо в аналоговом, либо в цифровом домене. см. например peaking filter (он же "колебательный контур", "резонансный усилитель" и т.п. )

 

Или же использовать xor и смириться с шумом в измерениях фазы.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

проксорить два поступающих меандра, а как это уберет провалы или дребезг? , только когда два сигнала будут совпадать по фазе но тогда фаза = 0?

Не даром сказал про интегрирование. Нарисуйте на бумажке ваши сигналы с дребезгом. Потом их ксор. Потому пропустите (на бумажке) через банальнейший RC фильтр. Это и будет аналоговым прототипом схемы. Посмотрите что это дает.

 

Положим что амплитуда сигналов равна 1, после фильтрации(аккумулирования) положим что есть нормировка к 1. Тогда в случае если сигналы сдвинуты на 180 градусов вы получите 1, если они синфазны вы получите 0, если сдвиг по фазе 90 градусов получите 0.5. А ваши пики и наводки дадут шум в младших разрядах, играя временем усреднения можно получить приемлемые результаты .

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для работы в системах с высоким уровнем помех(ВЧ/импульсные ВВ генераторы) неплохо зарекомендовал себя следующий фильтр - см. картинку. На каждый фронт входного сигнала ставим сдвиговый регистр, ёмкость и тактовая частота выбираются согласно параметрам ожидаемого сигнала/вероятным помехам/имеющимся ресурсам. Изменение логического уровня(GATE ON//GATE OFF) происходит только если входной сигнал(GATE) не меняется во время заполнения регистра.

Плюсы:

- не надо усреднения/интегрирования;

- не вносит фазовых искажений(с точностью до периода тактирования регистра), конечно, если фильтры на входах одинаковые :rolleyes:

post-86261-1432040400_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Благодарю вроде де бы есть положительный результат )) от 10000 отсчетов, максимум 40 шум это примерно 20мм хотел получить +-2мм. Попробую фильтрами поиграться может какие рекомендации дадите буду очень благодарен. Вначале сделал счетчик через phasedetect= sigA ^ sigB. Код простой и по времени цепи хорошо проходят. Но измерение происходит от 0 до 180 градусов а это 2,5м (

Сделал так, самому не очень нравиться и по времени не проходит, но работает. Может как то это можно упростить? Когда phasedetect ==1 счетчик считает когда 0 ждет.

//----------------------------------------------------------------------//
always @(negedge CLCK) begin
    if (RESET) begin
        phasedetect = 1'b0;
          casetrig    = 3'd0;  
    end else  begin
         
          case(casetrig)
          3'd0: begin
              if(in1)begin
                  phasedetect = 1'b1;
                if(in2)begin
                    casetrig    = 3'd1;
                end else begin                     
                         casetrig    = 3'd2;
                     end                     
              end           
          end
          3'd1: begin
              if(in2==0)begin                  
                     casetrig    = 3'd2;
              end           
          end          
          3'd2: begin
              if(in2)begin
                  phasedetect = 1'b0;
                     casetrig    = 3'd3;
              end           
          end
          3'd3: begin
              if(in1==0)begin                  
                     casetrig    = 3'd0;
              end           
          end          
          default: begin
              phasedetect = 1'b0;
              casetrig    = 3'd0;
          end
          endcase               
    end//reset     
end//always
//----------------------------------------------------------------------//

Можно еще вопрос) в квартусе есть возможность настройки оптимизации что бы оптимизировал цепи в первую очередь по времени ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Попробую фильтрами поиграться может какие рекомендации дадите буду очень благодарен.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сейчас пока нет возможности снять осциллограмму. Значения полученные микроконтроллером из плис по spi, вывожу по rs232 в терминалку.

Сигналы имеют небольшое дрожание максимальное измеряемое значение 0-360гр =0- 10000, а дрожание макс 40 =1,5гр, это шум возможно от плл встроенного в плис, у него не очень хорошие характеристики джиттер.

Насколько реальные значения получаются в таймквесте, смотрю отчеты несколько сигналов не проходит по времени(-0,5ns -0.8ns), а в плис конфигурация работает нормально?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Немного почитал про TimeQuest и понял что ничего не понял (.

Добавил код clock из pll 360 mhz нужно поделить и получить 60mhz.

//--------------------------------------------------------------------------//
always@(posedge pll1clck3)
begin
if(divpllclck < 2)begin
    divpllclck = divpllclck +2'd1;
end else begin
    divpllclck = 2'd0;
     clckdive = ~clckdive;
end
end
//--------------------------------------------------------------------------//

Скомпилировалось все без ошибок. Запустил timequest вообщем все в слаках.

В 13,1 версии timequest сложнее еще не разобрался.(

post-27923-1432451331_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделал так, самому не очень нравиться и по времени не проходит, но работает. Может как то это можно упростить? Когда phasedetect ==1 счетчик считает когда 0 ждет.

У Вас "RESET" - синхронный или все же асинхронный?

 

И совершенно отсутствует понятие о "блокирующих" и "не блокирующих"...

Плохо!

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Синхронный сброс, по переднему фронту тактового сигнала. Переделал на неблокирующие все равно задержка -75ns.

always@(posedge pll1clck3)
begin
if(divpllclck < 2)begin
    divpllclck <= divpllclck +2'd1;
end else begin
    divpllclck <= 2'd0;
     clckdive = ~clckdive;
end
end
//--------------------------------------------------------------------------//

TimeQuest сгенерировал файл sdc там этот сигнал указан как

create_clock -name {clckdive} -period 1.000 -waveform { 0.000 0.500 } [get_registers {clckdive}]

Он происходит от клока который выходит из pll

create_generated_clock -name {SystemPll1|altpll_component|auto_generated|pll1|clk[3]} -source [get_pins {SystemPll1|altpll_component|auto_generated|pll1|inclk[0]}] -duty_cycle 50.000 -multiply_by 36 -divide_by 5 -phase 135.000 -master_clock {CLCKIN50Mhz} [get_pins {SystemPll1|altpll_component|auto_generated|pll1|clk[3]}]

Это правильно, он не должен быть create_generated_clock?

Откуда берутся такие большие задержки ?

post-27923-1432455677_thumb.jpg

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

есть "золотое правило" в верилоге: никогда не мешать в одном always - begin - end блоке блокирующие и неблокирующие присваивания.

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

 

и ещё, я вам советую отказаться от некоего непонятного клока, который вы генерируете при помощи

clckdive = ~clckdive;

зачем он?

 

если он нужен только для того чтобы выполнять действия по его переднему фронту - то сформируйте некий сигнал-строб "разрешение выполнения", назовите его допустим enable_act (напомню: он будет работать по клоку pll1clck3), после чего используйте конструкцию

if (enable_act) begin

end

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

 

вообще, в плис не принято формированить тактовые частоты, кроме как про помощи встроенных PLL.

Способы конечно есть, но они требуют досканального понимания того что ты делаешь и как потом будешь использовать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Благодарю за замечания, буду учиться.

Никак не могу найти причину задержки в 2,5нс. Пробовал разбивать присвоение на два такта по 6бит. задержка не изменилась.

В каком порядке искать ? В верхней строчке написано from node res. res это сигнал сброса он в самом начале появляется и все.

always@(posedge CLCKIN50Mhz)
begin
    if(timereset < 16'd65530)
    begin
        timereset = timereset + 16'h1;
        res = 1'b1;    
    end 
    else begin
        res = 1'b0;
    end
end

post-27923-1432473722_thumb.jpg

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Осталось придумать как объединить 3 сигнала от двух модулей о положении объекта в один. один модуль измеряет 5м, другой 100м, третий сигнал разница между двумя. Думал сложением фигня вышла.

Подбросте мыслей ))

post-27923-1432568616_thumb.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...