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

 
 
> Усреднение значений энкодера, Как посчитать среднее около нуля?
Corvus
сообщение Jun 14 2013, 17:33
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 771
Регистрация: 24-04-08
Из: Зеленоград
Пользователь №: 37 056



Добрый день!

Есть инкрементный энкодер - разрядность 14 бит. Из-за несовершенства механики значения немного дрожат. Примерно на 1-3 значения. Чтобы избавиться от этого вычисляю арифметическое среднее для нескольких измерений. И всё бы хорошо, но в окрестности нуля такой путь не работает. Т.е. имеем набор значений 0, 0, 1, 16383, 0. После усреднения получим 3277 sad.gif

Собственно, вопрос: как лучше всего обойти эту ситуацию?
Пока вижу единственный путь - считать обороты и использовать их как старшие биты для значения текущего положения. А потом усреднять.

Но может быть есть способ проще? Задача выглядит стандартной, но что-то ничего путного не нагуглилось. Может не так ищу...

Заранее спасибо.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
ViKo
сообщение Jun 17 2013, 08:29
Сообщение #2


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

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



Весь диапазон значений энкодера 0...16384 разбиваем на 2 участка, на одном считаем, что число беззнаковое, на другом переводим в число со знаком, усредняем, и затем преобразуем обратно. Участки - поделим диапазон пополам:
0...4096 - со знаком
4096...12288 - без знака
12288...16384 - со знаком (-4096...0)
Границы выбраны условно. Важно работать только по одному варианту для значений, находящихся на границе. Поэтому, как только значение дошло до границы, принудительно переключаемся на другой вариант расчета.
Например, значение приближается к 12288 - переключаемся на расчет со знаком, превращаем значение в -4096. Вряд ли погрешность энкодера составит 1/4 оборота, так, что текущее значение выскочит за пределы -8192.
Go to the top of the page
 
+Quote Post
maksimp
сообщение Jun 20 2013, 18:55
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 313
Регистрация: 2-07-11
Пользователь №: 66 023



Код
#define N 5
uint16_t x[N]; // их будем усренять

int16_t s;
int16_t i;
s=0;
for(i=1;i<N;i++)
{
  s+=(int16_t)((x[i]-x[0]+0x2000)&0x3fff)-0x2000;
}
if(s>0) s=(s+N/2)/N; // деление с округлением к ближайшему
else s=(s-N/2)/N;
r=x[0]+s; // результат

Для правильной работы при очень быстром вращении лучше сделать int32_t s;
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- Corvus   Усреднение значений энкодера   Jun 14 2013, 17:33
- - toweroff   Я бы поступил так. Если значение от предыдущего ус...   Jun 14 2013, 18:18
|- - BvDV   может быть что то типа этого код содран от сюда ...   Jun 14 2013, 18:50
|- - toweroff   Цитата(BvDV @ Jun 14 2013, 22:50) может б...   Jun 14 2013, 19:17
|- - Corvus   Цитата(toweroff @ Jun 14 2013, 23:17) ТС,...   Jun 15 2013, 06:43
|- - adnega   Ввод цифр от 0 до 9 при помощи энкодера (по типу с...   Jun 15 2013, 07:46
- - cant   наиболее просто сделать исключение и принять 2-1-0...   Jun 14 2013, 19:21
|- - toweroff   Цитата(cant @ Jun 14 2013, 23:21) наиболе...   Jun 14 2013, 20:00
- - RabidRabbit   Может медианная фильтрация подойдёт?   Jun 14 2013, 22:22
|- - MaslovVG   В промышленных CNC Для определения положения по да...   Jun 17 2013, 05:18
- - ar__systems   КодMixedSigns = (V1 | V2 | V3 | V4) ^ ...   Jun 15 2013, 05:54
- - Iptash   У вас же не на большую велечину прыгают, если посл...   Jun 15 2013, 07:44
- - Alex11   А если по-простому? У Вас же не бывает скачков на ...   Jun 15 2013, 09:15
|- - Corvus   adnega Спасибо. Сейчас попробую разобраться. Цита...   Jun 15 2013, 11:44
- - Fujitser   Просто используйте числа со знаком. Тогда 16384 пр...   Jun 16 2013, 10:14
|- - ae_   Цитата(Fujitser @ Jun 16 2013, 19:14) Про...   Jun 16 2013, 12:19
- - АНТОН КОЗЛОВ   Обрабатывая сигналы от ветряка, аналогичные эконде...   Jun 16 2013, 17:37


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

 


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


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