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

 
 
 
Reply to this topicStart new topic
> Акселерометр LIS302DL., При некоторых положениях большой разброс показаний.
SZ0
сообщение Jul 22 2012, 08:20
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 14-02-06
Пользователь №: 14 331



При расположении акселерометра как на рис. 2 и 4, где ось Z перпендикулярна земле датчик выдаёт показания, после расчёта которых получаются правильные углы если его отклонять до положения оси Z как на рис. 1 и 3. Как только ось Z начинает приближаться к положению горизонтально земле (рис. 1 и 3), то данные начинают скакать с огромной погрешностью. С чем это связано?
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
dac
сообщение Jul 22 2012, 12:06
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 600
Регистрация: 27-05-05
Пользователь №: 5 482



а можно в цифрах - при каких углах какая погрешность (которая большая). по логике то понятно - на малых значениях большие ошибки - либо помеха, либо разрядность измерения
Go to the top of the page
 
+Quote Post
SZ0
сообщение Jul 22 2012, 15:47
Сообщение #3


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 14-02-06
Пользователь №: 14 331



Выяснил следующее. Примем, что ось Y фиксирована. Когда ось Х и Z поворачиваются относительно Y на рис. 1 влево вправо (ось Х как бы раскачивается с небольшой амплитудой), то при положении оси Х почти перпендикулярно из расчётов выходят углы:
Х 4 7 5 (хотя по Х тут угол должен быть в приделах 90)
У 13 35 19 (хотя Y в приделах 0)
но стоит Х начать опускаться ниже, начинают выводится нормальные углы в приделах 80 градусов и ниже. Как при заваливании Х влево, так и вправо.

На рис. 3 аналогичная ситуация при оси Х находящейся почти перпендикулярно вниз:
Х -7 -5 -3 (хотя по Х тут угол должен быть в приделах -90)
У 74 46 35 (хотя Y в приделах 0)
Стоит Х начать подниматься выше -80, как по Х и Y начинают выводится нормальные результаты.

При качании по осям на рис. 1 и 2 нормальные результаты получаются. Стоит углу по Х подойти к 80 или -80 начинается "бред" sad.gif

Подозреваю, что я с математикой напортачил.

Код
typedef     float                   f32;
#define     SENS18      0.018

  buff8mX = 0;
  buff8mY = 0;
  buff8mZ = 0;
  
  SENS = SENS18;

// определяем знак угла
// в  X, Y и Z значения, считанные из LIS302DL

  if(X > 127)
  {
   X = 255 - X;
   buff8mX = 1;
  }

  if(Y > 127)
  {
   Y = 255 - Y;
   buff8mY = 1;
  }

  if(Z > 127)
  {
   buff8mZ = 1;
   Z = 255 - Z;
  }

  // расчёт угла Х  

  if(buff8mX)uart_tx_byte('-'); // вывод знака угла "-"
  buff8 = (u8)(atan(((f32)((f32)X*SENS))/(sqrt((((f32)((f32)Y*SENS))*((f32)((f32)Y*SENS)))+(((f32)((f32)Z*SENS))*((f32)((f32)Z*SENS)))))) * 180) / M_PI; // расчёт угла
  itoa_usr(buff8); // преобразование значения в строку
  uart_tx_str((const char *)buff_str); // вывод строки

  // расчёт угла Y

  uart_tx_str((const char *)OutY);
  if(buff8mY)uart_tx_byte('-');
  buff8 = (u8)(atan(((f32)((f32)Y*SENS))/(sqrt((((f32)((f32)X*SENS))*((f32)((f32)X*SENS)))+(((f32)((f32)Z*SENS))*((f32)((f32)Z*SENS)))))) * 180) / M_PI;            
  itoa_usr(buff8);
  uart_tx_str((const char *)buff_str);


Сообщение отредактировал SZ0 - Jul 22 2012, 15:51
Go to the top of the page
 
+Quote Post
SZ0
сообщение Jul 27 2012, 08:05
Сообщение #4


Местный
***

Группа: Участник
Сообщений: 326
Регистрация: 14-02-06
Пользователь №: 14 331



Дело было в скобочках.

buff8 = (u8)((atan(((f32)((f32)X*SENS))/(sqrt((((f32)((f32)Y*SENS))*((f32)((f32)Y*SENS)))+(((f32)((f32)Z*SENS))*((f32)((
f32)Z*SENS)))))) * 180) / M_PI);

Поставил, пока только в симуляторе проверил (макетку сломал по неаккуратности).

Сообщение отредактировал SZ0 - Jul 27 2012, 08:06
Go to the top of the page
 
+Quote Post
jorikdima
сообщение Jul 27 2012, 09:35
Сообщение #5


тут может быть ваша реклама
*****

Группа: Свой
Сообщений: 1 164
Регистрация: 15-03-06
Из: Санкт-Петербург/CA
Пользователь №: 15 280



Цитата(SZ0 @ Jul 27 2012, 12:05) *
Дело было в скобочках.

buff8 = (u8)((atan(((f32)((f32)X*SENS))/(sqrt((((f32)((f32)Y*SENS))*((f32)((f32)Y*SENS)))+(((f32)((f32)Z*SENS))*((f32)((
f32)Z*SENS)))))) * 180) / M_PI);

Поставил, пока только в симуляторе проверил (макетку сломал по неаккуратности).

Чтоб в следующий раз не убить кучу времени на ерунду, не пишите таких выражений. Разбивайте на несколько. Ассемблерный код при правильном программировании не увеличится, а гемора станет меньше.
Go to the top of the page
 
+Quote Post

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

 


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


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