Урок 52
Часть 2
Датчик давления LPS25HB
В предыдущей части занятия мы добавили все макросы, которые вносят удобства в чтение и написание кода, а также считали идентификатор датчика.
Продолжим писать инициализацию.
Переименуем функцию MagInit в PressInit
//———————————————
void PressInit(uint16_t InitStruct)
{
Также исправим и раскомментируем вызов данной функции в главной функции инициализации датчика
LD2_OFF;
PressInit(ctrl);
LD2_ON;
Продолжаем писать инициализацию, постепенно раскомментировывая и подправляя код в функции
uint8_t value = 0;
//пока выключим датчик (PD = 0)
value = Press_IO_Read(LPS25HB_ADDRESS,LPS25HB_CTRL_REG1);
value&=~LPS25HB_PD_MASK;
value|=LPS25HB_PD_POWERDOWN_MODE;
Press_IO_Write(LPS25HB_ADDRESS,LPS25HB_CTRL_REG1,value);
/*
Здесь мы используем регистр CTRL_REG1 (20h) и сбросим там бит PD с целью пока выключить датчик
Пишем код дальше
Press_IO_Write(LPS25HB_ADDRESS,LPS25HB_CTRL_REG1,value);
//Включим Data Rate 25 Гц
value = Press_IO_Read(LPS25HB_ADDRESS,LPS25HB_CTRL_REG1);
value&=~LPS25HB_ODR_MASK;
value|=LPS25HB_ODR_25HZ;
Press_IO_Write(LPS25HB_ADDRESS,LPS25HB_CTRL_REG1,value);
Здесь мы используем тот же регистр CTRL_REG1 (20h) и устанавливаем там биты, отвечающие за частоту считывания показаний
Продолжим писать инициализацию
Press_IO_Write(LPS25HB_ADDRESS,LPS25HB_CTRL_REG1,value);
//Enable Interrupt Circuit
value = Press_IO_Read(LPS25HB_ADDRESS,LPS25HB_CTRL_REG1);
value&=~LPS25HB_DIFF_EN_MASK;
value|=LPS25HB_DIFF_EN_ENABLE;
Press_IO_Write(LPS25HB_ADDRESS,LPS25HB_CTRL_REG1,value);
Здесь мы опять же используем регистр CTRL_REG1 (20h) и устанавливаем там бит, отвечающий за включение схемы прерываний
Продолжаем дальше
Press_IO_Write(LPS25HB_ADDRESS,LPS25HB_CTRL_REG1,value);
//Enable BDU
value = Press_IO_Read(LPS25HB_ADDRESS,LPS25HB_CTRL_REG1);
value&=~LPS25HB_BDU_MASK;
value|=LPS25HB_BDU_ENABLE;
Press_IO_Write(LPS25HB_ADDRESS,LPS25HB_CTRL_REG1,value);
И опять у нас тот же регистр CTRL_REG1 (20h). Устанавливаем мы в нем теперь бит, отвечающий за включение BDU (Block data update). С данным режимом мы с вами уже хорошо знакомы
Пишем дальше код
Press_IO_Write(LPS25HB_ADDRESS,LPS25HB_CTRL_REG1,value);
//Set SPI mode 3 WIRE
value = Press_IO_Read(LPS25HB_ADDRESS,LPS25HB_CTRL_REG1);
value&=~LPS25HB_SIM_MASK;
value|=LPS25HB_SIM_3_WIRE;
Press_IO_Write(LPS25HB_ADDRESS,LPS25HB_CTRL_REG1,value);
У нас тот же регистр регистр CTRL_REG1 (20h). Включаем 3х проводной режим, так как по умолчанию устанавливается 4х-проводной
Продолжим писать дальше
Press_IO_Write(LPS25HB_ADDRESS,LPS25HB_CTRL_REG1,value);
//Set internal averaging sample counts for pressure and temperature
value = Press_IO_Read(LPS25HB_ADDRESS,LPS25HB_RES_CONF_REG);
value&=~(LPS25HB_AVGT_MASK | LPS25HB_AVGP_MASK);
value|=LPS25HB_AVGP_32;
value|=LPS25HB_AVGT_16;
Press_IO_Write(LPS25HB_ADDRESS,LPS25HB_RES_CONF_REG,value);
Здесь уже регистр другой – RES_CONF (10h). Данный регистр отвечает за усреднение нескольких показаний (низкочастотную фильтрацию) показаний давления и температуры. Установим 32 показания на давление и 16 на температуру
И последнее:
Press_IO_Write(LPS25HB_ADDRESS,LPS25HB_RES_CONF_REG,value);
//Включаем датчик
value = Press_IO_Read(LPS25HB_ADDRESS,LPS25HB_CTRL_REG1);
value&=~LPS25HB_PD_MASK;
value|=LPS25HB_PD_ACTIVE_MODE;
Press_IO_Write(LPS25HB_ADDRESS,LPS25HB_CTRL_REG1,value);
Здесь мы битом 1 регистра переведём датчик в активный режим, то есть включим его
На этом инициализация закончена.
Соберём код, прошьём контроллер и проверим, не погаснет ли у нас светодиод.
Если всё нормально, то начнём писать код считывания показаний с датчика. Сначала напишем функцию считывания показаний температуры
Функцию Mag_GetXYZ переименуем в Press_Get_Temp, также изменим тип входного параметра
//———————————————
void Press_Get_Temp (float* pData)
{
Для считывания показаний температуры используем два регистра
Раскомментируем код и внесём изменения в функцию считывания показаний
//———————————————
void Press_Get_Temp (float* pData)
{
int16_t raw_data=0,tmp_data=0;
buffer[0]=Press_IO_Read(LPS25HB_ADDRESS,LPS25HB_TEMP_OUT_L_REG);
buffer[1]=Press_IO_Read(LPS25HB_ADDRESS,LPS25HB_TEMP_OUT_H_REG);
raw_data = (((uint16_t)buffer[1]) << 8) + (uint16_t)buffer[0];
tmp_data = raw_data / 48 + 425;
*pData = ( float )tmp_data / 10.0f;
}
//———————————————
Почему именно такая формула расчёта температуры в градусах подробно описано в документации, только мы для исключения слишком большого количества операций с плавающей точкой воспользуемся умноженной 10 левой частью формулы, а затем результат на 10 поделим
В следующей части нашего урока мы напишем функцию считывания и предварительной обработки значения давления, также изменим код функции фильтра скользящего среднего.
Также мы отобразим значение температуры и давления (причём сразу в трёх единицах измерения в терминальной программе).
Предыдущая часть Программирование МК STM32 Следующая часть
Техническая документация на датчик:
Программа NS Port Monitor для значений с плавающей точкой
Отладочную плату можно приобрести здесь Nucleo STM32F401RE
Оценочную плату можно приобрести здесь STM32 X-NUCLEO-IKS01A1
Смотреть ВИДЕОУРОК
Добавить комментарий