久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3996|回復: 0
打印 上一主題 下一主題
收起左側

STM32與多臺MS5803壓力傳感器I2C通訊

[復制鏈接]
跳轉到指定樓層
樓主
ID:272571 發表于 2018-1-6 22:38 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
MS5803壓力傳感器支持SPI和I2C總線通訊,擁有24位AD轉換。能夠同時獲得壓力值和溫度值,其中壓力測量范圍為10-1100mbar,溫度的測量范圍是-40-85攝氏度。各引腳功能及參數如下:
傳感器內部結構圖如下:
通訊協議的選擇通過PS引腳來設置:
PS引腳電位
通訊模式
使用的引腳
高電平
I2C
SDA, SCL, CSB
低電平
SPI
SDI, SDO, SCLK, CSB
SPI模式下,SCLK作為外部輸入時鐘,SDI作為串行數據輸入,支持Mode0和Mode3的時鐘極性和相位。傳感器的響應數據輸出為SDO引腳,片選信號為CSB引腳。界限示意圖如下:
在I2C模式下,SCLK為外部串行時鐘輸入,SDA位串行數據通訊。CSB引腳作為地只選擇,可以鏈接到VDD或者GND,這也意味著MS5803可以在一條I2C總線接兩個設備。在CSP接高電平時,地址為0x76(1110110 b),而CSB接低電平時,地址為0x77 (1110111 b)這個地址是高七位,最后以為有讀寫命令來決定。實現寫命令時,最后一位為0,實現讀命令時,最后一位為1。
MS5803擁有5個基本命令:復位、讀取出廠校準值、數據1轉換(壓力值數據)、數據2轉換(溫度值數據)和讀取ADC的轉換結果。具體分配如下:
因為MS5803的地址位僅有1位是可以設定的,所以一條I2C總線最多只能掛2個MS5803模塊。為了讓程序具有較好的可移植性,我們在便寫程序時不使用對硬件的直接操作,而采用函數指針來操作,所以我們定義了:

/*向MS5803下發指令,指令格式均為1個字節*/
typedef void (*WriteCommandToMS5803Type)(uint8_t deviceAddress,uint8_t command);
/*從MS5803讀取多個字節數據的值*/
typedef void (*ReadBytesFromMS5803Type)(uint8_t deviceAddress,uint8_t *pData,uint16_t bytesNum);
以上兩個函數指針來實現針對硬件的讀寫操作。接下來我們開始編寫代碼。
1)復位操作
復位操作的數據流如下圖所示,只需要發送一條命令就可完成:
[url=][/url]
/*復位MS5803操作*/
void ResetForMS5803(uint8_t deviceAddress,WriteCommandToMS5803Type WriteCommandToMS5803)
{
  uint8_t command=COMMAND_RESET;
  /*下發復位命令*/
  WriteCommandToMS5803(deviceAddress,command);
}
[url=][/url]
2)讀取校準值
校準值是出廠時廠家校準的各種系數,每臺設備都有差異,是固定不變的,只需要一次讀取就可以了,共有6個系數,均為16為整數。首先發送讀系數的命令,然后讀取就可以了,每次讀取1個,分6次讀取。過程數據流如下圖所示:
[url=][/url]
/*從MS5803的PROM中讀取校準數據*/
void GetCalibrationData(uint8_t deviceAddress,uint16_t *caliPara,WriteCommandToMS5803Type WriteCommandToMS5803,ReadBytesFromMS5803Type ReadBytesFromMS5803)
{
  /*C1壓力靈敏度*/
  caliPara[0]=ReadPromFromMS5803(deviceAddress,COMMAND_PROM_READ_C1,WriteCommandToMS5803,ReadBytesFromMS5803);
  /*C2壓力補償值*/
  caliPara[1]=ReadPromFromMS5803(deviceAddress,COMMAND_PROM_READ_C2,WriteCommandToMS5803,ReadBytesFromMS5803);
  /*C3壓力靈敏度溫度系數*/
  caliPara[2]=ReadPromFromMS5803(deviceAddress,COMMAND_PROM_READ_C3,WriteCommandToMS5803,ReadBytesFromMS5803);
  /*C4壓力補償溫度系數*/
  caliPara[3]=ReadPromFromMS5803(deviceAddress,COMMAND_PROM_READ_C4,WriteCommandToMS5803,ReadBytesFromMS5803);
  /*C5參考溫度*/
  caliPara[4]=ReadPromFromMS5803(deviceAddress,COMMAND_PROM_READ_C5,WriteCommandToMS5803,ReadBytesFromMS5803);
  /*C6溫度傳感器溫度系數*/
  caliPara[5]=ReadPromFromMS5803(deviceAddress,COMMAND_PROM_READ_C6,WriteCommandToMS5803,ReadBytesFromMS5803);
}
[url=][/url]
3)讀取轉換值
讀取轉換結果值是我們的目的,可以讀取溫度和壓力兩個量,不過一次只能讀一個。首先發送命令設定采集壓力還是溫度,并設定精度。然后發送讀取的命令,最后讀取對應的值。再使用校準系數計算出最終的物理值。
  1. /*獲取轉換值,包括溫度和壓力*/

  2. void GetConversionValue(uint8_t deviceAddress,float *pPres,float *pTemp,uint16_t *caliPara,uint16_t *semaphore,WriteCommandToMS5803Type WriteCommandToMS5803,ReadBytesFromMS5803Type ReadBytesFromMS5803)

  3. {

  4.   uint16_t senst1;        //C1壓力靈敏度

  5.   uint16_t offt1;         //C2壓力補償值

  6.   uint16_t tcs;           //C3壓力靈敏度溫度系數

  7.   uint16_t tco;           //C4壓力補償溫度系數

  8.   uint16_t tref;          //C5參考溫度

  9.   uint16_t tempsens;      //C6溫度傳感器溫度系數



  10.   /*從MS5803的PROM中讀取校準數據*/

  11.   if(*semaphore>0)

  12.   {

  13.     GetCalibrationData(deviceAddress,caliPara,WriteCommandToMS5803,ReadBytesFromMS5803);

  14.     *semaphore=*semaphore-1;

  15.   }

  16.   senst1=caliPara[0];

  17.   offt1=caliPara[1];

  18.   tcs=caliPara[2];

  19.   tco=caliPara[3];

  20.   tref=caliPara[4];

  21.   tempsens=caliPara[5];

  22.   uint32_t digitalPressureValue;

  23.   uint32_t digitalTemperatureValue;


  24.   /*讀取壓力數據*/

  25. digitalPressureValue=ReadConversionFromMS5803(deviceAddress,COMMAND_CONVERTD1OSR4096,WriteCommandToMS5803,ReadBytesFromMS5803);

  26.   Delayms(20);


  27.   /*讀取溫度數據*/

  28. digitalTemperatureValue=ReadConversionFromMS5803(deviceAddress,COMMAND_CONVERTD2OSR4096,WriteCommandToMS5803,ReadBytesFromMS5803);


  29.   /*對溫度進行一階修正*/

  30.   int32_t dT;

  31.   int32_t temp;

  32.   dT=digitalTemperatureValue-tref*256;

  33.   temp=(int32_t)(2000+dT*tempsens/pow(2,23));



  34.   /*對壓力進行一階修正*/

  35.   int64_t off;

  36.   int64_t sens;

  37.   int32_t pres;

  38.   off=(int64_t)(offt1*pow(2,17)+(tco*dT)/pow(2,6));

  39.   sens=(int64_t)(senst1*pow(2,16)+(tcs*dT)/pow(2,7));

  40.   pres=(int32_t)((digitalPressureValue*sens/pow(2,21)-off)/pow(2,15));


  41.   /*對溫度和壓力進行二階修正*/

  42.   int64_t ti=0;

  43.   int64_t offi=0;

  44.   int64_t sensi=0;

  45.   int64_t off2=0;

  46.   int64_t sens2=0;

  47.   if(temp<2000)

  48.   {

  49.     ti=(int64_t)(11*dT*dT/pow(2,35));

  50.     offi=(int64_t)(31*(temp-2000)*(temp-2000)/pow(2,3));

  51.     sensi=(int64_t)(63*(temp-2000)*(temp-2000)/pow(2,5));


  52.     off2=off-offi;

  53.     sens2=sens-sensi;


  54.     temp=temp-(int32_t)ti;

  55.     pres=(int32_t)((digitalPressureValue*sens2/pow(2,21)-off2)/pow(2,15));

  56.   }



  57.   if((-4000<=temp)&&(temp<=8500))

  58.   {

  59.     *pTemp=(float)temp/100.0;

  60.   }

  61.   if((1000<=pres)&&(pres<=190000))

  62.   {

  63.     *pPres=(float)pres/100.0;

  64.   }

  65. }
復制代碼


STM32應用實例八.docx

489.69 KB, 下載次數: 16, 下載積分: 黑幣 -5

STM32

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 一级做a爰片久久毛片免费看 | 免费看黄视频网站 | 欧美性大战xxxxx久久久 | 色婷婷av一区二区三区软件 | 视频在线日韩 | 国产黄色精品在线观看 | 一级毛片免费视频 | 国产欧美一区二区精品久导航 | www精品美女久久久tv | 污视频免费在线观看 | 亚洲激精日韩激精欧美精品 | 男女视频在线观看网站 | 亚洲国产成人av好男人在线观看 | 欧美久久精品 | 久草视| japanhdxxxx裸体 | 国产成人精品久久二区二区91 | 自拍偷拍第一页 | 亚洲天堂日韩精品 | 成人免费观看男女羞羞视频 | 国产精品久久久久久网站 | 国产无套一区二区三区久久 | 成人免费视频 | 久草在线在线精品观看 | 密室大逃脱第六季大神版在线观看 | 国产精品欧美一区二区 | 久久久久亚洲精品 | 成人高清在线视频 | 国产欧美在线一区二区 | 我要看黄色录像一级片 | 婷婷五月色综合 | 在线午夜 | 亚洲精品免费观看 | 国产精品不卡视频 | 欧美综合国产精品久久丁香 | 99福利| 亚洲日本激情 | 免费看黄色小视频 | 看特级黄色片 | 国产精品视频免费观看 | 美女天天干天天操 |