OSD на ATmega1281

mandigit

Каково назначение контура из C(330pF), R(1.5K*), C(22pF), VD6?

msv

А как у Вас (в меге) организован PPM_IN?

Тайминг в OSD получается весьма жесткий… В моменты вывода строки нельзя использовать прерывания. Поэтому для определения длительностей на входе ppm_in после вывода каждой строки проверяется флаг блока захвата первого таймера, и при его срабатывании считывается/расчитывается длина импульса по значению в ICR1. Определение полярности ppm “само” получилось автоматическое, тк. для синхронизации ppm-пакета нахожу интевал >2.5мс, а противоположенное значение считается стробом. Все значения укладываются в буфера, которые проверяются на корректность, анализируются, обрабатываются в межкадровый промежуток. Могу выложить кусок исходника по захвату, но он на асме и наверно не слишком понятен.

под графику выделяете память (видео буфер) , а потом по прерыванию выводите?

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

Каково назначение контура из C(330pF), R(1.5K*), C(22pF), VD6?

Это элементы формирующие “тень”. C(330pF) и верхние диод с резистором- дифференцирующая задние фронты мод. сигнала цепочка. R(1.5K*)- определяет уровень тени. C(22pF) необходим для ограничения спектра модулирующего сигнала (резкий переход от уровня белого к уровню черного), без него сбиваются декодеры PAL и на картинке появляются цветные факела.

AgiSer

Сергей, Спасибо за ответ.
Oчень интересно увидель эту часть кода(PPM_IN routine)

  1. Инициализация таймера.( timer clk = 2.5 МГц, Normal mode,Input Capture ?)
  2. как расчитывается длина импульса по значению в ICR1?
    ( if пред знач > тек знач then WidthCH = ffff - пред знач + тек. знач
    else WidthCH = тек знач таймера- пред знач )
  3. Синхронизация?
    (if WidthCH>2,5 mS) then След. знач. будет СH1.
msv

Все правильно.
Инициализация очевидная:

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 2500,000 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// OC1C output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
// Compare C Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x02;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
OCR1CH=0x00;
OCR1CL=0x00;

Надеюсь с регистрами, которые в качестве переменных, разберетесь.

;--------------------
_PPM_RX:
	SBIS 0x16,5 ;if(TIFR1 & 0x20)
	RJMP _end_int1
	LDS  R16,134 ;[0]=ICR1L; [1]=ICR1H;
	LDS  R17,135
        MOVW R18,R16
	CP   R16,R11 ;if(val.i>=old_tim1_val) v=val.i-old_tim1_val;
	CPC  R17,R12
	BRLO _PPM_RX1
	SUB  R16,R11
	SBC  R17,R12
	RJMP _PPM_RX2
_PPM_RX1:
	LDI  R26,LOW(65535) ;else v=val.i+(0xffff-old_tim1_val);
	LDI  R27,HIGH(65535)
	SUB  R26,R11
	SBC  R27,R12
	ADD  R16,R26
	ADC  R17,R27
_PPM_RX2:
        MOV  R11,R18 ;old_tim1_val=val.i;
        MOV  R12,R19
	LDS  R26,129 ;if((TCCR1B & 0x40)==0)
	ANDI R26,LOW(0x40)
        LDS  R26,129
	BRNE _PPM_RX3
	ORI  R26,0x40
        RJMP _PPM_RX4
_PPM_RX3:
        ANDI R26,0xBF ;else TCCR1B&=~0x40;
_PPM_RX4:
	STS  129,R26
  	CPI  R16,LOW(6251) ;if(v>25*250)
        LDI  R18,HIGH(6251)
	CPC  R17,R18
	BRLO _PPM_RX5
	LDI  R26,LOW(_ppm_raw_buff)  ;ppm_raw_buff[ind]=ppm_cur_ch;
	LDI  R27,HIGH(_ppm_raw_buff)
        TST  R10
	BREQ _PPM_RX6
  	ADIW R26,19*2
_PPM_RX6:
        ST   X,R8
   	CLR  R8 ; ppm_cur_ch=0;
        LDI  R18,1
	EOR  R10,R18 ;ppm_cur_bank^=1;
_PPM_RX5:
        LDI  R18,17 ;if(ppm_cur_ch<17)
	CP   R8,R18
	BRSH _PPM_RX9
	LDI  R26,LOW(_ppm_raw_buff)  ;ppm_raw_buff[ind+ppm_cur_ch+1]=v;
	LDI  R27,HIGH(_ppm_raw_buff)
        TST  R10
	BREQ _PPM_RX7
  	ADIW R26,19*2
_PPM_RX7:
        MOV  R18,R8
        CLR  R19
   	LSL  R18
	ROL  R19
   	ADD  R26,R18
	ADC  R27,R19
        ADIW R26,2
	ST   X+,R16
	ST   X,R17
_PPM_RX9:
        LDI  R18,19 ;if(ppm_cur_ch<19) ppm_cur_ch++;
	CP   R8,R18
	BRSH _PPM_RX8
	INC  R8
_PPM_RX8:
	SBI  0x16,5 ;TIFR1|=0x20;
;--------------------
_end_int1:

Вообще-то я неопытный писатель на асме avr, прошу прощения у проффи, которых такой код может покорежить…

AgiSer

Сергей (MSV), Спасибо разобрался.

У меня нет прерывания от ССИ, поэтому. polling сделал на Periodic Interval Timer 20kHz (PIT) в котором считаю интервал от прерывания КСИ до старта вывода OSD, опрашиваю окончание приёма в GPS USART буфер и мигаю светодиодом для индикация работы.

На недели попробую разобраться с PPM_IN через Timer в In Capture Mode, попробую засунуть в PIT: ADC start convertion c проверкой и запись в Video Buffer между КСИ и 25-й строкой.

Если несколько вопросов, может по опыту сталкивались:

  1. Селектор синхроимпульсов в TV распознает КСИ если не формировать синхронизирующие импульсы? (да/нет)
  2. Как можно преобразовать выходы TTL (3,3V)и подмешать их к Video In в уровень sync (0V), Blank (0.3V)? Мои идеи заканчиваються на использовании CD4066 😦 focus.ti.com/lit/ds/symlink/cd4066b.pdf
msv

Давайте сначала разберемся, что за источник видео у Вас? Почему там нет ССИ (раз Вы их собираетесь выдавать с OSD)?
//-------
Полетал немного на выходных… Чёт не пойму как на yotube поприличнее качество выложить/получить. Сейчас жму в H.263 с разрешением 720х576 битрейтом 3000кбпс, а получается на yotube такая мазня.
Суббота:

А вот воскресный полет детям и людям с неуравновешанной психикой смотреть не рекомендуется!

Комментарии чуть позже будут, когда смогу подобрать цензурные слова…

AgiSer

“Давайте сначала разберемся, что за источник видео у Вас? Почему там нет ССИ (раз Вы их собираетесь выдавать с OSD)?”

ээээ… ССИ есть, нет прерываний от ССИ (реализованно аппаратно.)
Прерывания от КСИ есть. Источник обычный - CCD камера PAL.
Cелектор стандарт- LM1818.

Третий полет… слов нет. 😦

Syberian
msv:

смотреть не

пересматривал 5 раз… не хватает голоса робота: “PULL UP!..[beep-beep-beep]…PULL UP!..” .Последние кадры аж за душу берет!
Чего это с ним? С виду, поймал помеху, включился глючный автопилот на RTH, врубил газ на полную… На земле включили мануал. Однако, РРМ детектор сглючил после автопилота и перестал ловить команды. В результате брикет из пенопласта, потеряв сигнал, опять включает RTH с движком на всю катушку.
Главное, чудо-телеметрия уцелела…

msv

