|
|
  |
нестабильность показаний АЦП, нестабильность показаний АЦП |
|
|
|
Sep 27 2012, 09:39
|
Участник

Группа: Участник
Сообщений: 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; }; Увы, переделка статьи, в которой должен был быть учтен этот пробел, была отложена. Так что спасибо за напоминание! Доработаем-с!
|
|
|
|
|
Sep 27 2012, 09:59
|
    
Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731

|
Даже с сохранением неделённого результата так Код return y = (Na * z + (1<<(k-1))) >> k; будет корректнее.
|
|
|
|
|
Sep 27 2012, 10:20
|
Участник

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

|
Да, конечно, симметричное округление. Это правильно. Но я обычно в промежуточных вычислениях работаю с запасом по разрешающей способности. Поэтому там округлением не занимаюсь. А только в конце, может быть, проделаю такое добавление половинки единицы дискретности. Например, с АЦП идет много разрядов, младшие пляшут (собсно, зачем и усредняем), мы пускаем все это в обработку, не заботясь о мелочи, полразряда. А когда уж на индикатор выводится значение, которое должно быть стабильным, которое имеет определенную дискретность (не взятую с потолка) - вот тогда и есть смысл прибавить половинку.
В статье поправил. Еще раз спасибо коллеге ReAl. Да, и оговорился там, что от диапазона входных величин x, Na и k зависит и выбор z. В указанном примере лучше сразу объявить long z. Что скажете?
Сообщение отредактировал drvlas - Sep 27 2012, 10:21
|
|
|
|
|
Sep 27 2012, 10:48
|
Гуру
     
Группа: Модераторы
Сообщений: 8 752
Регистрация: 6-01-06
Пользователь №: 12 883

|
Цитата(xemul @ Sep 27 2012, 14:32)  Скажу... Я тоже хочу сказать, что как бы ни были (при)увлекательны формулы и числа, надо сначала посмотреть на реальную правду в глазах. Если имеется наводка, то от нее нужно избавляться в зародыше, чтобы потом не морочиться с числами. Вот если есть наводка, а автор хочет измерять от нуля, то вблизи нуля никакие числовые фильтры не помогут. И вблизи максимума... Поэтому нужно отфильтровать на входе аналоговым фильтром и сместить и сжать шкалу.
|
|
|
|
|
Sep 27 2012, 11:29
|
Участник

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

|
Цитата(Tanya @ Sep 27 2012, 13:48)  Если имеется наводка, то от нее нужно избавляться в зародыше, чтобы потом не морочиться с числами. И верно, и нет. Да, нужно подходить комплексно и не стараться вытянуть ЦОС грубые недоработки в проектировании платы. Нет, ибо с числами можно не морочиться, а значительно улучшить результаты. Весь мир так делает. Почему нам отказываться? Давайте конкретнее. Цитата(Tanya @ Sep 27 2012, 13:48)  Вот если есть наводка, а автор хочет измерять от нуля, то вблизи нуля никакие числовые фильтры не помогут. Вблизи нуля помогут. Нужно правильно выбирать диапазон работы АЦП, вот и все. Впрочем, коллега ViKo уже сказал об этом.
|
|
|
|
|
Sep 27 2012, 13:44
|
Участник

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

|
А применение rail to rail ОУ даст мне на 10 битном АЦП полный ноль и полные 5 v ? ( шаг АЦП 0,0048 v)
Сообщение отредактировал endasm - Sep 27 2012, 13:47
|
|
|
|
|
Sep 27 2012, 17:09
|

Нечётный пользователь.
     
Группа: Свой
Сообщений: 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 может считаться уже когда он, скажем, милливольт пятдесят или сто от шины работает. А не пять. Да и свой сигнал до нуля и опорного я чтараюсь и не рассчитывать, у АЦП свои ошибки есть. Если надо, подставку небольшую делаю. В том числе чтобы шумы/наводки при ограничении об шину не давали смещение сигнала после фильтрации.
--------------------
Ну, я пошёл… Если что – звоните…
|
|
|
|
|
Sep 27 2012, 18:04
|
Участник

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

|
Цитата(ReAl @ Sep 27 2012, 20:09)  Да вот я как-то, пардон, комментарии читать начал, но далеко не зашёл :-) "но далеко не зашел" близко и понятно  Цитата(ReAl @ Sep 27 2012, 20:09)  Только такое впечатление, что, в терминологии исходной заметки, в нём не Na должно быть, а Nb. Ай-ай-ай! Это была ошибка. Уже устранил. Огромное спасибо!
|
|
|
|
|
Sep 28 2012, 05:13
|

Универсальный солдатик
     
Группа: Модераторы
Сообщений: 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.
|
|
|
|
|
Sep 28 2012, 06:14
|
Участник

Группа: Участник
Сообщений: 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. Вы немного не дочитали статью  Она, собственно, посвящена тому, как можно легко и просто найти Nb по заданным характеристикам фильтра (а именно: по времени отклика на ступенчатое воздействие). Поэтому уж такой свободы в выборе Nb у нас нет. Ну, частный случай может быть, что Nb = 16, но я считал более важным обеспечить Na+Nb=256 или иная степень двойки, чтобы деления не было.
|
|
|
|
|
Sep 28 2012, 06:20
|

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

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