Телеметрия (часть 1)

Dikoy

Подтянуть можно и без степапа, тупо меняя направление вывода МК с выхода на вход, и имея резистор подтяжку к +5 вольт.
Если и ставить степап, то дял питаняи всей аппы. И не степап, а сепик…
По этому я и удивился - отдельный степап на сигнал серв…

pvp
smalltim:

…Какой же корявый код USB библиотек у Атмела…

Позволю себе ещё разок указать на www.fourwalledcubicle.com/LUFA.php.
На мой взгляд, вполне проработанная библиотека usb для atmel’ов, сопровождающаяся кучей примеров устройств различных классов. По крайней мере, в части реализации HID и CDC устройств, у меня всё работало.

pvp
serj:

…Также я обычно не использую первые 30-50 байт eeprom.

Я тоже так делаю, а точнее, начинаю использовать eeprom со старших адресов.

serj
Dikoy:

А кто нибудь проверял работу серв при управляющем напряжении 3,3 вольта?
Я вчера проверил, вроде работает (питалась она от 5). И принципиально выходит, что должна, если там КМОП вход. Но вдруг мне просто повезло?..

Управляющий сигнал в 3.3-3.7 вольта является “де факто” стандартом большинства приемников- по питанию приемника стоит стабилизатор на 3.3- 3.7 вольта.

Питание самой сервы, понятное дело должно быть нормальное - 4.2-6 вольт.
Также следует обратить внимание на помехи по “земляному” проводу- если есть вч- составляющие тока, то они могут снижать помехозащищенность- при большой нагрузке некоторые аналоговые сервы начинают дрожать. Обычно такие помехи проявляют себя при использовании удлинителей серв.

smalltim

>Позволю себе ещё разок указать на www.fourwalledcubicle.com/LUFA.php.

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

Теперь вот сижу в DDK ковыряюсь - атмеловские библиотеки для Win32 теряют почти половину из приходящих HID-репортов. Опять придется всё руками делать, хехе.

Dikoy

Да ладно? Уж пяток проектов сдали на кее с атмельским CDC, и всё как часики. Хотя тоже библиотеки правил. Что подразумевается под библиотеках под вин32?
ПС. А при диагональном расположении пирометров вы как считаете дельту? Как дельту среднего арифметического между соседними датчиками?

smalltim

>Уж пяток проектов сдали на кее с атмельским CDC, и всё как часики.
CDC и HID - это разные вещи кагбе. HID клевый, потому что драйверов вообще не надо. То есть, вообще юзеру ничего делать не надо. Воткнул и работаешь. Только для режима DFU надо драйвер. Хотя в принципе и бутлоадеры HID есть.
Зато HID медленный. 64 кбайт/сек - это если очень повезет. Я пока выжал почти 32, не знаю, что получится, когда откажусь от атмеловских библиотек. Почти 32 - это потому что атмельская либа, зараза, пакеты теряет когда между пакетами меньше 5 мсек.

>Что подразумевается под библиотеках под вин32?
ATUsbHid.dll и иже. Там организуется отдельный поток с несинхронным, зато неблокирующим чтением из девайса-файла, и с FIFO приходящих с девайса HID-репортов. Надо синхронное. Не надо FIFO. Поковырявшись в DDK понял, что, оказывается, это просто.

>А при диагональном расположении пирометров вы как считаете дельту? Как дельту среднего арифметического между соседними датчиками?
Ну здрасте. Матрица поворота на 45 градусов.
Крен - сумма дельт двух пар. Тангаж - разница дельт двух пар. Ну или наоборот, смотря в какую сторону на 45 градусов голову повернули 😃
Ну и поделить на корень из двух. На всякий случай 😃

PigTail

2 Dikoy, а какие у Вас цифровые сенсоры, буковки у них какие, чой то не могу найти 😦

Dikoy
smalltim:

рен - сумма дельт двух пар. Тангаж - разница дельт двух пар.

А пары у вас, это диаметрально противоположные датчики?

Вахтанг

Я надеюсь, что вы об этом помните, но вдруг…
При переходе бортовой системы на управление от автопилота, при пропадании сигнала от передатчика, может возникнуть неприятная ситуация, по причине изменения нулевой точки РМ. Дело в том, что настройки всех триммеров хранятся именно в передатчике, а не в приемнике, и при пропадании сигнала от передатчика, по идее, приемник должен выставить РМ в свой нейтрал (справедливо для аппаратуры на 2,4ГгЦ, ибо у FM нет «сейф моде» и едет крыша, если потерял передатчик)!

smalltim

>А пары у вас, это диаметрально противоположные датчики?

Да.

Dikoy

2smalltim
Может я конечно туплю, но поворот есть умножение матриц. Причём матрица поворота состоит из синусов/косинусов 45 градусов, то есть 0,7.
И того имеем:


d1 d3 * 0.7 -0.7 = 0.7(d1+d3)  0.7(d3-d1)
d2 d4   0.7  0.7   0.7(d2+d4)  0.7(d4-d2)

Так я себе представляю матрицу поворота.
Как выведен ваш способ?.. Мне просто интересно 😃

serj
Dikoy:

2smalltim
Может я конечно туплю, но поворот есть умножение матриц.
//-------
Как выведен ваш способ?.. Мне просто интересно 😃

Мне кажется, смеситель Тимофея сильно похож на смеситель элевонов 😃

smalltim

>синусов/косинусов 45 градусов, то есть 0,7.

Точно. А синус и косинус 45 градусов это единица делить на корень из двух. Примерно Ваши 0.7

[x 0]  (исходная матрица)
[0 y]

*

[cos45 -sin45] (матрица поворота)
[sin45  cos45]

итого у Вас

a= (x/V2+y/V2) = (x+y)/V2
b= (x/V2-y/V2) = (x-y)/V2

Dikoy

Блин, я всё время забываю, что у Вас на АЦП сразу делта 😃 А я заточил иптематику на индивидуальную обработку датчиков.
Упростил свою систему и получил почти то же, только минус где-то теряется… Ну да ладно. Потом отлажу.

smalltim

Прошивка для телеметрии v232nb - для плат без бародатчиков.
Можно использовать и v232, но тогда в соответствующих местах экрана будут бессмысленные числа или нули.

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

Так что, кому надо, забирайте v232nb:

smalltim

Решил сделать пару заманушных скриншотов 😃

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

Только вот HID медленный, зараза. Я засекал время: скачка 2 МБ набортной памяти занимает в среднем минуту и 25 секунд. Ну да ладно, переживем.

slides
smalltim:

Решил сделать пару заманушных скриншотов 😃

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

Только вот HID медленный, зараза. Я засекал время: скачка 2 МБ набортной памяти занимает в среднем минуту и 25 секунд. Ну да ладно, переживем.

😈 Да он издевается над нами !!!😃

Dikoy

Проздравьте мине! Вчера был первый автоматический вылет! 😃
Сыкотно было аж жуть, но ничё… Из крена машину выводит! Машинки позамёрзли, сажал аппарат в снег фактически одним элероном 😃
Пока из недостатков - очень тормознутая система получилась. Надо уменьшать фильтрацию и подбирать ПИД… Бум думать.

smalltim

Поздравляю!

Насколько именно тормозная система получилась?
Я закладываюсь на обновление ширины PPM на выходе (в режиме автопилота) не меньше чем 25 раз в секунду, абсолютный мимнимум - 10 раз в секунду.
Если автопилот работает не как автопилот, а просто в режиме стабилизации самика, задержка с обработкой и выдачей на сервы управления от человека должна быть не больше 5 мсек, 10 мсек - абсолютный максимум.

smalltim

У меня пока продвигается всё очень неторопливо. Сегодня добил и всячески проверил функции произвольного чтения/записи во внешний флеш.
Следующий этап - логика и сами функции калибровок компаса, пирометров и входных-выходных PPM.

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

UPD:
Если кому интересно, наткнулся на мерзкую вещь в AVRGCC, связанную с типом констант.

вот такой, например, код нифига не сработает:
u32 a;

if(a>1000){…}

а вот такой сработает:
u32 a;

if(a>(u32)1000){…}

Гады, столько крови попортили…

Dikoy

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

Тормознутось опрелелялась органолептически 😃 То есть раскачкой в руке. Если вертануть самолёт максимально быстро, что позволяет рука и прочность самолёта, то машинки начинают отрабатывать только когда самик уже почти достиг 90 градусов. То есть во-1 ПИД плохо настроен (опережение маленькое), во-2 идут задержки, связаные с работой кода (та же запись во флеш отъедает время).
Код у меня сейчас - шедевр. Когда получил пирометры, чтобы не париться, взял один проект с работы под кей, выкинул лишнее оставив движок (Модбас коммуникация по всем МКашным портам) и насадил код чтения пирометров туда. В итоге за пару дней их завёл. Ну и далее наращивал всё на этом движке. А там только движок 20 кБ после компиляции занимает 😃
Сейчас планирую вынести функционал управления в отдельный проект, соптимизировать математику, выкинуть лишнее. Тогда и оценю задержки.
А насчёт обновления ШИМа - вычисление периода ППМ идёт в прерывании, ШИМ аппаратный, с двойной буфферизацией. По расчётам задержка прохождения сигнала не должна превысить один период ППМ. По крайней мере когда я проверял передачу через кей на земле, на глаз задержек не заметил. Только элероны немного дрожали (ошибка измерения) но на полёт это не влияет.
В общем, на следующих выходных должно стать ясно, что там со скоростью.

smalltim

У меня функции чтения/записи берут линейный адрес во флеше, указатель на буфер, и сколько в буфер писать/читать.

А как ПИД может тормозить? Там И что ли большое? У меня И вообще не предусматривается, только ПД. А изначально хотел вообще просто ООС с постоянным коэффициентом вкрячить и всё. То есть, П. 😃

Скажите, Гуру, плавающая точка (float?) (double?) на AVR GCC достойна того, чтобы ее использовать, или лучше оставить всё по старинке, в целых числах?

Artie
smalltim:

вот такой, например, код нифига не сработает:
u32 a;

if(a>1000){…}

а вот такой сработает:
u32 a;

if(a>(u32)1000){…}
Гады, столько крови попортили…

а как себя ведет

if (a>1000l)
или
if (a>1000ul) ?

… А то, может быть это не бага, а … 😉

smalltim:

Скажите, Гуру, плавающая точка (float?) (double?) на AVR GCC достойна того, чтобы ее использовать, или лучше оставить всё по старинке, в целых числах?

float от double там, кажется, вообще не отличаются 😃, но в целом библиотека вполне нормальная.

Целесообразность же работы в интах или флоатах определяется балансом доступных времени (бо плавучка медленна) и места (бо библиотеки жрут место) с одной стороны, и желанием (а иногда и возможностью) перевода всей необходимой арифметики в целые числа - с другой…