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



Урок 52

 

Часть 1

 

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

 

Сегодня мы познакомимся с датчиком, который измеряет давление. Мы рассмотрим и изучим датчик, установленный на плате расширения X-NUCLEO-IKS01A1, предназначенной для работы с отладочной платой Nucleo. Мы будем подключать данную оценочную плату к плате Nucleo STM32F401RE. Выполнен данный датчик также с использованием технологии MEMS.

Этот датчик давления также наряду с интерфейсом I2C может подключаться и с использованием интерфейса SPI. Но мы будем использовать подключение именно по привычному I2C.

Датчик имеет следующие технические характеристики:

Диапазон показаний давления 260 – 1260 гПа (гектопаскалей);

Диапазон показаний  температуры -30 – +105 ᵒС

Разрешение 24 бит для показаний давления и 16 бит для показаний температуры;

Чувствительность 4096 LSB/hPa (бит на один гектопаскаль) для давления;

480 LSB/°C для температуры.

Среднеквадратичное значение уровня шума (RMS noise) – 0,03 гПа без встроенного фильтра и 0,01 со встроенным фильтром;

Отклонение от нуля при температуре +25ᵒС – ±0,1 гПа.

Отклонение показаний температуры ±2 °C.

Частота измерений 1 – 25 Гц.

С некоторыми остальными показателями, регистрами, значениями и другими тонкостями гироскопа мы познакомимся в ходе его программирования.

Проект мы создадим из проекта прошлого занятия, в котором мы работали с магнитометром, установленном на этой же плате расширения – из проекта Mag_LIS3MDL, только назовём мы данный проект теперь соответственно Press_ LPS25HB.

Файлы lis3mdl.c и lis3mdl.h соответственно переименуем в lps25hb.c и lps25hb.h.m.

Запустим проект Cube MX. Скорость USART пока установим 115200 bps

 

image00

 

Больше ничего не трогаем. Сгенерируем проект, откроем его. Настроим программатор на авторезет. Добавим файл lps25hb.c. Скомпилируем проект.

По причине переименования файлов у нас будут ошибки. Для устранения данных ошибок мы исправим подключение заголовочных файлов в main.c и в lps25hb.с

#include "stm32f4xx_hal.h"
#include "lps25hb.h"
#include "lps25hb.h"
//--------------------------------------------

 

В обработчике прерываний от таймера закомментируем вызов функции считывания данных и отправки их в USART.

В бесконечном цикле он у нас уже закомментирован

 

                //Mag_Read();

                HAL_UART_Receive_IT(&huart2,(uint8_t*)str,8);

 

 

В файле lps25hb.h удалим весь код и скопируем туда для экономии драгоценного времени заранее подготовленный код со всеми макросами и переменными из файла macro.txt

 

#ifndef LPS25HB_H_

#define LPS25HB_H_

#include «stm32f4xx_hal.h»

#include <string.h>

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

#define ABS(x)         (x < 0) ? (-x) : x

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

#define LD2_Pin GPIO_PIN_5

#define LD2_GPIO_Port GPIOA

#define LD2_ON HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_SET) //GREEN

#define LD2_OFF HAL_GPIO_WritePin(GPIOA, GPIO_PIN_5, GPIO_PIN_RESET)

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

#define LPS25HB_ADDRESS     0xBA

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

#define        LPS25HB_WHO_AM_I_REG        0x0F

#define        LPS25HB_RES_CONF_REG        0x10

#define        LPS25HB_CTRL_REG1        0x20

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

#define        LPS25HB_WHO_AM_I        0xBD

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

#define        LPS25HB_PD_ACTIVE_MODE        0x80

#define        LPS25HB_PD_POWERDOWN_MODE        0x00

#define        LPS25HB_PD_MASK        0x80

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

#define        LPS25HB_ODR_ONE_SHOT        0x00

#define        LPS25HB_ODR_1HZ        0x10

#define        LPS25HB_ODR_7HZ        0x20

#define        LPS25HB_ODR_12_5HZ        0x30

#define        LPS25HB_ODR_25HZ        0x40

