Easyelectronics.ru

Электроника для всех
Текущее время: 17 окт 2019, 15:39

Часовой пояс: UTC + 5 часов



JLCPCB – Прототипы печатных плат за $2/10pcs (Любой цвет!)
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 18 ] 
Автор Сообщение
 Заголовок сообщения: Переход датчика поворота через 0
СообщениеДобавлено: 02 ноя 2015, 23:18 
Старожил
Аватара пользователя

Зарегистрирован: 11 фев 2015, 18:08
Сообщения: 211
Всем доброго вечера.
Собственно сабж.
Есть датчик угла одной плоскости. На выходе 0-359,9 градусов. Как покрасивее организовать переход датчика через 0?
Сам датчик изначально устанавливается под неизвестным углом, поэтому ищу варик - мож у кого уже есть в заначках алгоритмик какой...?
Сделать не проблема, но халява всегда вкусней =), да и времени меньше
Спс


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переход датчика поворота через 0
СообщениеДобавлено: 02 ноя 2015, 23:49 
Старожил
Аватара пользователя

Зарегистрирован: 28 мар 2012, 10:33
Сообщения: 1198
Откуда: Сочи
Повернуть его из положения 359,9 градусов на +0.1 градуса и он перейдет через ноль!

Но вы, конечно, не это хотели спросить...
Так спросите то, что хотели.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переход датчика поворота через 0
СообщениеДобавлено: 03 ноя 2015, 11:39 
Старожил
Аватара пользователя

Зарегистрирован: 11 фев 2015, 18:08
Сообщения: 211
Датчик установлен на поворотной конструкции. По сути его работа заключается в том, что бы определять на какой угол отклонилась конструкция от начального положения. В этот момент может произойти переход через 0 датчика. Можно конечно следить каждый раз за направлением движения и выставлять флаги - но тут может быть геморно, ибо конструкция движется не совсем линейно, а рывками, пусть и не большими. И бывает дергается назад. А в сухом остатке нужно знать конечный угол отклонения.
Вот я и подумал - наверняка уже есть изящные решения такой задачи.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переход датчика поворота через 0
СообщениеДобавлено: 03 ноя 2015, 17:36 
Старожил

Зарегистрирован: 27 мар 2015, 01:22
Сообщения: 1445
(конечное_положение - начальное_положение + 3600) % 3600
Я угадал? )

_________________
less is more


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переход датчика поворота через 0
СообщениеДобавлено: 03 ноя 2015, 19:26 
Старожил
Аватара пользователя

Зарегистрирован: 28 дек 2011, 11:24
Сообщения: 4096
Откуда: г. Липецк
В энкодерах серводвигателей это решается отдельной дорожкой с нулевой меткой. Для вас оптимальнее применить отдельный датчик нулевой метки, исходя из конструкции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переход датчика поворота через 0
СообщениеДобавлено: 03 ноя 2015, 19:43 
Старожил
Аватара пользователя

Зарегистрирован: 28 янв 2010, 20:18
Сообщения: 543
Я тоже не понял, что нужно. Считать абсолютное отклонение от начального положения с учётом того, что могло произойти несколько оборотов? То есть угол на выходе может/должен выходить за пределы +/-pi?

Если да, то вот я недавно делал. Только там положение вектором задается а не углом.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переход датчика поворота через 0
СообщениеДобавлено: 03 ноя 2015, 21:05 
Старожил
Аватара пользователя

Зарегистрирован: 28 мар 2012, 10:33
Сообщения: 1198
Откуда: Сочи
ЯadiatoR, подожди, ты же писал:

ЯadiatoR писал(а):
На выходе 0-359,9 градусов.


При переходе через 0 показания с 359.9 меняются на 0?
В чем вопрос все таки?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переход датчика поворота через 0
СообщениеДобавлено: 03 ноя 2015, 23:34 
Старожил

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 3519
Что тут непонятного. Вопрос был - "как покрасивее". Есть много красивых роликов о том, как сначала катится шарик, сбивается кегля, наполняется ведро с водой и т.д., а в конце выдавливается зубная паста на щетку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переход датчика поворота через 0
СообщениеДобавлено: 07 ноя 2015, 01:08 
Старожил
Аватара пользователя