Позволю пооффить, раскажу как это было… Время указано после вкл. борта на видео в правом углу.
6:27 После проверки всех систем - взлет.
6:56 После тестовых кругов, набора высоты с визуальным контролем(ВК), переход с ручного режима на режим стабилизации и управления по FPV. Контрольные широкие круги, с ВК ассистентом.
9:00 Удаление 300, высота 330, потеря ВК ассистентом, решение КВС(те. мной 😃) лететь дальше в сторону города только по FPV. Спокойный полет с небольшим набором высоты.
9:18 Решение КВС о возврате в сторону базы. Плавный разворот, полет к базе по указателю GPS.
9:42 Решение снизить высоту, уменьшением газа.
9:50 Легкая паника от включения аларма- критически низкая скорость. (Что воздушная скорость была нормальная, а просто на высоте дул сильный встречный понял уже на разборе).
10:01 Решение уменьшить газ и для поддержания скорости уменьшить тангаж.
10:33 Расстояние до базы сокращается весьма быстро, а высота уменьшается слишком медленно. Если на такой высоте окажусь над базой, есть шанс, что ВК у ассистента так и не появится, а видео-линк точно пропадет (на приеме использовался зигзаг с рефлектором). Паника. Два решения- плавно снижать кругами, стараясь не выйти из сектора зигзага или пикирование с резким сбросом высоты. Более безопастным кажется второй способ, но полет в режиме стабилизации ограничивает углы тангажа. Принято решение перейти в ручной режим.
10:34 Вместо ручного режима КВС ошибочно включает режим автопилот. Крен/тангаж АП отрабатывает правильно, а газ, вместо минимального, врубает на полную (косяк в программе, не слишком был заметен при малых отклонениях целевой и текушей высот).
10:35 Ошибка исправлена - включен ручной режим. Дальше все действия КВС можно отследить по маленькой горизонтальной шкале в нижней части экрана (элероны) и маленькой вертикальной шкалой в правой части (РВ). В режиме ручного управления значения на этих шкалах фактически показывают положение ручки пульта. Заметно, что поначалу КВС, слишком увлеченный желанием сбросить высоту, ничего не делал для увеличения тангажа и выравнивания, а только пытался парировать крен. Что было дальше… как сверхустойчивый высокоплан умудрился “уменьшить” высоту быстрее кирпича… комиссия так и не поняла… Уж совсем явных ошибок управления на начальной стадии вроде бы и не было… Возможно порыв ветра бросил пикирующий самолет в штопорную бочку (после чего неопытный КВС начисто потерял ориентацию) или… стая ворон отаковала… или НЛО… или…
10:57 Контакт с планетой. Полная паника… Самое жуткое, что падение визуально не зафиксировано, и известен только примерный сектор поиска. На самолете пропадает линк управления- включается автопилот. К сожалению почему-то пропадает линк GPS (спутники офигели от такого маневра) и остается последнее полученное значение высоты 142м и скорость 80км/ч. АП считает, что он в полете, и радостно врубает двиги, пытаясь улететь домой.
XX:XX Не знаю сколько приходили в себя, сколько забрасывали манатки в машину и рванули на машине по полям, примерно в сторону падения. По дороге соображаем, что можно пользоваться зигзагом как пеленгатором. Видео сигнал потихоньку улучшается, приближаемся… На самолете восстанавливается линк GPS, АП понимает что на земле и вырубает двиги.
13:07 Восстанавливается видео. Самолет кто-то подобрал, куда-то несет! Адреналина вагон, проезжаю по грязи и кочкам на 7-ке, по таким болотам, что потом сами удивлялись с сыном (ассистентом), - тут и на джипе не всякий сунется.
13:10 Самолет кто-то бросает. АП видя увеличение скорости взревает оставшимся (как потом выяснилось) двигом -пытается улететь домой… Бросают еще… и еще…
14:42 Наконец визуально увидел пацанов, бросающих мой драгоценный самолет. Бегу с некоторыми словами к ним, взбешенный кощунством- мое чудо инженерной мысли- да прямо камерой…, прямо в землю…
15:57 Наконец вспомнил, что пора выключить борт… Окончание полета. Упокоился понял, что пацаны ничего плохого может и не хотели, видели, что он живой, все шевелится, да мотором еще крутит… просто пытались его отправить домой… А ведь он мог им и на голову свалиться… Брррр… Мне по хорошему еще извинения надо бы просить.
Как это ни странно, сильно ничего не пострадало. Самолет в последний момент выровнялся и, задев дерево стабилизатором (виден след), плюхнулся на шасси(!), которые слега погнулись. Оба винта даже целые! Морда немного пострадала, скорее от бросков юных авиаторов… А вот дома уже обнаружил, что сломался зубец на серве управления камерой (ну это фигня) и сгорел один двиг ( хорошо сгорел… даже магниты размагнитились…) с регом. А вот это грусно, при цене 5-баков прийдется ждать его пару месяцев с ХС. Ну будем считать это мне наказанием за беспечность…

cvy7

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

msv

А что такое дивертиси? Попадался этот термин, но не знаю значения… Четвертушку дополнительно сделать действительно неплохо, но надо какой-то коммутатор (электронный?) с мин потерями на 1ггц… Как, на чем это можно сделать?

Aleksey_Gorelikov

Нужен коммутатор не на ВЧ, а на НЧ. И два приемника. Решение о переключении принимать по RSSI.

Термин диверсити - ИМХО используется несовсем правильно в данном случае. Покрайней мере я его воспринимаю как прием на разнесенные две и более антен, с компенсацией фазовых сдвигов. Типа антенная решетка со сканированием лепестка ДН получается. Но это в моем восприятии, возможно и ошибочном.

msv

Ок, спасибо за ликбез. Но это всяко не час работы… 😃 К тому же где-то надо искать 2-й тюнер ( не уверен, что они все совместимы, а свой noname покупал на ебай за 50баков вместе с передатчиком). А вот найти, вывести хоть на стрелочный индикатор RSSI, да слепить коммутатор (на pin-диодах?) хотя бы с ручной переключалкой, вполне реально… Может у кого есть проверенная схемка/конструкция?

cvy7

Зачем вручную! Такую аппу и телеметрию сделали, а тут вручную 😃
мега (8 заглаза) и 74hc4051. Могу платку скинуть, но у меня там лишняя в Вашем случае MAX7456 и мега с избытком- 32 габарита. Моя платка еще не приша с изготовления. Такая конструкция (с мегой и коммутатором) точно делалась Сергеем Кендышем, у него “летала”, идея подчерпнута у него

PS. А термин мы тут действительно неправильно применяем, сленг просто.

cvy7

Добавлено, подумав. 😃
У меня MAX - драйвером по совместительству, в Вашем случае все-же лучше пин-диоды будет.

7 days later
Dikoy
ukkr:

По возможностям эти АРМы рвут любую МЕГУ.

Да нифига. Реально в 5-6 раз АРМ быстрее меги. При нагромождении плавучки - раз в 10. Но это предел. И конечно реч идёт о 9 арме, а не о 7. Седьмой в 2-3 раза виигрывает.
Плюс не надо забывать, что все армы намного нежнее АВРов, часто требуют двойного питания, выводы ток не держат и т.д.
ИМХО для таких задач сейчас Xmega приятней.

msv:

Но самое главное- не понял, как, даже зная вектор продольной оси самолета, можно корректировать гироскоп крена???

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

Nick_Shl:

Гироскоп не надо корректировать. Гироскоп надо интегрировать. Постоянно.

С гироскопом ничего не надо делать. А вот ДУС, как тут правильно заметили, надо интегрировать и, в связи с этим, корректировать. Не постоянно, но часто.

Syberian:

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

Нет, просто трёхосевой компас углы не даст. Только при условии точного задания оных на старте. В принципе, и тут можно прикрутить курс по GPS, но на наших широтах разрешения лучше 2,5 градусов не получить…

Dikoy
GSL:

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

Там порядок частот и ускорений совсем другой. Если привязать к модели маятник на 10 кг, то он неплохо покажет вертикаль. Даже электроники не порнадобится - за счёт своей массы 😃

Vad64:

Повторю еще раз, получить крен и тангаж только из трехосевого датчика магнитного поля невозможно. За исключением случая полета в районе магнитного полюса, где силовые линии магнитного поля Земли вертикальны. В наших широтах наклон линий к горизонту - около 70 градусов.

Зато на полюсе курс отвалится 😃
А так +1

msv:

От разгона по идее не должно быть никаких артефактов. Проц или заведется или уж нет. Это только ИМХО, своей практики не так много.

Бывают при обработке прерываний. При работе с ЕЕПРОМ - 90% глюков. Гнал м48 до 27 МГц. Работала, если осторожно 😃

msv:

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

