Я МОГУ читать даташит, но я его НЕ ПОНИМАЮ! Как включит подавление шума и 8 бит?!
Кстати, я вот подумал -- если опорное напряжение будет 1.1В, то тогда больше простора -- будут пункты 550, 600, 650 и 700.
В таком случае два младших бита остаются в ADCL и становятся там старшимиzero648 писал(а):Если точность не сильно важна, можно результат АЦП прижать влево, читать только ADCH
ADMUX|=(1<<ADLAR); // Прижимаем результат АЦП влево
Это что за пункты?просто КОТ писал(а):У мя есть 4 пункта, которые надо выделить.
Это: 210, 225, 240 и 255. +-30 не катит.
режим ADC NOISE иКак включит подавление шума
... баиньки
Я МОГУ читать даташит, но я его НЕ ПОНИМАЮ!
Gudd-Head Если ещё не скачали, то обязательно скачайте себе книгу "Микроконтроллеры AVR семейства Tiny Mega фирмы Atmel" А.В.Евстифеев ,......
Проверяем. На одном из каналов АЦП выставим 3 вольта. А теперь давайте считать. Так как программа настроена на измерения 5 вольт, из этого и будем исходить. Разделив 5вольт/1023≈0,0048878 вольт на дискрету (или по Вашему выражению на единицу). Согласно Вашему утверждению результат должен отличаться на 20÷30 единиц. Умножаем 0,0048878 * 20 ≈ 0,097756, тогда показания на LCD дисплее должны быть ≈3,097вольта, если в плюс, или ≈2,902, если в минус. Но показания вольтметра и LCD дисплея совпадают и равны 3 вольта. Резюме…?Барсик писал(а): Если максимальное значение, которое можно получить 1023, то результат болтается где-то на 20 - 30 единиц.
Для его диапазона младшие можно выбросить , но и оставшиеся можно усреднить , что тоже повысит точность и избавит от лишнего шума.Аlex писал(а):просто КОТ, а я ведь не зря Вам объяснял как уменьшить шум младших бит с помощью усреднения, а Вы мой пост проигнорировали
Вы, конечно, можете не соглашаться. Я тёмный кот - Протеусом пользоваться не умею. Я смотрел на реальном железе - ATtiny13, опорное напряжение АЦП от внутреннего источника 1,1 вольт. Результат преобразования в виде импульсов выпихивал наружу через свободную ногу контроллера. Сколько АЦП насчитал - столько вышло импульсов. Импульсы считал частотомером, включённым в режим счёта импульсов. Напряжение на вход АЦП подавал от гальванического элемента на 1,5 вольта через делитель. Пробовал и обычный режим и "Noise Canceler". Сейчас уже не помню точно результаты. Но осталось впечатление "так себе".siamds писал(а):Позвольте с Вами не согласиться насчет точности показаний МК.
Всё очень просто. Во-первых, 10 замеров - это не удобно. Удобно использовать степени двойки: 2, 4, 8, 16, 32, 64 и т.д. Почему? Потому, что на такие числа легче делить - деление заменяется побитовым сдвигом вправо.просто КОТ писал(а):в теории понял, а как осуществить нет.
Вот усреднени например. Что бы усреднить надо например 10 замеров сложить и на 10 поделить. Но!
После каждого замера регистр, ЕМНИП, обновляется -- как складывать то?!
Код: Выделить всё
#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; // обнуляем нашу переменную перед следующим накоплением
}
}Код: Выделить всё
Потому, что на такие числа легче делить - деление заменяется побитовым сдвигом вправо.Вообще то делают несколько по другому.Барсик писал(а): Во-вторых, результаты преобразования надо накапливать в переменной - прибавлять к ней каждый раз результат. Как накопится нужное количество - поделить её на это самое количество.
Вообще-то запустить ADC в этой тиньке можно используя 7 прерываний . При этом не требуется команда запуска ADC в обработчиках прерываний , все произойдёт автоматически. А уж читать результат преобразования или нет - дело третьеесли такое возможно в атмелах