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

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. Остальное - домыслы и моя практика это подтверждает.

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

dmk

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

serj:

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

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

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