Работа с АЦП в спящем режиме (ADC Noise Reduction)
- Войдите на сайт для отправки комментариев
Пнд, 17/02/2014 - 23:02
Коллеги, никто не пробывал работать с ацп ардуино используя встроенную в контроллер систему подавления помех (ADC Noise Reduction) ? Может у кого-то есть наработки? Об этой возможности часто упоминается, но нигде материал не доведён до конкретного рабочего скетча. Есть небольшой материал на эту тему у DI HALT , но там на асме, и вообще для другого контроллера. Есть топик на эту тему на arduino.cc , но тоже до рабочего скетча не доведён. Может у кого-то случайно уже есть готовый код на Си для меги 8/168/328 ? Уж очень интересно, какой эффект даёт применение этой возможности.
В принципе на arduino.cc был скетч, который как-бы работает. Но я его тестировал, и никакого снижения девиации показаний по сравнении с обычным способом не увидел. Возможно и в нём что-то не так, т.к. никто восторжено не написал про полученный эффект. Но что именно не так -понять крайне затруднительно, вроде всё правильно. Сам вышеупомянутый скетч:
Данный код очень сильно шумит:
Если сравнить с тем же оверсемплингом:
Жаль что ресурсы жрёт как паровоз, но если учесть что мега 8-я на частоте 16 мГц может выполнять до 16 миллионов инструкций в секунду, то не всё так плохо, хотя лучше чтобы мега тратила те MIPSы на что-то другое, если у Вас что-то удастся найти давайте, с удовольствием поиграюсь.
Если я правильно понял, в режиме noise reduction МК ещё и кушает меньше?
HWman, похоже тот скетч не даёт процессору уснуть, на досуге поразбираюсь более основательно.
Если интересно, то проблему с шумами для себя я решил пока альтернативным способом, не прибегая кстати к оверсемплингу. Алгоритм в кратце такой: делаю 25 циклов чтения analogRead, заполняю двухмерный массив из 5 строк. В строке 2 ячейки, в одну ячейку вносится значение analogRead, во вторую ячейку вноситься количество повторов, пришедшееся на это значение. Новое значение отсчёта вносится в пустую строчку, итд. В конце цикла по максимальному количеству повторов вычисляется самый частый отсчёт, это промежуточный результат. Он довольно стабилен, но всё равно результаты циклов при статическом состоянии напряжения на входе АЦП могут биться между 2х значений, что бы это ликвидировать сделал 2-ю фазу, в ней запоминается текущий отсчёт, и если отсчёт из следущего цикла не равен предыдущему, то включается счёт времени, и если спустя 50 миллисекунд очередной отсчёт не сравнялся, то результат меняется на последний. Таким образом скорострельность вывода данных составляет в среднем 20..50 миллисекунд. Что например для вольтметров-амперметров, и много чего *метров более чем хорошо. Стабильность отображения цифр получилась практически железобетонная, лучше чем у среднеклассового мультиметра. Перевёл уже одно из своих изделий на этот алгоритм, очень доволен.
Да, вот моё творение :)
Кстати, для более точных замеров можно сделать измерение питания контроллера, и учесть напряжение питания при расчёте напряжения.
По умолчанию, в качестве опорного у ардуино используется внутреннее опорное напряжение, которое стабилизированно диодом и не зависит от напряжения питания. Так что для более точного измерения этот совет не подходит, разве что только если у вас датчик подключен к тому же питанию, что и процессор, при этом он аналоговый. Но тут самым правильным решением будет подать на Vref опорное напряжение с резистивного делителя подключенного к питанию. Таким методом вы аппаратно уничтожите ошибку возникающую из-за питания. И танцы с бубнами будут не нужны ;)
Повозился ещё раз со спящим ацп - толку ноль. И со всеми регистрами поигрался, и с усыпляющими командами, как хошь крути-верти, но на результат не влияет. Уже думаю, может оно так и есть, то есть эффект от использования этого режима не такой уж и очевидный? Ещё раз поспрашивал гугля на эту тему, но никто нигде особо не сравнивал и не хвалил спящий способ чтения. Видимо придётся оставить эту задумку.
HWman, я не сразу обратил внимание, но на том графике в 3 сообщении совсем чудовищная дерготня. У меня, напомню, в среднем +/- 1 единица, хотя если постараться, то можно найти участки, где звенит +/- 2 отсчёта. Но +/- 10 - это явные косяки в аппаратной части. Вот мой график для сравнения красная -сырое чтение analogRead, жёлтая -обработанное алгоритмом.
А помоему на графике очень да же не плохо. Можно предположить, что значение 588.5 . В даташите же написано • ± 2 LSB Absolute Accuracy • . То есть "шум" в пределах 4 единицы считается нормой.
Подпаял керамику на ножку AREF и на землю и получилось как у Вас, а я так долго бился головой об стену почему у меня шумы около +/- 10, а если юзать источник опорного напряжения так там вообще ужас был.
А обнаружил совсем случайно, держался за плату со стороны пайки и увидел что шумы уменьшились.
Но всё равно буду юзать оверсемплинг, при помощи него можно спокойно выжать 12 битное разрешение от меги 8, а если юзать только 1 канал АЦП тогда думаю будет и больше.
HWman, абсолютная погрешность, заявленная производителем соответствует цене двух 10-битных отсчётов в плюс и минус, на 5 вольтовой шкале это +/- 10мв, то есть фактически чистой 8-битной разрядности. От того, что появится 11 бит или даже 12 он точнее не станет, просто врать начнёт более изящно. Оверсемплинг это прекрасный инструмент, но он предназначен для других целей, когда нужна относительная точность, например в сканирующей матрице можно схватить больше полутонов, в электронном графопостроителях рисовать более плавную линию, в звуке уменьшить искажения наконец. Но вольтметру нужна абсолютная точность. Вы не задумывались, какая погрешность у обычного среднеценового мультиметра? Примерно 0,5%, а то и больше. На 5-вольтовой шкале это будет +/- 12 мв, что даже хуже, чем максимальная обещанная погрешность меги +/- 10мв на 10 битах. Нужно точнее? Тогда это задача для более серьёзного ацп. Хотите обманываться, и смотреть на скачущие единицы милливольт и три цифры после запятой? Да пожалуйста )
Оверсемплинг это прекрасный инструмент, но он предназначен для других целей, когда нужна относительная точность, например в сканирующей матрице можно схватить больше полутонов, в электронном графопостроителях рисовать более плавную линию, в звуке уменьшить искажения наконец.
Если продолжать аналогию, то и больше разрядов, так что заявление о 12 битах вполне верное (8+4, где 4 бита дают 16 сэмплов). А вопрос абсолютной точности при этом решается калибровкой.
Для моей задачи оверсемплинг именно то что мне нужно(будет чем заполнить теоретическую часть ;) ).
Вы я вижу разбираетесь в МК, у меня до Вас такой вопрос, есть ли смысл юзать ИОН в измерениях? Где-то читал что не желательно его использовать из за нестабильности, я так понимаю внутри МК есть стабилитрон который и обеспечивает ИОН, из этого можно предположить что есть подавать на МК относительно стабилизированное напряжение то и на ИОНе будет такое же стабилизированное напряжение.
Для моей задачи использовать ИОН для измерений куда лучше чем измерять просто по напряжению питания + можно же переключаться между питаловом и ИОНом, что значительно расширит диапазон напряжений и точностей.
HWman, кто ж такое писал, ИОН как раз и нужен для стабильности. И полезен во всех случаях кроме случаев, когда измеряемая схема питается от того-же, от чего и сам контроллер, и когда точность не нужна. Для измерения напряжения ион просто обязателен, как минимум внутренний ион можно задействовать. Но лучше внешний, я пользуюсь обычно REF 192..195.
ites, не совсем понятно что в хотели сказать в первой строке, а по поводу абсолютной точности, то увы, калибровка дело хорошее, но её возможности очень ограничены. Есть некоторые факторы, как например нелинейность усиления, дифференциальная нелинейность, которые не скомпенсируешь просто так.
ites, не совсем понятно что в хотели сказать в первой строке, а по поводу абсолютной точности, то увы, калибровка дело хорошее, но её возможности очень ограничены. Есть некоторые факторы, как например нелинейность усиления, дифференциальная нелинейность, которые не скомпенсируешь просто так.
Что ж такого непонятного? По даташитам и опыту людей получается, что ADC имеет точность порядка 8 разрядов, выдавая при этом 10 формальных. В последних двух как бы шум. Если считать измеряемый сигнал константным за время измерения, а шум равномерно распределённым, то 16 семплов дают дополнительные 4 бита точности.
Ну дают, а толку-то. Это разрешающая способность, и на абсолютную точность она влияет к сожалению довольно слабо. Применительно к вольтметру не так важно разрешение в 5 милливольт или 1 милливольт, когда при этом он может законно врать на 20 милливольт.
Ну дают, а толку-то. Это разрешающая способность, и на абсолютную точность она влияет к сожалению довольно слабо. Применительно к вольтметру не так важно разрешение в 5 милливольт или 1 милливольт, когда при этом он может законно врать на 20 милливольт.
Так о том и речь, что тут важно понимать "функцию вранья". Если погрешность распределена равномерно в диапазоне допустимой ошибки, то повышение точности работает.
Так о том и речь, что тут важно понимать "функцию вранья". Если погрешность распределена равномерно в диапазоне допустимой ошибки, то повышение точности работает.
Подумал ещё раз и думаю, что я прав тут только частично. Времени нет обдумать более полно, так что, на всякий случай признаю правоту dimax
http://dl.dropboxusercontent.com/u/4120887/avr_tiny_mega_2008.pdf
Надеюсь Вам поможет.
Добавил около аналоговой части МК(АVcc) кондёрчик на 100 мкФ, почти около самых ног МК. Теперь почти ровная линия и без всяких функций на подобии лоу ноис дрюкшн или оверсемплинг.
Вот только когда переключа.сь на ИОН тогда почему-то шум опять возвращаеться:
HWman, а что это за софт на скриншотах?
http://www.x-io.co.uk/serial-oscilloscope/