ADCX

preview_player
Показать описание
Считывание среднего значения с АЦП за N выборок в секунду с помощью скользящего среднего и таймера для Atmega168/328.

Рекомендации по теме
Комментарии
Автор

Я честно старался понять, как из буфера со значениями АДЦ вычитается старое значение и прибавляется новое, но так и не понял.
А так канал очень нравится 👍, спасибо Вам за ваши труды.

Bvv
Автор

Очень понравилось. Какие все таки открываются возможности если копнуть глубже. Очень было бы здорово сделать урок (можно на примере этого скетча) как работать с регистрами? Как выуживать и правильно применять инфу из даташита? Как правильно записать? Некоторые строки для меня (любителя) как магия :)

Serionia
Автор

Канал отличный!! Много информации по существу. Спасибо.
Просьба помочь в одном вопросе: пытаюсь реализовать пример из даташит на atmega16(32) для дифференциального режима ADC в PROTEUS ( ADMUX = 0xED (ADC3 - ADC2, 10x gain, 2.56V reference, left adjusted result) Voltage on ADC3 is 300 mV, voltage on ADC2 is 500 mV. //page 213// ) .
Проблема в том, что результат измерения = 0 (не соответствует даташиту), но если поменять местами входные напряжения, то ответ в регистре ADC будет верным, но в обычном представлении (0x00 = ADC2=300mV, 0x3FF = 300mV+2.56V ), без намека на "two’s complement form".
Дело в Протеусе или в даташите? Или в принципе не измерить отрицательную дельту напряжений? Спасибо.

dickarrow
Автор

Извините, я смотрел с перемоткой, но почему бы не использовать метод классической скользящей средней Sredn = Sredn *(1-k)+ADC_DR*k, где К коэффициент фильтрации(сглаживания, усреднения?.

ark_dd
Автор

Цифровой микрофон подобными методами считается? Очень хочется увидеть прикладное решение.

АлександрЗаг-мо
Автор

Здравствуйте.
Подскажите пожалуйста, а чтобы нечто подобное сделать на Attiny13A (может выборку значительно меньше и т.п.), ей хватит ресурсов, таймеров и т.д.?
Возможно, там действительно будет затыка по возможности использования нужного таймера и вообще скорее всего просто по объёму флеш (1 Кб) под скетч.. Но я просто не смогу сам себе ответить на этот вопрос пока ещё из-за недостаточности знаний/понимания. :(
Спасибо.
Я из оленекодеров, которые пытаются что-то большее понять по примерам и не только. На тиньке пытаюсь сделать некий преобразователь аналогового сигнала в другой аналоговый с задержкой фронта при росте, степень которой зависит ещё и от уровня за некий предшествующий период.
В принципе, у меня даже получилось на данный момент, но сглаживание реализуется лишь с использованием одного предыдущего показания, поскольку приёмы со сдвигом индекса, буферами и прочим, мне пока не подвластны.. Сможете ответить на первый вопрос о возможности?
Спасибо, если потратите время.

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

NyyphoHerr-D-panorama
Автор

Так не проще?
#define FILTER_STEP 5

#define FILTER_COEF 0.05

int val;

float val_f;

unsigned long filter_timer;

void setup() {

Serial.begin(9600);

}

void loop() {

if (millis() - filter_timer > FILTER_STEP) {

filter_timer = millis(); // просто таймер

// читаем значение (не обязательно с аналога, это может быть ЛЮБОЙ датчик)

val = analogRead(0);

// основной алгоритм фильтрации. Внимательно прокрутите его в голове, чтобы понять, как он работает

val_f = val * FILTER_COEF + val_f * (1 - FILTER_COEF);

// для примера выведем в порт

Serial.println(val_f);

}

}

Bvv