#define        LPS25HB_ODR_MASK        0x70

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

#define        LPS25HB_DIFF_EN_ENABLE        0x08

#define        LPS25HB_DIFF_EN_DISABLE        0x00

#define        LPS25HB_DIFF_EN_MASK        0x08

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

#define        LPS25HB_BDU_DISABLE        0x00

#define        LPS25HB_BDU_ENABLE        0x40

#define        LPS25HB_BDU_MASK        0x04

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

#define LPS25HB_SIM_3_WIRE        0x01

#define LPS25HB_SIM_4_WIRE        0x00

#define        LPS25HB_SIM_MASK        0x01

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

#define        LPS25HB_AVGP_8        0x00

#define        LPS25HB_AVGP_32        0x01

#define        LPS25HB_AVGP_128        0x02

#define        LPS25HB_AVGP_512        0x03

#define        LPS25HB_AVGT_8        0x00

#define        LPS25HB_AVGT_16        0x04

#define        LPS25HB_AVGT_32        0x08

#define        LPS25HB_AVGT_64        0x0C

#define        LPS25HB_AVGT_MASK        0x0C

#define        LPS25HB_AVGP_MASK        0x03

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

#define        LPS25HB_TEMP_OUT_L_REG        0x2B

#define        LPS25HB_TEMP_OUT_H_REG        0x2C

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

#define        LPS25HB_PRESS_OUT_XL_REG        0x28

#define        LPS25HB_PRESS_OUT_L_REG        0x29

#define        LPS25HB_PRESS_OUT_H_REG        0x2A

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

void Press_Ini(void);

void Press_Read(void);

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

#endif /* LPS25HB_H_ */

 

 

Функцию Mag_Ini переименуем в Press_Ini в файлах main.c и в lps25hb.с

 

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

void Press_Ini(void)

{

        Press_Ini();

  /* USER CODE END 2 */

 

Следующая задача у нас – написать код инициализации датчика. И, как всегда, по сложившейся традиции, раз уж у нас подключение именно по шине I2C, начинаем мы её, конечно же, со считывания идентификатора микросхемы.

Исходя из подключения микросхемы, адрес мы выбираем 0xBA

 

image02

 

Регистр для чтения идентификатора используем WHO_AM_I (0Fh)

 

image01

 

В данной таблице мы также видим, переведя двоичный код в шестнадцатеричный, что идентификатор должен быть равен именно 0xBD.

Функцию Mag_ReadID переименуем в Press_ReadID и в реализации, и в вызове

 

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

uint8_t Press_ReadID(void)

{

        HAL_Delay(1000);

        if(Press_ReadID()==LIS3MDL_MAG_WHO_AM_I) LD2_ON;

 

Аналогичным образом поступим и с функциями Mag_IO_Read и Mag_IO_Write

 

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

uint8_t Press_IO_Read(uint16_t DeviceAddr, uint8_t RegisterAddr)

{

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

void Press_IO_Write(uint16_t DeviceAddr, uint8_t RegisterAddr, uint8_t Value)

{

 

Также подправим код в функции чтения идентификатора

 

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

uint8_t Press_ReadID(void)

{

        uint8_t ctrl = 0x00;

        ctrl = Press_IO_Read(LPS25HB_ADDRESS, LPS25HB_WHO_AM_I_REG);

        return ctrl;

}

 

Исправим код в главной функции инициализации

 

        HAL_Delay(1000);

        if(Press_ReadID()==LPS25HB_WHO_AM_I) LD2_ON;

 

В функциях, которые мы пока не используем, закомментируем весь код, облачив его вот в такие теги /* */.

Также закомментируем в инициализации вот это

 

        else Error();

        //LD2_OFF;

        //MagInit(ctrl);

        //LD2_ON;

 

Скомпилируем код, прошьём контроллер и проверим результат нашей работы. Зелёный светодиод должен загореться.

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

 

 

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

 

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

LPS25HB Datasheet

LPS25HB Technical note

Программа Hyper Terminal

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

 

 

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

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

 

 

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

 

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

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

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

*