Урок 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) (нажмите на картинку для увеличения).
LSM303DLHC_NORMAL_MODE: значение 0x00. Т.е. мы не включаем бит low-power (пониженного энергопотребления) датчика, нам нужен полноправный режим.
LSM303DLHC_AXES_ENABLE: значение 0x07. Здесь мы включаем все три младшие бита (Zen, Yen и Xen). То есть мы будем работать со всеми тремя осями координат.
LSM303DLHC_ODR_50_HZ: значение 0x40. Включаем только шестой бит ODR2, то есть скорость мы задаем 50 Гц.
Теперь перейдем к регистру 23h.
В нем мы включим:
LSM303DLHC_BlockUpdate_Continous: значение 0x00. Тем самым мы говорим датчику, что мы не будем включать в нем самый старший бит BDU, отвечающий за защиту от записи одного байта из двух во время снятия показаний с другого. Нам это не нужно, так как это несколько усложнит запись показаний в регистр.
LSM303DLHC_BLE_LSB: значение 0x00. Здесь мы говорим акселерометру, что бит BLE, который отвечает за то, чтобы байты показаний датчика заполнялись наоборот (старший байт становится младшим), мы также включать не будем.
LSM303DLHC_HR_ENABLE: значение 0x08. А вот байт HR, который инициализирует режим вывода в высоком разрешении мы всё же включим (нажмите на картинку для увеличения).
На этом инициализация датчика еще не закончена. Напишем еще одну функцию для управления фильтрацией.
//—————————————
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) (нажмите на картинку для увеличения).
И в конце инициализации включим второй зелёный светодиод, который просигнализирует нам об успешной инициализации датчика, т.к. в процессе сочинения и отладки кода я столкнулся с некоторыми проблемами и зависаниями.
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. Это один из двух бит, отвечающих за конфигурацию режима фильтрации верхних частот. Использовать будем обычный режим без перезагрузки фильтров.
LSM303DLHC_HPFCF_16: значение 0x10. Включим бит HPCF1, являющийся одним из двух бит (HPCF2 и HPCF1), отвечающих за выбор частоты среза фильтра верхних частот. К сожалению техническая документация не располагает подробными сведениями о том, какое именно значение частоты мы срезаем, используя ту или иную комбинацию данных бит. Поэтому данная настройка была взята из примера, который лежит в папке со средой программирования.
LSM303DLHC_HPF_AOI1_DISABLE и LSM303DLHC_HPF_AOI2_DISABLE: оба значения 0x00. Это два младших бита регистра, отвечающие за включение прерываний на одноименных ножках INT1 и INT2. В рамках нашего занятия мы не будем пользоваться прерываниями, поэтому данные биты мы не включаем.
С инициализацией закончили.
Соберём код, прошьём контроллер и проверим по свечению светодиода, что у нас хотя бы ничего не повисло и мы не ушли в ошибку
В следующей части нашего занятия мы напишем код, который будет считывать показания датчика и будет соответствующим образом складывать это в буфер для дальнейшего использования в работе.
Предыдущая часть Программирование МК STM32 Следующая часть
Техническая документация на датчик
Купить отладочную плату можно здесь STM32F3-DISCOVERY
Смотреть ВИДЕОУРОК
Добавить комментарий