Olegus 0 2 мая, 2019 Опубликовано 2 мая, 2019 · Жалоба Использую 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Гц. Почему так? Вроде один и тот же чип, с акселем работает, а с магнитометром нет. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба Вы что, для передачи 3 чисел используете malloc() ? Который вызывается с частотой 30-50 Гц ? Зачем "гонять" 3 ячейки памяти туда-сюда, если они используются 50 раз в секунду ? Если момент готовности данных определяете по опросу бита - можете получить кучу граблей, например децимацию в различных вариантах. Возможно в теме ТС - эффект из этой серии. Используйте таймер для задания регулярного события (старт замера-оцифровки) и апп. прерывания по готовности данных для получения результата. Уберите free() и malloc(), разве что это сделано умышленно и необходимо (IMHO) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
k155la3 26 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба ЭТО 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 ) { . . . . . } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 172 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба 10 часов назад, k155la3 сказал: Вы что, для передачи 3 чисел используете malloc() ? Который вызывается с частотой 30-50 Гц ? Зачем "гонять" 3 ячейки памяти туда-сюда, если они используются 50 раз в секунду ? Хех! Это ещё что! Некоторые деятели в строку числа перегоняют и так передают, а потом обратно в число восстанавливают. Между функциями. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alexunder 4 3 мая, 2019 Опубликовано 3 мая, 2019 · Жалоба 37 minutes ago, jcxz said: Хех! Это ещё что! Некоторые деятели в строку числа перегоняют и так передают, а потом обратно в число восстанавливают. Между функциями. Offtopic. У нас один товарищ преобразовывал структуры в JSON-строку, передавал ее в другой поток, в котором производил обратные преобразования. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться