Перейти к содержанию
    

Считывание данных с магнитометра.

Использую LSM303DLHC. Задал скорость считывания данных для акселерометра 50 Гц, а для магнитометра 30Гц.
Для акселерометра проверяю в регистре STATUS_REG_A (с.28 LSM303DLHC datasheet)состояние 3-го бита и в момент =1 считываю данные из выходных регистров,
и у меня этот флаг поднимается с частотой 50 Гц.

int8_t n_bit_status_ready_Acc = 3;
status_ready_Acc = Accel_IO_Read(0x32,LSM303DLHC_STATUS_REG_A);
    	    if ( ((1 << n_bit_status_ready_Acc) & status_ready_Acc) == (1 << n_bit_status_ready_Acc) )
    	    {
    	   ptr = Accel_ReadAcc();
    	   Ax_3 = ptr[0];
    	   Ay_3 = ptr[1];
    	   Az_3 = ptr[2];
    	   Ax_sum3 = Ax_sum3 + Ax_3;
    	   Ay_sum3 = Ay_sum3 + Ay_3;
    	   Az_sum3 = Az_sum3 + Az_3;
    	   Ncal_current = Ncal_current + 1;
   	   free(ptr);

    	    }

т.е. переменная Ncal_current за 1 секунду достигает значение 50.

То же самое делаю для магнитометра. Регистр статуса SR_REG_M (09h) (с.39 LSM303DLHC datasheet). Вижу по графику данных с магнитометра, что частота меняяется 
(если меняю частоту выдачи данных), т.е. магнитометр программируется адекватно, но также как  с акселерометром проверяю нулевой бит Регистр статуса SR_REG_M (09h)
а там почти все время 1. И получается скорость сотни Гц вместо моих 30Гц. Почему так? Вроде один и тот же чип, с акселем работает, а с магнитометром нет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вы что, для передачи 3 чисел используете malloc() ?  Который вызывается с частотой 30-50 Гц ?  Зачем "гонять" 3 ячейки памяти туда-сюда, если они используются 50 раз в секунду ?

Если момент готовности данных определяете по опросу бита - можете получить кучу граблей, например децимацию в различных вариантах. Возможно в теме ТС - эффект из этой серии. Используйте таймер для задания регулярного события (старт замера-оцифровки) и апп. прерывания по готовности данных для получения результата.

Уберите free() и malloc(), разве что это сделано умышленно и необходимо (IMHO)

 

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ЭТО

int8_t n_bit_status_ready_Acc = 3;
status_ready_Acc = Accel_IO_Read(0x32,LSM303DLHC_STATUS_REG_A);
    	    if ( ((1 << n_bit_status_ready_Acc) & status_ready_Acc) == (1 << n_bit_status_ready_Acc) )
    	    {
    	   		ptr = Accel_ReadAcc();
			    . . .. 

более кашерно 

#define ACMGM_STATUS_BIT_READY   0x08

или 

#define ACMGM_STATUS_BIT_READY   ( 1 << 3 )

 if ( status_ready_Acc  &  ACMGM_STATUS_BIT_READY )    { . . . . . }

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

10 часов назад, k155la3 сказал:

Вы что, для передачи 3 чисел используете malloc() ?  Который вызывается с частотой 30-50 Гц ?  Зачем "гонять" 3 ячейки памяти туда-сюда, если они используются 50 раз в секунду ?

Хех! Это ещё что! Некоторые деятели в строку числа перегоняют и так передают, а потом обратно в число восстанавливают. Между функциями.  :biggrin::biggrin::biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

37 minutes ago, jcxz said:

Хех! Это ещё что! Некоторые деятели в строку числа перегоняют и так передают, а потом обратно в число восстанавливают. Между функциями.  :biggrin::biggrin::biggrin:

Offtopic. У нас один товарищ преобразовывал структуры в JSON-строку, передавал ее в другой поток, в котором производил обратные преобразования.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...