2015-02-19 2 views
-3

Я использую микроконтроллер Gyro L3GD20 и STM32F4. Я получаю эти данные от датчика гироскопа.Как преобразовать необработанные данные в полезные углы?

0, -1, -1, -2, -3, -4, -5, -6, -6, -5, -3, -4, -4, -5, -6, -5 , -3, -3, -3, -3, -3, -4, -4, -4, -3, -3, -3, -3, -5, -5, -5, -4, -4, -4, -5, -5, -6, -6, -5, -5, -6, -6, -8, -9, -10, -10, -11, -12, -14 , -16, -17, -16, -14, -12, -11, -10, -8, -7, -8, -8, -8, -8, -6, -5, -4, -4, -2, -2, -3, -2, -2, -2, -2, -1, -2, -2, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 3, 4, 4, 4, 5, 6, 6, 6, 7, 8, 8, 9, 9, 8, 9, 10 , 12, 15, 19, 17, 13, 9, 9, 14, 19, 8, 15, 15, 17, 17, 18, 17, 14, 14, 15, 15, 11, 7, 5, 5, 6, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0

Это относится к угловой-v elocity вдоль оси x. Я хотел бы извлечь угол из необработанных данных. Кусок кода

while(1) 
{ 
    if(measure) 
    { 
     ///20 ms///. 
     L3GD20_Read(&L3GD20_Data); 
     int16_t x = L3GD20_Data.X; 
     USART_putint(USART2, _x, 10); 
     USART_SendData(USART2, ','); 
     measure = 0; 
    } 
} 

Спасибо заранее.

+2

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

+3

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

+2

Учитывая только скорость оси x, как вы можете вычислить любой угол? Угол к чему? – Lundin

ответ

2

Гистоскоп MEMS представляет собой угловую скорость , где выходной сигнал пропорционален градусам в секунду. Чтобы получить относительную ориентацию с угловой скоростью, вы должны интегрироваться со временем, что даст вам изменение угла за это время. По существу изменение угла пропорционально сумме всех образцов угловой скорости.

L3GD20 - это трехосный датчик, поэтому он может обеспечивать выход для рыскания, высоты тона и рулона. Он имеет цифровой интерфейс I2C/SPI и выполняет выборку и синхронизацию для вас и помещает данные в FIFO, поэтому вы, вероятно, не должны догадываться, что синхронизация только считывается с интервалом 20 мс; скорее, вы должны прочитать все доступные данные в ответ на прерывание данных. (Минимальная скорость вывода данных составляет 95 выборок в секунду, поэтому вы теряете данные при чтении со скоростью 50 с/с). Как вы это делаете, зависит от используемого вами API. Он имеет программируемую чувствительность 250, 500 или 2000 градусов в секунду; вы должны использовать минимальное значение для получения максимального разрешения.

#define GYRO_FS_DPS 250 
#define GYRO_ABS_SAMPLE_MAX 0x7fff 

long x_integrator = 0 ; 

while(1) 
{ 
    while(/* L3GD20 data available */) 
    { 
     L3GD20_Read(&L3GD20_Data) ; 

     x_integrator += L3GD20_Data.X ; 
    } 

    ... 
} 

Тогда относительная ориентация в градусах определяется в любое время:

orientation = ((x_integrator * GYRO_FS_DPS)/GYRO_ABS_SAMPLE_MAX) % 360 ; 

В конечном итоге вы должны четко понимать Пярта datsheet, это очень гибкая и настраиваемая часть и как именно вы его процесс данные будут зависеть от того, как вы его настроили.

+0

Хорошая запись +1. Незначительный: '# define' ->' int' и не должен '/ SHRT_MAX' быть'/65536'? – chux

+0

@chux: Лист данных указывает выход как дополнение к 16 бит двум, поэтому абсолютный полномасштабный диапазон равен 32767. В C++ я бы использовал 'numeric_limits .max()', что было бы более безопасным; '0x7fff', вероятно, лучше здесь - исправлено. – Clifford

Смежные вопросы