Регистрация | Вход
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
Страница 1 из 212»
Модератор форума: ivan_fd 
Форум Picbasic.ru » Программирование МК » PicBasicPro » усреднение 16 битных данных в АЦП
усреднение 16 битных данных в АЦП
vsky Дата: Пт, 09.01.2009, 19:06  |                                                                                                                Сообщение # 1
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 41
Репутация: 0   ±
Замечания:   ±
На сайте с 23.09.2008

Статус: Offline

Собственно вопрос, как усреднять 16 битные отсчёты с АЦП средствами PBP?
Необходимо просуммировать 5...10 отсчётов и разделить на количество отсчётов, без потери точности.

Заранее благодарен за ответы.

ЯНДЕКС Дата: 09.01.2009
demanik Дата: Пт, 09.01.2009, 19:47  |                                                                                                                Сообщение # 2
Группа: Модераторы
Ранг:  Помогаю всем
Сообщений: 451
Репутация: 10   ±
Замечания:   ±
На сайте с 11.12.2007

Статус: Offline

О какой точности идет речь ???
АЦП возвращает данные при максимальном разрешении от 0 до 1023. суммируйте 10 замеров у Вас все помещается в переменную WORD потом делите на 10 и в результате среднее. А с ним потом делаем что нужно.


Попробуй всё и вся... может быть пол...

vsky Дата: Пн, 12.01.2009, 14:36  |                                                                                                                Сообщение # 3
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 41
Репутация: 0   ±
Замечания:   ±
На сайте с 23.09.2008

Статус: Offline

АЦП-внешний AD7705. Но это не принципиально. Вопрос стоит именно об усреднении 16битных выборок cry
ADMIN Дата: Пн, 12.01.2009, 18:01  |                                                                                                                Сообщение # 4
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1109
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Можно так:
Code

Word1 = (Word1 + Word2)/2 '
Word1 = (Word1 + Word3)/2 '
Word1 = (Word1 + Word4)/2 '
Word1 = (Word1 + Word5)/2 '
Word1 = (Word1 + Word6)/2 '
Word1 = (Word1 + Word7)/2 '
Word1 = (Word1 + Word8)/2 '
Word1 = (Word1 + Word9)/2 '
Word1 = (Word1 + Word10)/2 '

Но можно проще:

Code

    wordIn  var word[10] 'массив из десяти переменных типа Word
    i var byte ' Переменная - счетчик
       
    for i = 2 to 10                    ' 10 раз складываем результаты    
    wordin[1] = (wordin[1] + wordin[i])/2      ' усреднения в переменную WordIn[1]
    next i
    ' В итоге в WordIn[1] усредненное значение десяти измерений

holyuser Дата: Пн, 12.01.2009, 19:27  |                                                                                                                Сообщение # 5
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 246
Репутация: 5   ±
Замечания:   ±
На сайте с 12.12.2007

Статус: Offline

Предлагаемые выше варианты неприменимы, хотя бы из-за того, что еще при сложении первых двух
word's возможно превышение максимально допустимого значения результата, который не может принять
значение большее чем word.

Найти среднее арифметическое значение нескольких (n<255) переменных типа word, не выходя за рамки
возможных значений (65535) в любом случае, можно следующим способом:

sum_1 var word 'вспомагательные переменные
sum_2 var word
average var word 'результат

sum_1 = word_1.highbyte + word_2.highbyte + word_3.highbyte + word_n.highbyte
sum_2 = word_1.lowbyte + word_2.lowbyte + word_3.lowbyte + word_n.lowbyte
average.highbyte = sum_1 / n
average.lowbyte = sum_1 // n
average = average + sum_2 / n

vsky Дата: Вт, 13.01.2009, 11:14  |                                                                                                                Сообщение # 6
Группа: Проверенные
Ранг:  Пытаюсь разобраться
Сообщений: 41
Репутация: 0   ±
Замечания:   ±
На сайте с 23.09.2008

Статус: Offline

holyuser, огромное спасибо.

буду пробовать. smile

ADMIN Дата: Ср, 14.01.2009, 04:10  |                                                                                                                Сообщение # 7
Администратор
Группа: Администраторы
Ранг:  Специалист
Сообщений: 1109
Репутация: 24   ±
Замечания:   ±
На сайте с 20.08.2007

Статус: Offline

Да, опрометчиво заявил. И на старуху бывает проруха
Alex Дата: Пт, 23.01.2009, 02:36  |                                                                                                                Сообщение # 8
Группа: Удаленные
Ранг: 
Сообщений:
Репутация:   ±
Замечания:   ±
На сайте с

Статус:

holyuser А не легче ли поделить на 2 каждое значение и сложить ?

Выражение
Word = (Word1 + Word2)/2
Равносилно выражению
Word = Word1 / 2 + Word2 / 2

И не будет никаких переполнений smile

В вашем примере усредняються полубайты и код получаеться слишком грамозким и долговыполнимым. Адолгое выполнение и большая занимаемость области програмной памяти не есть гуд для реализации каких то задач.
И это понимет программист тогда, когда начинает писать серьёзные программы, а к этому все придут и начинать правильно минимизировать код и увеличивать скорость выполнение кода нужно с начала, дабы потом не затыкаться на проблемах.

Сообщение отредактировал Alex - Пт, 23.01.2009, 02:38
holyuser Дата: Пт, 23.01.2009, 02:51  |                                                                                                                Сообщение # 9
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 246
Репутация: 5   ±
Замечания:   ±
На сайте с 12.12.2007

Статус: Offline

Quote (Alex)
holyuser А не легче ли поделить на 2 каждое значение и сложить ?

Ну, Вы Alex, даете!

Конечно легче было бы: Word = (Word1 + Word2)/2

но

к несчастью, еще при сложении Word1 с Word2, может произойти переполнение, а потом что?

Добавлено (23.01.2009, 2:51:06)
---------------------------------------------

Quote (Alex)
Выражение
Word = (Word1 + Word2)/2
Равносилно выражению
Word = Word1 / 2 + Word2 / 2

А здесь я в Вами, пожалуй, не соглашусь, Вы о потере точности, случайно, не забыли?

Alex Дата: Пт, 23.01.2009, 03:34  |                                                                                                                Сообщение # 10
Группа: Удаленные
Ранг: 
Сообщений:
Репутация:   ±
Замечания:   ±
На сайте с

Статус:

Quote
может произойти переполнение, а потом что?

Да ничего. Для этого придуманы флаги переполнения. Смело складываем два байта, делим пополам, и заменяем старший бит результата на наш флаг.
holyuser Дата: Пт, 23.01.2009, 03:51  |                                                                                                                Сообщение # 11
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 246
Репутация: 5   ±
Замечания:   ±
На сайте с 12.12.2007

Статус: Offline

Ну а тогда как будут обстоять дела с громоздким и долговыполнимым кодом?
Alex Дата: Пт, 23.01.2009, 03:59  |                                                                                                                Сообщение # 12
Группа: Удаленные
Ранг: 
Сообщений:
Репутация:   ±
Замечания:   ±
На сайте с

Статус:

А что сдесь громозкого ?
Сложил (1 операция), поделил на 2 (1 операция) и заменил бит (2 операции).
Использовано 4 переменных и 4 операции.

В вашем случае:
Выделил 2 младших полубайта (2 операции), поделил на 2 (1), выделил 2 старших полубайта (2 операции), поделил на 2 (1), сложил (1).
Использовано 7 переменных и 7 операций. И это ещё не ивестно как он будет выделять полубайты.

Сообщение отредактировал Alex - Пт, 23.01.2009, 04:09
holyuser Дата: Пт, 23.01.2009, 04:06  |                                                                                                                Сообщение # 13
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 246
Репутация: 5   ±
Замечания:   ±
На сайте с 12.12.2007

Статус: Offline

Quote (holyuser)
А что сдесь громозкого ?

А Вы напишите это все на PBP, прокомпилируйте и будет Вам ответ.

Alex Дата: Пт, 23.01.2009, 04:12  |                                                                                                                Сообщение # 14
Группа: Удаленные
Ранг: 
Сообщений:
Репутация:   ±
Замечания:   ±
На сайте с

Статус:

Ну значит этот компиль не пригоден к использованию smile Раз вы такого мнения о нём.
Ещё и не известно как он будет выделять полубайты. Может сдвигать байт начнёт biggrin
holyuser Дата: Пт, 23.01.2009, 04:18  |                                                                                                                Сообщение # 15
Группа: Проверенные
Ранг:  Могу и подсказать
Сообщений: 246
Репутация: 5   ±
Замечания:   ±
На сайте с 12.12.2007

Статус: Offline

Я о компиляторе PBP ничего плохого не могу сказать, в нем все известно и предсказуемо.
А Вы позадумайтесь, как предложенным Вами способом можно найти среднее значение, например,
250 выборок типа word и какая при этом у Вас получится ошибка?
Форум Picbasic.ru » Программирование МК » PicBasicPro » усреднение 16 битных данных в АЦП
Страница 1 из 212»
Поиск: