Например TDA7294

Форум РадиоКот • Просмотр темы - Оверсемплинг
Форум РадиоКот
Здесь можно немножко помяукать :)





Текущее время: Пн июл 07, 2025 03:00:34

Часовой пояс: UTC + 3 часа


ПРЯМО СЕЙЧАС:



Начать новую тему Ответить на тему  [ Сообщений: 19 ] 
Автор Сообщение
Не в сети
 Заголовок сообщения: Оверсемплинг
СообщениеДобавлено: Вс окт 02, 2016 21:38:32 
Первый раз сказал Мяу!

Зарегистрирован: Сб окт 01, 2016 12:22:25
Сообщений: 31
Рейтинг сообщения: 0
Здравствуйте


делаю лабораторный блок питания и хочу сделать управление блоком на 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;
         
     adc_result_accum_processed = ms_volts ;      
     adc_result_accum_processed = (adc_result_accum_processed * ADC_GAIN_ERROR_FACTOR) >> 16;             
     adc_result_accum_processed = adc_result_accum_processed >> OVRSAMPLE_ADD_BIT;
   
     return adc_result_accum_processed;
}



ПОВЕДЕНИЕ ТАКОЕ:
напряжение на нагрузке 3.556В вольта, программа рассчитала и вернула из функции оверсемплинга значение 727, что в пересчете 3.542В
формула для расчета далее:

Код:
 volt=(Vref * adc_oversampled * volt_devider) / digitization;


что значит: (4988 * 727 * 4) / 4095 = 3542


на лицо косяк настройки делителя.
Начинаю потихоньку по пол Ома добавлять сопротивление в делителе.
Показания ADC не меняются.. однако вход АЦП повышется на один миливольт.. ADC молчит, еще на один и опа!!
уже отдает из функции 735! :kill:

куда делись еще 8 ступеней (то есть между 727..735)??? и соотвественно и показания сразу же прыгнули как 3581мв, что == 3,581В
я так понимаю оверсемплинг призван на то чтобы как раз таки детализировать показания, а не угрубить их в 5 раз

от этого работает криво и ВСЯ система, бывает попадешь точно в напряжение, а бывает левак показывает с разницей 20мв и более.. до 40!
так без всякого оверсемплинга получается точнее должно быть, то есть 5000/1024=4,88 - шаг 5мв. А с оверсемплингом 40 :)


что за бред? почему так? какое тут увеличение битности?? откудова?

друзья, где косяк? 2 дня убил :shock:


PS.
Читал атмеловский апноут и таблицу смотрел про мнимые миливольты в разрядности и даже микровольты - чушь!

_________________
Делай, что должен и будь, что будет


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Вс окт 02, 2016 22:04:08 
Ум, честь и совесть. И скромность.
Аватар пользователя

Карма: 98
Рейтинг сообщений: 2116
Зарегистрирован: Чт дек 28, 2006 08:19:56
Сообщений: 18401
Откуда: Новочеркасск
Рейтинг сообщения: 0
Медали: 2
Получил миской по аватаре (1) Мявтор 3-й степени (1)
а вы подмешивали шумоподобный сигнал на вход АЦП? без этого шума результат будет не тем - читайте внимательнее апноут

_________________
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Вс окт 02, 2016 22:18:36 
Первый раз сказал Мяу!

Зарегистрирован: Сб окт 01, 2016 12:22:25
Сообщений: 31
Рейтинг сообщения: 0
ARV писал(а):
а вы подмешивали шумоподобный сигнал на вход АЦП? без этого шума результат будет не тем - читайте внимательнее апноут


пробовал подмешивать шум. то есть искуственно.. допустим на ADC читается 135 + random(-3..3): 134..136...133....137
об это речь? а реализация хоть правильная?

толку мало.. точнее - ноль!

и почему все-таки не достигается мнимая детализация линейных показаний? на самом деле ведь не происходит никакого увеличения. Происходит укрупнение сетки.
вместо 1, например 8.

так можно и 20 бит добавить)))) то есть будет например 1 000 000 семплов. Но по факту шаг будет 1000 :)))

