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

Dikoy
dmk:

to Dikoy:
Время (необходимое и достаточное для AVR, в пределах его скоростных возможностей) в течении которого вход подключен к конденсатору УВХ составляет 1 цикл АЦП (исключая первое после запуска АЦП преобразование) и начинается сразу после старта преобразования. После этого и до следующего старта вы можете играться с мультиплексором как хотите - конденсатор уже отключен от входа и соответственно подключен ко входу компаратора ЦАПа. Мне кажется, что это более “само собой разумеется” и упоминаются в “ЛЮБОМ учебнике”. Раз lodeworx писал про недокументированый глюк, я хотел выяснить, не связан ли он с определенной моделью AVR или конфигурацией АЦП, и только. А если у Вас есть “ЛЮБОЙ” учебник или апнот с подтверждением или доказательством противного, дайте ссылку, или цитату, как это сделал smalltim 😃 .

Я бы с удовольствием, но как можно судить о схемотехнике аналоговой части, имея в даташит только упрощенную блок схему?

Вот, например, выдержки из даташита на 1287:
If a different data channel is selected while a conversion is in progress, the ADC will finish the current conversion before performing the channel change.

The channel and reference selection is continuously updated until a conversion is started. Once the conversion starts, the channel and reference selection is locked to ensure a sufficient sampling time for the ADC. Con-tinuous updating resumes in the last ADC clock cycle before the conversion completes (ADIF in ADCSRA is set). Note that the conversion starts on the following rising ADC clock edge after ADSC is written. The user is thus advised not to write new channel or reference selection values to ADMUX until one ADC clock cycle after ADSC is written.

Special care should be taken when changing differential channels. Once a differential channel has been selected, the stage may take as much as 125 μs to stabilize to the new value. Thus conversions should not be started within the first 125 μs after selecting a new differential chan-nel. Alternatively, conversion results obtained within this period should be discarded.

Там же есть Figure 25-8, показывающая схему аналогового входа. Нетрудно посчитать, что постоянная времени составляет 1,4 мкС. То есть заряд ёмкости входа после смены канала потребует минимум 1,4 мкС, при услови нулевого выходного сопротивления источника.
Об этом подробно расписано в апнотах атмела, касающихся АЦП. Искать их чтобы что-то доказать я не буду - лениво. Можете убедиться сами.
Наконец, автоматические генераторы кода, например, CV, в функциях АЦП генерят либо задержку 10 мкс, либо пустую конверсию (что надёжней) после каждой смены канала или настроек.
В даташите вы также можете найти рекомендацию останавливать ядро процессора во время преобразования. О “После этого и до следующего старта вы можете играться с мультиплексором как хотите” речи даже не идёт.

Vad64
Dikoy:

Вот, например, выдержки из даташита на 1287

Вот это уже более конструктивный разговор. Итак, написано:
If a different data channel is selected while a conversion is in progress, the ADC will finish the current conversion before performing the channel change.

Это означет, что если задать новое значение канала, то АЦП закончит текущее преобразование, а потом уже поменяет канал.

The channel and reference selection is continuously updated until a conversion is started. Once the conversion starts, the channel and reference selection is locked to ensure a sufficient sampling time for the ADC.

А это означает, что канал и опора обновляется только до тех пор, пока не началось преобразование. После начала преобразования эти установки блокируются и т.д. Это и имеет в виду коллега словами “После этого и до следующего старта вы можете играться с мультиплексором как хотите”

Про постоянную времени. Если в худшем случае она 1.4 мкс, то нужно 9.7 мкс для устаканивания сигнала в ошибку 0.1% при максимальном разбросе сигналов на переключаемых входах. При 1.5 тактах сэмплирования это обеспечивается на частотах АЦП 150 кГц и ниже при рекомендованном диапазоне 50-200 кГц.
Лично я склонен полагать, что сопротивление 100 кОм на рисунке - крайний случай, характерный для очень низкого напряжения питания. В реальности при питании 3.3 - 5В я не наблюдал никакого влияния между каналами при максимальном разбросе входных напряжений и частоте АЦП до 200 КГц. В доказательство, в пояснениях к рисунку написано: The ADC is optimized for analog signals with an output impedance of approximately
10 kΩ or less. If such a source is used, the sampling time will be negligible. Т.е. время сэмплирования пренебрежимо мало, если источник имеет сопротивление менее 10 кОм. Именно под это оптимизирован АЦП и его времена. Если бы 1.5 такта было недостаточно для переключения каналов и сэмплирования, думаю, Атмел увеличил бы это время, как оно увеличено у них для первого преобразования (до 13.5 тактов). Понимаете, быстродействием просто так не бросаются. Если выкидывать каждый 2й отсчет АЦП, то это уже не очень хороший АЦП.
Случаи с дифференциальными входами и bangap - да, требуют задержек и об этом действительно написано.

Наконец, просто проведите эксперимент - задайте на соседних входах 0 и Ucc и посмотрите, чему будут равны первый и последущий отсчеты после переключения.

Успехов

dmk

to Dikoy:
Останавливать процессор рекомендовано, но не обязательно, а при работающем процессоре переключение мультиплексора шумов не добавит. И мультиплексором вы можете играться как хотите, читайте хотя бы свою цитату из даташит (правда несколько другими словами): "The user is thus advised not to write new channel or reference selection values to ADMUX until one ADC clock cycle after ADSC is written.
По поводу постоянной времени. Внимательно читая даташит видим что общее последовательное сопротивление может быть от 1 до 100 кОм. Так что, время заряда будет от 14 нано секунд до 1.4 мкс (я думаю что при разном усилении входа(отличном от 1) и использовании дифференциальных каналов сопротивление может меняться). Но даже ваши 1.4 мкс легко влезают в 1 цикл АЦП при максимальной частоте (для АЦП AVR 15 килосэмплов в секунду или 65 мкс на преобразование).
ЗЫ. Спорить больше не буду, меня вполне устроило подтверждение Vad64. А то что Вы тут Самый Грамотный Спец доказывать не надо (даже если бы не было лениво), все и так здесь это знают. 😒

ЗЫ.ЗЫ. Пока писАл, с ответом опередили. Ну да ладно.

Dikoy
dmk:

to Dikoy:
Останавливать процессор рекомендовано, но не обязательно, а при работающем процессоре переключение мультиплексора шумов не добавит. И мультиплексором вы можете играться как хотите, читайте хотя бы свою цитату из даташит (правда несколько другими словами): "The user is thus advised not to write new channel or reference selection values to ADMUX until one ADC clock cycle after ADSC is written.
По поводу постоянной времени. Внимательно читая даташит видим что общее последовательное сопротивление может быть от 1 до 100 кОм. Так что, время заряда будет от 14 нано секунд до 1.4 мкс (я думаю что при разном усилении входа(отличном от 1) и использовании дифференциальных каналов сопротивление может меняться). Но даже ваши 1.4 мкс легко влезают в 1 цикл АЦП при максимальной частоте (для АЦП AVR 15 килосэмплов в секунду или 65 мкс на преобразование).
ЗЫ. Спорить больше не буду, меня вполне устроило подтверждение Vad64. А то что Вы тут Самый Грамотный Спец доказывать не надо (даже если бы не было лениво), все и так здесь это знают. 😒

ЗЫ.ЗЫ. Пока писАл, с ответом опередили. Ну да ладно.

Блин, при чём здесь доказывать? Есть ПРАКТИКА. И эта практика говорит, что НАДО. Есть апнота, которая тоже говорит, что НАДО. И есть вы, с теорией. Я програмлю АВР уже 5 лет, начинал ещё с 89-х. Эволюцию их АЦП прочувствовал на своей шкуре, а так же АЦП других производителей, вплоть до 24 бит с нановольтными весами разрядов. Не у всех это явление описано, но у всех проявляется в той или иной мере.
Все параметры в ДШ описаны для конкретного случая, лабораторного. В некотрых ДШ над таблицами так и пишут, при каких условиях был получен параметр. Не надо огульно применять эти значение, не подумав и минуты.
Много у вас источников с сопротивлением ниже 10 к? нормальный делитель, это 50-100к. Вот тут вам атмел и скажет - мы расчитывали на 10к, а всё, что выше, проблемы ваши. Соединив два входа с Ucc и GND, по совету Vad64, мы действительно не увидим шума.
Вот выдержка из кодегенератора CV:
// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

То есть как минимум 3 человека в мире (я, автор, программер CV) про проблему знают. Рекомендую задуматься.

Vad64
Dikoy:

Есть апнота, которая тоже говорит, что НАДО.

Апноту укажите, пожалуйста.

lodeworx
Vad64:

Апноту укажите, пожалуйста.

Мне тоже интересно. В моем случае, физически подключено вот так:
ADC4 не имеет отношения к дифф. каналам. Частота 125кгц, мега32…

// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
А такие вещи,в программе, меня как-то пугают. А использует ли функция delay_us() таймер? Уверен нет- это макро на ассемблере, которое наверняка запрещает прерывания при входе в нее. Замечательно полезно!

lodeworx

Для общего обозрения, заморочился:
“относительный”, усредненный спектральный анализ для 1 результата после переключения на 4 канал, с гироскопом, 31 фрейм, ADC-125khz, переключение между 0 и 4 каналами 16x оверсемплинг:

для 16-го:

Шумит?! Все это понятно, про зарядку, импеданс… И что Atmel не очень- то в аналоговую часть углубляется…
С вариометром я AD7705 использовал- там в datasheet этому вопросу целая страница посвящена- стр.16!
Для общего дела, с наилучшими пожеланиями! 😃

foxfly
lodeworx:

Мне тоже интересно.
А такие вещи,в программе, меня как-то пугают.

Прямо как в старом анекдоте : пришел Пьер и все опошлил 😦
А как все хорошо начиналось : Smaalltim с год назад решил сделать устройство телеметрии.
И сделал!
Очень приличное, недорогое и работающее.
Одно это- достойно большого уважения !
Выложил информацию для всех.
И тут приходит боксер- теоретик, утверждающий, что по его (авторитетному и непререкаемомому) мнению- все это “вторичный продукт” (почитайте В.Войновича- узнаете расшифровку термина 😃 )
Батенька!
А где можно увидеть что то, сделанное Вашими ручками?
Или Вы действуете по театральному принципу: актера из меня не вышло, пойду в критики?

maloii

Народ подскажите как в WinAVR (плагин для студии) в ассэмблерной вставке указать адрес памяти (.org). Не могу таблицу знако генератора расположить по 100 кратному адресу памяти. В доки написано так 😦

Note that .org is available in gas as well, but is a fairly pointless pseudo-op in an assembler environment that uses relocatable object files, as it is the linker that determines the final position of some object in ROM or RAM.

. Решил переписать код с CodeVisionAVR на WinAVR, протестил один и тот же код компилированный в разных средах и WinAVR чутьли не в 2 раза шустрее. Вообще ассемблер в WinAVR странный, .db там нет, как я понял замена ему .byte.

smalltim

Рисую схему и печатную плату автопилота.
Пока остановился на следующем наборе входов и датчиков:

  • Вход с GPS модуля
  • 2 пары пирометров
  • 2-осевой компас

На плате предусматриваю еще, из главного:

  • 4 входа и 4 выхода РРМ
  • 16 мегабит памяти
  • USB интерфейс
  • 2 светодиода состояния
  • Разъем SPI для обновления прошивок платы телеметрии и обмена данными с платой телеметрии.

Из неглавного понадобится:

  • Сдвоенный ОУ для компаса, сдвоенный ОУ для платки пирометров.
  • Линейный стабилизатор 3.3В для питания потрохов

Ну, и мелочевка: кварц, резисторы, конденсаторы, разъемы

Плата автопилота должна уметь работать как автономно, так и в паре с платой телеметрии. Если плат работает автономно, то меню на экран выводить нечем. Все настройки - с компука, через USB.
Если плата автопилота работает в паре с платой телеметрии, то на плату телеметрии сгружается обновленная прошивка с поддержкой меню и появляется возможность
управлять настройками прямо в поле, с экранным меню.

Навигация по меню планируется с пульта:

  • вправо-влево-вверх-вниз - ручкой крен-тангаж.
  • Да-Нет-больше-меньше - ручкой РН

Настройки предполагаются следующие:

  • Установка уровней, при которых соответствующие индикаторы на экране начинают мигать: расстояние до базы, высота, напряжения батареи, и т.д.
  • Установка уровней, при которых включается автопилот: расстояние до базы, высота, напряжения батареи, и т.д.
  • Чувствительность системы стабилизации по крену/тангажу
  • Крейсерская высота на автопилоте
  • Крейсерская воздушная скорость на автопилоте
  • Максимальные допустимые углы крена-тангажа на автопилоте
  • Инверсия каналов и расходы на автопилоте

