LPS25HをSPIで使えるようにしたライブラリです。 ・気圧 ・温度 ・高度(気圧と温度から) が取得できます。 FIFOも使えます。
LPS25H_spi.cpp@0:7bbdfc4610fe, 2017-11-10 (annotated)
- Committer:
- Sigma884
- Date:
- Fri Nov 10 06:47:33 2017 +0000
- Revision:
- 0:7bbdfc4610fe
- Child:
- 1:5cd2389454f5
LPS25H?SPI???????????
Who changed what in which revision?
User | Revision | Line number | New 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 | 0:7bbdfc4610fe | 14 | spi -> frequency(10000000); |
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 | } |