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

smalltim

>До полного автопилота для вертолета как-то далековато еще

Ээ… тогда я все вопросы снимаю.

>Завтра доберусь до тушки- выложу листинг с барометра
Не, не надо.

Про поддержание вертолета в стабильном состоянии - удачи! Получится простыми методами - бум перенимать опыт, если поделитесь 😃

Одна тут ссылочка мне понравилась. По идее, физически должно быть эквивалентно управлению по одной из степеней свободы верта:
Inverted Pendulum Balancing Robot Montage

Psw

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

serj
Dikoy:

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

Само у них летает, но только на самоустойчивом электролете с рулем направления без элеронов 😃
Измерить они могут, а вот управлять- с этим наблюдаются трудности …
Я думаю, вам известно сколько “дозоров” было положено с помощью их автопилота 😦

Вообще, задача измерения и управления- это две разные задачи…

Кстати, тот же Побежимовский “элерон” - замечательный комплекс, простой как 2 копейки, имеет на борту из датчиков только gps и барометр, да еще один гироскоп 😃

Так что- на “бюджетный” вариант- максимум две пары пирометров и в сад 😃

Про компас- на широте Питера 5 градусов наклона по крену могут привести к 15 градусам ошибки курса.

Про гиру модельную по крену- я имел в виде только демпфер…

Dikoy
serj:

Я думаю, вам известно сколько “дозоров” было положено с помощью их автопилота 😦

Вообще, задача измерения и управления- это две разные задачи…

Так что- на “бюджетный” вариант- максимум две пары пирометров и в сад 😃

Про компас- на широте Питера 5 градусов наклона по крену могут привести к 15 градусам ошибки курса.

Да, я знаю. Только не знаю, это с ИХ автопилотом, или доработанным канадским, на котором они и лётают собственно?

Да, +1. Измерение и управление задачи разные. Причём управление - сильно проще.

К пирометрам желателен аксель. Во-1 он позволит использовать только 4 пирометра, при этом знать направление на землю. Во-2 его можно использовать совместно с 3-х осевым компасом, делая его невосприимчивым к кренам ( www.magneticsensors.com/datasheets/hmc1055.pdf , стр.9, HEADING COMPUTATION). +GPS. Вот это, ИМХО, и есть опримальная концепция:
GPS, возд. скорость, компас, пирометры, аксель. Альтиметр - как опция. И всё.

Вся математика компаса укладывается в 3 строчки:
X’ = X * cos(φ) + Y * sin(θ) * sin(φ) – Z * cos(θ) * sin(φ)
Y’ = Y * cos(θ) + Z * sin(θ)
Azimuth (Heading) = arctan (Y’ / X’)

lodeworx
Dikoy:

Да, я знаю. Только не знаю, это с ИХ автопилотом, или доработанным канадским, на котором они и лётают собственно?

Да, +1. Измерение и управление задачи разные. Причём управление - сильно проще.

К пирометрам желателен аксель. Во-1 он позволит использовать только 4 пирометра, при этом знать направление на землю. Во-2 его можно использовать совместно с 3-х осевым компасом, делая его невосприимчивым к кренам ( www.magneticsensors.com/datasheets/hmc1055.pdf , стр.9, HEADING COMPUTATION). +GPS. Вот это, ИМХО, и есть опримальная концепция:
GPS, возд. скорость, компас, пирометры, аксель. Альтиметр - как опция. И всё.

Вся математика компаса укладывается в 3 строчки:
X’ = X * cos(φ) + Y * sin(θ) * sin(φ) – Z * cos(θ) * sin(φ)
Y’ = Y * cos(θ) + Z * sin(θ)
Azimuth (Heading) = arctan (Y’ / X’)

+5! наконец пришла зима! 😁 Ура товарищи!

lodeworx

