Easyelectronics.ru

Электроника для всех
Текущее время: 11 июл 2020, 03:26

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



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 13 ноя 2018, 10:29 
Заглядывает иногда

Зарегистрирован: 07 фев 2018, 15:20
Сообщения: 100
У меня есть трёрхосевой акселерометр adxl313. В интернете часто видел как люди делали на нём датчик угла поворота,то есть они поворачивали акселерометр в пространстве и на дисплее отображались углы по трём осям,вот как на картинке

Вложение:
угол.JPG
угол.JPG [ 129.38 Кб | Просмотров: 1663 ]


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

Вот,например мой код

Код:
         //проект для измерения углов поворота акселерометра

#define F_CPU 8000000

#include <avr/io.h>
#include <util/delay.h>
#include <math.h>
#include <stdlib.h>
#include "lcd_display.h"
#include "registers.h"
#include "adxl_lib.h"


void xyz_to_display(uint16_t number);


int main(void)
{
   lcd_init();           //инициализируем дисплей для вывода значений
   spi_init();           //инициализируем аппаратный spi
   adxl_init();          //инициализируем акселерометр
   uint16_t x,y,z;       //переменные для хранения ускорения по трём осям
   uint8_t temp1;        //переменная для хранения младшей части оси
   uint8_t temp2;        //перемення для хранения старшей части оси
      
    while(1)
    {
     temp1 = get_byte_from_adxl(addr_x0);         //считываем младшую часть x0
     temp2 = get_byte_from_adxl(addr_x1);         //считываем старшую часть x1
     temp2 &= clear_8_bits;                       //обрезаем незначащие биты в старшем байте
     x = to_digit_into_16one(temp2,temp1);        //соединяем два байта в одно 16 ричное число
    
   
     temp1 = get_byte_from_adxl(addr_y0);         //считываем младшую часть y0
     temp2 = get_byte_from_adxl(addr_y1);         //считываем старшую часть y1
     temp2 &= clear_8_bits;                       //обрезаем незначащие биты в старшем байте
     y = to_digit_into_16one(temp2,temp1);        //соединяем два байта в одно 16 ричное число
    
     temp1 = get_byte_from_adxl(addr_z0);         //считываем младшую часть z0
     temp2 = get_byte_from_adxl(addr_z1);         //считываем старшую часть z1
     temp2 &= clear_8_bits;                       //обрезаем незначащие биты в старшем байте
     z = to_digit_into_16one(temp2,temp1);        //соединяем два байта в одно 16 ричное число
    
     send_comand(0x82);                           //устанавливаем курсор в дисплее
     xyz_to_display(x);                           //выводим значение x
    
     send_comand(0x8A);                           //устанавливаем курсор на дисплее
     xyz_to_display(y);                           //выводим значение y
    
     send_comand(0xC2);                           //устанавливаем курсор на дисплее
     xyz_to_display(z);                           //выводим значение z

    
     //double theta = acos(z/sqrt(square(x)+square(y)+square(z)));
     //форумала которую я нашёл в интернете
     double x_angle = 57.295*atan((x/ sqrt(pow(y,2))+pow(z,2)));    //угол поворота по оси x (но формула не работает)
     char c[5];                                      //обьявляем массив для передачи в функцию
     char *p;                                        //обьявляем указатель на char,где мы будем хранить начала строки
     p = dtostrf(x_angle,0,2,c);                     //получаем строковое представление x_angle
     send_string_to_lcd(p,start_lcd+0x4A);           //выводим строковое представление x_angle на дисплей   
      
    
     _delay_ms(200);                                 //ждём 200 милисекунд
    }
}


контроллер считывает данные с акселерометра в 11 битовом формате - то есть акселерометр измеряет ускорение в диапазоне +-g и данные представляются в диапазоне +-1024. Не совсем понимаю какие формулы нужно использовать и в каком формате вставлять в них ускорение,то есть ускорение должно быть в формате -+1024 или в -+9.8. Если во втором формате,то мне получается нужно преобразовать данные с акеселерометра в ускорение +-9.8 и потом уже вставлять в формулы?
В моём коде в строке с double x_angle = 57.295*atan((x/ sqrt(pow(y,2))+pow(z,2))); я пытаюсь определить угол по иксу. Эту формулу я взял из готового кода который нашёл в интернете,но формула не работает и вообще всё программа с этой строчкой работает неадекватно. Кто нибудь знаете алгоритм или математическую формулу по которой можно найти угол поворота? код я бы написал сам,знать бы алгоритм

вот на фото 2результаты вывода ускорений,всё работает,только угол никак не найти

Вложение:
lLiF9BEB7ws.jpg
lLiF9BEB7ws.jpg [ 87.86 Кб | Просмотров: 1663 ]


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 13 ноя 2018, 18:38 
Заглядывает иногда

Зарегистрирован: 11 дек 2013, 17:52
Сообщения: 69
Ответ на ваш вопрос дадут знания тргитонометрии и что такое вектор в трехмерном пространстве. Откалиброванный акселерометр желательно иметь для точности вычислений. Если доступен только аксель, то вы сможете вычислить 2 угла: тангаж и крен. Показания ветора акселя нормируются (хотя и не обязательно). А потом по формулам тригонометрии вычисляете углы из прямоугольного треугольника с узвесными сторонами) Удачи!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 13 ноя 2018, 18:47 
Старожил

Зарегистрирован: 22 июл 2017, 11:48
Сообщения: 4198
Откуда: Чобля - долбаный кетайец
Акселерометр в покое показывает направление земного ускорения g. Его проекция на оси координат акселерометра будет сохранена в регистрах акселерометра и может быть прочитана. Прочитали значения? Ну а теперь обратимся к школьной тригонометрии за 9 класс. Отношение проекции Y к проекции X и вычисление арктангенса этого отношения даст угол φ. В Си это ф-ция atan(x). Возвращает значение в радианах. Для перехода к градусам надо умножить на 57,3. (180/pi). Теперь надо вычислить угол к оси Z аналогичным образом. Для этого, надо узнать длину катета треугольника, образованного проекцией вектора g на плоскость X-Y. Это можно сделать двумя путями. Пойдем вторым путем, имея оригиналы проекций на оси: искомая длина = квадратному корню из суммы квадратов проекций на оси X и Y. Ну а потом - снова арктангенс отношения проекции на ось Z к вычисленной в предыдущем шаге длине.

Изображение


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 13 ноя 2018, 18:58 
Старожил
Аватара пользователя

Зарегистрирован: 30 мар 2015, 23:56
Сообщения: 817
В стиле адруино это atan2(x,y) atan2(z,x) atan2(y,z). А перед ними фильтр на x,y,z акселя в режиме плавающей точки!!! + статическая компенсация усиления и сдвига.
Значение компенсации можно получить на карусельке, она конечно будет дико плавать от температуры, но зато наглядно и сразу.
Без компенсации atan2, и та магия что выше - не работает.

_________________
Потоковая OS


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 13 ноя 2018, 19:01 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 692
Какой угол вы пытаетесь получить с помощью акселерометра ? Акселерометр меряет ускорение вдоль осей X, Y, Z. Вращение меряет гироскоп. Но если акселерометру придать некий радиус, то по длине пройденного пути (ускорение и время, при постоянном движении ускорение равно 0) и радиусу - можно вычислить угол поворота.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 14 ноя 2018, 07:39 
Заглядывает иногда

Зарегистрирован: 07 фев 2018, 15:20
Сообщения: 100
lleeloo писал(а):
Ответ на ваш вопрос дадут знания тргитонометрии и что такое вектор в трехмерном пространстве. Откалиброванный акселерометр желательно иметь для точности вычислений. Если доступен только аксель, то вы сможете вычислить 2 угла: тангаж и крен. Показания ветора акселя нормируются (хотя и не обязательно). А потом по формулам тригонометрии вычисляете углы из прямоугольного треугольника с узвесными сторонами) Удачи!


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 14 ноя 2018, 09:58 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1631
Откуда: Курск
николай19971997 писал(а):
ось х параллельна земле

Земля круглая! Параллельно шару?
Или всё же она плоская???
Не проще взять гироскоп с магнитометром?
Откуда возьмётся ускорение для акселерометра, если только вращать в плоскости параллельной поверхности плоской земли?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 14 ноя 2018, 11:15 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4684
Откуда: КЧР, поселок Нижний Архыз
Невозможно по показаниям акселерометра положение вычислить. Разве что определить, где верх-низ (и то, если нет ускорения относительно других осей).
Для определения вращения гироскопы, вообще-то, используются. Но и там точность ниже плинтуса.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 14 ноя 2018, 12:20 
Заглядывает иногда

