Телеметрия (часть 1)
Да, посмотрел видео. Скачки налицо, надо думать.
Что интересно:
- с температурой не коррелируют, т.е. это не погрешности температурной коррекции
- Промежуточные значения между 10-метровыми шагами отображаются, только пробегают быстро. Это значит, нифига не погрешности каких-нибудь остатков.
То, что значения пробегают, а не резко переключаются на 10 метров, значит, что “плавающее окно” на 8 сэмплов работает нормально. Это в 8-сэмпловый буфер что-то такое странное пишется.
Такое ощущение, что у Атмеги на канале датчика высоты вдруг 2-3 младших разряда АЦП пропало.
brandvik, а Вы можете без видеопередатчика посмотреть, что происходит? С Вашим вынужденным сопляным монтажом провода могут нехило так наводки с передатчика на плату тащить.
А я сейчас посмотрю лишний раз математику и еще постараюсь со своей платой на лифте покататься 😃
Если удастся - выложу видео.
Без передатчика, надо подумать чего бы это подключить… И это мысль покататься на лифте! 😃
На видео от Maloii такое же прослеживается: last fly my easy star
Бум разбираться.
Явного криминала в коде не нашел.
Но код коррекции высоты по начальному атмосферному давлению на земле (оно не всегда 101.3 кПа 😃 ) - очень тяжелый и очень злой - жуткие извраты с 16-битной псевдоплавающей арифметикой… Жуть. Решил убрать подобру-поздорову, оставив только температурную коррекцию.
И увеличить ширину окна скользящего среднего с 8 до 16, 32, а то и до 64 (если памяти хватит, сейчас погляжу) сэмплов. Запаздывать будет отображение высоты - скорости секунды на 3, но уж извините, зато циферки плавненько сменяться будут.
Вот здесь на видео у меня код еще без температурной коррекции и т.д.: vimeo.com/1460573
Высота с бародатчика - слева, третья снизу.
Попробовал без передатчика на лифте покататься, тоже самое. Потыкал осцилографом, никаких шумов не нашел. Запаздывание вывода данных более чем на 1с не очень то будет хорошо. Особенно по скорости. Но в принципе не смертельно 😃
А вот есть еще такая . В свое время были разговоры о вариометре. Не помню уже почему от него отказались, но если честно то не хватает звукового вариометра.
Отбой катаниям на лифте.
Нашел, что было поломано - вброс новых значений и фильтрация в буфере “скользящего среднего” происходили в 8 раз чаще, чем нужно.
Показания в итоге выводятся верные, но, по сути, без сглаживания “скользящим средним”. Получили новое значение, опросив 64 раза АЦП, и забили весь буфер этим значением. Никакого нафиг “скользящего среднего”.
Отсюда и мельтешащий указатель скорости, кстати.
Вернул взад все коррекции высоты. Сейчас увеличу буфер “скользящего среднего” заодно с 8 до 16 отсчетов. При этом время, за которое “скользящим средним” усредняются показания скорости-высоты, будет не 1.28, а 2.56 секунды.
Про шаги по 7…10 метров. Эта вот… ~8 метров - это предел точности MPXA4115 с 10-битным АЦП Атмеги, если опрашивать в лоб.
С оверсэмплингом - у меня 64 выборки за раз - 11 бит получается. Со “скользящим средним” на 8 таких пачек - еще 1-2 бит.
Только вот скользящее среднее в какой-то момент было сломано моими кривыми руками, поэтому 8 метров и вылезАли.
Забираем прошивку v228:
Изменения относительно v227:
-
Исправлен код “скользящего среднего” для усреднения данных с АЦП на каналах датчиков давления.
Результат - отсутствие “мельтешения” цифр на индикаторах скорости и высоты с датчиков давления -
Увеличена ширина окна “скользящего среднего” с 8 до 32 сэмплов.
Результат - еще более плавное изменение высоты и скорости на индикаторах. Усреднение идет по ~5 секундам полета. -
Частота АЦП уменьшена вдвое.
Результат - чуть более точная работа АЦП. -
Включен pull-up резистор на входе ICP
Результат - при отсутствии подключения к RC приемнику, в условиях сильных помех или наводок, больше нет ложного детектирования наличия подключения к приемнику.
Потыкал осцилографом, никаких шумов не нашел.
Это, кстати, не очень здорово. Для нормальной работы оверсэмплинга на АЦП шумы на уровне 0.5 … 1 LSB (2.5 … 5мВ) должны присутствовать, а если их нет, то надо подмешивать. Я же, когда разрабатывал финальный вариант платы, к шумам подошел просто: давить!..
Но ничего, отлаживая прошивку 228, я выводил на экран накопление по 64 измерениям с АЦП - немного шумит, так что всё хорошо 😃 Да и “скользящее среднее” тут как нельзя кстати 😃
Запаздывание вывода данных более чем на 1с не очень то будет хорошо. Особенно по скорости. Но в принципе не смертельно 😃
С прошивкой 228 при мгновенном увеличении скорости , скажем, с 50 до 100 км/ч, на индикаторе скорость начнет расти сразу, но дойдет ровно до 100 только за 5 секунд. То же и с высотой.
В свое время были разговоры о вариометре. Не помню уже почему от него отказались, но если честно то не хватает звукового вариометра.
К сожалению, не в этой жизни. Это надо или цифровые датчики, или внешний АЦП 16-битный, и выход с платы телеметрии на звуковой канал. У меня из свободных выходов, к которым можно подпаяться, не меняя печатную плату, остались только выход USART и SPI. USART будет использовать 3apw 😉, а SPI - плата автопилота.
Прошивку обновил. Покатался на лифте, впечатления странные, на днях попробую облетать…
Так, провел расширенный тест. Новая прошивка вообще глючит по полной. Может быть стоит грешить на мои корявые ручик и сопливую плату, но результат следующий.
Залил версию 227.
Испытания на лифте:
Подъем, 000000000000123456567888888888888888910 11 12 13 14 15 16 17 17 17 17 17 17 17
Спуск тоже самое в обратном порядке.
Скорость. Тестировалось с феном на двух скоростях.
1я скорость - плавание показаний 21-24 ; 2я - 37-39
Заливаем 228
Лифт:
Подъем, 000000000001234567…20 2122 22 22 22 22 22 22 22 22 22 23 24 25 26 27…42 43 44 44 44 44 44 44 😃
Скорость.
1я 31 как вкопанная. 2я 59 тоже стоит на месте. Показания какой версии более верные сказать не могу, нет эталона.
Плюс, при изменениях скорости , показания очень сильно запаздывают. Ориентироваться на них при управлении невозможно.
Вот такие результаты…
Высота врет явно, по скорости не скажу, но впечатления такие что тоже врет.
Так, провел расширенный тест. Новая прошивка вообще глючит по полной. Может быть стоит грешить на мои корявые ручик и сопливую плату, но результат следующий.
Залил версию 227.
Испытания на лифте:
Подъем, 000000000000123456567888888888888888910 11 12 13 14 15 16 17 17 17 17 17 17 17
Спуск тоже самое в обратном порядке.
Скорость. Тестировалось с феном на двух скоростях.
1я скорость - плавание показаний 21-24 ; 2я - 37-39
Заливаем 228
Лифт:
Подъем, 000000000001234567…20 2122 22 22 22 22 22 22 22 22 22 23 24 25 26 27…42 43 44 44 44 44 44 44 😃
Скорость.
1я 31 как вкопанная. 2я 59 тоже стоит на месте. Показания какой версии более верные сказать не могу, нет эталона.
Плюс, при изменениях скорости , показания очень сильно запаздывают. Ориентироваться на них при управлении невозможно.
Вот такие результаты…
Высота врет явно, по скорости не скажу, но впечатления такие что тоже врет.
Ne beite silno.
Ya seichas ne u kompuka, no, pohozhe, znayu v chem delo. Ne vezde pod 32 sempla perepisal.
Blizhe k nochi perepishu pod 16 semplov I pereproveru, na lifte tozhe pokatayus.
Так и оказалось. В делении на 32 при усреднении в скользящем окне было оставлено деление на 16 😦
5 утра - не лучшее время для ассемблера ☕
Сейчас исправил. 32 сэмпла - много, медленная реакция и т.д. Сделал 16.
Забирайте прошивку 228b:
Забрали, прошили, потестили. Скорость работает на отлично! А вот с высотой таже беда залипает на 8ке, хотя точность вернулась на место. Думаю вам стоти самому на лифте покататься и посмотреть как у вас обстоят дела.
с высотой таже беда залипает на 8ке
Лично мне кажется что объяснение уже давалось:
Про шаги по 7…10 метров. Эта вот… ~8 метров - это предел точности MPXA4115 с 10-битным АЦП Атмеги, если опрашивать в лоб.
Для нормальной работы оверсэмплинга на АЦП шумы на уровне 0.5 … 1 LSB (2.5 … 5мВ) должны присутствовать, а если их нет, то надо подмешивать.
Потыкал осцилографом, никаких шумов не нашел.
Чутьё 5 мВ/деление вроде нередко есть в осц, должон видеть шумы значит.
Привет!
Осилил таки девайс, в жизни ничего подобного не делал - ни лут ни smd ни avr. Но могу заметить atmega8 очень устойчива к произволу радиолюбителя.
По поводу питания lm1881 зачем там 4.7к на вход Vcc ?? запустил только коротнув резистор и отключив плохой диод… ( потом нашел кд510)
Какой может быть разброс показаний напряжения питания и из-за чего ?
и что делать с нижним соском датчика давления ? наглухо закрыть ?
smalltim и ко – респет и уважуха!
По поводу питания lm1881 зачем там 4.7к на вход Vcc ??
Он там не нужен (даже если он 4.7 Ом 😃).
Какой может быть разброс показаний напряжения питания и из-за чего ?
Если резисторы в делителе правильные, то никакого разброса.
и что делать с нижним соском датчика давления ? наглухо закрыть ?
Судя по тому, что на фотографии нижнего соска уже нет 😎, то ничего не делать. А вообще он должен был идти на “статический” конец трубки Пито.
2 smalltim: Btw, на Вашей плате мне пришлось поменять местами датчики и еще перевернуть диффернциальный вверх ногами, порезав нафиг дорожки под ним. - Именно потому, что правильный датчик - с двумя сосками - “у кринку нэ лэзе !”
Привет!
Осилил таки девайс, в жизни ничего подобного не делал - ни лут ни smd ни avr. Но могу заметить atmega8 очень устойчива к произволу радиолюбителя.
По поводу питания lm1881 зачем там 4.7к на вход Vcc ?? запустил только коротнув резистор и отключив плохой диод… ( потом нашел кд510)
Какой может быть разброс показаний напряжения питания и из-за чего ?и что делать с нижним соском датчика давления ? наглухо закрыть ?
smalltim и ко – респет и уважуха!
Там не 4.7кОм, а 4.7Ом. Для снижения помех по питанию.
Разброс напряжений питания из-за разброса сопротивлений резисторов в делителях на входе. Лучше ставить 1-процентные.
Второй сосок датчика давления можно откусить под корень или подвести к грамотно сделанному ПВД.
В верхний сосок поступает давленние набегающего потока воздуха. в нижний - статическое давление воздуха. MPXV5010-датчик дифференциальный, он выдает напряжение, пропорциональное разнице этих давлений, что и надо для вычисления скорости.
Так что второй сосок, если не хочется городить “правильный” ПВД, можно откусить под корень, пусть берет статическое давление на плате, в 3 мм от Атмеги 😃
>Btw, на Вашей плате мне пришлось поменять местами датчики и еще перевернуть диффернциальный вверх ногами, порезав нафиг дорожки под ним. - Именно потому, что правильный датчик - с двумя сосками - “в кринку нэ лэзе !”
Да, если надо 2 соска, то проблема есть. Но решаемая на счет “раз”. С двумя сосками нормально лезет, если отогнуть немного выводы датчика, поставив его “на цыпочки”. Он станет на примерно на 2 мм выше.
Вопрос про разброс напряжений - никто не пользовался 'грифельмодом " ( рисование по резистору мягким карандашом) для подстройки показаний Делителя. На мамке рисовал на ура, но на сколько там изменилось сопротивление - не представляю …
На видео от Maloii такое же прослеживается: last fly my easy star
Бум разбираться.
Похоже это разное время входа в прерывание по строкам(такт или два). На моей графической- такая-же точно “шняга” (софт полностью мой) может попробовать все переменные в 16 бит?- в один размер?
Вернул взад все коррекции высоты. Сейчас увеличу буфер “скользящего среднего” заодно с 8 до 16 отсчетов. При этом время, за которое “скользящим средним” усредняются показания скорости-высоты, будет не 1.28, а 2.56 секунды.
А как вы делаете ФСС?.. Вообще, увеличение размерности буфера не должно увеличивать время получения параметра (если не обращать внимание на само время вычисления процессором, которое относительно мало).
Сейчас в рабочих проектах активно пользую такую конструкцию: в ОЗУ три буфера по 8 байт. Первый забивается выборками с АЦП. Его средним забивается второй. Его средним - третий. 24 байта в ОЗУ эквиваленты обычному ФСС на 1024 выборки (по сути, это трёхкаскадный фильтр). Время вычисления на древнем 51 ядре (12 тиков на операцию, кварц 11 мег) около 1 мс. На АВР, думаю, уложится в 100 мкС. Но пока не переносил.
Ещё один плюс такого подхода: вычисления проводятся в пределах 16 бит, что для АВР есть хорошо, учитывая его 16 битные регистры. Аналогичный вариант с буфером на 1024 выборки потребовал бы переходить в 32 битные переменные.
ПС. Вчера, наконец, смог поднять свою куту!!! 😁 Она у меня гидроплан. С воды взлетать сейчас стрёмно, а вот со снега - самое то. Записал пирометры в полёте, подсчёт углов. Получил ошибку примерно 0,25 градуса в первых 5 градусах крена. Потом до 3 градусов плоть до 45 гразусов. Потом чистый гон 😃
В требуемых ±15 градусах крена ошибка не превышает градус - сравнивал показания с БСО. От высоты не зависит 😃
На неделе попробую пришить к автопилоту вместо БСО, посмотрю, как будет держать крен.
А как вы делаете ФСС?.. Вообще, увеличение размерности буфера не должно увеличивать время получения параметра (если не обращать внимание на само время вычисления процессором, которое относительно мало).
В каждом кадре камеры (1/50 сек) во время между отрисовкой верхних строк и нижних строк опрашивается один канал АЦП - делаются и суммируются 64 выборки.
В следующем кадре - следующий канал АЦП.
Итого 8 каналов опрашиваются в течение 8 кадров.
Т.е. время между обновлениями данных по одному каналу АЦП составляет 8*(1/50) сек, или 0.16 сек.
В ФСС (сделаны как кольцевой буфер, таких несколько, свой для каждого из различных физ параметров) новая инфа капает каждые 0.16 сек. Ширина ФСС - 16 значений. Значит, самый “давний” сэмпл, лежащий в буфере ФСС, соответствует времени 0.16*16=2.56 секунды назад. Если сделать буфер ФСС шириной 32 сэмпла, то будет 5.12 секунды назад. Это слишком инерционно. Поэтому сделано 16 сэмплов.
Всё.
Каскадные ФСС делать не могу - ресурсов не хватит. Каскадные ФСС имеют смысл при непрерывном опросе АЦП, без отвлечения на математику и отрисовку и т.д., тогда задержек по времени таких больших не будет. У меня же на всё про всё одна Атмега - и парсинг ГПС, и математика, и отрисовка, и АЦП, и ICP, и еще общение с автопилотом по SPI добавляется.
Похоже это разное время входа в прерывание по строкам(такт или два). На моей графической- такая-же точно “шняга” (софт полностью мой) может попробовать все переменные в 16 бит?- в один размер?
Нет, это не разное время входа в строковое прерывание. А чтоб у Вас не было задержек на такт или два, в конце строки отправляйте Мегу спать, чтоб к следующей строке отдохнула и не тормозила с реакцией на прерывания 😃.
Больше ничего не понял. Зачем, к чему, почему, какие все переменные в 16 бит?