С термометрами вообще беда. Цифровые сцуко греются при частом опросе ( forum.ixbt.com/topic.cgi?id=48:9132#31 ). Я в итоге остановился на аналоге и внутреннем АЦП меги. Самый надёжный вариант.

msv:

поэтому применил MC34063 + IRF7413.

Кстати, можно научить этому саму атмегу, если большая точность напряжения не нужна. Я делал подобное: forum.ixbt.com/topic.cgi?id=48:8375#23
Для шахтёров датчик метана. Работает от двух мизинчиков год, при обнаружении газа орёт как резаный. У меня период замера АЦП рпримерно постоянный, т.к. чип мало загружен, колебания напряжения цифровой и стрелочный вольтметр не фиксируют вообще. Если привязать обмер к кадрам, например, можно и на плате автопилота такое сгородить. Причём можно прям из меги управлять выходным напряжением 😉

Dikoy
msv:

Люди, покаюсь… В принципе изначально не было в планах доводить проект до законченной конструкции с полным представлением всех исходников итп. Очень рассчитываю на обмен мнениями, идеями, как по железу, так и по алгоритмам. Много ценных замечаний и идей получаю в личке (чего только стоит шедевральный цикл вывода в строке за 3 такта на пиксель от уважаемого abalex), за что всем авторам большое спасибо.

Можем объединить усилия. Я длительное время занимался разработкой АП для БПЛА. Результат тут: fotki.yandex.ru/users/nm1456t01/album/94385/
Бортовой комплект модульный:

Можно использовать только АП или АП+модуль навигации. Параметры в кратце такие:
6 ППМ входов, 12 ППМ выходов (+6 ППМ выходов на навигационном блоке). Дуплексный цифровой канал с землёй до 4 км, через него можно и рулить.
Слежение антенной наземки за самолётом.
12 аналоговых ключей на навигационном блоке для управления полезной нагрузкой (подключение параллельно кнопкам фотика, например, и управление ими).
Но, у меня нет телеметрии и разработкой оной мне не хочется заниматься. Если объединить усилия, должен получиться неплохой проект.
Изюминка в том, что я сейчас пытаюсь побороть нелюбовь пирометров к ИК помехам и полётам в облаках. По этому на моей голловке помимо 6 пирометров стоит ещё магнитометр и аксель (в следующей версии и ДУС):

Комплексирование с ДУСом позволит вылечить пирометры от этой болензни. Вот так выглядит отработка помехи на 20 градусов обычной головкой. 1 - угол по дусу (зацените уход), 2 - модель сигнала пирометра, 3 - комплексированый сигнал. Шумовая составляющай комплексированого сигнала снижена за счёт ДУС, ухода нет. Это хорошо, это позволит летать при малом градиенте. Но отработка помехи никая…

Другой вариант - фильтр калмана. Штука хорошая, оценивает сигналы за 25 сек, потом давит шумы и систематику ДУСов на ура. Но вот момеху отрабатывает 1000 сек…

А вот после долгих рваний волос на (.) получаем такую картинку отработки:

То есть подавление резких помех почти идеально, уход всей системы на 10 градусов при отключении одного из каналов (ДУС или пиро) порядка 500 сек. То есть градус в 100 сек. ИМХО совсем нефигово, айда летать вдоль домов и в облаках! 😉
С тянучкой разберусь и надо это дело облетать.

cvy7
Dikoy:

Можем объединить усилия.

Dikoy,Я целиком ЗА, +1000

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

Если чтото из этого получится, то и проект будет открытым!

msv

Можем объединить усилия.

Если имеется в виду совместный проект, звучит заманчиво, но боюсь нереально… 😦 Уж слишком разные изначально задачи у всех. У меня, например, - сделать интегрированное устройство с тем функционалом, который сейчас уже есть (после отладки/доводки, конечно буду добавлять функциональность), с главным критерием- мин. бюджет. Если бы речь шла о коммерческом проекте, можно было бы назначить менеджера проекта и остальным подчиняться его волевым (хоть и обсуждаемым) решения, решая поставленные локальные задачи. А для проектов под себя, конечно никто не захочет делать то, что ему не нужно и/или не интересно и/или не по карману…
А если объединять усилия в смысли подсматривая чужие идеи и учиться на чужих ошибках, без сомнения полезно. Ради этого и тему создавал.
//----
Комбинация ДУС-пироголова безусловно перспективна. Жаль что не нашел подходящих по цене/качеству ДУС. Собственно давить шумы пироголовы ДУСом имхо и не нужно. Просто за основной сигнал брать именно с ДУСа, как менее шумный и более скоростной. А корректировать его долговременную нестабильность проинтегрированным (заодно все шумы срежуться) значением с пироголовы. Единственная сложность ( с ходу не соображу)- необходимо корректировать на малых интервалах времени и значение пироголовы по некоррелированным изменениям относительно ДУС .
//—
Пока жду моторчик есть время причесать код… Ошибок столько- что понимаю, самолет возвращался на базу на автопилоте не потому что, а вопреки… (шютка конечно… 😃) Странно, что авария произошла именно на ручном режиме, где все чисто.
Добавил в режиме стабилизации поддержку планирования - смещение 0-ля тангажа для газа меньше некоторого порогового значения.
Оснавная проблема- не могу сообразить как с пульта включать триммирование борта (установка нуля пироголовы и внутренних нормализированных значений каналов). Сейчас делается кратковременным переводом режима Ручной-Стабилизация-Ручной. (Режимы переключаются трехпозиционным дискретным переключателем) Но анализ видео показал, что несколько раз триммирование включалось ложно (нервничая вполне можно щелкнуть), что конечно чревато… Использовать еще один канал только для этого вроде бы жалко. В общем известное противоречие,- хочется макс. использовать один канал управления АП, при этом сохранить однозначность…

cvy7

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