Зарегистрирован: 11 фев 2015, 18:08
Сообщения: 211
)))
Пишу с планшета, так что не нарисую.
Двумя словами - есть конструкция в виде колена/шарнира. В общем поворотная в одной плоскости. На статической и на поворотной стороне расположены два одинаковых датчика акселерометра. Оба шлют показания в виде флоата 0-359(9) градусов на головное устройство. При запуске система калибруется - находит относительный угол нулевого (начального) положения. И далее при работе определяет на какой угол отклонилась поворотная часть от статической. В принципе ход плеча не более 30 градусов в обе стороны, но как изначально установлены датчики на этой конструкции не известно. На данный момент, конечно, это реализованно просто фиксированным углом установки, но это не технологично. Вот и пока плотно этим не занялся подыскиваю ответ на просторах форума) Кстати статичная сторона тоже может вращаться в пространстве потому и установлена система с относительным углом отклонения


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переход датчика поворота через 0
СообщениеДобавлено: 07 ноя 2015, 01:15 
Старожил
Аватара пользователя

Зарегистрирован: 11 фев 2015, 18:08
Сообщения: 211
antonluba писал(а):
ЯadiatoR, подожди, ты же писал:

ЯadiatoR писал(а):
На выходе 0-359,9 градусов.


При переходе через 0 показания с 359.9 меняются на 0?
В чем вопрос все таки?

Да. Вот и хочу найти уже готовый код по определению перехода через 0. Может это будет настолько просто и легко - не спорю (каюсь пока даже не думал над этим, пока других дел не в проворт...). Что бы не было типа сейчас аля 20 градусов и бабац 1 датчик через ноль проходит и становится отклонение на ~360 больше ну и в твком духе. Просто может случиться ситуация, что в рабочем режиме при неудачном закреплении датчиков на конструкции оба могут дергаться через ноль, а система должна это отслеживать и выдавать правильный результат


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переход датчика поворота через 0
СообщениеДобавлено: 07 ноя 2015, 03:03 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 742
ЯadiatoR писал(а):
Что бы не было типа сейчас аля 20 градусов и бабац 1 датчик через ноль проходит и становится отклонение на ~360 больше ну и в твком духе.

Чаще читать...

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переход датчика поворота через 0
СообщениеДобавлено: 07 ноя 2015, 04:21 
Старожил
Аватара пользователя

Зарегистрирован: 28 янв 2010, 20:18
Сообщения: 543
Передавайте вектор а не угол, проблема исчезнет.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переход датчика поворота через 0
СообщениеДобавлено: 07 ноя 2015, 07:30 
Старожил

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 3519
Преобразование угла в вектор займет много времени (плавающая математика) или будет неточным (аналоговая электроника). На приемном конце нужно будет все равно вектор преобразовывать обратно в угол (еще столько же затрат), и всё ради чего - чтобы устранить перехлест.

Но задача изначально ставится неправильно. Если данные представлены в виде угла, то точка разрыва в них есть по определению. Надо понять, в каком диапазоне значения приемлемы для исполнительного устройства и поставить промежуточный процессор, который бы вгонял данные в этот диапазон. Если задаться значениями -179.9 ... +179.9, то достаточно при углах более 180 вычитать 360. Тогда точки перехлеста окажутся в значениях -180 и +180. Если нужно обрабатывать поворот больше чем на 360, то нужно помнить "целую часть", равную числу полных оборотов, и в расчетах ее умножать на 360. По-хорошему, это должен делать сам датчик, но похоже, он этого не делает. Тогда придется отслеживать большой скачок (например, более 20 градусов по модулю) и в этот момент менять число полных оборотов.

Например, было 0 (2), стало 0 (358) - это перехлест "назад", значит, учитываем полное число -1. Результат -1 (+358).
Было 0 (358), стало 0 (2), результат +1 (2). В скобках представлена "дробная часть" угла.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переход датчика поворота через 0
СообщениеДобавлено: 07 ноя 2015, 18:39 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1545
Откуда: Курск
Я тут делал
Тоже начальное положение неизвестно.
Ничего сложного. У меня угол 90 градусов.
Может поможет


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переход датчика поворота через 0
СообщениеДобавлено: 07 ноя 2015, 19:58 
Старожил
Аватара пользователя

Зарегистрирован: 28 янв 2010, 20:18
Сообщения: 543
iev91 писал(а):
Преобразование угла в вектор займет много времени (плавающая математика) или будет неточным (аналоговая электроника). На приемном конце нужно будет все равно вектор преобразовывать обратно в угол (еще столько же затрат), и всё ради чего - чтобы устранить перехлест.


ТС говорит, что датчик это акселерометр, значит исходная информация вектор а не угол, преобразовывать не надо. Я поэтому и предложил. А на приемном конце преобразовать в угол надо один раз, а не два на каждом устройстве с датчиком.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переход датчика поворота через 0
СообщениеДобавлено: 08 ноя 2015, 00:30 
Старожил
Аватара пользователя

Зарегистрирован: 11 фев 2015, 18:08
Сообщения: 211
amaora писал(а):
Передавайте вектор а не угол, проблема исчезнет.

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

Сам датчик тупой - он всего лишь шлет текущие показания и все. Об остальной системе он ничего не знает.

Cthulhu писал(а):
Я тут делал
Тоже начальное положение неизвестно.
Ничего сложного. У меня угол 90 градусов.
Может поможет

Спасибо, но знания асмы безнадежно забылись... И у вас все таки 1 датчик - с ним попроще.

amaora писал(а):
ТС говорит, что датчик это акселерометр, значит исходная информация вектор а не угол, преобразовывать не надо. Я поэтому и предложил. А на приемном конце преобразовать в угол надо один раз, а не два на каждом устройстве с датчиком.

Верно, аксель. Но мне в итоге нужно получить градусы, ибо дальнейшая кинематика требует расчета из них.
думаю при вычислении текущего дифф угла я просто буду учитывать четверть приходящих углов и отталкиваться от них. Думаю там все просто будет, надо только начать писать)
Отпишусь как сделаю...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переход датчика поворота через 0
СообщениеДобавлено: 12 ноя 2015, 01:49 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
Так что всё-таки нужно на выходе?
Угол отклонения от начального положения?
Можем ли мы быть уверены, что угол не превысит 180-ти градусов?

Если да, то

result = angle - zero_angle;
if (result > 180) result = result - 360;
if (result < -180) result = result + 360;

Где zero_angle - это угол, полученный при тарировке.

Или так:
result = angle - zero_angle + 360;
if (result > 180) result = result - 360;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Переход датчика поворота через 0
СообщениеДобавлено: 12 ноя 2015, 03:10 
Старожил
Аватара пользователя

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 849
А если мы хотим измерять относительный угол поворота на всём диапазоне...
Предлагаю дифференциальный сумматор с комплементарной коррекцией :)... Черная магия, такая черная. :).


Код:
float roundMeas(float a)
{
int total;
total = a / 360;
a = (a - total * 360);
total = a / 180;
a = (a - total * 360);
return a;
};

ф-ия roundMeas приводит любой угол в диапазон -180...180. (Наверное, ее можно и покрасивее написать.)

Код:
float now_angle(float measurment_angle)
{
static float last_measurment;
static float integral_angle;
float absolute_angle;
float diff_angle;

//дифф интегратор
diff_angle = roundMeas(measurment_angle - last_measurment);
integral_angle += diff_angle;


//комплементарный корректор
// zero_angle - значение, полученное при тарировке.
absolute_angle = measurment_angle - zero_angle;
integral_angle =  integral_angle + 0.001 * roundMeas(absolute_angle - integral_angle);

return integral_angle;
};

Ф-ия замеряет разницу между прошлым и текущим измерениями и записывает ее в
diff_angle. Если скорость измерений достаточна, то разность мала и не выйдет за -180...180 градусов, и всегда будет определена корректно.

Далее diff_angle прибавляется к integral_angle. integral_angle, соответственно это переменная, которая аккумулирует наши знания об угле. Учитывая, что integral_angle составляется путём суммы разностей, никакие переходы через ноль ему нестрашны. Угол будет абсолютным.

Однако. Такой метод подсчета может приводить к ошибке интегрирования на больших интервалах времени. Поэтому мы вводим коррекцию, комплементарно вводя в малой дозе отклонение реально измеряемого угла (с учетом нулевого смещения) и нашего модельного интегрированного угла. Поскольку мы ожидаем, что разница их незначительна, она опять же не выйдет за диапазон -180...180, а ф-ия roundMess пожрёт целые повороты, буде integral_angle их накрутил.

Чёрная магия. Такая черная :).


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 18 ] 

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB