делаю лабораторный блок питания и хочу сделать управление блоком на atmega328p. Контроллер будет и измерительным прибором.
пытаюсь поднять точность измерений на 10-битном ADC, прочитал многое об оверсемплинге и ничего не могу понять, шарлатанство какое-то. всмысле, разрядность то поднялась, да. НО! какой смысл?? когда стало например 8191 ступеньки вместо 1023,.. но "шаг" стал не 1, а 20??)) то есть картина следующая:
кварц: 16МГц опорное: 5В - стабилитрон tl431 измеряемый диапазон: 20В (20000мв) вход на АЦП: делитель - 2 резистора (1:4). То есть на нагрузке 20В на входе ADC - 5.
Читаю 64 выборки вот так:
Код:
ISR (ADC_vect){ ms_volts += ADC; .... }
Затем сдвигаю полученное значение на 3 вот так:
Код:
unsigned long get_volts_adc_value(){
static unsigned long adc_result_accum_processed = 0;
ПОВЕДЕНИЕ ТАКОЕ: напряжение на нагрузке 3.556В вольта, программа рассчитала и вернула из функции оверсемплинга значение 727, что в пересчете 3.542В формула для расчета далее:
на лицо косяк настройки делителя. Начинаю потихоньку по пол Ома добавлять сопротивление в делителе. Показания ADC не меняются.. однако вход АЦП повышется на один миливольт.. ADC молчит, еще на один и опа!! уже отдает из функции 735!
куда делись еще 8 ступеней (то есть между 727..735)??? и соотвественно и показания сразу же прыгнули как 3581мв, что == 3,581В я так понимаю оверсемплинг призван на то чтобы как раз таки детализировать показания, а не угрубить их в 5 раз
от этого работает криво и ВСЯ система, бывает попадешь точно в напряжение, а бывает левак показывает с разницей 20мв и более.. до 40! так без всякого оверсемплинга получается точнее должно быть, то есть 5000/1024=4,88 - шаг 5мв. А с оверсемплингом 40
что за бред? почему так? какое тут увеличение битности?? откудова?
друзья, где косяк? 2 дня убил
PS. Читал атмеловский апноут и таблицу смотрел про мнимые миливольты в разрядности и даже микровольты - чушь!
_________________ Делай, что должен и будь, что будет
а вы подмешивали шумоподобный сигнал на вход АЦП? без этого шума результат будет не тем - читайте внимательнее апноут
пробовал подмешивать шум. то есть искуственно.. допустим на ADC читается 135 + random(-3..3): 134..136...133....137 об это речь? а реализация хоть правильная?
толку мало.. точнее - ноль!
и почему все-таки не достигается мнимая детализация линейных показаний? на самом деле ведь не происходит никакого увеличения. Происходит укрупнение сетки. вместо 1, например 8.
так можно и 20 бит добавить)))) то есть будет например 1 000 000 семплов. Но по факту шаг будет 1000
_________________ Делай, что должен и будь, что будет
заметил еще такое, с подмешиванием шума, если прочитано значение
на ADC 4637 --> оверсеплинг --> 579 реальных единиц - это равняется 2821мв на ADC 4639 --> оверсеплинг --> 579 реальных единиц - это равняется 2821мв на ADC 4631 --> оверсеплинг --> 578 реальных единиц - это равняется 2816мв -- разница 5мв
то есть.. отчетливо видно, что никуда ничего не делось.. все те же 5мв на один шаг. игра цифр выходит и шарлатанство
_________________ Делай, что должен и будь, что будет
Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.
Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4563 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Цитата:
пробовал подмешивать шум. то есть искуственно.. допустим на ADC читается 135 + random(-3..3): 134..136...133....137
Что за "искуственный шум" ? Программный random чтоли ? Шум должен быть в измеряемом сигнале. Причём его уровень должен быть не ниже уровня младшего бита.
пробовал подмешивать шум. то есть искуственно.. допустим на ADC читается 135 + random(-3..3): 134..136...133....137
Что за "искуственный шум" ? Программный random чтоли ? Шум должен быть в измеряемом сигнале. Причём его уровень должен быть не ниже уровня младшего бита.
Дело в том что я проектирую сначала все это добро в Proteus. Откудова там шуму взяться эмулировать его можно программным рандомом? +1... -1.. к показанию ADC?
а вобще направление верное? с этом оверсемплингом. Функция правильная?
_________________ Делай, что должен и будь, что будет
Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4563 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
nickbel писал(а):
просто самый ценный совет, как в голову сразу не пришло, удивительно
А какой Вы хотели совет услышать ? Вам двое сказали - должны быть шумы на входе АЦП. А каким образом Вы их будете создавать - дело вкуса. Эмулируете в протеусе - значит создавайте там шумы, что тут ещё можно сказать
nickbel писал(а):
ну а хоть подход то правильный? я верно реализовываю "оверсемплинг"?суть такая? знает кто?
Никто не знает. Программа у Вас в голове, сюда выкладываете какие то куски кода, куски мыслей ... Пробуйте, эксперементируйте, и сами узнаете, правильно делаете или нет, когда заработает (или не заработает).
ну а хоть подход то правильный? я верно реализовываю "оверсемплинг"?суть такая? знает кто?
Никто не знает. Программа у Вас в голове, сюда выкладываете какие то куски кода, куски мыслей ... Пробуйте, эксперементируйте, и сами узнаете, правильно делаете или нет, когда заработает (или не заработает).
Понял, растолкую. Тут не куски кода - тут уже готовые функции.
1. В прерывании постоянно суммируем все опросы ADC начиная со значения суммы -- ноль. Чтение -> преобразование -> суммирование к значению. И так - 64 раза. То есть 64 значения.
Код:
ISR (ADC_vect){ ms_volts += ADC; .... }
2. Далее, полученную сумму отправляем в функцию оверсемплинга
Код:
unsigned long get_volts_adc_value(){
// сбросили на ноль результирующее static unsigned long adc_result_accum_processed = 0;
// присвоили сумму значений из 64 чтений ADC считанную ранее adc_result_accum_processed = ms_volts ;
// коррекция шума. Судя по даташиту у каждой микры значение разное, от экземпляра зависит, условно - 0.9998. Типа внутренний шум АЦП итп adc_result_accum_processed = (adc_result_accum_processed * ADC_GAIN_ERROR_FACTOR) >> 16;
// делаем сдвиг скоректированного отфильтрованного значения на количество разрядов которое хотим добавить к 10 битам, я хочу сделать 13. Итого 13-10=3. Сдвигаем на 3 adc_result_accum_processed = adc_result_accum_processed >> OVRSAMPLE_ADD_BIT;
// возвращаем полученное, оверсепленное значение return adc_result_accum_processed; }
3. полученное после оверсемплинга значение переводим в миливольты
где: Vref - опорное в мв = 5000 adc_oversampled - значение возвращенное из функции volt_devider - умножили на коэффициент делителя (так как диапазон не 5 вольт, как опорное, а 20. То коэф = 4) digitization - количество "мнимых" ступенек ADC вместо 1023. То есть согласно таблицы из Atmel -- 4051, после оверсемплинга (грубо гря 4096 - в 4 раза больше)
НО результат - абышто! и я хотел спросить совета - куда копать, почему шаг становится 20... 50ма?? А не в чем сделать, в железе или не в железе. В 10 раз больше становится шаг, нежели если бы я использовал просто опорное. Вот как это так? почему? Пусть бы осталось прежнее разрешение, так оно еще ухудшилось. такой "оверсемплинг" не уточнил показания, а просто угрубил их в 10 раз выходит. Так и вопрос отсюда, это шарлатанство атмел? якобы как-то волшебным образом можно "улучшить" их плохенький ADC. или это действительно у кого-то работает? может реализация есть какая-то готовая, пример, просто функция, которой надо отдать сумму прочитанных значений (пачку). Может я что не так делаю..
шум добавлялся и без шума. Эмуляцией - добавлялось еще одно рандомное значение, 65-е, -- rand() % 64 (то есть от 1 до 64 - чем не шум), чтобы сумма чуть-чуть плавала. еще хуже
и вот как быть, смысл собирать в железе когда реально косяк в чем-то другом, подозреваю, что я просто неправильно сделал, но где?
_________________ Делай, что должен и будь, что будет
Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57 Сообщений: 4563 Откуда: Планета Земля
Рейтинг сообщения:0 Медали: 1
Вы сдвигаете результат вправо на 16 бит, потом ещё раз на 3, итого 19. Что там вообще может остаться после таких сдвигов, совершенно неведомо... Пройдитесь отладкой в протеусе по коду и посмотрите что твориться в переменных.
Так, в качестве бреда..... Может в этом? - начиная со значения суммы -- ноль, т.е. 1 значение равное 0 + 63 реальных значения ADC...
нет, первое значение - это первое показание ADC. Имеется ввиду: переменная равняется нулю изначально. потом - первый отчет + второй + третий.... 64 потом снова сброс на 0 и снова сложение 64 семплов + функция оверсемплинга
_________________ Делай, что должен и будь, что будет
Вы сдвигаете результат вправо на 16 бит, потом ещё раз на 3, итого 19. Что там вообще может остаться после таких сдвигов, совершенно неведомо... Пройдитесь отладкой в протеусе по коду и посмотрите что твориться в переменных.
гм.. 16-бит никак не отражается почти, в пределах ошибки, вот что выходит, отладка:
Сумма значений: 6720 Подмешиваем шум:6733 Коррекция шума ADC (эти 16 бит):6732 Результат сдвига на 3:841 mVolts: 2043 -- Сумма значений:6720 Подмешиваем шум:6744 Коррекция шума ADC (эти 16 бит):6743 Результат сдвига на 3:842 ADC: 842 mVolts: 2046 -- Сумма значений:6720 Подмешиваем шум:6741 Коррекция шума ADC (эти 16 бит):6740 Результат сдвига на 3:842 mVolts: 2046
_________________ Делай, что должен и будь, что будет
Смысл поднятия точности АЦП АВРок довольно сомнителен. 10 бит — это 0,1% точности на максимальном сигнале и целый 1% на 10% от максимального сигнала. АЦП АВРок имеет заметные нелинейности: интегральные могут достигать десятка младших разрядов, а дифференциальные целого младшего разряда (на переходах типа 63-64, 95-96, 255-256, 511-512). Поэтому уже имеющаяся точность квантования заметно больше точности самого АЦП. Кроме того, повышение разрядности с помощью шума — это существенно статистический процесс. Если не учитывать функцию распределения этого шума, то полученные в результате данные будут на столько искажены, что смысла в них не будет.
Если автору топика требуется измерять очень большой диапазон значений, то имеет смысл не повышать точность АЦП, а осуществить автоматическое переключение диапазонов, как это сделано во всяких более-менее продвинутых китайских вольтметрах.
Смысл поднятия точности АЦП АВРок довольно сомнителен. 10 бит — это 0,1% точности на максимальном сигнале и целый 1% на 10% от максимального сигнала. Если автору топика требуется измерять очень большой диапазон значений, то имеет смысл не повышать точность АЦП, а осуществить автоматическое переключение диапазонов, как это сделано во всяких более-менее продвинутых китайских вольтметрах.
в общем отсюда следует что AVR, все-таки - барахло. получается особо ничего так и не померять точно, - наличие, напряжения увидеть разве да диодом поморгать, на прощание
_________________ Делай, что должен и будь, что будет
Хотя нет, я немного погорячился с погрешностью АЦП, потому что запамятовал. Вот поднял свои старые измерения:
Интегральная нелинейность порядка одного младшего разряда, дифференциальная иногда подскакивает до четверти младшего разряда. Так что при большом желании, применив правильный шум, на один-два разряда точность разрядность результата можно поднять.
nickbel писал(а):
в общем отсюда следует что AVR, все-таки - барахло. получается особо ничего так и не померить точно, - наличие, напряжения увидеть разве
1% — это шикарнейшая точность, поверьте мне. Чтобы получить честную точность 0,1% не достаточно просто взять оборудование по-круче, да по-дороже. Надо составить правильную методику измерения, правильно померить все систематические погрешности и правильно провести расчёты. Если вы думаете, что китайские мыльницы выдают честные три знака, то разочаруйтесь: там и вторая значащая будет привирать.
А АВРки имеют свою нишу и свои задачи вполне прекрасно выполняют. Хотя есть, конечно, более дешёвые и производительные МК.
Хотя нет, я немного погорячился с погрешностью АЦП, потому что запамятовал. Вот поднял свои старые измерения
ого, спасибо за наглядный график! все-таки конечно лучше использовать STM по ряду параметров. Но Proteus не моделирует их камни разве что брать наверное и сразу отлаживать в железе действительно
ну, а с другой стороны, если действительно не все так плохо, может и допилю все-таки прошивку для AVR, тем более что она готова.. вопрос точности
_________________ Делай, что должен и будь, что будет
все-таки конечно лучше использовать STM по ряду параметров.
Да, эстээмки дешевле и производительнее (во многих смыслах). И АЦП у них с большей разрядностью. Но нелинейности никуда не денутся, хотя, наверное, и будут меньше (не зря же разрядность выше).
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения