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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> нестабильность показаний АЦП, нестабильность показаний АЦП
ViKo
сообщение Sep 27 2012, 08:57
Сообщение #16


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(ReAl @ Sep 27 2012, 11:47) *
Ну так это и есть переход к фиксированной точке 8.8
Но большой запас разрядности плюс заметная фильтрация уже выталкивают в 32 бита даже при 8-битных входных значениях. Так что надо смотреть по месту, где-то я комбинировал и запас разрядности, и проверку куда округлять.

Для 8-разрядного входного числа и 8-разрядных коэффициентах размерности 8.8 хватит гарантированно. Можно проверить на вашей же программе. А промежуточные вычисления делать 24-битовыми. XX.XX * .NN = ZZ.ZZZZ

upd. добавил подчеркнутое
Go to the top of the page
 
+Quote Post
drvlas
сообщение Sep 27 2012, 09:39
Сообщение #17


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 3-09-10
Пользователь №: 59 263



Цитата(ReAl @ Sep 27 2012, 10:53) *
«Ну кто так строит!»™
Нельзя в целых числах просто так «взять и поделить»
...
Конечно, если считать во всяких электронных таблицах или в самописных программах в плавучке, то этого не видно.

Ну, если это камень в огород автора той заметки на Easyelectronics, то отвечу. Автор пользуется описанным подходом с середины 80-х и обычно как раз в целочисленной арифметике. Так что эффект потери точности при делении ему известен. И он легко устраняется сохранением неделенного результата.
В обсуждении той заметки была приведена даже реализация фильтра на Си.
Код
int filter(int x, int Na, int k){
static int y = 0, z = 0;
z += (x — y);
return y = Na * z >> k;
};

Увы, переделка статьи, в которой должен был быть учтен этот пробел, была отложена.
Так что спасибо за напоминание! Доработаем-с!
Go to the top of the page
 
+Quote Post
xemul
сообщение Sep 27 2012, 09:59
Сообщение #18



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Даже с сохранением неделённого результата так
Код
return y = (Na * z + (1<<(k-1))) >> k;

будет корректнее.
Go to the top of the page
 
+Quote Post
drvlas
сообщение Sep 27 2012, 10:20
Сообщение #19


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 3-09-10
Пользователь №: 59 263



Да, конечно, симметричное округление. Это правильно.
Но я обычно в промежуточных вычислениях работаю с запасом по разрешающей способности. Поэтому там округлением не занимаюсь. А только в конце, может быть, проделаю такое добавление половинки единицы дискретности.
Например, с АЦП идет много разрядов, младшие пляшут (собсно, зачем и усредняем), мы пускаем все это в обработку, не заботясь о мелочи, полразряда. А когда уж на индикатор выводится значение, которое должно быть стабильным, которое имеет определенную дискретность (не взятую с потолка) - вот тогда и есть смысл прибавить половинку.

В статье поправил. Еще раз спасибо коллеге ReAl. Да, и оговорился там, что от диапазона входных величин x, Na и k зависит и выбор z. В указанном примере лучше сразу объявить long z. Что скажете?

Сообщение отредактировал drvlas - Sep 27 2012, 10:21
Go to the top of the page
 
+Quote Post
xemul
сообщение Sep 27 2012, 10:32
Сообщение #20



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(drvlas @ Sep 27 2012, 14:20) *
Что скажете?

Скажу, что при равномерном распределении (k-1)-го разряда методическая погрешность (y = Na * z >> k) за N вызовов filter() составит N*(1<<(k-1))/2.

UPD: нет, меньше, но лень предел считать в уме.
Go to the top of the page
 
+Quote Post
Tanya
сообщение Sep 27 2012, 10:48
Сообщение #21


Гуру
******

Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(xemul @ Sep 27 2012, 14:32) *
Скажу...

Я тоже хочу сказать, что как бы ни были (при)увлекательны формулы и числа, надо сначала посмотреть на реальную правду в глазах.
Если имеется наводка, то от нее нужно избавляться в зародыше, чтобы потом не морочиться с числами.
Вот если есть наводка, а автор хочет измерять от нуля, то вблизи нуля никакие числовые фильтры не помогут.
И вблизи максимума... Поэтому нужно отфильтровать на входе аналоговым фильтром и сместить и сжать шкалу.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 27 2012, 11:19
Сообщение #22


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Tanya @ Sep 27 2012, 13:48) *
вблизи нуля никакие числовые фильтры не помогут.
И вблизи максимума...

Например, берем скользящее среднее. Если встречаются помехи-импульсы относительно сигнала-нуля, они тоже усреднятся. Не вижу причин для беспокойства. Ну, приподнимется чуть-чуть результат. Так надо же соображать, чтобы диапазон измеряемого сигнала (вместе с помехами, мы же не детектор-выпрямитель проектируем) укладывался в диапазон АЦП.
Go to the top of the page
 
+Quote Post
drvlas
сообщение Sep 27 2012, 11:29
Сообщение #23


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 3-09-10
Пользователь №: 59 263



Цитата(Tanya @ Sep 27 2012, 13:48) *
Если имеется наводка, то от нее нужно избавляться в зародыше, чтобы потом не морочиться с числами.

И верно, и нет.
Да, нужно подходить комплексно и не стараться вытянуть ЦОС грубые недоработки в проектировании платы.
Нет, ибо с числами можно не морочиться, а значительно улучшить результаты. Весь мир так делает. Почему нам отказываться?

Давайте конкретнее.
Цитата(Tanya @ Sep 27 2012, 13:48) *
Вот если есть наводка, а автор хочет измерять от нуля, то вблизи нуля никакие числовые фильтры не помогут.
Вблизи нуля помогут. Нужно правильно выбирать диапазон работы АЦП, вот и все. Впрочем, коллега ViKo уже сказал об этом.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 27 2012, 11:54
Сообщение #24


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Можно и аналогию из аналоговой схемотехники привести. Если помехи у нас есть ниже нуля скачут, то фильтром на ОУ, запитанным от положительного питания, мы их тоже не отфильтруем.
Go to the top of the page
 
+Quote Post
endasm
сообщение Sep 27 2012, 13:44
Сообщение #25


Участник
*

Группа: Участник
Сообщений: 40
Регистрация: 9-07-12
Пользователь №: 72 673



А применение rail to rail ОУ даст мне на 10 битном АЦП полный ноль и полные 5 v ? ( шаг АЦП 0,0048 v)

Сообщение отредактировал endasm - Sep 27 2012, 13:47
Go to the top of the page
 
+Quote Post
ReAl
сообщение Sep 27 2012, 17:09
Сообщение #26


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

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



Цитата(drvlas @ Sep 27 2012, 12:39) *
В обсуждении той заметки была приведена даже реализация фильтра на Си.
...
Увы, переделка статьи, в которой должен был быть учтен этот пробел, была отложена.
Да вот я как-то, пардон, комментарии читать начал, но далеко не зашёл :-)
«Увы, ... отложена» близко и понятно :-(

Этот фильтр дотягивать будет и (с учётом замечания по симметризации округления) явно лучше.
Только такое впечатление, что, в терминологии исходной заметки, в нём не Na должно быть, а Nb.
Точнее, и ни то, и ни другое, так как фильтр уже другой, но Nb (малое по сравнению с делителем) по смыслу ближе.
По крайней мере если брать по статье Na=248 (30-кратное превышение влияния фильтрованного значения перед новым отсчетом), то в этот фильтр никак нельзя 248 ставить, он с таким коэффициентом при ступеньке даже в сотни квантов в несколько прыжков выйдет на заданное значение, а не в многие десятки.


Цитата(endasm @ Sep 27 2012, 16:44) *
А применение rail to rail ОУ даст мне на 10 битном АЦП полный ноль и полные 5 v ? ( шаг АЦП 0,0048 v)
Смотрите документацию на ОУ. RR может считаться уже когда он, скажем, милливольт пятдесят или сто от шины работает. А не пять.
Да и свой сигнал до нуля и опорного я чтараюсь и не рассчитывать, у АЦП свои ошибки есть. Если надо, подставку небольшую делаю. В том числе чтобы шумы/наводки при ограничении об шину не давали смещение сигнала после фильтрации.


--------------------
Ну, я пошёл… Если что – звоните…
Go to the top of the page
 
+Quote Post
drvlas
сообщение Sep 27 2012, 18:04
Сообщение #27


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 3-09-10
Пользователь №: 59 263



Цитата(ReAl @ Sep 27 2012, 20:09) *
Да вот я как-то, пардон, комментарии читать начал, но далеко не зашёл :-)
"но далеко не зашел" близко и понятно sm.gif

Цитата(ReAl @ Sep 27 2012, 20:09) *
Только такое впечатление, что, в терминологии исходной заметки, в нём не Na должно быть, а Nb.
Ай-ай-ай! Это была ошибка. Уже устранил. Огромное спасибо!
Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 28 2012, 05:13
Сообщение #28


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(drvlas @ Sep 27 2012, 12:39) *
Так что эффект потери точности при делении ему известен. И он легко устраняется сохранением неделенного результата.
В обсуждении той заметки была приведена даже реализация фильтра на Си.
...

