Делаю некий вольтметр на PIC12F675. Измеряемое напряжение до 20,48В, точность нужна 0,01В. При делителе 2МОм/1МОм, напряжении питания 5,12В и 10-разрядном АЦП у меня будет нужный диапазон измерения (0 - 20,48В), но точность только 0,02В. Получается, что мне нужен 11-битный АЦП, а в младших PICах такого не бывает, только 10-битный.
Как бы эдак извернуться, чтобы программно повысить разрядность АЦП до 11 бит? Вот это видел, но смысл не очень понятен...
Повышение разрядности АЦП с помощью оверсемплинга заключается в том, что Вы делаете не одно, а несколько преобразований, а затем усредняете. Но после суммирования накопленного массива делите сумму не на количество элементов массива, а на вдвое меньшую величину. Но оверсемплинг не повышает точность преобразования. Он лишь повышает разрешающую способность за счет падения скорости преобразования. Кроме того, массив накопления нужно делать скользящим. Сиречь каждое новое преобразование выталкивает из массива самое старое (кольцевой буфер). После записи в буфер очередного измерения производится расчет среднего значения (удвоенного за счет вдвое меньшего делителя). Фактически это представляет из себя ФНЧ с конечной импульсной характеристикой (КИХ-FIR) и прямоугольной оконной функцией (Rectangular Window). Есть еще одно ограничение оверсемплинга по увеличению разрядности.Дело в том, что амплитуда шума во входном сигнале должна быть больше младшего разряда АЦП. Иначе никакого повышения разрядности получить не выйдет. ЗЫ. Искомой точности Вы не получите хотя бы потому, что не читали даташит. Точность АЦП всегда ниже его разрядности. Максимальная общая ошибка АЦП указана в даташите. Для выбранной Вами платформы она равна плюс-минус 1 МЗР. http://ww1.microchip.com/downloads/en/D ... 41190G.pdf страница 103 таблица 12-8 пункт А02
ЗЫ. Искомой точности Вы не получите хотя бы потому, что не читали даташит. Точность АЦП всегда ниже его разрядности. Максимальная общая ошибка АЦП указана в даташите. Для выбранной Вами платформы она равна плюс-минус 1 МЗР.
Читал. Собственно точность такая полностью устраивает. Не устраивает шаг выходных данных 0,02В - не фэншуйно. Меня устроило бы даже квазиувеличение точности путём интерполяции предыдущих отсчётов.
Цитата:
Кроме того, массив накопления нужно делать скользящим. Сиречь каждое новое преобразование выталкивает из массива самое старое (кольцевой буфер). После записи в буфер очередного измерения производится расчет среднего значения (удвоенного за счет вдвое меньшего делителя). Фактически это представляет из себя ФНЧ с конечной импульсной характеристикой (КИХ-FIR) и прямоугольной оконной функцией (Rectangular Window).
Это уже написано - борюсь с шумом. 8 10-битных отсчётов суммирую и делю на 8. Самый старый отсчёт заменяется только что измеренным. Получается операция интегрирования по времени 8 отсчётов.
Цитата:
Повышение разрядности АЦП с помощью оверсемплинга заключается в том, что Вы делаете не одно, а несколько преобразований, а затем усредняете. Но после суммирования накопленного массива делите сумму не на количество элементов массива, а на вдвое меньшую величину. Но оверсемплинг не повышает точность преобразования. Он лишь повышает разрешающую способность за счет падения скорости преобразования.
Смысл этого от меня ускользает. Фактически я имею удвоенное среднее арифметическое за 8 отсчётов. И чё?
Цитата:
Есть еще одно ограничение оверсемплинга по увеличению разрядности.Дело в том, что амплитуда шума во входном сигнале должна быть больше младшего разряда АЦП. Иначе никакого повышения разрядности получить не выйдет.
Соответственно и это непонятно. Амплитуду шума всегда можно увеличить уменьшив ёмкость блокировочного конденсатора по входу АЦП. Но каким образом связан шум на входе и удвоенное среднее за несколько отсчётов с увеличением разрядности?
Возьмем 16 ПОСЛЕДНИХ отсчетов. Просуммируем. И поделим не на 16, а на 8. Если диапазон между соседними значениями АЦП заполнить белым шумом, а затем усреднить, то мы получим статистическое среднее. Это среднее и будет входным сигналом. Так например, если реальное значение сигнала будет находится ровно посередине двух значений, то в массиве окажется равное количество этих соседних значений. При усреднении которых мы и получим нижнее+0,5. Амплитуду шума увеличить путем уменьшения емкости на входе не получится. Нужен именно ШУМ, а не какой то паразитный входной сигнал, который, скорее всего, будет наводкой от 50 Гц... Кстати, назначение входного фильтра у АЦП вполне конкретное. И он не предназначен для уменьшения шума. Его задача - АНТИАЛИАСИНГ. То есть удвоенная частота семплирования (частота выборок) должна быть подавлена на разрядность АЦП. То есть в Вашем случае на 60 дБ (в 1024 раза). Иначе дальнейшая цифровая фильтрация приведет к попаданию в полосу пропускания пересекающуюся с основной часть кратного спектра.
Ну вот нет у меня необходимой теоретической базы, я этого всего не знаю.
Да, действительно, если уменьшить С, то полезет 50Гц и гармоники, особенно 3-я. А чистый шум можно наверное взять только с выхода сильно шумящего ОУ, если входной сигнал предварительно усиливается. В моём случае неоткуда.
Один разряд можно вытащить за счет помех цифровой части. Так что 11 разряд Вы конечно получите, но вот его корректность будет весьма невысокой. Обычно такой способ увеличения разрядности применяют для повышения чувствительности ОБНАРУЖИТЕЛЕЙ сигналов. То есть когда точность не важна, важно лишь обнаружить ИЗМЕНЕНИЕ входного напряжения АЦП.
Заголовок сообщения: Re: Программно увеличить разрядность АЦП до 11 бит
Добавлено: Вс янв 31, 2016 10:53:30
Сверлит текстолит когтями
Карма: 15
Рейтинг сообщений: 212
Зарегистрирован: Вт мар 31, 2015 22:56:07 Сообщений: 1298 Откуда: Мы люди простые, живем в лесу, на пенек молимся
Рейтинг сообщения:1
E30M20B20 писал(а):
Ну вот нет у меня необходимой теоретической базы, я этого всего не знаю.
Хорошо расписано в апноте от Atmel, AVR121. Какой именно МК тут совершенно не важно.
Если наращивать разрядность оверсемплингом – то хотя бы до 2^13 (64 отсчета). Меньше нет смысла.
_________________
Последний раз редактировалось trengtor Вс янв 31, 2016 11:44:37, всего редактировалось 1 раз.
А, вот наконец до меня дошло! Удвоенное среднее - оно же и есть на один бит длиннее
Цитата:
Один разряд можно вытащить за счет помех цифровой части. Так что 11 разряд Вы конечно получите, но вот его корректность будет весьма невысокой. Обычно такой способ увеличения разрядности применяют для повышения чувствительности ОБНАРУЖИТЕЛЕЙ сигналов. То есть когда точность не важна, важно лишь обнаружить ИЗМЕНЕНИЕ входного напряжения АЦП.
Так а мне большего-то и не надо. Это измерительная часть самописца, фиксирующего динамику изменения напряжение на 12В акк батарее. Здесь нужна не столько точность, сколько понимание куда растёт график.
Я всё понял, огромное спасибо!
Цитата:
Если наращивать разрядность оверсемплингом – то хотя бы до 2^13 (64 отсчета). Меньше нет смысла.
А почему? 64 отсчёта мне в RAM не влезет, у 675-го PICа всего 64 байта RAM!
Смысл всегда есть, если он обоснован. 11, 12 или 100 разрядов - совершенно безразлично. Важно лишь, чтобы результат был ожидаемым. Такшта делайте 11-ый. Массив возьмите хотя бы 16 отсчетов (32 байта ОЗУ). ЗЫ. У Вас там входной делитель слишком высокоомный. Откройте даташит в разделе АЦП и почитайте про эквизишн тайм. Вообще то выходное сопротивление источника должно быть ниже 10 кОм.
Заголовок сообщения: Re: Программно увеличить разрядность АЦП до 11 бит
Добавлено: Вс янв 31, 2016 11:24:50
Сверлит текстолит когтями
Карма: 15
Рейтинг сообщений: 212
Зарегистрирован: Вт мар 31, 2015 22:56:07 Сообщений: 1298 Откуда: Мы люди простые, живем в лесу, на пенек молимся
Рейтинг сообщения:1
E30M20B20 писал(а):
Цитата:
Если наращивать разрядность оверсемплингом – то хотя бы до 2^13 (64 отсчета). Меньше нет смысла.
А почему? 64 отсчёта мне в RAM не влезет, у 675-го PICа всего 64 байта RAM!
А почитать апнот, прежде чем спрашивать? Про 64 – совет из личной практики. Сможете сделать 256 – делайте 256. Хуже не станет. Как вывернуться, чтобы сохранить ОЗУ – тут мне сложно вам что-то советовать. Сам я предпочитаю использовать МК с избыточным объемом ПЗУ и ОЗУ.
_________________
Последний раз редактировалось trengtor Вс янв 31, 2016 11:31:59, всего редактировалось 1 раз.
Ну кто же так делает? Инструкции в конце концов читаются только от отчаяния...
Сумма такого большого количества чисел - само по себе геморрой, это уже вылазит за рамки двух байтов, нужен третий. Имеет ли смысл - непонятно. Тем более, что в моём случае настоящей честной точности мне как бы не очень и надо - проблема чисто косметическая, чтобы было не через 2 сотки, а по-нормальному, через одну.
Цитата:
ЗЫ. У Вас там входной делитель слишком высокоомный. Откройте даташит в разделе АЦП и почитайте про эквизишн тайм. Вообще то выходное сопротивление источника должно быть ниже 10 кОм.
И про это знаю. Но из соображения электробезопасности вынужден применить такой высокоомный делитель (меряю аккумулятор, находящийся под потенциалом сети, выходные данные в виде UART 8N1 через оптрон идут в RxD UART-USB. Питание PICа тоже гальванически развязано от USB). Неизбежно возникающую погрешность буду компенсировать при калибровке готового девайса.
_________________ (c) 1982 Sinclair Research Ltd
Последний раз редактировалось E30M20B20 Вс янв 31, 2016 15:26:15, всего редактировалось 3 раз(а).
Повышение разрядности АЦП с помощью оверсемплинга заключается в том, что Вы делаете не одно, а несколько преобразований, а затем усредняете. Но после суммирования накопленного массива делите сумму не на количество элементов массива, а на вдвое меньшую величину.
Не совсем точно. Вместо "несколько" следовало написать 4^n, где n - необходимое число дополнительных разрядов. И делить надо не "на вдвое меньшую величину", а на 2^n, то есть, на величину корня квадратного из первого коэффициента.
КРАМ писал(а):
Но оверсемплинг не повышает точность преобразования.
Точность полученных значений он же повышает, тогда зачем путать ТС?
КРАМ писал(а):
Кроме того, массив накопления нужно делать скользящим.
Это уже не к оверсемплингу относится, а к скользящему среднему, что несколько из другой оперы. Пример описания в апноте от Силабса: для повышения разрядности на 4 бита, берете 256 измерений (4^4), складываете их и делите на 16 (sqrt(256)) ("Once we calculate the result of 256 samples (in this example), we store or process the data and begin collecting data for the next output").
Заголовок сообщения: Re: Программно увеличить разрядность АЦП до 11 бит
Добавлено: Вс янв 31, 2016 11:36:29
Сверлит текстолит когтями
Карма: 15
Рейтинг сообщений: 212
Зарегистрирован: Вт мар 31, 2015 22:56:07 Сообщений: 1298 Откуда: Мы люди простые, живем в лесу, на пенек молимся
Рейтинг сообщения:0
E30M20B20 писал(а):
Ну кто же так делает? Инструкции в конце концов читаются только от отчаяния...
Сумма такого большого количества чисел - само по себе геморрой, это уже вылазит за рамки двух байтов, нужен третий. Имеет ли смысл - непонятно. Тем более, что в моём случае настоящей честной точности мне как бы не очень и надо - проблема чисто косметическая, чтобы было не через 2 сотки, а по-нормальному, через одну.
Вам нужно убрать мусор в незначащий (скрытый) разряд. Не так ли?
А апнот прочитайте. В вашем случает это must, а не should.
Только AVR121, а не 221. Моя ошибочка
_________________
Последний раз редактировалось trengtor Вс янв 31, 2016 11:46:01, всего редактировалось 2 раз(а).
Заголовок сообщения: Re: Программно увеличить разрядность АЦП до 11 бит
Добавлено: Вс янв 31, 2016 11:40:07
Сверлит текстолит когтями
Карма: 15
Рейтинг сообщений: 212
Зарегистрирован: Вт мар 31, 2015 22:56:07 Сообщений: 1298 Откуда: Мы люди простые, живем в лесу, на пенек молимся
Рейтинг сообщения:0
Pnjom-Penb писал(а):
КРАМ писал(а):
Кроме того, массив накопления нужно делать скользящим.
Это уже не к оверсемплингу относится, а к скользящему среднему, что несколько из другой оперы. Пример описания в апноте от Силабса: для повышения разрядности на 4 бита, берете 256 измерений (4^4), складываете их и делите на 16 (sqrt(256)) ("Once we calculate the result of 256 samples (in this example), we store or process the data and begin collecting data for the next output").
В общем да, тут КРАМ путает скользящую сумму со скользящим средним. Нужна скользящая сумма. Все прекрасно реализуется на сдвиговых операциях (работаем-то с целочисленными значениями из АЦП), просто сдвигаем вправо на степень четверки.
Не совсем точно. Вместо "несколько" следовало написать 4^n, где n - необходимое число дополнительных разрядов. И делить надо не "на вдвое меньшую величину", а на 2^n, то есть, на величину корня квадратного из первого коэффициента.
Ну то есть, если мне нужен всего лишь один дополнительный разряд, то я должен взять сумму 4-ёх отсчётов, и разделить её на 2?
Цитата:
AVR121
Почитаю. Но хочется, как обычно, простого и быстрого решения, которое уже нашлось
_________________ (c) 1982 Sinclair Research Ltd
Последний раз редактировалось E30M20B20 Вс янв 31, 2016 11:50:06, всего редактировалось 1 раз.
Повышение разрядности АЦП с помощью оверсемплинга заключается в том, что Вы делаете не одно, а несколько преобразований, а затем усредняете. Но после суммирования накопленного массива делите сумму не на количество элементов массива, а на вдвое меньшую величину.
Не совсем точно. Вместо "несколько" следовало написать 4^n, где n - необходимое число дополнительных разрядов. И делить надо не "на вдвое меньшую величину", а на 2^n, то есть, на величину корня квадратного из первого коэффициента.
Речь шла об ОДНОМ лишнем разряде. Поэтому объяснение вполне корректно. То, о чем написали Вы очевидно, если понять частный случай лишнего разряда.
Pnjom-Penb писал(а):
КРАМ писал(а):
Но оверсемплинг не повышает точность преобразования.
Точность полученных значений он же повышает, тогда зачем путать ТС?
НЕ ПОВЫШАЕТ он никакой точности. Он повышает РАЗРЕШЕНИЕ. Или Вы не знаете разницу между точностью и разрешением? Наличие лишних разрядов никак не изменяет смещение нуля и нелинейность АЦП.
Pnjom-Penb писал(а):
КРАМ писал(а):
Кроме того, массив накопления нужно делать скользящим.
Это уже не к оверсемплингу относится, а к скользящему среднему, что несколько из другой оперы.
Абсолютно из этой оперы. Вся история с оверсемплингом является тупо фильтрацией (цифрового шума+белого шума) с целью выделения сигнала ниже уровня этого шума. При этом можно применять как скользящее среднее (КИХ), так и рекурсивный БИХ. Результат будет абсолютно одинаковый.
trengtor писал(а):
В общем да, тут КРАМ путает
КРАМ тут ничего не путает. Это Вы с пнем-пенем плохо понимаете физику и математику метода.
Заголовок сообщения: Re: Программно увеличить разрядность АЦП до 11 бит
Добавлено: Вс янв 31, 2016 11:51:45
Сверлит текстолит когтями
Карма: 15
Рейтинг сообщений: 212
Зарегистрирован: Вт мар 31, 2015 22:56:07 Сообщений: 1298 Откуда: Мы люди простые, живем в лесу, на пенек молимся
Рейтинг сообщения:0
E30M20B20 писал(а):
Цитата:
Не совсем точно. Вместо "несколько" следовало написать 4^n, где n - необходимое число дополнительных разрядов. И делить надо не "на вдвое меньшую величину", а на 2^n, то есть, на величину корня квадратного из первого коэффициента.
Ну то есть, если мне нужен всего лишь один дополнительный разряд, то я должен взять сумму 4-ёх отсчётов, и разделить её на 2?
С учетом шума АЦП (±1 младший разряд), а также нестабильности и шума опорника (вы же не сказали, что у вас использовано), вам понадобятся избыточные разряды, в которые должны проваливаться шумы (нестабильность показаний) после оверсемплинга и децимации.
...а также нестабильности...опорника....в которые должны проваливаться шумы (нестабильность показаний) после оверсемплинга и децимации.
Удивительная каша... Нестабильность опорного напряжения (в нашем случае напряжения источника питания МК) ВООБЩЕ НИКАК не будет подавлена. К тому же нестабильность и шум не имеют друг к другу никакого отношения.
Заголовок сообщения: Re: Программно увеличить разрядность АЦП до 11 бит
Добавлено: Вс янв 31, 2016 11:58:29
Сверлит текстолит когтями
Карма: 15
Рейтинг сообщений: 212
Зарегистрирован: Вт мар 31, 2015 22:56:07 Сообщений: 1298 Откуда: Мы люди простые, живем в лесу, на пенек молимся
Рейтинг сообщения:0
КРАМ писал(а):
trengtor писал(а):
...а также нестабильности...опорника....в которые должны проваливаться шумы (нестабильность показаний) после оверсемплинга и децимации.
Удивительная каша... Нестабильность опорного напряжения (в нашем случае напряжения источника питания МК) ВООБЩЕ НИКАК не будет подавлена. К тому же нестабильность и шум не имеют друг к другу никакого отношения.
А что насчет вашего скользящего среднего? Оно-то каким место сюда относится?
А насчет того, что за опора – пускай топикстартер нам и скажет.
А что насчет вашего скользящего среднего? Оно-то каким место сюда относится?
Прежде чем загадочно подмигивать, попробуйте разобраться в цифровой обработке сигналов... Скользящее среднее - это ЧАСТНЫЙ СЛУЧАЙ цифрового фильтра низких частот с конечной импульсной характеристикой (с прямоугольным окном). К слову, окно может быть не обязательно прямоугольным. Вы пользуетесь аппнотами без всякого понимания что и откуда там берется. Оттого делаете странные и наивные выводы.
Последний раз редактировалось КРАМ Вс янв 31, 2016 12:03:14, всего редактировалось 1 раз.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 17
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения