реклама на сайте
подробности

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> АЦП в ATMega8: 8 бит или 10 бит?, Загадка в АЦП ATMega8 (ADC5)
kv_addr
сообщение Apr 23 2007, 16:09
Сообщение #16


Местный
***

Группа: Свой
Сообщений: 208
Регистрация: 6-07-04
Из: Полтава
Пользователь №: 279



Цитата(defunct @ Apr 23 2007, 16:04) *
Извиняюсь погорячился.. Понедельник - день тяжелый ;>

В понедельник бывает. wink.gif
Цитата(defunct @ Apr 23 2007, 16:04) *
А ДШ свежий желательно иметь всегда, особливо когда возникают спорные вопросы.

Тут - без каких-либо возражений.
Go to the top of the page
 
+Quote Post
NVade
сообщение Apr 23 2007, 16:30
Сообщение #17


Участник
*

Группа: Свой
Сообщений: 71
Регистрация: 7-07-06
Из: Новосибирск
Пользователь №: 18 652



немного не по теме, но сталкивался с ситуацией с тексасовскими ЦАПами. Как это принято имеется семейство с одинаковой цоколевкой и разрядностью 8/10/12 в зависимости от типа (и цены в геометрической прогрессии естественно). Брали 10 -разрядный, а оказалось что у него все 12 разрядов работают. Для себя объяснил что так делается по маркетинговым соображениям.
Может и здесь Atmel пытался покончить с архаичным dip'ом. Явно кристаллы одинаковые идут в разные корпуса. В том, что разрядность может в 4 раза пострадать из-за большей длины от кристалла до пина сильно сомневаюсь.
Go to the top of the page
 
+Quote Post
arttab
сообщение Apr 24 2007, 04:30
Сообщение #18


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



В старых ревизиях было 8 бит. Потом в новой ревизии стало 10 bit ADC. Ограничение по корпусам не видел, т.е. на всех корпуса 10 bit. Или я что то проглядел.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
Anjey_N
сообщение Apr 24 2007, 19:50
Сообщение #19


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Я новичок, поэтому наверное сейчас задам глупый вопрос!
Пишу прогу для вольтметра, использую Мегу16 со встроенным АЦП. Делаю 128 выборок, суммирую и затем делю на 128. Получаю результат. Мне сказали, что теперь нужно применить вычисление скользящего среднего. А как это сделать, я не знаю! Может, кто-нибудь подскажет или даст ссылку на это чудо! help.gif

Сообщение отредактировал Anjey_N - Apr 24 2007, 19:51
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 24 2007, 20:57
Сообщение #20


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Anjey_N @ Apr 24 2007, 18:50) *
Мне сказали, что теперь нужно применить вычисление скользящего среднего. А как это сделать, я не знаю!
Поиск по форуму по словосочетанию "скользящее среднее" дает несколько результатов, уже не говоря о том, сколько результатов на такое же словосочетание дает google.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
arttab
сообщение Apr 25 2007, 05:27
Сообщение #21


Профессионал
*****

Группа: Свой
Сообщений: 1 432
Регистрация: 7-12-04
Из: Новосибирск
Пользователь №: 1 371



я делал простое усреднение так:
Xi = (Xi + Xi+1) / 2
Xi+1 результат нового измерения
только частоты выборок должна быть больше скорости изменения сигнала иначе фигня получиться.
в общем вмде можно так записать:
Xi = (k/n)*Xi + (p/n)*Xi+1
от коэффициентов будет зависеть скорость приближения к устоявшемуся значению.


--------------------
OrCAD, Altium,IAR, AVR....
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Apr 25 2007, 11:19
Сообщение #22


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Anjey_N @ Apr 24 2007, 19:50) *
Я новичок, поэтому наверное сейчас задам глупый вопрос!
Пишу прогу для вольтметра, использую Мегу16 со встроенным АЦП. Делаю 128 выборок, суммирую и затем делю на 128. Получаю результат. Мне сказали, что теперь нужно применить вычисление скользящего среднего. А как это сделать, я не знаю! Может, кто-нибудь подскажет или даст ссылку на это чудо! help.gif

Делаете кольцевой массив на количество выборок и переменную для суммы.
С каждой новой выборкой вычитаете из суммы самое старое значение из массива, пишете на его место значение выборки, прибавляете к сумме значение выборки и делите сумму на количество элементов в массиве (константа).
Как проинициализировать массив решайте сами.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 26 2007, 00:52
Сообщение #23


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Anjey_N @ Apr 24 2007, 18:50) *
Мне сказали, что теперь нужно применить вычисление скользящего среднего. А как это сделать, я не знаю!


Пример скользящего усреднения по 16-ти точкам (без использования массивов)

Код
int UpdateAverage( int CurrVal )
{
    static int Sum = 0;
    int tmp = (Sum + (16 >> 1)) >> 4; // среднее = (Sum + n/2) / n, где n = 16
    Sum += CurrVal - tmp;
    return tmp;
}



<Усредненное значение АЦП> = UpdateAverage( <Текущее значение АЦП> );
Go to the top of the page
 
+Quote Post
Snaky
сообщение Apr 26 2007, 06:56
Сообщение #24


Mute Beholder
***

Группа: Свой
Сообщений: 260
Регистрация: 4-04-07
Из: Третья планета от Солнца
Пользователь №: 26 754



Цитата(defunct @ Apr 26 2007, 03:52) *
Пример скользящего усреднения по 16-ти точкам (без использования массивов)

Код
int UpdateAverage( int CurrVal )
{
    static int Sum = 0;
    int tmp = (Sum + (16 >> 1)) >> 4; // среднее = (Sum + n/2) / n, где n = 16
    Sum += CurrVal - tmp;
    return tmp;
}



<Усредненное значение АЦП> = UpdateAverage( <Текущее значение АЦП> );

нерабочий примерчик-то. вызвал 16 раз функцию с аргументом CurrVal = 10, в результате получил 6. через 20 итераций получил 7. blink.gif
и вообще странный какой-то алгоритм - возвращать результат целочисленного деления (накопленной суммы + константа) на константу.

PS я всегда пользуюсь методом с кольцевым массивом, как описал IgorKossak


--------------------
Common sense is not so common.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 26 2007, 13:07
Сообщение #25


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(Snaky @ Apr 26 2007, 05:56) *
нерабочий примерчик-то. вызвал 16 раз функцию с аргументом CurrVal = 10, в результате получил 6. через 20 итераций получил 7. blink.gif

Пример рабочий. Вы дальше повызывайте.
Хотите чтоб быстрее получался рез-тат усредняйте по 8-ми или по 4-м точкам.

Цитата
и вообще странный какой-то алгоритм - возвращать результат целочисленного деления (накопленной суммы + константа)

Почитайте какую-нить книжку по усреднению прежде чем выступать.
Константа эта для устранения абсолютной погрешности в 0.5LSB при накоплении суммы.

Цитата
PS я всегда пользуюсь методом с кольцевым массивом

У вас видать памяти в МК всегда много..
Go to the top of the page
 
+Quote Post
Lepeksiy
сообщение Apr 26 2007, 13:08
Сообщение #26


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 25-04-07
Пользователь №: 27 294



В общем виде фильтрация выглядит примерно так (для чайников):

Код
// Размер массива - должен быть степенью двойки!!
#define ARRAY_SIZE 16

// Функция берет текущее значение и возвращает отфильтрованное
int GetMovingAverage(int current_value)
{
    static int filter_array[ARRAY_SIZE];
    static unsigned int index = 0;
    static int sum = 0;

    // Вычитаем удаляемое значение из суммы и прибавляем текущее
    sum += current_value - filter_array[index];
    // Вставляем текущее значение в массив
    filter_array[index] = current_value;
    // Изменяем индекс. Не забывать, что ARRAY_SIZE должен быть степенью двойки!!
    index = (index + 1) & (ARRAY_SIZE - 1);
    // Возвращаем отфильтрованное значение.
    return sum / ARRAY_SIZE;
}