То есть, вместо хранения Y в форме целой и дробной частей (которые, в принципе, можно обе использовать для выдачи - получаем увеличение разрядности, о котором говорится на каждом микроконтроллерном сайте) вы будете хранить Y (целую часть? или не хранится?) и Z (целую и дробную части). И в чем выигрыш? В уменьшении умножений - вместо двух - одно? Так если брать Nb как степень двойки, можно одними сдвигами и сложениями обойтись.
А именно, например для Nb = 16 - из Y вычитаем 1/16 часть, а X уменьшаем в 16 раз, и добавляем к Y.
Go to the top of the page
 
+Quote Post
drvlas
сообщение Sep 28 2012, 06:14
Сообщение #29


Участник
*

Группа: Участник
Сообщений: 50
Регистрация: 3-09-10
Пользователь №: 59 263



Цитата(ViKo @ Sep 28 2012, 08:13) *
То есть, вместо хранения Y в форме целой и дробной частей (которые, в принципе, можно обе использовать для выдачи - получаем увеличение разрядности, о котором говорится на каждом микроконтроллерном сайте) вы будете хранить Y (целую часть?) и Z (целую и дробную части). И в чем выигрыш?

Спасибо, что заметили: сохранять Y вовсе не обязательно. Я поленился еще раз переделывать код, так как это мелочь, что она объявлена статической. Если уж Вам очень хочется, чтобы все используемые переменные имели одинаковую размерность, то считайте, что у Z есть целая и дробная часть. Мой скромный, но очень практический опыт работы с целочисленной арифметикой говорит о том, что нужно хорошенько разбираться с размерностью на этапе проектирования математики. Когда модель, формулы построены, то в реализации уже не так важно, где стоит запятая (точка). Поэтому я считаю все переменные целыми (как их и обрабатывает МК) и редко говорю "фиксированная точка", а чаще "целочисленная арифметика".

Пример: умножаем ЧИСЛО1 * ЧИСЛО2. Оба целые однобайтные. Результат ЧИСЛО3 - двухбайтное целое. Прекрасно.
ЧИСЛО1 - однобайтовое целое
ЧИСЛО2 - однобайтовое целое
ЧИСЛО3 - двухбайтовое целое
Можно объявить вообще все эти числа ИНТами или ЛОНГами. Никаких запятых.

Теперь нам захотелось результат иметь такого же масштаба, что и ЧИСЛО1. Хорошо, можете считать, что у ЧИСЛА2 запятая отделяет 8 бит дробной части. Тогда
ЧИСЛО1 - честно однобайтовое целое
ЧИСЛО2 - однобайтовое дробное
ЧИСЛО3 - двухбайтовое с целой и дробной частью.
Как на мой взгляд, то первый вариант проще для восприятия. Но на вкус и цвет...

Цитата(ViKo @ Sep 28 2012, 08:13) *
Так если брать Nb как степень двойки, можно одними сдвигами и сложениями обойтись.
А именно, например для Nb = 16 - из Y вычитаем 1/16 часть, а X уменьшаем в 16 раз, и добавляем к Y.

Вы немного не дочитали статью sm.gif Она, собственно, посвящена тому, как можно легко и просто найти Nb по заданным характеристикам фильтра (а именно: по времени отклика на ступенчатое воздействие). Поэтому уж такой свободы в выборе Nb у нас нет. Ну, частный случай может быть, что Nb = 16, но я считал более важным обеспечить Na+Nb=256 или иная степень двойки, чтобы деления не было.

Go to the top of the page
 
+Quote Post
ViKo
сообщение Sep 28 2012, 06:20
Сообщение #30


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(drvlas @ Sep 28 2012, 09:14) *
Вы немного не дочитали статью sm.gif Она, собственно, посвящена тому, как можно легко и просто найти Nb по заданным характеристикам фильтра (а именно: по времени отклика на ступенчатое воздействие). Поэтому уж такой свободы в выборе Nb у нас нет. Ну, частный случай может быть, что Nb = 16, но я считал более важным обеспечить Na+Nb=256 или иная степень двойки, чтобы деления не было.

Я не читал вдумчиво, но ваш путь выбора фильтра разглядел. Однако, ради простоты фильтра я не стал бы заморачиваться получением точного времени отклика. Уверен, в большинстве случаев так и надо поступать.
Я пишу не про форму представления числа. А про лишнюю сущность - переменную Z.
Na + Nb = 256 можно (и нужно) обеспечивать и при Nb - степени двойки. Na мы вообще не будем использовать, я написал выше, как это получается.
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 Текстовая версия Сейчас: 19th July 2025 - 19:09
Рейтинг@Mail.ru


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