Урок 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
Больше ничего не трогаем. Сгенерируем проект, откроем его. Настроим программатор на авторезет. Добавим файл 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
Регистр для чтения идентификатора используем WHO_AM_I (0Fh)
В данной таблице мы также видим, переведя двоичный код в шестнадцатеричный, что идентификатор должен быть равен именно 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 Следующая часть
Техническая документация на датчик:
Программа NS Port Monitor для значений с плавающей точкой
Отладочную плату можно приобрести здесь Nucleo STM32F401RE
Оценочную плату можно приобрести здесь STM32 X-NUCLEO-IKS01A1
Смотреть ВИДЕОУРОК
Добавить комментарий