Обсуждаем контроллеры компании Atmel.
Ответить

AVR121: Повышение разрешения АЦП с помощью оверсемплинга

Вт янв 21, 2020 07:48:46

Прочитал документ AVR121, затем протестировал, а как у меня работает АЦП на ATMEGA16 в DIP корпусе из старых запасов. Выяснилось, что при включении внутреннего Vref и соблюдении правил трассировки 10 битное значение АЦП стоит как вкопанное и не собирается изменятся во времени. Вообще не понял статью. Говорят что нужно добавить белый шум и, чудесным образом разрядность в оверсемплинге повыситься. При этом предлагая генератор шума сделать из процессов ШИМ вовсе не случайных. Чего-то не сходиться с повышением разрядности, выходит мы получил по логике случайные числа дополнительно к разрядности АЦП и только и, что? эти случайные числа позволят измерять точнее? Или все-же просто создают иллюзию?

Re: AVR121: Повышение разрешения АЦП с помощью оверсемплинга

Вт янв 21, 2020 09:51:01

Идея в том, что белый шум с равной вероятностью увеличивает входное значение на какую-то величину и уменьшает на нее же. То есть если входной сигнал попадает ровно на "ступеньку" АЦП (для определенности пусть будет 127), наложение шума ничего не изменит. Но если реальное значение, скажем, на 10% выше, то наложение шума добавляется относительно реального значения, и с вероятностью 5% перескочит на следующую ступеньку, 45% - на предыдущую, а 50% - останется на этой. Если сложить, скажем, 100 измерений, получим 50*127 + 5*128 + 45*126 = 12660. Если поделить на 100, получим уже дробное число 126,6, то есть разрядов добавили, но точность упала. Это связано с тем, что граница ступенек АЦП идет не по середине, а по основанию. Чтобы это исправить, нужно прибавить к каждой из них 0,5. На 100 измерений эта добавка составляет 50. Добавляем ее к сумме, получаем 12710. Если теперь поделить на 100, получим 127,10 - то что надо.
То же самое работает для шума больше одного младшего разряда.
Проведите простой эксперимент. Откройте табличный процессор, например, Calc или Excel. В первую ячейку, скажем, A1 внесите "реальное" (дробное) значение, в следующий столбец сложите "реальное" значение плюс случайное значение в каком-нибудь диапазоне, но симметричном и округлите вниз. Например, B1...Bn = trunc($A$1 + (rand()-0.5)*2)
Учитывая округление именно вниз (как и любое машинное округление по умолчанию), хорошо бы к каждому измерению прибавить 0,5, но поскольку числа целые, напрямую это сделать не выйдет. Лучше эти постоянные слагаемые вынести за скобки: ввести корректировку trunc((n+1)/2)
Получили массив из n целых чисел. Складываем их, прибавляем корректировку. Если теперь поделить на количество измерений, получим число, примерно равное исходному.

Re: AVR121: Повышение разрешения АЦП с помощью оверсемплинга

Вт янв 21, 2020 16:12:11

Спасибо большое за разъяснение. И то верно, ведь есть АЦП 1 разрядные сигма дельта. Есть ли надежда вытащить разрядность на плате Blue Pill? Таким алгоритмом. На плате Blue Pill STM32F102CBT6 если я правильно прочитал даташит на 48 пиновый корпус Vref подключен внутри процессора к Vcc. Выходит Vref не актуально и, говорят что эффективная разрядность ENOB 8,5 бит. Тогда выходит зашумлены 3,5 бит и надо оверсемплить 16 раз, чтобы придти к 12 битам разрешения.

P.S. Вот еще интересный вопрос где взять образцовый ЦАП для калибровки АЦП по алгоритму AVR120. Видимо придется сто-то придумать самостоятельно.

Re: AVR121: Повышение разрешения АЦП с помощью оверсемплинга

Вт янв 21, 2020 21:08:35

Есть ли надежда вытащить разрядность на плате Blue Pill? Таким алгоритмом.

Есть, конечно. Я аналогичным способом вытаскивал показания stm32L151. Правда, у меня не было задачи посчитать разряды, только общую форму сигнала.
где взять образцовый ЦАП для калибровки АЦП

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

Re: AVR121: Повышение разрешения АЦП с помощью оверсемплинга

Пт янв 24, 2020 22:46:42

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

При этом, когда достигнута золотая середина в вопросе, указанном выше, и, кажется, что всё на мази, в игру вступает новый фактор. Этот фактор — статистическое распределение шума. Очевидно, что любой физический шум — это вовсе не равномерное на отрезке распределение. В лучшем случае можно надеяться на нормальное (гауссово) распределение. Но даже в этом случае, если брать простое усреднение, то можно получить искажённые значения. Правильно будет (для нормального распределения) брать обратную функцию к функции ошибок от некоторой дроби. Это ещё тот жёсткий матан.

Re: AVR121: Повышение разрешения АЦП с помощью оверсемплинга

Сб янв 25, 2020 00:40:17

Вот и разгадка Китайпрома которые делают на таких проциках NUVOTON к примеру 5,5 разрядные вольтметры и, показывают ролики где эти вольтметры "конкурируют" (догоняют по точности) взрослый HP 20 летней давности....

Re: AVR121: Повышение разрешения АЦП с помощью оверсемплинга

Сб янв 25, 2020 02:17:08

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

Re: AVR121: Повышение разрешения АЦП с помощью оверсемплинга

Сб янв 25, 2020 03:03:30

Только усреднение нужно выполнять, методом скользящего среднего, скользящей средней медианы, например. Вообще скользящее среднее очень многообразно (наберите "Скользящее среднее" в Гугле и посмотрите статью из Википедии), а если его дополнить БИХ фильтром, то должно получиться что-то типа SDR радио, я надеюсь вы слышали радиолюбительские переговоры с применением SDR алгоритмов, как чисто и разборчиво там звучит речь оператора...

Re: AVR121: Повышение разрешения АЦП с помощью оверсемплинга

Сб янв 25, 2020 04:45:10

astrahard, Медиана не взлетит, так как она выдаёт в качестве результата одно из значений выборки, то есть имеет ту же разрядность, что и результат АЦП. Нужно именно правильное усреднение с пересчётом через нелинейную функцию, если шум имеет нелинейную функцию распределения.

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

Re: AVR121: Повышение разрешения АЦП с помощью оверсемплинга

Сб янв 25, 2020 16:53:27

Да, конечно, Вы правы. А тема родилась рассматривая Китайские 5 разрядные вольтметры 0-30В и 0-100В. Китайцы все сфоткали и 0-30В вольтметр сделали на 8 разрядном NUVOTON с HX711 (24 разрядный сигма дельта АЦП от весов) а в модели 0-100В перешли на голый NUVOTON со своим 12 разрядным АЦП 500 килосемплов. Видимо это дальнейшее развитие идеи "автокалибровки" из статьи https://aterlux.ru/article/ntcresistor Погребняк Дмитрий с его скриптом для калибровки результатов измерения для термисторов. Удивительно, но в W1209 термостате Китайпром обеспечивает точность как у Дмитрийя Погребняка в его статье, тоесть 0,1 градус в районе 0-40 Градусов и, судя по его онлайн скрипту может и 0,01 градус. Удивительно и то, что повторяемость (воспроизводимость) характеристик деталей (даже таких нелинейных как термистор) у современных производителей позволяет делать "автокалибровку" не индивидуально, а для всей партии разом без печальных последствий.

P.S. К примеру, я был просто поражен воспроизводимостью характеристик от экземпляра к экземпляру AMS1117-5.0 и это при цене 2р!, видимо это наследие бурно прогрессирующей ПП технологии вынужденной работать с уже трилионами транзисторов размером 7 нМ.

Добавлено after 2 hours 19 minutes 14 seconds:
Так вот мнение откопал Оверсемплинг -> Абсолютно беспомощен против систематической ошибки, уменьшая лишь случайную. Отсюда и проистекал вопрос уже в первом посте, просто я не сформулировал так элегантно. К примеру берем STM32F103CBT6 или какой либо 8 разрядный NUVOTON с 12 разрядным АЦП в 500 килосемплов и питанием от AMS1117-5.0. И, как охарактеризовать шум который приходиться оцифровывать АЦП в процессе оверсемплинга? Понятно, что львиная доля шума будет генерироваться исполняемым на процессоре кодом и, имеет систематический, а вовсе не случайный характер. Из этого проистекает вопрос, как модернизировать алгоритм, чтобы шум был менее систематическим и более случайным, может оверсемплинг выполнять не через регулярные промежутки времени, а вставить задержки получаемые от генератора случайных чисел?

Добавлено after 7 hours 26 minutes 25 seconds:
Я предлагаю, перед началом преобразования в режиме оверсемплинга, сгенерировать случайное число 32 бита и сдвигая его влево в зависимости от флага переполнения вставлять, например, 4 NOP перед в прерывании начала очередного преобразования. Если потребуется можно сгенерировать 2 и более случайных чисел для 64 и больше преобразований.

Re: AVR121: Повышение разрешения АЦП с помощью оверсемплинга

Сб янв 25, 2020 17:38:39

Я так понимаю что вместо шума можно подмешать пилу или треугольник с размахом 1LSB с частотой в целое число раз меньше частоты выборки?

Re: AVR121: Повышение разрешения АЦП с помощью оверсемплинга

Сб янв 25, 2020 17:57:12

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

систематическмй шум убрать см. AVR126: ADC of megaAVR® in Single-Ended Mode
ADC Noise Canceler
The ADC of the megaAVR has a noise canceler that enables conversion during sleep mode, which
reduces the noise induced from the CPU core and other peripherals. This feature is available in the ADC
Noise Reduction and Idle mode. To use this feature:
• Ensure that ADC is enabled and not busy converting. Single conversion mode must be selected
and the ADC conversion complete interrupt must be enabled.
• Enter ADC noise reduction or idle mode. The ADC will start a conversion once the CPU has been
halted.
• If no other interrupts occur before the ADC conversion completes, the ADC interrupt will wake-up
the CPU and execute the ADC conversion complete interrupt routine. If another interrupt wakes up
the CPU before the ADC conversion is complete, that interrupt will be executed, and an ADC
conversion complete interrupt request will be generated when the ADC conversion completes. The
CPU will remain in active mode until a new sleep command is executed.

если уж STM32, то можно просто взять STM32F373 - там есть 16-bit sigma-delta ADC с внутренним и внешним Vref и внутренним програмируемым усилителем. Есть 48-ногий корпус, скорее всего совместимый по ногам с STM32F103CBT6

Re: AVR121: Повышение разрешения АЦП с помощью оверсемплинга

Сб янв 25, 2020 18:10:39

Вопрос не в том как убрать шум от ядра, а как его сделать несистематическим. Еще интересно как мыслят в Китайпроме переходя от STM8003 к NUVOTON. "просто взять STM32F373 - там есть 16-bit sigma-delta ADC с внутренним и внешним Vref и внутренним програмируемым усилителем. Есть 48-ногий корпус, скорее всего совместимый по ногам с STM32F103CBT6" тогда просто взят и промоделировать в программе, зачем делать в реале. Ваш пост просто убивает математика, и называется как просто НЕ ДУМАТЬ а взять на полке.
Ответить