Если платы телеметрии нет, то плата автопилота должна стабилизировать высоту не по бародатчику, а по GPS, и вместо заранее заданной воздушной скорости поддерживать заранее заданный уровень газа.

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

Что еще забыл?
А, раз в секунду все параметры со всех датчиков сливаются в память платы автопилота и потом при подключении к компуку по USB могут быть слиты и просмотрены на компуке.
Если плата телеметрии отсутствует, то в память сливаются только те данные, что дают пирометры и GPS.

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

Поддержка готовых “голов” с пирометрами типа того, что продается на FMA, обязана быть. Только я для удобства и убирания необходимости калибровки на своей “голове” выведу еще и напряжение средней точки (VCC/2), от которой отмеряются выходы. Потому что она нифига не VCC/2 обычно, а “где-то рядом”.

lodeworx
foxfly:

Прямо как в старом анекдоте : пришел Пьер и все опошлил 😦
А как все хорошо начиналось : Smaalltim с год назад решил сделать устройство телеметрии.
И сделал!
Очень приличное, недорогое и работающее.
Одно это- достойно большого уважения !
Выложил информацию для всех.
И тут приходит боксер- теоретик, утверждающий, что по его (авторитетному и непререкаемомому) мнению- все это “вторичный продукт” (почитайте В.Войновича- узнаете расшифровку термина 😃 )
Батенька!
А где можно увидеть что то, сделанное Вашими ручками?
Или Вы действуете по театральному принципу: актера из меня не вышло, пойду в критики?

Как- то не в тему…

  1. Я тему ADC поднял на примере !СВОИХ! ошибок и наблюдений(вариометр, гироскоп для вертолета).
  2. Пусть Smalltim скажет, если я не хвалил OSD…и его самого!
  3. Только литературного кружка не хватает 😵
lodeworx

To:Smalltim. Вполне рабочая конфигурация- ни добавить-ни убавить.

  1. Память на карте или чип?
  2. Из-за чего принято решение на 3.3в перейти?
smalltim

Память - чип.

3.3В - из-за того, что на AT90USBKEY всё питается от 3.3В, и память максимум вроде как 3.6В. А так - непринципиально, 3.3В или 5В.

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

Вы готовы мириться с погрешностью вычисления и отображения курса на базу до 10-15 градусов, когда углы крена и тангажа ненулевые? Точный-то курс автопилот всегда при необходимости сможет узнать, приведя крен и тангаж к нулям.

leliksan

Вы готовы мириться с погрешностью вычисления и отображения курса на базу до 10-15 градусов, когда углы крена и тангажа ненулевые? Точный-то курс автопилот всегда при необходимости сможет узнать, приведя крен и тангаж к нулям.

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

foxfly
lodeworx:

Как- то не в тему…

  1. Я тему ADC поднял на примере !СВОИХ! ошибок и наблюдений(вариометр, гироскоп для вертолета).
  2. Пусть Smalltim скажет, если я не хвалил OSD…и его самого!
  3. Только литературного кружка не хватает 😵

То, что Вы анализируете свои ошибки- весьма похвально!
Но вопрос был о другом: есть ли в Вашем творчестве успешные и работающие конструкции?
А ошибок при любом реальном действии- у кого хочешь (в т.ч. и у меня- вагон) 😦
Как раз против превращения реальной темы в пустую болтовню- я и выступаю 😃
Предвидя встречный вопрос к себе- отправляю Вам в личку ссылки на мои конструкции (дабы не быть обвиненным в саморекламе )

foxfly
leliksan:

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

С погрешностью “курса на базу” в 15%- точно на нее не попадешь. Достаточно посчитать треугольник с гипотенузой 2км 😦 Даже в поле зрения не прилетишь.
Но и биться скажем, за 0,1*- тоже смысла нет, поскольку раз в сек. приходит коррекция курса с GPS и самолет “доворачивает” в нужном направлении.
2 Smalltim: если ставить компас- то 3х координатный, ибо врет при крене 2х- страшно.
А с пирометрами- боюсь вы все бежите не туда: смысл FMA -два пирометра без усилительных каскадов (т.е. две термобатарейки DEXTER DST 60) включены встречно! А операционник нужен с нулевым дрейфом.(AD8552)
Тем самым они компенсируют температурный уход, и на выходе операционника- всегда (при равной “засветке” пирометров) сидит точно половина питания- 1,65 в.
Точность определения крена- около 3*

