LPS25HをSPIで使えるようにしたライブラリです。  ・気圧  ・温度  ・高度(気圧と温度から) が取得できます。 FIFOも使えます。

Committer:
Sigma884
Date:
Tue Mar 17 12:39:22 2020 +0000
Revision:
2:7ea8c77e960c
Parent:
0:7bbdfc4610fe
commit for publish Stability_seed2019_v2

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sigma884 0:7bbdfc4610fe 1 #include "LPS25H_spi.h"
Sigma884 0:7bbdfc4610fe 2 #include "mbed.h"
Sigma884 0:7bbdfc4610fe 3 #include "math.h"
Sigma884 0:7bbdfc4610fe 4
Sigma884 0:7bbdfc4610fe 5 /**********
Sigma884 0:7bbdfc4610fe 6 コンストラクタ
Sigma884 0:7bbdfc4610fe 7 ・使用するSPIを選択
Sigma884 0:7bbdfc4610fe 8 ・使用するCSピンを選択
Sigma884 0:7bbdfc4610fe 9 **********/
Sigma884 0:7bbdfc4610fe 10 LPS25H_spi :: LPS25H_spi(SPI &userSPI, PinName userPin) : cs(userPin){
Sigma884 0:7bbdfc4610fe 11 spi = &userSPI;
Sigma884 0:7bbdfc4610fe 12
Sigma884 0:7bbdfc4610fe 13 spi -> format(8, 3);
Sigma884 2:7ea8c77e960c 14 spi -> frequency(5000000);
Sigma884 0:7bbdfc4610fe 15 cs = 0;
Sigma884 0:7bbdfc4610fe 16 spi -> write(0x00);
Sigma884 0:7bbdfc4610fe 17 spi -> write(0x00);
Sigma884 0:7bbdfc4610fe 18 cs = 1;
Sigma884 0:7bbdfc4610fe 19 }
Sigma884 0:7bbdfc4610fe 20
Sigma884 0:7bbdfc4610fe 21 /**********
Sigma884 0:7bbdfc4610fe 22 (void)センサー起動(int データレート)
Sigma884 0:7bbdfc4610fe 23 ・データ更新レートを選択(1, 10, 25, 50, 75)
Sigma884 0:7bbdfc4610fe 24 **********/
Sigma884 0:7bbdfc4610fe 25 void LPS25H_spi :: begin(int drate){
Sigma884 0:7bbdfc4610fe 26 switch(drate){
Sigma884 0:7bbdfc4610fe 27 case 1:
Sigma884 0:7bbdfc4610fe 28 cmd_ctrl_reg1 = 0x90;
Sigma884 0:7bbdfc4610fe 29 break;
Sigma884 0:7bbdfc4610fe 30
Sigma884 0:7bbdfc4610fe 31 case 7:
Sigma884 0:7bbdfc4610fe 32 cmd_ctrl_reg1 = 0xA0;
Sigma884 0:7bbdfc4610fe 33 break;
Sigma884 0:7bbdfc4610fe 34
Sigma884 0:7bbdfc4610fe 35 case 12:
Sigma884 0:7bbdfc4610fe 36 cmd_ctrl_reg1 = 0xB0;
Sigma884 0:7bbdfc4610fe 37 break;
Sigma884 0:7bbdfc4610fe 38
Sigma884 0:7bbdfc4610fe 39 case 25:
Sigma884 0:7bbdfc4610fe 40 cmd_ctrl_reg1 = 0xC0;
Sigma884 0:7bbdfc4610fe 41 break;
Sigma884 0:7bbdfc4610fe 42
Sigma884 0:7bbdfc4610fe 43 default:
Sigma884 0:7bbdfc4610fe 44 cmd_ctrl_reg1 = 0x80;
Sigma884 0:7bbdfc4610fe 45 break;
Sigma884 0:7bbdfc4610fe 46 }
Sigma884 0:7bbdfc4610fe 47 cs = 0;
Sigma884 0:7bbdfc4610fe 48 spi -> write(CTRL_REG1 & 0x3F);
Sigma884 0:7bbdfc4610fe 49 spi -> write(cmd_ctrl_reg1);
Sigma884 0:7bbdfc4610fe 50 cs = 1;
Sigma884 0:7bbdfc4610fe 51
Sigma884 0:7bbdfc4610fe 52 wait(0.1f);
Sigma884 0:7bbdfc4610fe 53 }
Sigma884 0:7bbdfc4610fe 54
Sigma884 0:7bbdfc4610fe 55 /**********
Sigma884 0:7bbdfc4610fe 56 (void)FIFO設定(int FIFOレベル)
Sigma884 0:7bbdfc4610fe 57 ・FIFOウォーターマークレベルを選択(2, 4, 8, 16, 32)
Sigma884 0:7bbdfc4610fe 58 **********/
Sigma884 0:7bbdfc4610fe 59 void LPS25H_spi :: setFIFO(int size){
Sigma884 0:7bbdfc4610fe 60 cmd_ctrl_reg2 = 0x40;
Sigma884 0:7bbdfc4610fe 61 switch(size){
Sigma884 0:7bbdfc4610fe 62 case 2:
Sigma884 0:7bbdfc4610fe 63 cmd_fifo_ctrl = 0xC1;
Sigma884 0:7bbdfc4610fe 64 break;
Sigma884 0:7bbdfc4610fe 65
Sigma884 0:7bbdfc4610fe 66 case 4:
Sigma884 0:7bbdfc4610fe 67 cmd_fifo_ctrl = 0xC3;
Sigma884 0:7bbdfc4610fe 68 break;
Sigma884 0:7bbdfc4610fe 69
Sigma884 0:7bbdfc4610fe 70 case 8:
Sigma884 0:7bbdfc4610fe 71 cmd_fifo_ctrl = 0xC7;
Sigma884 0:7bbdfc4610fe 72 break;
Sigma884 0:7bbdfc4610fe 73
Sigma884 0:7bbdfc4610fe 74 case 16:
Sigma884 0:7bbdfc4610fe 75 cmd_fifo_ctrl = 0xCF;
Sigma884 0:7bbdfc4610fe 76 break;
Sigma884 0:7bbdfc4610fe 77
Sigma884 0:7bbdfc4610fe 78 case 32:
Sigma884 0:7bbdfc4610fe 79 cmd_fifo_ctrl = 0xDF;
Sigma884 0:7bbdfc4610fe 80 break;
Sigma884 0:7bbdfc4610fe 81
Sigma884 0:7bbdfc4610fe 82 default:
Sigma884 0:7bbdfc4610fe 83 cmd_ctrl_reg2 = 0x00;
Sigma884 0:7bbdfc4610fe 84 cmd_fifo_ctrl = 0x00;
Sigma884 0:7bbdfc4610fe 85 }
Sigma884 0:7bbdfc4610fe 86
Sigma884 0:7bbdfc4610fe 87 cs = 0;
Sigma884 0:7bbdfc4610fe 88 spi -> write(CTRL_REG2 & 0x3F);
Sigma884 0:7bbdfc4610fe 89 spi -> write(cmd_ctrl_reg2);
Sigma884 0:7bbdfc4610fe 90 cs = 1;
Sigma884 0:7bbdfc4610fe 91 cs = 0;
Sigma884 0:7bbdfc4610fe 92 spi -> write(FIFO_CTRL & 0x3F);
Sigma884 0:7bbdfc4610fe 93 spi -> write(cmd_fifo_ctrl);
Sigma884 0:7bbdfc4610fe 94 cs = 1;
Sigma884 0:7bbdfc4610fe 95
Sigma884 0:7bbdfc4610fe 96 wait(0.1f);
Sigma884 0:7bbdfc4610fe 97 }
Sigma884 0:7bbdfc4610fe 98
Sigma884 0:7bbdfc4610fe 99 /**********
Sigma884 0:7bbdfc4610fe 100 (int)Who Am I
Sigma884 0:7bbdfc4610fe 101 接続できているかを判定
Sigma884 0:7bbdfc4610fe 102 接続OK:1
Sigma884 0:7bbdfc4610fe 103 接続NG:-1
Sigma884 0:7bbdfc4610fe 104 **********/
Sigma884 0:7bbdfc4610fe 105 int LPS25H_spi :: whoAmI(){
Sigma884 0:7bbdfc4610fe 106 cs = 0;
Sigma884 0:7bbdfc4610fe 107 spi -> write(WHO_AM_I | 0x80 & 0xBF);
Sigma884 0:7bbdfc4610fe 108 ans = spi -> write(0x00);
Sigma884 0:7bbdfc4610fe 109 cs = 1;
Sigma884 0:7bbdfc4610fe 110 if(ans == 0xBD){
Sigma884 0:7bbdfc4610fe 111 return 1;
Sigma884 0:7bbdfc4610fe 112 }
Sigma884 0:7bbdfc4610fe 113 else{
Sigma884 0:7bbdfc4610fe 114 return -1;
Sigma884 0:7bbdfc4610fe 115 }
Sigma884 0:7bbdfc4610fe 116 }
Sigma884 0:7bbdfc4610fe 117
Sigma884 0:7bbdfc4610fe 118 /**********
Sigma884 0:7bbdfc4610fe 119 (float)気圧を取得
Sigma884 0:7bbdfc4610fe 120 **********/
Sigma884 0:7bbdfc4610fe 121 float LPS25H_spi :: getPres(){
Sigma884 0:7bbdfc4610fe 122 cs = 0;
Sigma884 0:7bbdfc4610fe 123 spi -> write(P_XL | 0xC0);
Sigma884 0:7bbdfc4610fe 124 pres_raw[0] = spi -> write(0x00); //XL
Sigma884 0:7bbdfc4610fe 125 pres_raw[1] = spi -> write(0x00); //L
Sigma884 0:7bbdfc4610fe 126 pres_raw[2] = spi -> write(0x00); //H
Sigma884 0:7bbdfc4610fe 127 cs = 1;
Sigma884 0:7bbdfc4610fe 128
Sigma884 0:7bbdfc4610fe 129 return (float)(pres_raw[0] | pres_raw[1] << 8 | pres_raw[2] << 16) / 4096.0f;
Sigma884 0:7bbdfc4610fe 130 }
Sigma884 0:7bbdfc4610fe 131
Sigma884 0:7bbdfc4610fe 132 /**********
Sigma884 0:7bbdfc4610fe 133 (float)温度を取得
Sigma884 0:7bbdfc4610fe 134 **********/
Sigma884 0:7bbdfc4610fe 135 float LPS25H_spi :: getTemp(){
Sigma884 0:7bbdfc4610fe 136 cs = 0;
Sigma884 0:7bbdfc4610fe 137 spi -> write(T_L | 0xC0);
Sigma884 0:7bbdfc4610fe 138 temp_raw[0] = spi -> write(0x00); //L
Sigma884 0:7bbdfc4610fe 139 temp_raw[1] = spi -> write(0x00); //H
Sigma884 0:7bbdfc4610fe 140 cs = 1;
Sigma884 0:7bbdfc4610fe 141
Sigma884 0:7bbdfc4610fe 142 if(temp_raw[1] >= 128){
Sigma884 0:7bbdfc4610fe 143 return 42.5 - (float)(65536 - (temp_raw[0] | temp_raw[1] << 8)) / 480.0f;
Sigma884 0:7bbdfc4610fe 144 }
Sigma884 0:7bbdfc4610fe 145 else{
Sigma884 0:7bbdfc4610fe 146 return 42.5 + (float)(temp_raw[0] | temp_raw[1] << 8) / 480.0f;
Sigma884 0:7bbdfc4610fe 147 }
Sigma884 0:7bbdfc4610fe 148 }
Sigma884 0:7bbdfc4610fe 149
Sigma884 0:7bbdfc4610fe 150 /**********
Sigma884 0:7bbdfc4610fe 151 (float)高度を取得(float 0mでの気圧, float 0mでの温度)
Sigma884 0:7bbdfc4610fe 152 ・引数に0m地点での気圧・温度を入れる
Sigma884 0:7bbdfc4610fe 153 ・計算式のソース:http://www.geocities.jp/u4ren6/Main/Excel_Data0017.html
Sigma884 0:7bbdfc4610fe 154 **********/
Sigma884 0:7bbdfc4610fe 155 float LPS25H_spi :: getAlt(float P_0, float T_0){
Sigma884 0:7bbdfc4610fe 156 pres_0 = P_0;
Sigma884 0:7bbdfc4610fe 157 temp_0 = T_0;
Sigma884 0:7bbdfc4610fe 158 pres_now = getPres();
Sigma884 0:7bbdfc4610fe 159
Sigma884 0:7bbdfc4610fe 160 return -(273.0 + temp_0) / 0.0342 * log(pres_now / pres_0);
Sigma884 0:7bbdfc4610fe 161 }