marti 0 16 июня, 2013 Опубликовано 16 июня, 2013 · Жалоба Обрабатывая сигналы от ветряка, аналогичные экондерным, усредняли синус уголка, и вычисляли арксинус. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
MaslovVG 0 17 июня, 2013 Опубликовано 17 июня, 2013 · Жалоба В промышленных CNC Для определения положения по датчику применяются коррекции записанные в файлы (таблицы). Для движения вперёд, назад, температурная и прочие. Шаг таблицы и значения определяются при калибровке станка. (например лазерным имерителем). Используется кусочно линейная апроксимация. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 17 июня, 2013 Опубликовано 17 июня, 2013 · Жалоба Весь диапазон значений энкодера 0...16384 разбиваем на 2 участка, на одном считаем, что число беззнаковое, на другом переводим в число со знаком, усредняем, и затем преобразуем обратно. Участки - поделим диапазон пополам: 0...4096 - со знаком 4096...12288 - без знака 12288...16384 - со знаком (-4096...0) Границы выбраны условно. Важно работать только по одному варианту для значений, находящихся на границе. Поэтому, как только значение дошло до границы, принудительно переключаемся на другой вариант расчета. Например, значение приближается к 12288 - переключаемся на расчет со знаком, превращаем значение в -4096. Вряд ли погрешность энкодера составит 1/4 оборота, так, что текущее значение выскочит за пределы -8192. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
maksimp 0 20 июня, 2013 Опубликовано 20 июня, 2013 · Жалоба #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; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться