АЦП. Разбор полётов

Обсуждаем контроллеры компании Atmel.
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

СТОЯТЬ! У мя ещё вопросы!
Я МОГУ читать даташит, но я его НЕ ПОНИМАЮ! Как включит подавление шума и 8 бит?!
Кстати, я вот подумал -- если опорное напряжение будет 1.1В, то тогда больше простора -- будут пункты 550, 600, 650 и 700.
Последний раз редактировалось просто КОТ Вт авг 14, 2012 21:31:00, всего редактировалось 1 раз.
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: АЦП. Разбор полётов

Сообщение Барсик »

Вот приеду в Феодосию... Может поговорим... А щас отпадаю...
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: АЦП. Разбор полётов

Сообщение zero648 »

zero648 писал(а):Если точность не сильно важна, можно результат АЦП прижать влево, читать только ADCH
ADMUX|=(1<<ADLAR); // Прижимаем результат АЦП влево

В таком случае два младших бита остаются в ADCL и становятся там старшими :tea:
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

Так что же делать?! А если взять 8битный АЦп, при опорном 1.1В?! Какие тогда коллебания будут?! В смысле не точности?!
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
zero648
Вымогатель припоя
Сообщения: 650
Зарегистрирован: Пн июн 18, 2012 12:01:04
Откуда: Челябинская область, Копейск

Re: АЦП. Разбор полётов

Сообщение zero648 »

просто КОТ писал(а):У мя есть 4 пункта, которые надо выделить.
Это: 210, 225, 240 и 255. +-30 не катит.

Это что за пункты?
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

Это падения напряжения на ПП кристалле, при 25*С, 50*С, 75*С и 100*С!
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: АЦП. Разбор полётов

Сообщение ILYAUL »

Как включит подавление шума
режим ADC NOISE и
... баиньки


Я МОГУ читать даташит, но я его НЕ ПОНИМАЮ!

Gudd-Head Если ещё не скачали, то обязательно скачайте себе книгу "Микроконтроллеры AVR семейства Tiny Mega фирмы Atmel" А.В.Евстифеев ,......
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение Аlex »

просто КОТ, а я ведь не зря Вам объяснял как уменьшить шум младших бит с помощью усреднения, а Вы мой пост проигнорировали :)
Аватара пользователя
siamds
Встал на лапы
Сообщения: 99
Зарегистрирован: Вт мар 20, 2012 20:50:22
Откуда: Краснодар

Re: АЦП. Разбор полётов

Сообщение siamds »

Уважаемый Барсик!
Позвольте с Вами не согласиться насчет точности показаний МК. МК – это точный измерительный прибор. В доказательство привожу программу измерения напряжения промоделированную в Proteuse.
Чтение_АЦП_Преобразования.rar
(30.39 КБ) 196 скачиваний

Барсик писал(а): Если максимальное значение, которое можно получить 1023, то результат болтается где-то на 20 - 30 единиц.
Проверяем. На одном из каналов АЦП выставим 3 вольта. А теперь давайте считать. Так как программа настроена на измерения 5 вольт, из этого и будем исходить. Разделив 5вольт/1023≈0,0048878 вольт на дискрету (или по Вашему выражению на единицу). Согласно Вашему утверждению результат должен отличаться на 20÷30 единиц. Умножаем 0,0048878 * 20 ≈ 0,097756, тогда показания на LCD дисплее должны быть ≈3,097вольта, если в плюс, или ≈2,902, если в минус. Но показания вольтметра и LCD дисплея совпадают и равны 3 вольта. Резюме…?
Чувствую что, прочитав мое сообщение у некоторых наших коллег зачесались руки написать что, мол, дескать, Proteus всего-навсего симулятор и не отражает действительное напряжение. Таких спешу успокоить: приведенный фрагмент программы, давно используется в системах автоматического контроля и регулирования на нашем производстве. Также не стоит и писать о том что применен другой МК. Ну думаю что таких “одаренных” на этом форуме нет, впрочем… посмотрим.
На каждого Моцарта есть свой Сальери.
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Re: АЦП. Разбор полётов

Сообщение Совесть »

А я все таки напишу это "Proteus всего-навсего симулятор", в реальности не все так радужно.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: АЦП. Разбор полётов

Сообщение ILYAUL »

Аlex писал(а):просто КОТ, а я ведь не зря Вам объяснял как уменьшить шум младших бит с помощью усреднения, а Вы мой пост проигнорировали :)

Для его диапазона младшие можно выбросить , но и оставшиеся можно усреднить , что тоже повысит точность и избавит от лишнего шума.
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

Ребят, я как-будто специально Вас не понимаю. Реально -- в теории понял, а как осуществить нет.
Вот усреднени например. Что бы усреднить надо например 10 замеров сложить и на 10 поделить. Но!
После каждого замера регистр, ЕМНИП, обновляется -- как складывать то?!
Изображение
И ты врёшь!!! © Vladisman
Изображение
bolek
Сверлит текстолит когтями
Сообщения: 1178
Зарегистрирован: Пт авг 21, 2009 03:22:12

Re: АЦП. Разбор полётов

Сообщение bolek »

Буфер под измерения завести.

А вообще - читать букварь, любой, голову заполнять азами программирования и устройства МК.
Что ни вопрос, то :facepalm:
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

Дай букварь -- я не знаю ЧТО конкретно читать. А без знаний оччень туго!
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
Барсик
Друг Кота
Сообщения: 3459
Зарегистрирован: Ср сен 27, 2006 16:18:57

Re: АЦП. Разбор полётов

Сообщение Барсик »

siamds писал(а):Позвольте с Вами не согласиться насчет точности показаний МК.
Вы, конечно, можете не соглашаться. Я тёмный кот - Протеусом пользоваться не умею. Я смотрел на реальном железе - ATtiny13, опорное напряжение АЦП от внутреннего источника 1,1 вольт. Результат преобразования в виде импульсов выпихивал наружу через свободную ногу контроллера. Сколько АЦП насчитал - столько вышло импульсов. Импульсы считал частотомером, включённым в режим счёта импульсов. Напряжение на вход АЦП подавал от гальванического элемента на 1,5 вольта через делитель. Пробовал и обычный режим и "Noise Canceler". Сейчас уже не помню точно результаты. Но осталось впечатление "так себе".
Разумеется, можно попробовать поиграться с частотой тактирования АЦП и с накоплением результатов.

просто КОТ писал(а):в теории понял, а как осуществить нет.
Вот усреднени например. Что бы усреднить надо например 10 замеров сложить и на 10 поделить. Но!
После каждого замера регистр, ЕМНИП, обновляется -- как складывать то?!
Всё очень просто. Во-первых, 10 замеров - это не удобно. Удобно использовать степени двойки: 2, 4, 8, 16, 32, 64 и т.д. Почему? Потому, что на такие числа легче делить - деление заменяется побитовым сдвигом вправо.
Во-вторых, результаты преобразования надо накапливать в переменной - прибавлять к ней каждый раз результат. Как накопится нужное количество - поделить её на это самое количество.
Вот возможный вариант кода для 16 измерений. Предполагается, что запуск АЦП происходит по прерыванию от таймера.

Код: Выделить всё

#define ADC_COUNTER 16 // сколько будем накапливать измерений (16)
#define DATA_SHIFT 4 // на сколько разрядов сдвинуть переменную, чтобы получилось деление на 16
volatile unsigned int adc_data = 0; // в этой переменной будем накапливать результат. обнуляем её перед использованием
volatile unsigned int adc_result = 0; // а это результат усреднения. обнуляем её перед использованием
volatile unsigned char adc_counter = ADC_COUNTER; // это счётчик накопленных измерений, присваиваем ему значение (16) перед использованием

// Это прерывание от АЦП. Оно случается, когда готов результат преобразования
interrupt [ADC_INT] void adc_isr(void)
{
    // проверяем, сколько накопили измерений
    if(adc_counter)
    {
        // ещё не накопили сколько надо
        adc_data=adc_data+ADCW; // прибавляем к нашей переменной очередной результат
        adc_counter--; // уменьшаем счётчик накопленных измерений на единичку
    }
    else
    {
        // накопили сколько надо
        adc_counter = ADC_COUNTER; // перезагружаем счётчик накопленных измерений   
        adc_result = adc_data >> DATA_SHIFT; // сдвигаем нашу переменную вправо на 4 разряда, т.е. делим на 16 и присваиваем усреднённое значение другой переменной
        adc_data = 0; // обнуляем нашу переменную перед следующим накоплением
    }   

}
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: АЦП. Разбор полётов