AVR-ADC_GLYUK! В мануалах как-то не заостряют внимание на этом- я в свое время напопоролся. Если у вас ADC использует …на… Я лучше код выложу с комментариями!
[codebox]
#define SELMUXADC 0b11111000—>Маска для ADMUX
#define OVERSAMPLERCHANNELS 1 ->каналов на оверсемплинг
#define OVERSAMPLExX 16-> 16х
#define NoP asm volatile (“nop”)
typedef struct {
uint16_t D_Container;
uint16_t Result;
uint8_t chnmask;
} Oversampler_SET;
Oversampler_SET Oversampler_CHNL[OVERSAMPLERCHANNELS];

ADMUX =_BV(REFS0);
ADCSRA =0b111 |_BV(ADEN) |_BV(ADIE) |_BV(ADSC);
//------------------------------------------------------
ISR (ADC_vect) {
Oversampler_SET *wrkwith;
wrkwith=&Oversampler_CHNL[OvSmpl];
if (wrkwith->Stat_Cntr++) { здесь уже нет “ашипки”
//if (wrkwith->Stat_Cntr++<OVERSAMPLExX) { а здесь так не надо делать

wrkwith->D_Container+=ADC; <- здесь НЕЛЬЗЯ использовать первый результат НЕ ТОЛЬКО при первом старте ADC, но и после переключения MUX!!!-ОН(осчет ADC) КРИВОЙ-шумит т.е.! Хитрые атмельщики- утаили!

}else if (wrkwith->Stat_Cntr>OVERSAMPLExX) { был “равно” стал “больше” т.е. делаем не 16, а 17 семплов
wrkwith->Result=(wrkwith->D_Container&0b11111111111100)>>2; >12 bit результат
wrkwith->Stat_Cntr=0;
wrkwith->D_Container=0;
if (OvSmpl++==OVERSAMPLERCHANNELS) OvSmpl=0;
wrkwith=&Oversampler_CHNL[OvSmpl];
ADMUX =(ADMUX&SELMUXADC) |wrkwith->chnmask; < ТРАГИЧЕСКИЙ момент 😃
NoP; < ждем такт, пока не обновится
}
ADCSRA|=_BV(ADSC); < стартуем
}
[/codebox]
Наглядненько
Наверняка ни я один попался, т.к. первое, что приходит в голову, при нескольких каналах ADC- это обновлять ADMUX на следующий канал сразу после получения результата…Я доооооолго морочился, пытаясь понять че шумит.

serj
lodeworx:

AVR-ADC_GLYUK! В мануалах как-то не заостряют внимание на этом- я в свое время напопоролся.

Вообще-то именно для этого в институтах учат схемотехнике 😃 чтоб следствия схемного построения аналоговой части (УВХ после коммутатора) не принимали за глюки … Сорри, не хотел язвить, но не удержался…

smalltim

В доках достаточно ясно написано об этом, надо только внимательно читать.
Я с самого рождения модуля телеметрии после переключения каналов АЦП первый полученный результат выбрасываю.

Dikoy
serj:

Вообще-то именно для этого в институтах учат схемотехнике 😃 чтоб следствия схемного построения аналоговой части (УВХ после коммутатора) не принимали за глюки … Сорри, не хотел язвить, но не удержался…

Называется “первое пустое преобразование” у всех АЦП последовательного приближения 😃 У СД просто возрастает время накопления. Раза в 2-3.

Psw
lodeworx:

я лично, приделал MURATA-GYROSTAR-ENV-05V (пьезо, случайно достался)<> вообще это не самолет

lodeworx:

Вертолет, нитро.

Порылся в своей коллекции убитых девайсов, содеял фотку:

двух убитых датчиков Мурата ENV-03 на фоне исправного ENV-05. Убились на верте при крашах на кухне. В одном 03 датчике даже краешек кристалла обломился, хотя корпус был целым естественно - обломился чисто от “ускорения несовместимого с жизнью”. Что-то мне подсказывает, что в ENV-05 кристалл ещё жирнее и убъётся при краше ещё легче. Про вибрации ДВС уж ваапще молчу - как он их там “переварит” без наводок.

serj:

в институтах учат схемотехнике

А я вот сам грызу гранит схемотехники потихоньку. Но то что после переключения MUX надо подождать для зарядки конденсатора УВХ перед началом АЦП - вроде и в даташитах написано и само по себе понятно.

smalltim:

после переключения каналов АЦП первый полученный результат выбрасываю

Ну да, это тоже способ “подождать”, только не самый быстрый.
Речь была об алгоритме получения каждого АЦП результата Переключил-Подождал зарядки УВХ -Запустил АЦП/Отключение конденсатора УВХ. Либо можно - при отсутствии регулируемой аппаратной задержки для УВХ как в 18 пиках, можно было делать в прерывании от готовности АЦП результата - Начало Обработчика Прерывания АЦП - пауза реакции на флаг прерывания и на сохранение регистров достаточна для зарядки УВХ - Запуск нового АЦП/Отключение УВХ - переключение MUX - быстрое копирование/накопление результата АЦП пока новый результат не готов - выход из прерывания.
И при этом не надо ничего выбрасывать и АЦП работает достаточно шустро без особых пустых программных задержек. Делал так в 16 пике.

smalltim

>Ну да, это тоже способ “подождать”, только не самый быстрый.

У меня каждый канал после переключения опрашивается 64 раза в режиме free run, потеря 65-го измерения - не слишком существенная потеря времени 😃

Vad64
smalltim:

В доках достаточно ясно написано об этом, надо только внимательно читать.
Я с самого рождения модуля телеметрии после переключения каналов АЦП первый полученный результат выбрасываю.

А можно поинтересоваться, в какой доке и где написано, что после переключения канала АЦП AVR надо ждать или откидывать первый результат?

smalltim

У меня была где-то аппноута про АЦП Атмеги.
Её не нашел, но вот что нашел, например, в даташите по AT90USB1287, которую использую в автопилоте:

In Free Running mode, always select the channel before starting the first conversion. The
channel selection may be changed one ADC clock cycle after writing one to ADSC. However,
the simplest method is to wait for the first conversion to complete, and then change the
channel selection. Since the next conversion has already started automatically, the next
result will reflect the previous channel selection. Subsequent conversions will reflect the new
channel selection.
When switching to a differential gain channel, the first conversion result may have a poor accuracy
due to the required settling time for the automatic offset cancellation circuitry. The user
should preferably disregard the first conversion result.

Psw

Если есть оверсэмплинг к примеру 4 канала по 64 считывания, то без постоянного переключения между каналами при каждом АЦП - результаты будут неравномерно взвешенны во времени, что чисто теоретически не есть хорошо. Так что лично я для чистоты совести исповедовал переключение MUX при каждом АЦП - к примеру если общий цикл накопления результата по всем каналам 1 секунда - то результат будет “более честным” - мало ли какие были всплески сигнала, а мы их могли прозевать и не усреднить.

lodeworx
Psw:

Если есть оверсэмплинг к примеру 4 канала по 64 считывания, то без постоянного переключения между каналами при каждом АЦП - результаты будут неравномерно взвешенны во времени, что чисто теоретически не есть хорошо. Так что лично я для чистоты совести исповедовал переключение MUX при каждом АЦП - к примеру если общий цикл накопления результата по всем каналам 1 секунда - то результат будет “более честным” - мало ли какие были всплески сигнала, а мы их могли прозевать и не усреднить.

Ну да, логично, я так-же пошел.

lodeworx
Psw:

Порылся в своей коллекции убитых девайсов, содеял фотку:

двух убитых датчиков Мурата ENV-03 на фоне исправного ENV-05. Убились на верте при крашах на кухне. В одном 03 датчике даже краешек кристалла обломился, хотя корпус был целым естественно - обломился чисто от “ускорения несовместимого с жизнью”. Что-то мне подсказывает, что в ENV-05 кристалл ещё жирнее и убъётся при краше ещё легче. Про вибрации ДВС уж ваапще молчу - как он их там “переварит” без наводок.

А я вот сам грызу гранит схемотехники потихоньку. Но то что после переключения MUX надо подождать для зарядки конденсатора УВХ перед началом АЦП - вроде и в даташитах написано и само по себе понятно.

Ну да, это тоже способ “подождать”, только не самый быстрый.
Речь была об алгоритме получения каждого АЦП результата Переключил-Подождал зарядки УВХ -Запустил АЦП/Отключение конденсатора УВХ. Либо можно - при отсутствии регулируемой аппаратной задержки для УВХ как в 18 пиках, можно было делать в прерывании от готовности АЦП результата - Начало Обработчика Прерывания АЦП - пауза реакции на флаг прерывания и на сохранение регистров достаточна для зарядки УВХ - Запуск нового АЦП/Отключение УВХ - переключение MUX - быстрое копирование/накопление результата АЦП пока новый результат не готов - выход из прерывания.
И при этом не надо ничего выбрасывать и АЦП работает достаточно шустро без особых пустых программных задержек. Делал так в 16 пике.

Что же вы там с ним на кухне делали- то? 😮 ENV-05 только питанием отличается(5в). При краше, мне его меньше всего жалко будет, по сравнению со всем остальным… Я для него уже соорудил силиконово-пластиковый гробик 😁 А ДВС именно с этими гиро и летает лет 10…

Psw

Краш на кухне со смертью гиры выглядит легко - обороты ротора 2к, лопастью по стальной трубе ножки стола, ударная волна через деревянную лопасть-ось-раму-демпфер-копрус в датчик заходит и ломает кристалл или просто ломает датчик. А сам верт без особо тяжких повреждений оказывапся. Полётный Вес верта около 400 грамм.

dmk
Vad64:

А можно поинтересоваться, в какой доке и где написано, что после переключения канала АЦП AVR надо ждать или откидывать первый результат?

Присоединяюсь к вопросу. Единственное ограничение - не переключать канал во время первого в конверсии цикла АЦП. Как собственно и объяснено в цитате от smalltim из даташита по AT90USB1287.
to lodeworx:
И действительно ли сэмпл после переключения канала шумный? Может причина в другом? Какая частота клока у АЦП?

Dikoy
dmk:

Присоединяюсь к вопросу. Единственное ограничение - не переключать канал во время первого в конверсии цикла АЦП. Как собственно и объяснено в цитате от smalltim из даташита по AT90USB1287.

Откройте ЛЮБОЙ учебник с описанием АЦП и там это будет. Это само собой разумеется.
В апнотах на АЦП, наверное, любой фирмы есть упоминание этой задержки.

Vad64

Вот не знаю, где у lodeworx глюки, но, подозреваю, что не в AVR. В даташитах AVR английским по-белому написано, что проблемы с точностью первого преобразования могут быть только при работе в режиме с дифференциальными входами или если выходное сопротивление источника сигнала больше 10 ком или при переключении на измерение bandgap reference. Остальное - домыслы и моя практика это подтверждает.
Не знаю, зачем lodeworx выложил в данной ветке куски какого-то левого кода, но забавно, как дружно народ подхватил и понес пургу.
Dikoy, спасибо за совет, но, думаю, Вам он будет полезен даже в бОльшей степени.

serj
Vad64:

Вот не знаю, где у lodeworx глюки, но, подозреваю, что не в AVR. В даташитах AVR английским по-белому написано, что проблемы с точностью первого преобразования могут быть только при работе в режиме с дифференциальными входами или если выходное сопротивление источника сигнала больше 10 ком или при переключении на измерение bandgap reference. Остальное - домыслы и моя практика это подтверждает.

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