Зарегистрирован: 11 дек 2013, 17:52
Сообщения: 69
Цитата:
А что значит откалиброванный акселерометр? я много раз слышал в интернете что его нужно откалибровать. Значит ли это,что мне нужно записать в регистры смещения какие-то значения чтобы они вычитались из значений ускорений по осям? просто я не совсем понимаю как определить насколько точны данные с акселерометра. Вот например лежит он на столе и ось х параллельна земле,какое в идеале должно быть ускорение по этой оси? то есть к каким параметрам я должен его калибровать
Проблема чуть более сложная, чем может показаться на самом деле.
Первое: постоянное смещение по осям акселерометра. Устраняется легко и непринужденно) Способов вычисления существует немало, приводить не буду
Второе: неортогональность осей акселерометра - тема отдельной диссертации и кривожопости производителя)
Третье: установка корпуса акселерометра на плату... перекосыб перегибы и прочие радости - исправляется калибровкой конечного устройства аля вывели уровень плоскости платы/издеоия в горизонт и далее как в п1
Четвертое но не последнее: величина коэф. масштабирования по осям может плавать((( ну и в самых тяжелых ситуациях - ее нелинейность.

В большинстве случаем для простого инклинометра вполне достаточно выполнить П1 или П3.

Цитата:
Невозможно по показаниям акселерометра положение вычислить. Разве что определить, где верх-низ (и то, если нет ускорения относительно других осей).
Для определения вращения гироскопы, вообще-то, используются. Но и там точность ниже плинтуса.
Очень спорное утверждение, думаю мы по-разному воспринимаем вопрос топикстартера. Повторюсь, по акселерометру можно вычислить 2 угла, да и те в стедистейт). Как их вычислять в данной ветке уже вполне внятно намекнули/написали. Особо добрые товарищи даже картинку привели


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 14 ноя 2018, 12:33 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4684
Откуда: КЧР, поселок Нижний Архыз
Вот я и говорю: крен и тангаж при помощи акселерометра грубо можно определить (но лишь в том случае, если акселерометр неподвижен или движется с постоянной скоростью), а вот для определения рыскания нужно иметь еще датчик магнитного поля + какой-нибудь надежный ориентир (т.к. датчик магнитного поля тоже будет сильно шуметь, особенно вблизи всяких железяк и ЛЭП).


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 14 ноя 2018, 14:50 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 692
Eddy_Em писал(а):
Вот я и говорю: крен и тангаж при помощи акселерометра грубо можно определить (но лишь в том случае, если акселерометр неподвижен или движется с постоянной скоростью)
Совсем мозг сломал, как можно вычислить крен и тангаж, если с датчика приходят 0-и ? И в приведенной картинке есть вектор М, то есть перемещение датчика (как из ускорения восстановить перемещение я понимаю). Таким образом вычисляется угол между вектором перемещения датчика и какой-то условно заданной системой координат, но никак не угол поворота датчика.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 14 ноя 2018, 14:57 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4684
Откуда: КЧР, поселок Нижний Архыз
"Перемещение" датчика невозможно без триангуляции вычислить.
Выше уже писали: акселерометр дает значения ускорения вдоль трех осей. Соответственно, если считать, что модуль этого ускорения равен g, можно определить ориентацию акселерометра относительно вектора g, т.е. крен и тангаж. Рыскание же - угол в плоскости, перпендикулярной g, акселерометром его не измерить.
Нули с датчика приходить не могут. Это означает, что датчик находится в невесомости!


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 14 ноя 2018, 14:59 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 692
То есть, если я вас правильно понял, у этого датчика в состоянии покоя есть некий вектор G. Я правильно понял ?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 14 ноя 2018, 15:39 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4684
Откуда: КЧР, поселок Нижний Архыз
Это акселерометр. От латинского acceleratio — "ускорение". И в покое он должен показывать 9.81м/с² на уровне моря.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 14 ноя 2018, 15:59 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1631
Откуда: Курск
https://www.analog.com/ru/products/adxl313.html#product-overview
Цитата:
ADXL313 хорошо подходит для применения в автомобильных сигнализациях или черных ящиках. Он способен измерять статическое ускорение, вызванное гравитацией, в задачах определения отклонения, а также динамическое ускорение, вызванное движением или ударами.

Про вращение тут ни слова
Вот ещё немного


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 14 ноя 2018, 16:26 
Старожил

Зарегистрирован: 16 ноя 2012, 07:47
Сообщения: 2870
void1509 писал(а):
То есть, если я вас правильно понял, у этого датчика в состоянии покоя есть некий вектор G. Я правильно понял ?

Именно так, земное 1g еще никто не отменял. По уменьшению этого 1g, многие внешние жесткие диски определяют падение девайса и блокируют головку, чтобы она не поцарапала блины.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 14 ноя 2018, 16:46 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3425
Eddy_Em писал(а):
"Перемещение" датчика невозможно без триангуляции вычислить.
Рыскание же - угол в плоскости, перпендикулярной g, акселерометром его не измерить.

Не то чтобы совсем невозможно, ускорение можно проинтегрировать, просто при этом будут накапливаться ошибки и очень быстро так как интегрирование двойное, вопрос лишь в точности самого акселерометра, его калибровки, ну и соответственно сколько времени пройдет после калибровки до того как накопленные ошибки станут слишком большими.
Ну и присутсвие собственно g тоже немного мешает, так как надо следить за ориентацией датчика относительно g и компенсировать его наличие в нужном направлении.
И ещё акселерометров может быть больше чем один, тогда вместе, разнесённые на некоторое расстояние они могут видеть и угловые ускорения, даже при повороте вокруг g, но его так же придётся интегрировать и проблемы с накоплением ошибок будут те же.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 15 ноя 2018, 03:48 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 692
Hold писал(а):
void1509 писал(а):
То есть, если я вас правильно понял, у этого датчика в состоянии покоя есть некий вектор G. Я правильно понял ?

Именно так, земное 1g еще никто не отменял. По уменьшению этого 1g, многие внешние жесткие диски определяют падение девайса и блокируют головку, чтобы она не поцарапала блины.


Благодарю, я не знал. Я так понимаю это особенность данного датчика. Так как ускорение - есть производная второго порядка от перемещения и производная от скорости. Если скорость постоянная, то ускорение должно быть равно 0.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 15 ноя 2018, 10:38 
Старожил

Зарегистрирован: 26 ноя 2012, 10:28
Сообщения: 4684
Откуда: КЧР, поселок Нижний Архыз
void1509 писал(а):
Благодарю, я не знал.

А стоило бы вспомнить хотя бы школьную физику. Ну и то, что мы таки в поле тяжести Земли находимся, а не в невесомости парим...


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

Зарегистрирован: 24 июл 2012, 13:54
Сообщения: 856
Небольшое замечание:

Чтобы пощупать математику калибровка необязательна. Точность будет прихрамывать, но результат будет виден.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 15 ноя 2018, 19:38 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 692
Eddy_Em писал(а):
А стоило бы вспомнить хотя бы школьную физику. Ну и то, что мы таки в поле тяжести Земли находимся, а не в невесомости парим...

А причем здесь сила тяжести ? На тело могут действовать бесконечное множество сил, но если скорость тела неизменна, то ускорение = 0.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 15 ноя 2018, 19:56 
Старожил

Зарегистрирован: 08 июн 2015, 16:26
Сообщения: 492
void1509 писал(а):
Eddy_Em писал(а):
А стоило бы вспомнить хотя бы школьную физику. Ну и то, что мы таки в поле тяжести Земли находимся, а не в невесомости парим...

А причем здесь сила тяжести ? На тело могут действовать бесконечное множество сил, но если скорость тела неизменна, то ускорение = 0.


А при том, что надо понимать устройство акселерометра. Он делается так, чтобы в состоянии покоя учитывать g.
Если совсем по-простом, то в условной камере условный шарик не может зависнуть "в воздухе", т.к. на него действует сила тяжести. Он падает на дно условной камеры. Датчики отклонения условного шарика от центрального положения это и засекают и выдают чистое g. В случае с MEMS, если не изменяет память, условная камера и условный шарик - обкладки переменного конденсатора.

Вот и все.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 15 ноя 2018, 19:58 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3425
сила тяжести при том что гравитационная и инертная массы эквивалентны.
соответственно акселерометр никаким образом не может отличить: находится ли он в покое, но при этом на него действует сила притяжения Земли, или же он в открытом космосе ускоряется вверх с 9.81м/с^2.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 15 ноя 2018, 20:09 
Старожил

Зарегистрирован: 17 дек 2014, 04:38
Сообщения: 692
Господа, благодарю вас за разъяснения. Я по вашим постам уже понял, что данный датчик не совсем акселерометр, а некий прибор измеряющий условное отклонение, условного шарика в уловной камере. Которое в большинстве случаев можно условно считать ускорением.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как определить угол поворота акселерометра зная ускорение
СообщениеДобавлено: 15 ноя 2018, 20:25 
Старожил

Зарегистрирован: 10 июн 2011, 23:01
Сообщения: 3425
этот датчик именно что акселерометр, который измеряет силу (a=F/m) действующую на сенсор внутри датчика относительно его же корпуса.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 37 ]  На страницу 1, 2  След.


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


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

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


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

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

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