<acronym id="s8ci2"><small id="s8ci2"></small></acronym>
<rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
<acronym id="s8ci2"></acronym>
<acronym id="s8ci2"><center id="s8ci2"></center></acronym>
0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用氣壓傳感器MS5611獲取溫度數據和氣壓數據

CHANBAEK ? 來源:實在太懶于是不想取名 ? 作者:電路小白 ? 2023-11-20 17:45 ? 次閱讀

MS5611是一款由瑞士公司MEAS推出的高分辨率氣壓傳感器。它具有以下特點:

接口:支持SPI和I2C總線接口。(通過PS腳來選擇)

內部結構:包括高線性度的壓力傳感器和超低功耗的24位累加模數轉換器(工廠校準系數)。

功能:提供精確的24位數字壓力值和溫度值,適用于高度計、溫度計等功能。

尺寸:僅有5.0毫米×3.0毫米×1.0毫米的小尺寸,適合集成在移動設備中。

這款傳感器采用領先的MEMS技術,具有高穩定性和非常低的壓力信號滯后。它在移動高度計、氣壓計系統、自行車電腦、智能手機等領域有廣泛的應用

準備工作

由于芯片上支持IIC通訊,因此我們打算使用STM32硬件IIC,我的STM32為STM32F407。

我們打開CUBEMX,選擇好我們的時鐘還有其他設置之后,我們打開我們的硬件IIC

圖片

并且我們打開串口來進行調試,我們選擇IIC1,可以發現是PB6/PB7。

并且我們在USART.C文件中加入我們的串口重定向代碼,方便我們使用printf函數

struct __FILE 
{ 
  int handle; 
}; 


struct __FILE __stdout;       
//定義_sys_exit()以避免使用半主機模式    
void _sys_exit(int x) 
{ 
  x = x; 
} 
//重定義fputc函數 
int fputc(int ch, struct __FILE *f)
{   
  while((USART1- >SR&0X40)==0);//循環發送,直到發送完畢   
  USART1- >DR = (unsigned char) ch;      
  return ch;
}

利用這串代碼,我們就可以把我們的串口發送函數重定向到我們的printf函數上。

之后我們測試一下,我們的串口發送。

圖片

可以看到串口重定向成功。

數據解釋

圖片

我們在MS5611的官方手冊中可以看到,MS5611的數據主要由C1~C6這六個校準系數以及D1,D2兩個數據組成。

圖片

通過這些數據配合芯片手冊計算方式我們可以計算出我們的傳感器數值。

圖片

我們在向MS5611發送數據轉換命令的時候,模塊會把對應的信號轉換好之后存入PROM寄存器中,我們需要讀取PROM的數據來讀取這些數據,PROM的地址從0XA0~0XAE

代碼編寫

#define MS5611_I2C_ADDR 0xEE //PS拉高的地址
#define CMD_ADC_READ    0x00 //ADC轉換開始
#define CMD_ADC_CONV_D1 0x40 //D1讀取命令
#define CMD_ADC_CONV_D2 0x50 //D2讀取命令
#define CMD_PROM_RD     0xA0 //PROM基地址


typedef struct {
    double temperature;//溫度
    double pressure;//氣壓
    uint32_t D1;
    uint32_t D2;
    uint16_t C1;
    uint16_t C2;
    uint16_t C3;
    uint16_t C4;
    uint16_t C5;
    uint16_t C6;
} MS5611Data;

首先我們定義模塊的命令宏定義以及我們的結構體用來存放我們的數據。

extern I2C_HandleTypeDef hi2c1;
void ReadMS5611Data(MS5611Data *ms5611Data);

其次定義我們的hi2c1句柄,由于這個句柄的實際定義是在i2c.h文件中,因此我們需要加上extern來修飾我們的變量

接著我們來定義我們的ReadMS5611Data函數,我們分步講解。

HAL_I2C_Mem_Write(&hi2c1, MS5611_I2C_ADDR, CMD_ADC_CONV_D1, I2C_MEMADD_SIZE_8BIT, NULL, 0, 100);
    HAL_Delay(10);
    uint8_t buffer[3];
    HAL_I2C_Mem_Read(&hi2c1, MS5611_I2C_ADDR, CMD_ADC_READ, I2C_MEMADD_SIZE_8BIT, buffer, 3, 100);
    ms5611Data- >D1 = ((uint32_t)buffer[0] < < 16) | ((uint32_t)buffer[1] < < 8) | (uint32_t)buffer[2];

首先是利用HAL庫的IIC寫命令函數,我們向模塊發送讀取命令,

圖片

由于D1,D2都是24個空間,因此我們的數據分3次讀取,我們定義一個uint8_t buffer[3];分別存儲三次數據

之后我們利用移位運算符,把我們的數據依次拼接到我們的D1數據上。
HAL_I2C_Mem_Write(&hi2c1, MS5611_I2C_ADDR, CMD_ADC_CONV_D2, I2C_MEMADD_SIZE_8BIT, NULL, 0, 100);
HAL_Delay(10);
HAL_I2C_Mem_Read(&hi2c1, MS5611_I2C_ADDR, CMD_ADC_READ, I2C_MEMADD_SIZE_8BIT, buffer, 3, 100);    
ms5611Data- >D2 = ((uint32_t)buffer[0] < < 16) | ((uint32_t)buffer[1] < < 8) | (uint32_t)buffer[2];

這部分也是同理,我們用這個方式獲取D2的值。

uint8_t coef_data[2];
    for (int i = 1; i <= 6; i++) {
        HAL_I2C_Mem_Read(&hi2c1, MS5611_I2C_ADDR, CMD_PROM_RD + (i)*2, I2C_MEMADD_SIZE_8BIT, coef_data, 2, 100);
        if (i == 1) {
            ms5611Data- >C1 = (coef_data[0] < < 8) | coef_data[1];
        } else if (i == 2) {
            ms5611Data- >C2 = (coef_data[0] < < 8) | coef_data[1];
        } else if (i == 3) {
            ms5611Data- >C3 = (coef_data[0] < < 8) | coef_data[1];
        } else if (i == 4) {
            ms5611Data- >C4 = (coef_data[0] < < 8) | coef_data[1];
        } else if (i == 5) {
            ms5611Data- >C5 = (coef_data[0] < < 8) | coef_data[1];
        } else if (i == 6) {
            ms5611Data- >C6 = (coef_data[0] < < 8) | coef_data[1];
        }
    }

接著我們定義一個數據用來存儲我們的校準系數,由于校準系數是存儲在PORM上的

圖片

所以我們需要用MS5611_I2C_ADDR, CMD_PROM_RD + (i)*2來確定我們的地址

我們把數據按照高8位低8位存儲到校準系數中

int32_t dt = ms5611Data- >D2 - ((int32_t)ms5611Data- >C5 *256);
double temp = 2000+((double)dt/ 8388608)*ms5611Data- >C6;

接著我們按照手冊中的方法計算我們的數據,需要注意的是,temp的類型最好選擇是double型,否則dt/8388608(1<<23)可能會數據丟失。

同樣的我們再用這種辦法計算我們的氣壓值(手冊上面都有)

int64_t off = ((int64_t)ms5611Data- >C2 * 65536) + ((int64_t)ms5611Data- >C4 * dt) / 128;
int64_t sens = ((int64_t)ms5611Data- >C1 < < 15) + (((int64_t)ms5611Data- >C3 * dt) / (1 < < 8));
double pressure = ((double)ms5611Data- >D1 * sens/2097152 - off) / (1 < < 15);

效果展示

圖片

可以看到我們的氣壓數據打印出來是符合常理的。

圖片

我們的溫度數據也是正常顯示的

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 傳感器
    +關注

    關注

    2532

    文章

    48520

    瀏覽量

    742096
  • mems
    +關注

    關注

    128

    文章

    3762

    瀏覽量

    189206
  • STM32
    +關注

    關注

    2245

    文章

    10686

    瀏覽量

    349564
  • 氣壓傳感器
    +關注

    關注

    4

    文章

    119

    瀏覽量

    20917
收藏 人收藏

    評論

    相關推薦

    一文看懂ms5611性能參數及典型應用

    MS5611是由MEAS(瑞士)推出的一款SPI和I2C總線接口的新一代高分辨率氣壓傳感器。本文開始介紹了MS5611概念和MS5611詳細
    發表于 03-08 09:36 ?8693次閱讀

    【經驗交流】使用MS5611高精度氣壓計之后的感想

    的),所以,可能會造成飛機上電之后需要等待的時間過長。這是在折騰了MS5611之后的一點心得,希望廣大在高度算法上折騰的盆友們發表下自己的看法和解決方法。大家多多交流!現在大多數氣壓計都是壓電式傳感器,不知道,這個與
    發表于 02-06 22:50

    完全替換精量(Intersema) MS5611氣壓傳感器 -- FBM320(沛喆

    本帖最后由 marcoyes 于 2017-4-14 14:41 編輯 ***沛喆FBM320氣壓傳感器在無人機、多軸飛行上測量相對高度。實現定高和懸停的大批量應用,其性能上可以完全取代
    發表于 12-10 00:25

    GPS軌跡和氣壓傳感器等多路數據同步采集與存儲實現方案

    本帖最后由 qujian112 于 2016-1-20 15:31 編輯 GPS軌跡和氣壓傳感器等多路數據同步采集與存儲實現方案簡易說明1. 網絡組成示意圖:2.項目名稱:GPS軌跡和氣
    發表于 01-20 15:29

    STM32F10X + MS5611 + JLink 測氣壓溫度例程詳解

    硬件平臺:STM32F10X + MS5611 + JLink 軟件平臺:Keil 4 一、基礎知識首先,MS5611是什么?MS5611氣壓傳感器
    發表于 08-18 13:30

    stm32f407使用SPI讀取氣壓MS5611數據

    stm32f407 使用SPI讀取氣壓MS5611數據并處理得出大氣壓
    發表于 08-17 09:05

    使用stm32的IIC庫函數開發MS5611氣壓

    前言這篇博客將介紹使用stm32的IIC庫函數開發MS5611氣壓計,獲取氣壓數據溫度數據,并
    發表于 11-23 08:53

    氣壓MS5611讀出來的數據不準是為什么?

    氣壓MS5611讀出來的數據不準
    發表于 11-02 07:55

    STM32+MS5611氣壓溫度例程詳解

    MS5611氣壓傳感器是集合SPI和I2C(高達20 MHz)總線接口的高分辨率氣壓傳感器,分辨率可達到10cm。內部有一個高線性度的壓力
    發表于 01-12 15:31 ?1.3w次閱讀
    STM32+<b class='flag-5'>MS5611</b>測<b class='flag-5'>氣壓</b><b class='flag-5'>溫度</b>例程詳解

    氣壓傳感器MS5611使用SPI接口的程序

    s5611是同時支持I2C和SPI通信協議的氣壓計芯片。已經很普遍的被用在飛行器控制板上作為高度傳感器。開發過stm32的朋友都知道它的硬件I2C是由bug的,一般使用的都是自己編寫的軟件I2C通信協議。但是其硬件SPI通信卻是
    發表于 01-12 16:25 ?1.1w次閱讀
    <b class='flag-5'>氣壓</b><b class='flag-5'>傳感器</b><b class='flag-5'>MS5611</b>使用SPI接口的程序

    氣壓傳感器bmp280與ms5611哪個好

    本文開始闡述了BMP280的定義與BMP280的應用程序,其次闡述了MS5611的定義、MS5611參數、MS5611的分類與典型應用,最后詳細分析了氣壓
    發表于 03-08 09:08 ?2.5w次閱讀

    MS5611氣壓計 I2C驅動代碼 STM32

    MS5611氣壓計 I2C驅動代碼 STM32
    發表于 11-15 11:51 ?23次下載
    <b class='flag-5'>MS5611</b><b class='flag-5'>氣壓</b>計 I2C驅動代碼 STM32

    STM32 BMP280模塊獲取氣壓溫度高度傳感器數據 TFT顯示

    接口,相比上一代的BMP180,精度已有相當大的提升,非常適合應用于低成本的多旋翼飛行器飛行控制器上,價格僅有目前流行的MS5611的四分之一。電路設計傳感器數據
    的頭像 發表于 07-21 10:47 ?1278次閱讀
    STM32 BMP280模塊<b class='flag-5'>獲取</b><b class='flag-5'>氣壓</b><b class='flag-5'>溫度</b>高度<b class='flag-5'>傳感器</b><b class='flag-5'>數據</b> TFT顯示

    MS5607與MS5611氣壓傳感器怎么選擇

    MS5611氣壓傳感器是一款SPI和IC總線接口的新一代高分辨率氣壓傳感器。分辨率可達到10cm。該傳感
    的頭像 發表于 05-09 16:31 ?623次閱讀
    <b class='flag-5'>MS</b>5607與<b class='flag-5'>MS5611</b><b class='flag-5'>氣壓</b><b class='flag-5'>傳感器</b>怎么選擇

    MS5611-01BA03傳感器在電子煙的黑科技

    由于MS5611-01BA03是絕壓型傳感器,輸出絕對壓力值。同樣如果將傳感器置于我們生活的大氣環境中,氣壓值的測量也會受到環境氣壓值的影響
    的頭像 發表于 05-09 16:34 ?823次閱讀
    <b class='flag-5'>MS5611</b>-01BA03<b class='flag-5'>傳感器</b>在電子煙的黑科技
    亚洲欧美日韩精品久久_久久精品AⅤ无码中文_日本中文字幕有码在线播放_亚洲视频高清不卡在线观看
    <acronym id="s8ci2"><small id="s8ci2"></small></acronym>
    <rt id="s8ci2"></rt><rt id="s8ci2"><optgroup id="s8ci2"></optgroup></rt>
    <acronym id="s8ci2"></acronym>
    <acronym id="s8ci2"><center id="s8ci2"></center></acronym>