nabbla (nabbla1) wrote,
nabbla
nabbla1

Categories:

Меню аналоговой камеры (попытка 2)

Попробуем применить свой БИХ-фильтр.

Продолжительность строчного синхроимпульса в формате CVI: почти 4 мкс. Если постоянная времени фильтра будет СУЩЕСТВЕННО МЕНЬШЕ, что для электронщиков означает - "на порядок", то присутствие фильтра не должно ухудшить синхронизацию, я надеюсь даже на некоторое улучшение за счёт сглаживания сигнала, всё-таки что-то у нас шумит... Хотя, если параметры этого фильтра предельно стабильны, а это так (в конце концов, это ЦИФРОВОЙ ФИЛЬТР), то постоянную времени можно и ещё сильнее увеличить, главное потом подкорректировать константу HSync, в которой закодировано, сколько тактов отсчитывается от синхроимпульса до начала видимой части строки.

Может показаться, что "отстроиться" мы должны от частоты 21 МГц, именно такова цветовая поднесущая в формате CVI. Увы, ситуация несколько хуже: из-за "эффекта наложения" (aliasing) при оцифровке этой поднесущей на частоте дискретизации 25 МГц, у нас получается "зеркальная частота" 4 МГц. Здесь, чтобы не запутаться, нет ли каких-то двоек (может половина частота дискретизации, а может разность частот ещё на 2 поделить), представляем синусоиду с частотой СТРОГО 25 МГц. Она после дискретизации превратится в постоянную составляющую, т.е было 25 МГц, стало 0. Другой граничный случай: половина частоты дискретизации, 12,5 МГц. Она "перейдёт в себя", т.е каких-то дополнительных частот мы не обнаружим, но фазу потеряем, сможем найти правильный коэффициент при "косинусе", но не при "синусе", в частности если нам так повезёт всё время попадать на нули - мы вообще этого сигнала "не увидим"! Так что ИЗ ЧАСТОТЫ ДИСКРЕТИЗАЦИИ ВЫЧИТАЕМ ЧАСТОТУ СИГНАЛА - и получаем "зеркальную".

И действительно, на цветном участке мы наблюдали такой "муар":


Расстояние между максимумами около 6 пикселей, один пиксель у нас 40 нс, так что выходит 240 нс, или 4,2 МГц. Похоже на правду...

При использовании нашего IIR_LPF, постоянная времени равна периоду тактового импульса, помноженному на 2level, level - параметр, который мы можем задать. К примеру, level=3 даст 320 нс, а level=4: 640 нс. Постоянная времени 320 нс будет примерно соответствовать частоте среза в 500 кГц (обратная величина от постоянной времени даёт "циклическую частоту" ω в рад/с, и нужно её ещё поделить на 2π чтобы дать ответ в герцах), что даже нашу "зеркальную частоту" ослабит в 8 раз - этого должно хватить!

Вроде всё понятно, давайте пробовать...


Приведём кусочек схемы "верхнего уровня":



ExtDataBus - внешняя 8-битная шина данных, на которой "сидит" быстродействующий АЦП (это он оцифровывает наше изображение), сама ПЛИС и ещё 2 микросхемы статической памяти. Именно отсюда поступают отсчёты.

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

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

При синтезе вылезли предупреждения по размеру сумматора (вычитатора) в модуле IIR_LPF: все его входы и выходы 8-битным, но его ширина заявлена как 8+level. В принципе, синтезатор и сам разобрался, что лишние биты можно отрезать, но теперь и я в модуле переправил, ширина стала просто 8.

А дальше начинается фигня... Прошиваю, запускаю - и опять сталкиваюсь с зависанием время от времени. Пробовал level=3, затем 4, затем и 5, иногда приходит нормально, иногда зависает, без особенной закономерности. Почему-то, когда открываю Termite ("терминал" для COM-порта), всё нормально, пока он не закрывается аварийно от переизбытка данных. Когда из своей программы - гораздо чаще зависает QuatCore всё на той же многострадальной GPUH.

В этот момент я задолбался и решил: даже ошибочно приходящий синхроимпульс не должен приводить к таким последствиям, полному зависанию! И третий раз поменял многострадальную строку, определяющую регистр FrontPorch. Изначально было так:

FrontPorch <= (SyncOut[0] & Hsync)? 1'b1 : start? 1'b0 : FrontPorch;


Потом, чтобы не лишний кусок не записывался в статическую память, добавил туда и кадровый синхроимпульс, но ещё решил, что SyncOut[0] здесь лишнее, т.е даже если мы не ждём синхроимпульса, а он припёрся, FrontPorch переключится в единичку:

FrontPorch <= (Hsync | Vsync)? 1'b1 : start? 1'b0 : FrontPorch;


И это, пожалуй, было ошибкой. Именно FrontPorch отвечает за опустошение выходного буфера, что и делает зависание неизбежным. Так что сейчас я сделал вот так:

FrontPorch <= (Hsync&SyncOut[0] | Vsync&SyncOut[1])? 1'b1 : start? 1'b0 : FrontPorch;


Зависания прекратились, и вообще картинка стала раз за разом приходить на удивление корректной

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

Пока был установлен режим CVBS (обычный телевизионный сигнал) и камера подключалась к телевизору, мой "виртуальный джойстик" работал идеально. А насколько он хорошо работал сейчас при формате CVI, я так и не понял. Вчера куда более серьёзной проблемой были зависания и сбои. Скорее всего, и тогда вызов меню работал не шибко устойчиво, хотя точно сказать не могу.

Увы, в поисках неисправности я внёс ещё одно изменение, возможно, в нём и дело. Я заметил, что выход joystickPWM был у меня отмечен как output, хотя по логике должен быть bidir, для возможности перехода в состояние с высоким выходным сопротивлением (Z-состояние). Я использовал его, чтобы ПЛИС вела себя "по-джентельменски" и позволяла пользоваться и "родным" джойстиком, если он подключён.

Вроде это было исправление ошибки, в прошлые разы именно в таком режиме всё работало правильно.

Опять пришлось расчехлять осциллограф, проверять, а туда вообще что-то поступает? ДА, выглядит правильно. Самое подозрительное - очень долгое "отпускание" кнопки. Как раз этот переход в Z-состояние означает, что конденсатор 0,1 мкФ должен зарядиться назад до 3,3 вольта через резистор около 50 кОм, установленный в аналоговой камере (или это источник тока, не знаю точно их схемотехники). Постоянная времени 5 мс - это весьма медленно, мы от таких интервалов уже отвыкли :)

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

А может, это полный бред, ещё предстоит разобраться.

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


Фух, менюшка всё-таки появляется, и не приводит к фатальным последствиям! Наконец удалось заползти и отключить цветность!


С отключённым цветом стало несколько получше:


Рыжий электрочайник (слева) перестал быть в разводах, как и провод перевязанный зелёной изолентой, да и в целом такой ряби стало гораздо меньше. Всё равно картинка пока не блещет качеством. Странные вертикальные полосы, какая-то наводка видимо. И в придачу слева появился "мусор", который видимо напрямую связан с дополнительной задержкой на БИХ-фильтре. Странно только, что мусор выскочил слева...

В принципе, можно уже за мишень взяться, а там уж "на ходу" попробую ещё картинку чуть-чуть причесать. Я присмотрел офигенные катафоты 8 см диаметром, в МАГАЗИНЕ ДЛЯ ФУР! Прямо как в ТЗ :)

[Spoiler (click to open)]

Tags: ПЛИС, программки, работа, странные девайсы
Subscribe

Recent Posts from This Journal

  • Великая Октябрьская резня бензопилой

    Сегодня прокатился прочистить Абрамцевскую просеку. Как обычно, с приключениями. Выезжал на велосипеде, а вернулся на самокате. Первый раз по этим…

  • Очередная несуразность в единицах измерения

    Когда-то я написал программу PhysUnitCalc - калькулятор, умеющий работать с размерностями. Мне казалось, что я наступил уже на все грабли, которые…

  • Big Data, чтоб их... (3)

    "В предыдущих сериях": мой прибор выдаёт 6 значений: 3 координаты и 3 угла, т.е все 6 степеней свободы твёрдого тела. Причём ошибки измерения этих 6…

  • Покрышки с взрывным характером

    Продолжаю кататься на велосипеде на работу и назад, а также время от времени в РКК Энергию. С 17 мая (когда решил записывать, сколько проехал,…

  • Big Data, чтоб их... (2)

    Вчера получил упоротое уравнение, чтобы найти, с какими весами нужно брать результаты измерений, чтобы получить наименее шумную и при этом…

  • Big Data, чтоб их...

    Решил всё-таки вывести оптимальную обработку N измерений x k, каждое по M компонент (т.е вектор M×1), и на каждое дана своя ковариационная…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your IP address will be recorded 

  • 0 comments