Реальные типы переменных должны быть согласованы с размерностью данных. Данные считаются недостоверными, пока функция не будет вызвана ARRAY_SIZE раз.
Go to the top of the page
 
+Quote Post
VladimirYU
сообщение Apr 26 2007, 13:57
Сообщение #27


Местный
***

Группа: Свой
Сообщений: 426
Регистрация: 5-04-07
Из: Санкт-Петербург
Пользователь №: 26 782



Можно испоьзовать алгоритм апериодического звена. Строится он по принципу интегратора ( сумматора накопителя) охваченного отрицательной обратной связью. Это позволяет уйти от скользящего массива, правда требуется сумматор (интегратор) двойной длины по сравнению с длиной результатов измерений и переменная для хранения предыдущего фильтрованного результата.
Go to the top of the page
 
+Quote Post
Lepeksiy
сообщение Apr 26 2007, 17:21
Сообщение #28


Участник
*

Группа: Участник
Сообщений: 21
Регистрация: 25-04-07
Пользователь №: 27 294



VladimirYU
А как это выражается формулами?
Go to the top of the page
 
+Quote Post
Anjey_N
сообщение Apr 26 2007, 21:35
Сообщение #29


Частый гость
**

Группа: Участник
Сообщений: 80
Регистрация: 12-01-07
Из: Энергодар Украина
Пользователь №: 24 374



Цитата(Lepeksiy @ Apr 26 2007, 13:08) *
В общем виде фильтрация выглядит примерно так (для чайников):

Код
// Размер массива - должен быть степенью двойки!!
#define ARRAY_SIZE 16

// Функция берет текущее значение и возвращает отфильтрованное
int GetMovingAverage(int current_value)
{
    static int filter_array[ARRAY_SIZE];
    static unsigned int index = 0;
    static int sum = 0;

    // Вычитаем удаляемое значение из суммы и прибавляем текущее
    sum += current_value - filter_array[index];
    // Вставляем текущее значение в массив
    filter_array[index] = current_value;
    // Изменяем индекс. Не забывать, что ARRAY_SIZE должен быть степенью двойки!!
    index = (index + 1) & (ARRAY_SIZE - 1);
    // Возвращаем отфильтрованное значение.
    return sum / ARRAY_SIZE;
}

Реальные типы переменных должны быть согласованы с размерностью данных. Данные считаются недостоверными, пока функция не будет вызвана ARRAY_SIZE раз.



Спасибо, буду разбираться и учиться! w00t.gif
Go to the top of the page
 
+Quote Post
ReAl
сообщение Apr 26 2007, 23:17
Сообщение #30


Нечётный пользователь.
******

Группа: Свой
Сообщений: 2 033
Регистрация: 26-05-05
Из: Бровари, Україна
Пользователь №: 5 417



Цитата(defunct @ Apr 26 2007, 12:07) *
Пример рабочий. Вы дальше повызывайте.
Хотите чтоб быстрее получался рез-тат усредняйте по 8-ми или по 4-м точкам.

Фильтр неплохой, сам пользуюсь :-)
Но это, IMHO, не скользящее среднее.
Реакция скользящего среднего на единичный скачок - прямая линия с выходом на уровень, т.е. если у нас было "много" нулей и вдруг пошло 32, то на 16-ом значении (при скользящем усреднении окном в 16 отсчётов) на выходе уже будет 32.
А этот "экспоненциальный" фильтр имеет поведение как у RC-цепочки.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post

3 страниц V  < 1 2 3 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.03087 секунд с 7
ELECTRONIX ©2004-2016