Сообщение ILYAUL »

Код: Выделить всё

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

Но иногда проще умножить , чем разделить. Так например сумма 128 отсчётов ( значений) при умножении на 2 даёт тоже самое значение , что и деление этой суммы на 128.
Аватара пользователя
просто КОТ
Друг Кота
Сообщения: 12364
Зарегистрирован: Пт дек 17, 2010 15:07:50
Откуда: Крымский Федеральный Округ
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение просто КОТ »

Вот уважаю я тебя Барсик -- умеешь нормально объяснить!
Кстати, по поводу прерываний -- это значит надо их ещё разрешить. Пойду читать даташит.
И ещё -- ты сказал, что прерывание от таймера, а написал в коде, что от АЦП. Это опечатка, или я что-то не понял?!
Изображение
И ты врёшь!!! © Vladisman
Изображение
Аватара пользователя
Аlex
Модератор
Сообщения: 4614
Зарегистрирован: Чт мар 18, 2010 23:09:57
Откуда: Планета Земля
Контактная информация:

Re: АЦП. Разбор полётов

Сообщение Аlex »

Это не опечатка. Запуска преобразования не наблюдается же в обработчике от АЦП.
Предполагается, что Вы будете запускать преобразование таймером с определённой периодичностью, например сделать обработчик прерывания от таймера и запускать в нём АЦП.
Но можно и воткнуть запуск в тотже обработчик, тогда он будет "тарабанить" постоянно, а Вы просто будете в любом удобном Вам месте считывать результат (adc_result). Но в этом случае, лучше выбрать самую минимальную частоту тактирования модуля АЦП (если такое возможно в атмелах), иначе обработчик будет занимать много процессорного времени, постоянно выполняясь.
Аватара пользователя
КРАМ
Друг Кота
Сообщения: 25123
Зарегистрирован: Чт янв 10, 2008 22:01:02
Откуда: Московская область, Фрязино

Re: АЦП. Разбор полётов

Сообщение КРАМ »

Барсик писал(а):Во-вторых, результаты преобразования надо накапливать в переменной - прибавлять к ней каждый раз результат. Как накопится нужное количество - поделить её на это самое количество.

Вообще то делают несколько по другому.
Шум младших разрядов АЦП имеет разную природу. БОльшая часть его носит чисто схемотехнический и сигнальный характер. Т.е. является ОБЪЕКТИВНЫМ результатом РЕАЛЬНОГО шума входного сигнала и помех от схемотехники устройства.
Для ФИЛЬТРАЦИИ этого шума используют цифровые ФНЧ. Т.е. программную обработку уже преобразованного сигнала.
Цифровые ФНЧ бывают ДВУХ видов: с конечной импульсной характеристикой (КИХ) и с бесконечной импульсной характеристикой (БИХ).
Первые требуют сохранения МАССИВА, а вторые рекурсивные, т.е. оперируют текущим и накопленным значениями.
Для уменьшения боковых лепестков в КИХ применяют оконные функции, т.е. массив должен быть всегда упорядочен и умножается на некоторые оконные коэффициенты (например, косинус на пъедестале).
Но к делу.
Простейший КИХ ФНЧ - это КОЛЬЦЕВОЙ БУФЕР (прямоугольное окно).
Для его формирования нужно каждое преобразование писать в буфер нужной длины просто по кольцу (инкрементируя указатель по кругу). И ПОСЛЕ КАЖДОГО ИЗМЕРЕНИЯ, после занесения очередного измерения в буфер, находится сумма всех элементов массива-буфера и делится на длину буфера (сдвигом или делением, зависит от выбранной длины).
Таким образом результат фильтрации будет на выходе с частотой преобразования, НО С ЗАДЕРЖКОЙ на длину буфера.
Полоса пропускания такого ФНЧ (основной лепесток) будет равна 1/Т, где Т - длина буфера на временной оси.
Аватара пользователя
ILYAUL
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср мар 28, 2012 21:45:24
Откуда: ВО

Re: АЦП. Разбор полётов

Сообщение ILYAUL »

если такое возможно в атмелах
Вообще-то запустить ADC в этой тиньке можно используя 7 прерываний . При этом не требуется команда запуска ADC в обработчиках прерываний , все произойдёт автоматически. А уж читать результат преобразования или нет - дело третье
Ответить

Вернуться в «AVR»