_________________
Делай, что должен и будь, что будет


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Вс окт 02, 2016 23:05:12 
Первый раз сказал Мяу!

Зарегистрирован: Сб окт 01, 2016 12:22:25
Сообщений: 31
Рейтинг сообщения: 0
заметил еще такое, с подмешиванием шума, если прочитано значение

на ADC 4637 --> оверсеплинг --> 579 реальных единиц - это равняется 2821мв
на ADC 4639 --> оверсеплинг --> 579 реальных единиц - это равняется 2821мв
на ADC 4631 --> оверсеплинг --> 578 реальных единиц - это равняется 2816мв -- разница 5мв


то есть.. отчетливо видно, что никуда ничего не делось.. все те же 5мв на один шаг.
игра цифр выходит и шарлатанство

_________________
Делай, что должен и будь, что будет


Вернуться наверх
 
Выбираем индустриальные и медицинские источники питания MEAN WELL в открытом исполнении

Использование модульных источников питания открытого типа широко распространено в современных устройствах. Присущие им компактность, гибкость в интеграции и высокая эффективность делают их отличным решением для систем промышленной автоматизации, телекоммуникационного оборудования, медицинской техники, устройств «умного дома» и прочих приложений. Рассмотрим подробнее характеристики и особенности трех самых популярных вариантов AC/DC-преобразователей MW открытого типа, подходящих для применения в промышленных устройствах - серий EPS, EPP и RPS представленных на Meanwell.market.

Подробнее>>
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Пн окт 03, 2016 00:04:04 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4563
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Цитата:
пробовал подмешивать шум. то есть искуственно.. допустим на ADC читается 135 + random(-3..3): 134..136...133....137
Что за "искуственный шум" ? Программный random чтоли ?
Шум должен быть в измеряемом сигнале. Причём его уровень должен быть не ниже уровня младшего бита.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Пн окт 03, 2016 00:16:19 
Первый раз сказал Мяу!

Зарегистрирован: Сб окт 01, 2016 12:22:25
Сообщений: 31
Рейтинг сообщения: 0
Аlex писал(а):
Цитата:
пробовал подмешивать шум. то есть искуственно.. допустим на ADC читается 135 + random(-3..3): 134..136...133....137
Что за "искуственный шум" ? Программный random чтоли ?
Шум должен быть в измеряемом сигнале. Причём его уровень должен быть не ниже уровня младшего бита.


Дело в том что я проектирую сначала все это добро в Proteus. Откудова там шуму взяться :)
эмулировать его можно программным рандомом? +1... -1.. к показанию ADC?

а вобще направление верное? с этом оверсемплингом. Функция правильная?

_________________
Делай, что должен и будь, что будет


Вернуться наверх
 
Распродажа паяльного оборудования ATTEN!
Паяльные станции, паяльники и аксессуары по самой выгодной цене.

По промокоду radiokot скидка 10%
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Пн окт 03, 2016 13:04:42 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4563
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Собирайте на железе и не будет никаких проблем.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Пн окт 03, 2016 15:21:07 
Первый раз сказал Мяу!

Зарегистрирован: Сб окт 01, 2016 12:22:25
Сообщений: 31
Рейтинг сообщения: 0
Аlex писал(а):
Собирайте на железе и не будет никаких проблем.


просто самый ценный совет, как в голову сразу не пришло, удивительно :)

я собсно.. потому и спрашиваю
ну а хоть подход то правильный? я верно реализовываю "оверсемплинг"?
суть такая? знает кто?

_________________
Делай, что должен и будь, что будет


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Пн окт 03, 2016 16:59:50 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4563
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
nickbel писал(а):
просто самый ценный совет, как в голову сразу не пришло, удивительно :)
А какой Вы хотели совет услышать ?
Вам двое сказали - должны быть шумы на входе АЦП. А каким образом Вы их будете создавать - дело вкуса.
Эмулируете в протеусе - значит создавайте там шумы, что тут ещё можно сказать :dont_know:

