реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Измерение фазы двух меандров
sergey sva
сообщение May 19 2015, 08:13
Сообщение #1


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Как реализовать измерение фазы двух меандров,может есть готовые модули?, искал на опенкоре подходящего не нашел или не по тем словам искал.
Два сигнала меандр частота 10кгц поступают на плис. Нужно как можно точнее измерять их фазу. Сделал счетчик, по фронту первого сигнала запускал счетчик по фронту другого останавливал, такой алгоритм работает, но сигналы поступают из аналоговой схемы не очень стабильной.
Вообщем иногда в импульсах меандра появляются провалы в середине импульса или дребезг по фронтам, часта стабильная 10кгц.
Такой алгоритм работает но ловит много мусора. Сейчас думаю как сделать, но наверно изобретаю велосипед скорее всего есть что то готовое. Может кому что встречалось на эту тему.
Go to the top of the page
 
+Quote Post
des00
сообщение May 19 2015, 08:22
Сообщение #2


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(sergey sva @ May 19 2015, 16:13) *
Нужно как можно точнее измерять их фазу. Сделал счетчик, по фронту первого сигнала запускал счетчик по фронту другого останавливал, такой алгоритм работает, но сигналы поступают из аналоговой схемы не очень стабильной.
Вообщем иногда в импульсах меандра появляются провалы в середине импульса или дребезг по фронтам, часта стабильная 10кгц.
Такой алгоритм работает но ловит много мусора.

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


--------------------
Go to the top of the page
 
+Quote Post
sergey sva
сообщение May 19 2015, 08:38
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



проксорить два поступающих меандра, а как это уберет провалы или дребезг? , только когда два сигнала будут совпадать по фазе но тогда фаза = 0?
Go to the top of the page
 
+Quote Post
Fat Robot
сообщение May 19 2015, 08:40
Сообщение #4


ʕʘ̅͜ʘ̅ʔ
*****

Группа: Свой
Сообщений: 1 008
Регистрация: 3-05-05
Пользователь №: 4 691



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

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

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

Или же использовать xor и смириться с шумом в измерениях фазы.
Go to the top of the page
 
+Quote Post
des00
сообщение May 19 2015, 08:53
Сообщение #5


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(sergey sva @ May 19 2015, 15:38) *
проксорить два поступающих меандра, а как это уберет провалы или дребезг? , только когда два сигнала будут совпадать по фазе но тогда фаза = 0?

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

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


--------------------
Go to the top of the page
 
+Quote Post
GSV0
сообщение May 19 2015, 13:04
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 17-04-15
Пользователь №: 86 261



Для работы в системах с высоким уровнем помех(ВЧ/импульсные ВВ генераторы) неплохо зарекомендовал себя следующий фильтр - см. картинку. На каждый фронт входного сигнала ставим сдвиговый регистр, ёмкость и тактовая частота выбираются согласно параметрам ожидаемого сигнала/вероятным помехам/имеющимся ресурсам. Изменение логического уровня(GATE ON//GATE OFF) происходит только если входной сигнал(GATE) не меняется во время заполнения регистра.
Плюсы:
- не надо усреднения/интегрирования;
- не вносит фазовых искажений(с точностью до периода тактирования регистра), конечно, если фильтры на входах одинаковые rolleyes.gif
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
sergey sva
сообщение May 22 2015, 12:24
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Благодарю вроде де бы есть положительный результат )) от 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
//----------------------------------------------------------------------//

Можно еще вопрос) в квартусе есть возможность настройки оптимизации что бы оптимизировал цепи в первую очередь по времени ?
Go to the top of the page
 
+Quote Post
GSV0
сообщение May 22 2015, 16:26
Сообщение #8


Участник
*

Группа: Участник
Сообщений: 42
Регистрация: 17-04-15
Пользователь №: 86 261



Цитата(sergey sva @ May 22 2015, 15:24) *
Попробую фильтрами поиграться может какие рекомендации дадите буду очень благодарен.


Чтобы дать рекомендации, надо бы взглянуть на Ваш дребезг/провалы, покажите картинки, а лучше осциллограммы.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение May 23 2015, 13:49
Сообщение #9


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Сейчас пока нет возможности снять осциллограмму. Значения полученные микроконтроллером из плис по spi, вывожу по rs232 в терминалку.
Сигналы имеют небольшое дрожание максимальное измеряемое значение 0-360гр =0- 10000, а дрожание макс 40 =1,5гр, это шум возможно от плл встроенного в плис, у него не очень хорошие характеристики джиттер.
Насколько реальные значения получаются в таймквесте, смотрю отчеты несколько сигналов не проходит по времени(-0,5ns -0.8ns), а в плис конфигурация работает нормально?
Go to the top of the page
 
+Quote Post
sergey sva
сообщение May 24 2015, 07:08
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Немного почитал про 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 сложнее еще не разобрался.(
Прикрепленное изображение
Go to the top of the page
 
+Quote Post
iosifk
сообщение May 24 2015, 07:47
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369



Цитата(sergey sva @ May 22 2015, 15:24) *
Сделал так, самому не очень нравиться и по времени не проходит, но работает. Может как то это можно упростить? Когда phasedetect ==1 счетчик считает когда 0 ждет.

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

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


--------------------
www.iosifk.narod.ru
Go to the top of the page
 
+Quote Post
sergey sva
сообщение May 24 2015, 08:08
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



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

Go to the top of the page
 
+Quote Post
krux
сообщение May 24 2015, 12:09
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596



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

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

зачем он?

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

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

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


--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
Go to the top of the page
 
+Quote Post
sergey sva
сообщение May 24 2015, 13:23
Сообщение #14


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Благодарю за замечания, буду учиться.
Никак не могу найти причину задержки в 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

Прикрепленное изображение

Go to the top of the page
 
+Quote Post
sergey sva
сообщение May 25 2015, 15:44
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923



Разобрался теперь все нормально. Проблемы с пересинхронизации разных сигналов от разных клоков, сбросы неправильно сделал синхронные асинхронные. все операции деления убрал а где возможно сделал через сдвиг.
Осталось придумать как объединить 3 сигнала от двух модулей о положении объекта в один. один модуль измеряет 5м, другой 100м, третий сигнал разница между двумя. Думал сложением фигня вышла.
Подбросте мыслей ))
Прикрепленное изображение
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 05:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01478 секунд с 7
ELECTRONIX ©2004-2016