serj
foxfly:

С погрешностью “курса на базу” в 15%- точно на нее не попадешь. Достаточно посчитать треугольник с гипотенузой 2км 😦 Даже в поле зрения не прилетишь.
Но и биться скажем, за 0,1*- тоже смысла нет, поскольку раз в сек. приходит коррекция курса с GPS и самолет “доворачивает” в нужном направлении.

Следует учитывать метод наведения.

Например, при простейшем методе “погони” когда курс на базу расчитывается каждый раз с приходом новых данных ( а у нас координаты раз в секунду идут) при ошибке и 20 и30 градусов точно на базу он не попадет, но круги метров 300 описывать будет 😃

правда траектория будет полукругом 😃

Psw
smalltim:

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

15 градусов - это ±7 или ±15* ? Ну то есть речь про размах или про модуль ?

leliksan:

Для возвращения на базу врукопашную вполне достаточно знать примерное направление,

foxfly:

С погрешностью “курса на базу” в 15%- точно на нее не попадешь. Достаточно посчитать треугольник с гипотенузой 2км

Считать гипотенузу на мой взгляд не имеет смысла - потому как при приближении к базе (а оно будет приближаться при ± 15* ошибке) гипотенуза тоже будет уменьшаться.
Вот лично мне думается что когда в пара прыге на визуальной ориентации (и “автопилот” в голове которая нифига не калькулятор) 2-3 км удаление от базы с высотой 1000-1500 м (у моего купола равновесная вертикаль около 6 и горизонт около 17 м/сек) ошибка 15* - да её (ошибку) ваапще визуально не заметишь - поправка на ветер и болтанка купола значительно выше, да и невозможно постоянно глядеть “на базу”, определяя направление - в воздухе полно доп факторов которые тоже внимание отвлекают, соответственно “поправки” в курс вносятся не очень часто, раз в 5 сек быть могет на высоте. Перед землёй на 100 и менее метрах - естественно всё внимание переключается на “базу” 1х1 метр к примеру ну или коридор 1х50 метров - поправки в курс вносятся чаще - около 2 раз в сек. И не надо забывать что “визуальный курс на базу” (который я определяю в парапрыге) и “курс вектора реального движенияна относительно земли базу” (который определяет ГПС - две большие разницы. А большинство парапрыгеров приходит на базу без ГПС при наличии видимости - и справляются ведь и мотора не имеют ваапще и на второй круг уйти ещё никому не удавалось. Лично я свою глазомерную точность оцениваю ±15 или даже более градусов. Главное идти в направлении базы, хотя бы в квадрант базы (90* или ±45 ошибки), согласен. Увеличение ошибки приведёт только к увеличению пути полёта, но цель всё-равно достигнется. А вообще SmallTim как любитель численного эксперимента мог бы и самостоятельно проверить “условие сходимости ряда” - при какой величине ошибки модель перестанет приходить на базу. Мне кажется что это будет ошибка более ± 90 град - когда мы перестанем приближаться к базе в полёте. А “комплексировать” магнитный и ГПС курсы придётся по разному при достаточно малом и достаточно большом удалении от базы - приоритеты должны поменятся.

foxfly
Psw:

15 градусов - это ±7 или ±15* ? Ну то есть речь про размах или про модуль ?

Считать гипотенузу на мой взгляд не имеет смысла .

Я ничего “на глаз” не оценивал.
Все описанное проверялось сначала- ездой на машине, затем- плаванием на модели катера, которая дает условия, максимально приближенные к полету (кроме изменения высоты и возможности потери улетевшего аппарата) в том числе и снос от ветра.
Только после всего этого- леталось на самолете…
А умозрительные вычисления при проверке на местности столько “ляпов” дают- лучше и не пробовать 😦

leliksan

По моему, погрешность 15% и 15 градусов совсем не одно и то же.
С уважением.