nickbel писал(а):
ну а хоть подход то правильный? я верно реализовываю "оверсемплинг"?суть такая? знает кто?
Никто не знает. Программа у Вас в голове, сюда выкладываете какие то куски кода, куски мыслей ...
Пробуйте, эксперементируйте, и сами узнаете, правильно делаете или нет, когда заработает (или не заработает).


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Пн окт 03, 2016 18:47:02 
Первый раз сказал Мяу!

Зарегистрирован: Сб окт 01, 2016 12:22:25
Сообщений: 31
Рейтинг сообщения: 0
Аlex писал(а):
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. полученное после оверсемплинга значение переводим в миливольты
Код:
 volt=(Vref * adc_oversampled * volt_devider) / digitization;


где:
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 - чем не шум), чтобы сумма чуть-чуть плавала.
еще хуже

и вот как быть, смысл собирать в железе когда реально косяк в чем-то другом, подозреваю, что я просто неправильно сделал, но где?

_________________
Делай, что должен и будь, что будет


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Пн окт 03, 2016 19:56:33 
Грызет канифоль
Аватар пользователя

Зарегистрирован: Чт май 17, 2007 09:44:13
Сообщений: 268
Откуда: Украина, г. Кривой Рог
Рейтинг сообщения: 0
Так, в качестве бреда..... :)
Может в этом? - начиная со значения суммы -- ноль, т.е. 1 значение равное 0 + 63 реальных значения ADC...


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Пн окт 03, 2016 20:03:37 
Модератор
Аватар пользователя

Карма: 90
Рейтинг сообщений: 1430
Зарегистрирован: Чт мар 18, 2010 23:09:57
Сообщений: 4563
Откуда: Планета Земля
Рейтинг сообщения: 0
Медали: 1
Получил миской по аватаре (1)
Вы сдвигаете результат вправо на 16 бит, потом ещё раз на 3, итого 19. Что там вообще может остаться после таких сдвигов, совершенно неведомо... :dont_know:
Пройдитесь отладкой в протеусе по коду и посмотрите что твориться в переменных.


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Пн окт 03, 2016 20:10:24 
Первый раз сказал Мяу!

Зарегистрирован: Сб окт 01, 2016 12:22:25
Сообщений: 31
Рейтинг сообщения: 0
pavel123 писал(а):
Так, в качестве бреда..... :)
Может в этом? - начиная со значения суммы -- ноль, т.е. 1 значение равное 0 + 63 реальных значения ADC...


нет, первое значение - это первое показание ADC. Имеется ввиду: переменная равняется нулю изначально. потом - первый отчет + второй + третий.... 64
потом снова сброс на 0 и снова сложение 64 семплов + функция оверсемплинга

_________________
Делай, что должен и будь, что будет


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Пн окт 03, 2016 20:21:11 
Первый раз сказал Мяу!

Зарегистрирован: Сб окт 01, 2016 12:22:25
Сообщений: 31
Рейтинг сообщения: 0
Аlex писал(а):
Вы сдвигаете результат вправо на 16 бит, потом ещё раз на 3, итого 19. Что там вообще может остаться после таких сдвигов, совершенно неведомо... :dont_know:
Пройдитесь отладкой в протеусе по коду и посмотрите что твориться в переменных.


гм.. 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

_________________
Делай, что должен и будь, что будет


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Пн окт 03, 2016 21:08:40 
Собутыльник Кота
Аватар пользователя

Карма: 28
Рейтинг сообщений: 757
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Сообщений: 2896
Откуда: приходит весна?
Рейтинг сообщения: 0
Смысл поднятия точности АЦП АВРок довольно сомнителен. 10 бит — это 0,1% точности на максимальном сигнале и целый 1% на 10% от максимального сигнала. АЦП АВРок имеет заметные нелинейности: интегральные могут достигать десятка младших разрядов, а дифференциальные целого младшего разряда (на переходах типа 63-64, 95-96, 255-256, 511-512). Поэтому уже имеющаяся точность квантования заметно больше точности самого АЦП. Кроме того, повышение разрядности с помощью шума — это существенно статистический процесс. Если не учитывать функцию распределения этого шума, то полученные в результате данные будут на столько искажены, что смысла в них не будет.

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


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Пн окт 03, 2016 22:19:31 
Первый раз сказал Мяу!

Зарегистрирован: Сб окт 01, 2016 12:22:25
Сообщений: 31
Рейтинг сообщения: 0
B@R5uk писал(а):
Смысл поднятия точности АЦП АВРок довольно сомнителен. 10 бит — это 0,1% точности на максимальном сигнале и целый 1% на 10% от максимального сигнала.
Если автору топика требуется измерять очень большой диапазон значений, то имеет смысл не повышать точность АЦП, а осуществить автоматическое переключение диапазонов, как это сделано во всяких более-менее продвинутых китайских вольтметрах.


в общем отсюда следует что AVR, все-таки - барахло.
получается особо ничего так и не померять точно, - наличие, напряжения увидеть разве :)
да диодом поморгать, на прощание

_________________
Делай, что должен и будь, что будет


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Пн окт 03, 2016 22:35:23 
Собутыльник Кота
Аватар пользователя

Карма: 28
Рейтинг сообщений: 757
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Сообщений: 2896
Откуда: приходит весна?
Рейтинг сообщения: 0
Хотя нет, я немного погорячился с погрешностью АЦП, потому что запамятовал. Вот поднял свои старые измерения:

Изображение

Интегральная нелинейность порядка одного младшего разряда, дифференциальная иногда подскакивает до четверти младшего разряда. Так что при большом желании, применив правильный шум, на один-два разряда точность разрядность результата можно поднять.

nickbel писал(а):
в общем отсюда следует что AVR, все-таки - барахло.
получается особо ничего так и не померить точно, - наличие, напряжения увидеть разве
1% — это шикарнейшая точность, поверьте мне. Чтобы получить честную точность 0,1% не достаточно просто взять оборудование по-круче, да по-дороже. Надо составить правильную методику измерения, правильно померить все систематические погрешности и правильно провести расчёты. Если вы думаете, что китайские мыльницы выдают честные три знака, то разочаруйтесь: там и вторая значащая будет привирать.

А АВРки имеют свою нишу и свои задачи вполне прекрасно выполняют. Хотя есть, конечно, более дешёвые и производительные МК.


Вложения:
интегральная нелинейность АЦП.gif [4.74 KiB]
Скачиваний: 1676


Последний раз редактировалось B@R5uk Пн окт 03, 2016 23:35:27, всего редактировалось 1 раз.
Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Пн окт 03, 2016 23:18:37 
Первый раз сказал Мяу!

Зарегистрирован: Сб окт 01, 2016 12:22:25
Сообщений: 31
Рейтинг сообщения: 0
B@R5uk писал(а):
Хотя нет, я немного погорячился с погрешностью АЦП, потому что запамятовал. Вот поднял свои старые измерения


ого, спасибо за наглядный график!
все-таки конечно лучше использовать STM по ряду параметров. Но Proteus не моделирует их камни :(
разве что брать наверное и сразу отлаживать в железе действительно

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

_________________
Делай, что должен и будь, что будет


Вернуться наверх
 
Не в сети
 Заголовок сообщения: Re: Оверсемплинг
СообщениеДобавлено: Пн окт 03, 2016 23:32:23 
Собутыльник Кота
Аватар пользователя

Карма: 28
Рейтинг сообщений: 757
Зарегистрирован: Сб ноя 13, 2010 12:53:25
Сообщений: 2896
Откуда: приходит весна?
Рейтинг сообщения: 0
nickbel писал(а):
все-таки конечно лучше использовать STM по ряду параметров.
Да, эстээмки дешевле и производительнее (во многих смыслах). И АЦП у них с большей разрядностью. Но нелинейности никуда не денутся, хотя, наверное, и будут меньше (не зря же разрядность выше).


Вернуться наверх
 
Показать сообщения за:  Сортировать по:  Вернуться наверх
Начать новую тему Ответить на тему  [ Сообщений: 19 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
Extended by Karma MOD © 2007—2012 m157y
Extended by Topic Tags MOD © 2012 m157y