Коварные ВЧ цепи

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

Предыстория
Разводил я плату, того самого универсального пульта. И была у меня там обычная матричная клавиатура — строки и столбцы. По столбцам сканируется, по строкам считывается. Элементарно. Собрал, запрограммировал опрос клавиатуры и выдачу символов на экран.
 

Включаю и тут же вылазит нажатие. Проверил программу — все как и должно, а кнопка сама почему то нажимается. Выключаю. Включаю — то же самое. Косяк, видать либо кнопка коротит, либо развел неправильно. Было поздно лег спать. Проснулся, включаю — не вылазит буква. Потыкал кнопочки, все работает как и должно. Что это было? Непонятно, может приглючилось? Тут раз — выскочила. Опа. Стал проверять. Вскрылось шаманство. После сброса кнопка не срабатывала, но стоило поднести к пульту руку, справа, под определенным углом — самопроизвольное нажатие. Мда… Но хоть что то стало ясно.
 


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

Во-вторых, заметил другую вещь — когда рука лежит рядом с разъемом глюкне проявляется. Чем дальше в лес тем толще партизаны. Где разъем и где клавиатура. Расположены по разному, порты разные. Какая связь? Только питание — повесил дополнительных конденсаторов на питание. Не помогло.
 

Третье, самое главное, на что я не обратил вначале должного внимания, а зря. У меня матрица кнопок, она обрабатывается сканированием. Значит в случайный момент времени у меня выбран случайный столбец. И даже если глюк на какой то конкретной строке, то столбец может быть разным, а значит нажатие разных кнопок и РАЗНЫЕ символы на экран. Минимум три разных. А у меня всегда один и тот же. С одной и той же кнопки. Такое постоянство результата говорит только об одном — Наводку генерирует сама схема.
 

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

Решение проблемы
Гляжу на плату, на то как идет линия от злополучной строки и где на нее могут влиять наводки от столбцов. Ага, а это что за зигзаги?
Нет, зигзаг то я знаю откуда — это я обходил дырку крепления LCD дисплея. Но крепление винтами не понадобилось, поэтому дырку я делать не стал, а вот зюзюка осталась. Коротнул ее кусочком проволки — глюки исчезли. О!

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

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

Ну и, само собой, программное решение, заключающееся в том, чтобы считывать значения со строк после окончания переходного процесса, связанного со сменой строки. Думаю тут 50-100ms хватит вполне. Вот такие дела!

