STM Урок 39. Подключаем акселерометр LSM303DLHC. Часть 3



Урок 39

 

Подключаем акселерометр LSM303DLHC

 

Часть 3

 

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

Далее настроим некоторые регистры в функции основной инициализации датчика:

 

        else Error();

        ctrl |= (LSM303DLHC_NORMAL_MODE | LSM303DLHC_ODR_50_HZ | LSM303DLHC_AXES_ENABLE);

        ctrl |= ((LSM303DLHC_BlockUpdate_Continous | LSM303DLHC_BLE_LSB | LSM303DLHC_HR_ENABLE) <<8 );

        AccInit(ctrl);

}

 

Теперь постараюсь объяснить, что именно мы настроили. Регистры LSM303DLHC_CTRL_REG1_A и LSM303DLHC_CTRL_REG4_A – это два регистра настроек с адресами 0x20 и 0x23 (см. техническую документацию на датчик стр. 24-27) (нажмите на картинку для увеличения).

 

image16_0500

 

LSM303DLHC_NORMAL_MODE: значение 0x00. Т.е. мы не включаем бит low-power (пониженного энергопотребления) датчика, нам нужен полноправный режим.

LSM303DLHC_AXES_ENABLE: значение 0x07. Здесь мы включаем все три младшие бита (Zen, Yen и Xen). То есть мы будем работать со всеми тремя осями координат.

LSM303DLHC_ODR_50_HZ: значение 0x40. Включаем только шестой бит ODR2, то есть скорость мы задаем 50 Гц.

 

image14

 

Теперь перейдем к регистру 23h.

 

 

В нем мы включим:

LSM303DLHC_BlockUpdate_Continous: значение 0x00. Тем самым мы говорим датчику, что мы не будем включать в нем самый старший бит BDU, отвечающий за защиту от записи одного байта из двух во время снятия показаний с другого. Нам это не нужно, так как это несколько усложнит запись показаний в регистр.

LSM303DLHC_BLE_LSB: значение 0x00. Здесь мы говорим акселерометру, что бит BLE, который отвечает за то, чтобы байты показаний датчика заполнялись наоборот (старший байт становится младшим), мы также включать не будем.

LSM303DLHC_HR_ENABLE: значение 0x08. А вот байт HR, который инициализирует режим вывода в высоком разрешении мы всё же включим (нажмите на картинку для увеличения).

 

image15_0500

 

 

На этом инициализация датчика еще не закончена. Напишем еще одну функцию для управления фильтрацией.

 

//—————————————

void Accel_AccFilterConfig(uint8_t FilterStruct)

{

  uint8_t tmpreg;

 

  /* Read CTRL_REG2 register */

  tmpreg = Accel_IO_Read(0x32, LSM303DLHC_CTRL_REG2_A);

 

  tmpreg &= 0x0C;

  tmpreg |= FilterStruct;

 

  /* Write value to ACC MEMS CTRL_REG2 register */

  Accel_IO_Write(0x32, LSM303DLHC_CTRL_REG2_A, tmpreg);

}

//—————————————

 

Вызовем данную функцию из функции инициализации, заполнив перед этим некоторые параметры регистра CTRL_REG2_A (21h) (нажмите на картинку для увеличения).

 

image17_0500

 

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

 

        AccInit(ctrl);

        ctrl = (uint8_t) (LSM303DLHC_HPM_NORMAL_MODE | LSM303DLHC_HPFCF_16 |

                                                                                LSM303DLHC_HPF_AOI1_DISABLE | LSM303DLHC_HPF_AOI2_DISABLE);

        Accel_AccFilterConfig(ctrl);

        LD7_ON;

 

Что же за биты регистра 0x21 мы включили?

LSM303DLHC_HPM_NORMAL_MODE: значение 0x80. Мы включили бит HPM1. Это один из двух бит, отвечающих за конфигурацию режима фильтрации верхних частот. Использовать будем обычный режим без перезагрузки фильтров.

 

image18

 

LSM303DLHC_HPFCF_16: значение 0x10. Включим бит HPCF1, являющийся одним из двух бит (HPCF2 и HPCF1), отвечающих за выбор частоты среза фильтра верхних частот. К сожалению техническая документация не располагает подробными сведениями о том, какое именно значение частоты мы срезаем, используя ту или иную комбинацию данных бит. Поэтому данная настройка была взята из примера, который лежит в папке со средой программирования.

LSM303DLHC_HPF_AOI1_DISABLE и LSM303DLHC_HPF_AOI2_DISABLE: оба значения 0x00. Это два младших бита регистра, отвечающие за включение прерываний на одноименных ножках INT1 и INT2. В рамках нашего занятия мы не будем пользоваться прерываниями, поэтому данные биты мы не включаем.

С инициализацией закончили.

Соберём код, прошьём контроллер и проверим по свечению светодиода, что у нас хотя бы ничего не повисло и мы не ушли в ошибку

 

image27

 

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

 

 

Предыдущая часть Программирование МК STM32 Следующая часть

 

Техническая документация на датчик

Программа SF Monitor

 

 

Купить отладочную плату можно здесь STM32F3-DISCOVERY

 

 

Смотреть ВИДЕОУРОК

 

STM Подключаем акселерометр LSM303DLHC

 

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*