АЦП. Разбор полётов
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: АЦП. Разбор полётов
СТОЯТЬ! У мя ещё вопросы!
Я МОГУ читать даташит, но я его НЕ ПОНИМАЮ! Как включит подавление шума и 8 бит?!
Кстати, я вот подумал -- если опорное напряжение будет 1.1В, то тогда больше простора -- будут пункты 550, 600, 650 и 700.
Я МОГУ читать даташит, но я его НЕ ПОНИМАЮ! Как включит подавление шума и 8 бит?!
Кстати, я вот подумал -- если опорное напряжение будет 1.1В, то тогда больше простора -- будут пункты 550, 600, 650 и 700.
Последний раз редактировалось просто КОТ Вт авг 14, 2012 21:31:00, всего редактировалось 1 раз.
Re: АЦП. Разбор полётов
Вот приеду в Феодосию... Может поговорим... А щас отпадаю...
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: АЦП. Разбор полётов
zero648 писал(а):Если точность не сильно важна, можно результат АЦП прижать влево, читать только ADCH
ADMUX|=(1<<ADLAR); // Прижимаем результат АЦП влево
В таком случае два младших бита остаются в ADCL и становятся там старшими

- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: АЦП. Разбор полётов
Так что же делать?! А если взять 8битный АЦп, при опорном 1.1В?! Какие тогда коллебания будут?! В смысле не точности?!
- zero648
- Вымогатель припоя
- Сообщения: 650
- Зарегистрирован: Пн июн 18, 2012 12:01:04
- Откуда: Челябинская область, Копейск
Re: АЦП. Разбор полётов
просто КОТ писал(а):У мя есть 4 пункта, которые надо выделить.
Это: 210, 225, 240 и 255. +-30 не катит.
Это что за пункты?
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: АЦП. Разбор полётов
Это падения напряжения на ПП кристалле, при 25*С, 50*С, 75*С и 100*С!
Re: АЦП. Разбор полётов
режим ADC NOISE иКак включит подавление шума
... баиньки
Я МОГУ читать даташит, но я его НЕ ПОНИМАЮ!
Gudd-Head Если ещё не скачали, то обязательно скачайте себе книгу "Микроконтроллеры AVR семейства Tiny Mega фирмы Atmel" А.В.Евстифеев ,......
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: АЦП. Разбор полётов
просто КОТ, а я ведь не зря Вам объяснял как уменьшить шум младших бит с помощью усреднения, а Вы мой пост проигнорировали 
Re: АЦП. Разбор полётов
Уважаемый Барсик!
Позвольте с Вами не согласиться насчет точности показаний МК. МК – это точный измерительный прибор. В доказательство привожу программу измерения напряжения промоделированную в Proteuse.
Чувствую что, прочитав мое сообщение у некоторых наших коллег зачесались руки написать что, мол, дескать, Proteus всего-навсего симулятор и не отражает действительное напряжение. Таких спешу успокоить: приведенный фрагмент программы, давно используется в системах автоматического контроля и регулирования на нашем производстве. Также не стоит и писать о том что применен другой МК. Ну думаю что таких “одаренных” на этом форуме нет, впрочем… посмотрим.
Позвольте с Вами не согласиться насчет точности показаний МК. МК – это точный измерительный прибор. В доказательство привожу программу измерения напряжения промоделированную в Proteuse.
Проверяем. На одном из каналов АЦП выставим 3 вольта. А теперь давайте считать. Так как программа настроена на измерения 5 вольт, из этого и будем исходить. Разделив 5вольт/1023≈0,0048878 вольт на дискрету (или по Вашему выражению на единицу). Согласно Вашему утверждению результат должен отличаться на 20÷30 единиц. Умножаем 0,0048878 * 20 ≈ 0,097756, тогда показания на LCD дисплее должны быть ≈3,097вольта, если в плюс, или ≈2,902, если в минус. Но показания вольтметра и LCD дисплея совпадают и равны 3 вольта. Резюме…?Барсик писал(а): Если максимальное значение, которое можно получить 1023, то результат болтается где-то на 20 - 30 единиц.
Чувствую что, прочитав мое сообщение у некоторых наших коллег зачесались руки написать что, мол, дескать, Proteus всего-навсего симулятор и не отражает действительное напряжение. Таких спешу успокоить: приведенный фрагмент программы, давно используется в системах автоматического контроля и регулирования на нашем производстве. Также не стоит и писать о том что применен другой МК. Ну думаю что таких “одаренных” на этом форуме нет, впрочем… посмотрим.
На каждого Моцарта есть свой Сальери.
Re: АЦП. Разбор полётов
А я все таки напишу это "Proteus всего-навсего симулятор", в реальности не все так радужно.
Re: АЦП. Разбор полётов
Аlex писал(а):просто КОТ, а я ведь не зря Вам объяснял как уменьшить шум младших бит с помощью усреднения, а Вы мой пост проигнорировали
Для его диапазона младшие можно выбросить , но и оставшиеся можно усреднить , что тоже повысит точность и избавит от лишнего шума.
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: АЦП. Разбор полётов
Ребят, я как-будто специально Вас не понимаю. Реально -- в теории понял, а как осуществить нет.
Вот усреднени например. Что бы усреднить надо например 10 замеров сложить и на 10 поделить. Но!
После каждого замера регистр, ЕМНИП, обновляется -- как складывать то?!
Вот усреднени например. Что бы усреднить надо например 10 замеров сложить и на 10 поделить. Но!
После каждого замера регистр, ЕМНИП, обновляется -- как складывать то?!
Re: АЦП. Разбор полётов
Буфер под измерения завести.
А вообще - читать букварь, любой, голову заполнять азами программирования и устройства МК.
Что ни вопрос, то
А вообще - читать букварь, любой, голову заполнять азами программирования и устройства МК.
Что ни вопрос, то

- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: АЦП. Разбор полётов
Дай букварь -- я не знаю ЧТО конкретно читать. А без знаний оччень туго!
Re: АЦП. Разбор полётов
Вы, конечно, можете не соглашаться. Я тёмный кот - Протеусом пользоваться не умею. Я смотрел на реальном железе - ATtiny13, опорное напряжение АЦП от внутреннего источника 1,1 вольт. Результат преобразования в виде импульсов выпихивал наружу через свободную ногу контроллера. Сколько АЦП насчитал - столько вышло импульсов. Импульсы считал частотомером, включённым в режим счёта импульсов. Напряжение на вход АЦП подавал от гальванического элемента на 1,5 вольта через делитель. Пробовал и обычный режим и "Noise Canceler". Сейчас уже не помню точно результаты. Но осталось впечатление "так себе".siamds писал(а):Позвольте с Вами не согласиться насчет точности показаний МК.
Разумеется, можно попробовать поиграться с частотой тактирования АЦП и с накоплением результатов.
Всё очень просто. Во-первых, 10 замеров - это не удобно. Удобно использовать степени двойки: 2, 4, 8, 16, 32, 64 и т.д. Почему? Потому, что на такие числа легче делить - деление заменяется побитовым сдвигом вправо.просто КОТ писал(а):в теории понял, а как осуществить нет.
Вот усреднени например. Что бы усреднить надо например 10 замеров сложить и на 10 поделить. Но!
После каждого замера регистр, ЕМНИП, обновляется -- как складывать то?!
Во-вторых, результаты преобразования надо накапливать в переменной - прибавлять к ней каждый раз результат. Как накопится нужное количество - поделить её на это самое количество.
Вот возможный вариант кода для 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; // обнуляем нашу переменную перед следующим накоплением
}
}Re: АЦП. Разбор полётов
Код: Выделить всё
Потому, что на такие числа легче делить - деление заменяется побитовым сдвигом вправо.Но иногда проще умножить , чем разделить. Так например сумма 128 отсчётов ( значений) при умножении на 2 даёт тоже самое значение , что и деление этой суммы на 128.
- просто КОТ
- Друг Кота
- Сообщения: 12364
- Зарегистрирован: Пт дек 17, 2010 15:07:50
- Откуда: Крымский Федеральный Округ
- Контактная информация:
Re: АЦП. Разбор полётов
Вот уважаю я тебя Барсик -- умеешь нормально объяснить!
Кстати, по поводу прерываний -- это значит надо их ещё разрешить. Пойду читать даташит.
И ещё -- ты сказал, что прерывание от таймера, а написал в коде, что от АЦП. Это опечатка, или я что-то не понял?!
Кстати, по поводу прерываний -- это значит надо их ещё разрешить. Пойду читать даташит.
И ещё -- ты сказал, что прерывание от таймера, а написал в коде, что от АЦП. Это опечатка, или я что-то не понял?!
- Аlex
- Модератор
- Сообщения: 4614
- Зарегистрирован: Чт мар 18, 2010 23:09:57
- Откуда: Планета Земля
- Контактная информация:
Re: АЦП. Разбор полётов
Это не опечатка. Запуска преобразования не наблюдается же в обработчике от АЦП.
Предполагается, что Вы будете запускать преобразование таймером с определённой периодичностью, например сделать обработчик прерывания от таймера и запускать в нём АЦП.
Но можно и воткнуть запуск в тотже обработчик, тогда он будет "тарабанить" постоянно, а Вы просто будете в любом удобном Вам месте считывать результат (adc_result). Но в этом случае, лучше выбрать самую минимальную частоту тактирования модуля АЦП (если такое возможно в атмелах), иначе обработчик будет занимать много процессорного времени, постоянно выполняясь.
Предполагается, что Вы будете запускать преобразование таймером с определённой периодичностью, например сделать обработчик прерывания от таймера и запускать в нём АЦП.
Но можно и воткнуть запуск в тотже обработчик, тогда он будет "тарабанить" постоянно, а Вы просто будете в любом удобном Вам месте считывать результат (adc_result). Но в этом случае, лучше выбрать самую минимальную частоту тактирования модуля АЦП (если такое возможно в атмелах), иначе обработчик будет занимать много процессорного времени, постоянно выполняясь.
- КРАМ
- Друг Кота
- Сообщения: 25121
- Зарегистрирован: Чт янв 10, 2008 22:01:02
- Откуда: Московская область, Фрязино
Re: АЦП. Разбор полётов
Барсик писал(а):Во-вторых, результаты преобразования надо накапливать в переменной - прибавлять к ней каждый раз результат. Как накопится нужное количество - поделить её на это самое количество.
Вообще то делают несколько по другому.
Шум младших разрядов АЦП имеет разную природу. БОльшая часть его носит чисто схемотехнический и сигнальный характер. Т.е. является ОБЪЕКТИВНЫМ результатом РЕАЛЬНОГО шума входного сигнала и помех от схемотехники устройства.
Для ФИЛЬТРАЦИИ этого шума используют цифровые ФНЧ. Т.е. программную обработку уже преобразованного сигнала.
Цифровые ФНЧ бывают ДВУХ видов: с конечной импульсной характеристикой (КИХ) и с бесконечной импульсной характеристикой (БИХ).
Первые требуют сохранения МАССИВА, а вторые рекурсивные, т.е. оперируют текущим и накопленным значениями.
Для уменьшения боковых лепестков в КИХ применяют оконные функции, т.е. массив должен быть всегда упорядочен и умножается на некоторые оконные коэффициенты (например, косинус на пъедестале).
Но к делу.
Простейший КИХ ФНЧ - это КОЛЬЦЕВОЙ БУФЕР (прямоугольное окно).
Для его формирования нужно каждое преобразование писать в буфер нужной длины просто по кольцу (инкрементируя указатель по кругу). И ПОСЛЕ КАЖДОГО ИЗМЕРЕНИЯ, после занесения очередного измерения в буфер, находится сумма всех элементов массива-буфера и делится на длину буфера (сдвигом или делением, зависит от выбранной длины).
Таким образом результат фильтрации будет на выходе с частотой преобразования, НО С ЗАДЕРЖКОЙ на длину буфера.
Полоса пропускания такого ФНЧ (основной лепесток) будет равна 1/Т, где Т - длина буфера на временной оси.
Re: АЦП. Разбор полётов
Вообще-то запустить ADC в этой тиньке можно используя 7 прерываний . При этом не требуется команда запуска ADC в обработчиках прерываний , все произойдёт автоматически. А уж читать результат преобразования или нет - дело третьеесли такое возможно в атмелах