35 thoughts on “Коварные ВЧ цепи”

      1. Ну почему же? Изначально работаю с Пиками,никаких наследий.
        Просто всегда, без исключений, ставил внешние резисторы и ни на секунду не задумывался о том, хватит ли сопротивления внутренних и будет это работать или нет при помехах ;)
        Данный пост — лишнее подтверждение правильности моего выбора :)
        С внешним резистором также элементарно определить пороги срабатывания, входные токи и прочие интересные вещи.

  1. У меня еще со времен ламповой техники (начал заниматься электроникой с 1 класса, в 1959г), в подсознании заложено несколько простых правил, справедливых и до сих пор. Вот они:
    1. Минимально возможная длина сигнальных линий. (В идеале — соединительных линий вообще не должно быть, выводы деталей непосредственно соединяются друг с другом).
    2. По возможности, разносить подальше друг от друга входные и выходные линии. Особенно для аналоговой технике, но и цифровым полезно.
    3. Максимально возможная площадь «Земли» и питания. (Идеал — земля на одной стороне платы, питание с другой, максимальной площади).
    4. Блокировочные конденсаторы должны быть расположены непосредственно у защищаемых микросхем, иметь выводы минимальной длины и минимальную собственную индуктивность («Керамика» предпочтительнее «Пленочных»). Идеал — на каждую микросхему свой конденсатор.
    5. Сигнальные линии не должны быть слишком тонкими (Очень резко возрастает индуктивнось). Большая ширина увеличивает емкость, но это менее опасно, (если только сигнальные линии не перекрывают друг друга на большой площади).
    6. Соединительнные линии от выводов «Земли» и питания микросхем до сответствующих шин большой площади должны быть как можно короче и шире.
    7. Токовые петли от мощных нагрузок должны быть как можно короче и по возможности не заходить в малосигнальные зоны.
    8. Источник питания (стабилизатор) не должен давать «просадок» напряжения при резких скачках потребляемого платой тока, если такие скачки могут иметь место.
    Возможно, что — то забыл, но основное перечислил. Указанные «Идеалы» не обязательны, просто это предельные случаи. Но чем дальше от них, тем внимательнее надо все анализировать, чтобы не снижать устойчивость.
    Например, мы на работе проверяли устойчивость своих разработок касанием отверткой шин земли или питания работающей платы, контактов входных и выходных разьемов, а также периодическим включением в соседнюю розетку мощной индуктивной нагрузки (например, 9-амперного ЛАТР), или емкости 1-5 мкф 600в. Если устройство сбоило — переделывали. Зато у меня никогда не было проблем с устойчивостью.
    Конечно, на этапе разработки также тщательно просчитывал задержки, «Гонки» и «Риск» в логических цепях. В критических местах программ, например, обработчиках прерываний, считал по тактам время выполнения для наихудшего из возможных случая.
    Чем тщательнее постараешься предусмотреть все заранее, тем меньше проблем с отладкой. Правда, пропадает интерес. Делал, делал, вот, наконец, все готово, только бы покопаться, посмаковать, а оно сразу все работает. А начальник говорит: «Иначе у тебя и быть не могло, давай, начинай следующую тему»…

      1. «Риск» — это такое явление, когда на вход, например, дешифратора, входные сигналы поступают с разной задержкой. При этом кратковременно этот элемент может выдать неправильное состояние (Не на том выходе). Если за ним стоит элемент с памятью (триггер, счетчик)- он это неправильное состояние может отработать, что может нарушить дальнейшую работу схемы. Один из вариантов исключить это явление — стробирование. «Гонки» — также когда на более простые логические элементы приходят сигналы с разной задержкой. При этом на его выходе появляются очень короткие, в единицы — десятки наносекунд, импульсы («Иголки»). Последствия аналогичны. Их очень трудно обнаружить. Часто подключение щупа осциллографа просто срезало их своей вх. емкостью. Я старался, чтобы, например, на многовходовый логический элемент один их входных сигналов, наиболее критичный, приходил позже других и как бы являлся разрешающим стробом для смены выходного состояния.

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

  2. Ну зачем-же ставить внешние резисторы когда есть внутренние? Я столкнулся с той-же самой проблемой, при чём нажатия фиксировались чуть-ли не при прикосновении к кнопкам, прямо капсенс какой-то!..Вылечилось циклом, в котором многократно опрашивался порт-и только если 100 раз подряд нолик-значит есть нажатие!..

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

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

    2. Опять же тут этих циклов надо сделать четыре штуки, а еще они замедлят программу и у тебя весь проц будет тупить на какой то клаве, пока там 100 штук не насчитает. А если клава на прерывани повешаны? А там по i2c байт пришел? Так ты его прозеваешь тут же. Придется делать проходной счетчик с заходом в прерывания каждый раз. А это расход и памяти и места в кристалле. Не все так очевидно. =)

    3. «Ну зачем-же ставить внешние резисторы когда есть внутренние? Я столкнулся с той-же самой проблемой .. Вылечилось циклом»

      Если я начну так проектировать схемы, то не то что мои контроллеры сертификацию на ГОСТ-ы (а это бесперебойное функционирование при подаче всяких милых помех, до киловольт включительно…) не пройду — меня уволят тут же нафиг.

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

  3. на серьезные изделия нада и резаки и кондеры ставить и цикл использовать от дребезка и задержики. а если для пульта какого простенького то цикл лучше всего. я за минимализм на плате. и если не хватает подтягивающего резака на порту то можно объеденит его с другим портом (ну если есть свободный) вот уже и в два раза меньше сопротивление и паять ничего не нада =)

    1. А где граница между серьезным и несерьезным? Плата должна быть спроектирована не на принципах минимализма, а так как это должно быть. Так что если надо кондеры и резюки то так тому и быть.

  4. каждый границу себе ставит. у меня так если для себя делаю то минимализм(ну конечно не до идиотизма), а если для продажи то тогда и кандеров и резаков не жалко. все равно СМДшные детальки копейки стоят. 5000шт резаков меньше5 уе. грех не поставить.

  5. 100 ms задержки все-таки многовато, мне хватало 25 обычно — но думаю в конкретном случае можно и так — просто почти полсекунды задержки на матрице 4х4 в этом случае уже чувствуется.

    Приходилось недавно делать устройство, где кнопки подсоединялись неэкранированным проводом длиной 5 метров — садили по классической схеме подтянутые выводы AVR на землю… разумеется, навесил резисторы — но большую часть все-таки выполняла программная фильтрация по принципу:
    if(!PINB.0){
    delay_ms(25);
    if(!PINB.0){
    delay_ms(25);
    if(!PINB.0){
    delay_ms(25);
    if(!PINB.0) foo();
    }
    }
    }

    (можно циклом, но так нагляднее и без лишних переменных)

    1. о! а можно поподробнее для новичков? предстоит подобная задача- вынести кнопку и пару светодиодов метра на три неэкранированным проводом — куда, как и какие навешивать резисторы, как защитить порт МК от наводок и от всякой статики?

      1. У меня никакой защиты не было. Поскольку питание устройства было батарейным, оно не заземлялось, поэтому пробой откуда-либо статикой входам контроллера не грозил. Наводки по той же причине угрожали не особо, т.к. провода шли параллельно в одном шнуре и если чего и наводилось, то на оба, в результате разница потенциалов между землей и входом была минимальной. Резисторы — одна нога на вход, вторая на VCC, параллельно внутреннему резистору подтяжки. Полезны по двум причинам: 1. чем меньше сопротивление, тем лучше шунтируются наводки через плюсовую шину питания и конденсаторы БП на землю; 2. при нажатии на кнопку дребезг контактов меньше при большем токе из-за микроскопического «приваривания» в месте контакта подвижных частей кнопки.
        Можно еще стабилитроны поставить по входам — от выгорания из-за мощного кратковременного импульса наводки не защитят, т.к. контроллер выгорит быстрее, чем нарастет ток в стабилитроне, но хотя бы защитят от возможных растянутых по времени наводок.

        1. то есть если питание делать от источника питания через L7805CV (кстати, так и не понял, в чем отличие от LM7805), то надо мудрить какую-то защиту? (две кнопки в двух разных местах на проводах метра по два-три)

  6. А никто не пробовал пускать этот прикольнинький эффект во-благо? Я имею ввиду использовать полученную таким образом индуктивность для фильтрации питания МК. Может кто знает, сколько нужно таких «витков», чтобы получить рекомендуемые Atmel’ом 47nH?

  7. Оп-па! А я собирался делать контроль фото датчиков в многоступенчатой пушке Гаусса на микроконтроллере. Там же жуткие наводки будут, при выстреле компас перемагничивается… Или я не прав?

  8. Интересно, я тут как раз собрал usb программатор (protoss). Только вот разводку платы сделал кривоватую — все сигнальные линии (reset, mosi, miso, clk) идут зюками.
    При прошивке мастер контроллера (через LPT 5 проводов) все прошло ок, комп новый устройство учуял, драйвер встал. А вот при попытке прошить другой контроллер — выдается сообщение, что мол не получается войти в режим программирования (да, джампер на линии сброса переставлять не забываю)
    Прочитав данную статью, подумал, может дело все в наводках? Все таки кварц на 12 МГц и дорожки у меня очень напоминают таблетки, которые клеют на товары в магазине.. :)

  9. Меня тоже осиняло на тему многоступенчатой пушки гауса, но до практики пока не доходило.. Собственно: «Дифференциальные линии»- это как? если можно :)

    1. дифференциальная линия это линия связи из двух проводов в одну сторону (т.е. две не RX две на TX).

      Есть две линии + и — я их иногда так и пишут RX+ RX- или, как в USB D+ и D-

      При этом лог уровень передается так:
      на (+) идет +5 на (-) идет -5

      А на принимающей стороне все все складывется через ОУ по формуле
      (+)-(-) = сигнал +5-(-5) = 10вольт.

      Так как провода идут вместе, то на них наводится помеха синхронно и одинаковая. НАпример, навелась помеха в +2 вольта.
      (+) +5 +2 = +7
      (-) -5 + 2 = -3
      Но на выходе (+)-(-) = сигнал получим все равно 10
      +7 — (-3) = 10 т.е. помеха срезалась.

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

        Например
        на (+) +5 на (-) 0 — это единица.
        на (+) 0 на (-) +5 — это ноль.

        Главное чтобы лог уровни шли в противофазе.

        1. Чёрт, как же всё просто) Двойка мне, плохо раскуривал USB.
          За как нельзя кстати своевременную статью по операционникам отдельное спасибо. Аккурат сегодня среди прочего их заказал, на всякий-пожарный %)

        2. А если использовать витую пару, то обязательно передавать дифференциальный сигнал? По идее витая пара сама по себе гасит одинаковую помеху, действующую на оба провода, эдакий пассивный фильтр, задуманный природой. Или я что-то неправильно понимаю? Если нет, то какие тогда преимущества у витой пары?

Добавить комментарий