Сделал я трехканальное управление для вертолета ( и пульт и приемник )
разработка здесь http://vg.ucoz.ru/forum/8-66-1
сигнал передается в формате PPM
Данные по проводам передаются нормально, а вот при подключении радио-модулей сервопривод начинает дергаться как эпилепсик.
Я сделал защиту от помех, но что-то толку от нее нету.
Подскажите, люди добрые, что можно еще сделать ? ( хотя бы теоретически, а над практической частью я подумаю сам. )
эпитептик наверное)
Что-то я потаскался по тому форуму и не смог найти исходники, хотелось бы посмотреть на вашу защиту от помех. Все это следствие шумов приемника.
;**************************************************************************************************************
; фильтр шумов
;**************************************************************************************************************
squelch: ; шумоподавление
mov Temp, XL ; Копируем
mov Temp1, XH
Ldi YH, 0x2 ; загружаем число 600 - помеха не может быть длиннее, чем пауза между импульсами
Ldi YL, 0x58
rcall compare_XY16 ; сравниваем
breq no_pomecha ; переход на обработку когда X=Y
brcs pomecha ; переход на обработку когда X<Y
rjmp no_pomecha ; переход на обработку когда X>Y
pomecha: ; это помеха
lds ZL, channel_len ; загружаем (читаем ) в "z" длину уже принятых помех
lds ZH, channel_len+1
add XL, ZL ; складываем длину принятой помехи с длиной всех уже принятых помех
adc XH, ZH ;
STS CHANNEL_len, XL ; сохраняем общую длительность принятых помех
STS CHANNEL_len+1, XH ;
rjmp out_1 ; выход
no_pomecha: ; длительность этого канала соответствует требованиям
lds ZL, channel_len ; загружаем (читаем ) в "z" длительность уже принятых помех
lds ZH, channel_len+1
ldi Temp, 0 ; обнуляем
STS CHANNEL_len, Temp ;
STS CHANNEL_len+1, Temp ;
add XL, ZL ; складываем длительность канала с длительностью всех принятых помех
adc XH, ZH ;
rjmp prodolzaem
вот так работает :
Помехи во время импульса прорваться вряд - ли смогут, а вот во время паузы - легко.
Пауза между импульсами 300 мкс
я сравниваю полученную длительность с 300 мкс
если полученная длительность короче чем 300 мкс - значит это помеха, сохраняю эту длительность в оперативке ( если их несколько, тоих длительности суммируются ), что бы потом прибавить ее к длительности канала.
если полученная длительность больше, чем 300 мкс - значит это - длительность канала, прибавляем к ней длительность всех полученных ранее помех и обнуляем в оперативке данные.
Так радиотракт никто не делает. Проверка длительностей это немного колхоз, причем не эффективный. И напрасно Вы считаете что с единицей ничего случиться не может. Помеха точно так же опрокинет единицу как и перевернет ноль. Хотите получить приемлемый результат - применяйте помехоустойчивое кодирование (желательно с возможностью исправления ошибки) со стороны передатчика и аналогичное декодирование в приемнике. Книг по этой тематике пруд пруди.
ЗЫ. Схему не видел (искать ее в 30 с лишним листах влом), но Вы уверены что само сопряжение радиотракта с МК выполнено верно?
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
вот тут описывал похожую проблему http://vg.ucoz.ru/forum/8-66-31 сообщение 459 ( приемник и передатчик при этом общались через провода )
у меня вход в прерывание настроен на захват падающего фронта ( так как паузы между импульсами одинаковые то можно и перенастроить )
почему то срабатывало прерывание, хотя не должно было...
я хотел добавить в линию передачи диод и соединить с общим ( а если захват будет по нарастающему фронту, то подтянуть к +5V ) через резистор в 10 Кило Ом, для того что бы получать четкие логические уровни...
Но делать этого я тогда не стал, потому что знал, что при подключении радио-модулей это может помешать...
мне кажется, что все дело в том, что радио-модули аналоговые.... были бы они цифровыми... Может туда емкость воткнуть? как получить четкие логические уровни на выходе радио-модуля ?
uwrtey писал(а):
Но делать этого я тогда не стал, потому что знал, что при подключении радио-модулей это может помешать...
Подтяжку стоит сделать (модулю это вряд ли помешает), лучше к плюсу наверное - хотя бы внутренними резисторами МК. Попробуйте в настройках прерывания установить подавление реакции на дребезг фронта (см. соответствующий регистр).
uwrtey писал(а):
как получить четкие логические уровни на выходе радио-модуля ?
Хорошо это или плохо, но если судить по структурной схеме, все уже сделано в модуле - и фильтр, и компаратор... Тут либо помехи, либо ложные срабатывания из-за отсутствия подтяжки в том числе. Может иголки на выходе. На малом расстоянии больших траблов с передачей/приемом быть не должно. Положите их в микроволновку например (выключенную разумеется) - там внешних помех минимум. Так постепенно проблема может локализоваться.
Если позволить скорость, лучше перейти на пакетную связь - гораздо более гибкая система получится
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Спасибо, как посветлеет попробую сделать:
1) ICNC1=1 / фильтр шума на контакте ICP // с английским я ни как... а гугл переводчик так перевел что я ни чего не понял..
Спойлер
Установка этого бита (одному) активирует входной шум Capture Canceler.
Когда шум компенсатор активирована, входной сигнал от контактного входного Capture (ICP1) фильтруется.
Функция фильтрации требует четырех последовательных равных ценятся образцы ICP1 штифт для изменения его выхода.
Захвата входа поэтому задерживается на четыре цикла Осциллятор когда шум компенсатор включен
чего "четырех равных последовательных" ???
2) Подтянуть к +5 V ? Каким сопротивлением ? ( нужно же как то рассчитать, что бы приемник смог обеспечить четкий лог_0 )
Ни подтяжка ни ICNC1=1 не помогли. Как по отдельности, так и вместе...
При чем устройство начинает работать еще хуже...
Может мне осциллограмму снять с приемника ? Правда у меня хорошего записывающего осциллографа нету. Но я могу записать линейным входом звуковой карты...
Осциллограмма бы точно не помешала. Вход прерываний очень быстрый и может ловить такие иголки, которые карта не увидит никогда. Но попробовать можно. Кроме того можно изменить подход - попробуйте отбрасывать битые пакеты совсем- суммировать глюки не надо. Если все известные заранее длительности (как стробы так и несущие информацию - т.е. в любой момент времени должны знать, какой импульс сейчас принимается и его допустимая длительность. )попали в допустимый интервал (как 0 так и 1) всех импульсов то только тогда подавайте управляющее воздействие - придется писать во временные переменные информацию по каналам и в случае успешной посылки применять их. Попал битый сигнал - сразу бракуйте всю посылку и через некоторое время (таймаут - подобрать экспериментально, но примерно половина времени между пакетами) начинайте прием снова.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Осциллограмму постараюсь в субботу вечером сделать..
Goodefine писал(а):Кроме того можно изменить подход - попробуйте отбрасывать битые пакеты совсем
А как быть, если все пакеты будут битые ?
Я умудряюсь помех наловить когда расстояние между приемником и передатчиком всего 20 см, а что будет на расстоянии 100 метров ?
на всякий случай расскажу про PPM
длительность пакета = 20 мс ( 0,02 сек. )
длительность канала = от 1000 мкс до 2023 мкс ( от 0,001 сек. до 0,002023 сек. )
пауза между импульсами = 300 мкс (0,0003 сек. )
длительность импульса = длительность канала -минус- длительность паузы = от 700 мкс до 1723 мкс ( от 0,0007 сек. до 0,001723 сек. )
В моем приемнике организован вход в прерывание по захвату падающего фронта, а это значит, что я сразу замеряю длительность КАНАЛА (канал=импульс+пауза) и по этому для меня важно суммировать ложные срабатывания.... Но раз помеха может возникнуть и во время импульса, то это наверное значит, что нужно пересмотреть сам принцип передачи данных по радио-тракту...
uwrtey писал(а):
А как быть, если все пакеты будут битые ?
Я умудряюсь помех наловить когда расстояние между приемником и передатчиком всего 20 см, а что будет на расстоянии 100 метров ?
Надо решать проблемы по мере их поступления - даже один битый пакет на 10-20 может вызывать дерганье. Например при приеме ИК-посылок с пульта битых чуть ли не четверть. Простое отбрасывание решает проблему. 20 см - не нужно, лучше разнесите по комнате, может быть банальный перегруз приемника.
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
А как Вы предлагаете поступить?
У меня считывается длительность всего канала ( канал= пауза + импульс )
помехой я считаю любой канал длительностью меньше 300 мкс
может есть смысл увеличить это число до 1000 мкс ?
так как длительность нормального импульса варьируется в пределах от 1000 мкс до 2023 мкс
по радиоканалу либо восстанавливать сигнал из битого, либо отбрасывать битый канал полностью.
во первых нужно проверять входит ли длительность канала в возможные рамки аналогично проверять и длительность паузы.
во вторых проверять пакет вцелом на количество получившихся каналов (в случае если помеха залезет, то может получиться и больше трех)
и в третьих я бы сохранял предыдущее значение канала, сравнивал его с вновь поступившим (за 20мс сильно не может поменяется, я полагаю?). Если изменение сильное отбрасывать это значение и ждать следующего пакета, оставив значение прежним
Вот осциллограмма. Осциллограмму я снимал при включенном передатчике, каждый канал соответствует среднему положению рулей.
Напоминаю, что делал я ее звуковой картой ( вход закрытый ).
Все графики инвертированы ( вверху лог_0, внизу лог_1 )
Графики нужно смотреть в порядке возрастания номеров присвоенных их именам.
На каждом графике - красным контуром отмечен тот участок, который будет увеличен ( в масштабе ) на следующем графике.
не силен в аналоговой технике, но мне кажется на первом графике видно, что вход звуковухи не согласован с выходом приемника.
на последнем графике(5) видны несколько пакетов длительностью 20 мс. еще видна экспонентциальная составляющая, которая постепенно поднимает график.
для получения точных осциллограмм, я вам советую собрать систему так, как она должна работать, т.е. передающий контроллер соединить с передатчиком, а приемный контроллер соединить с приемником. потом собрать отдельно высокоомный повторитель на ОУ, выход которого подключите к звуковой карте, а вход к месту, где нужно измерить сигнал (две точки: 1) точка соединения передающего контроллера и передатчика 2) точка соединения приемника и приемного контроллера.)
это чтобы посмотреть, что вообще передается и что вообще принимается. может у вас на передающей стороне проблемы?
ibiza11 писал(а):вход звуковухи не согласован с выходом приемника.
А как Вы это увидели ?
В прошлом проекте ( где я учился делать дискретное управление ), я подключал звуковуху именно так ( ни чего не согласовывая, и без использования высокоомного повторителя ) и получал нормальные графики.... ( Ну если нужно, то я готов это сделать )
ibiza11 писал(а):еще видна экспонентциальная составляющая, которая постепенно поднимает график.
Что это такое ? и откуда оно взялось? С передающего контроллера постоянно летят пакеты длительностью 20 мс, без всяческих пауз..
И по идее, кроме этих пакетов, там больше ни чего не должно быть!
ibiza11 писал(а): где нужно измерить сигнал (две точки: 1) точка соединения передающего контроллера и передатчика 2) точка соединения приемника и приемного контроллера.)
Точно! нужно еще в месте соединения передающего контроллера и передатчика посмотреть...
А эту осциллограмму я снимал как положено - в месте соединения приемника и приемного контроллера.
А еще у меня подозрение, что с питанием приемного радио-модуля не все в порядке ...
судя по первому графику, как будто приемный радио-модуль постоянно перезапускается по питанию...
Надо бы диод с конденсатором в линию питания добавить..
( а еще меня настораживает почему в приемном радио-модуле два контакта питания +5V?
В прошлые разы, когда я использовал эти радио-модули, я даже не задумывался над этим... )