STM Урок 52. Датчик давления LPS25HB. Часть 2



Урок 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 с целью пока выключить датчик

 

image04

 

Пишем код дальше

 

        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) и устанавливаем там биты, отвечающие за частоту считывания показаний

 

image03

 

 

Продолжим писать инициализацию

 

        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) и устанавливаем там бит, отвечающий за включение схемы прерываний

 

image06

 

Продолжаем дальше

 

        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). С данным режимом мы с вами уже хорошо знакомы

 

image05

 

Пишем дальше код

 

        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х-проводной

 

image09

 

 

Продолжим писать дальше

 

        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 на температуру

 

image07

 

И последнее:

 

        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 регистра переведём датчик в активный режим, то есть включим его

 

image13

 

На этом инициализация закончена.

Соберём код, прошьём контроллер и проверим, не погаснет ли у нас светодиод.

Если всё нормально, то начнём писать код считывания показаний с датчика. Сначала напишем функцию считывания показаний температуры

Функцию Mag_GetXYZ переименуем в Press_Get_Temp, также изменим тип входного параметра

 

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

void Press_Get_Temp (float* pData)

{

 

Для считывания показаний температуры используем два регистра

 

image10 image12

 

Раскомментируем код и внесём изменения в функцию считывания показаний

 

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

        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 поделим

 

image14

 

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

 

 

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

 

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

LPS25HB Datasheet

LPS25HB Technical note

Программа Hyper Terminal

Программа NS Port Monitor для значений с плавающей точкой

 

 

Отладочную плату можно приобрести здесь Nucleo STM32F401RE

Оценочную плату можно приобрести здесь STM32 X-NUCLEO-IKS01A1

 

 

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

 

STM32 Датчик давления LPS25HB

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

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

*