気圧センサLPS25HをI2Cで動かすライブラリ

Dependents:   rocket_logger_sinkan2018_v1 Shock_Alt_Logger_v2_1

Committer:
Sigma884
Date:
Tue Apr 24 12:23:03 2018 +0000
Revision:
0:4b9b28d45e51
2018/4/24 update

Who changed what in which revision?

UserRevisionLine numberNew contents of line
Sigma884 0:4b9b28d45e51 1 #include "LPS25H_lib.h"
Sigma884 0:4b9b28d45e51 2 #include "mbed.h"
Sigma884 0:4b9b28d45e51 3 #include "math.h"
Sigma884 0:4b9b28d45e51 4
Sigma884 0:4b9b28d45e51 5 LPS25H_lib :: LPS25H_lib(AD0 ad0, I2C &userI2C){
Sigma884 0:4b9b28d45e51 6 slave = ad0;
Sigma884 0:4b9b28d45e51 7 i2c = &userI2C;
Sigma884 0:4b9b28d45e51 8 }
Sigma884 0:4b9b28d45e51 9
Sigma884 0:4b9b28d45e51 10 void LPS25H_lib :: begin(int drate){
Sigma884 0:4b9b28d45e51 11 cmd_ctrl_reg1[0] = CTRL_REG1;
Sigma884 0:4b9b28d45e51 12 switch(drate){
Sigma884 0:4b9b28d45e51 13 case 0:
Sigma884 0:4b9b28d45e51 14 cmd_ctrl_reg1[1] = 0x80;
Sigma884 0:4b9b28d45e51 15 break;
Sigma884 0:4b9b28d45e51 16
Sigma884 0:4b9b28d45e51 17 case 1:
Sigma884 0:4b9b28d45e51 18 cmd_ctrl_reg1[1] = 0x90;
Sigma884 0:4b9b28d45e51 19 break;
Sigma884 0:4b9b28d45e51 20
Sigma884 0:4b9b28d45e51 21 case 7:
Sigma884 0:4b9b28d45e51 22 cmd_ctrl_reg1[1] = 0xA0;
Sigma884 0:4b9b28d45e51 23 break;
Sigma884 0:4b9b28d45e51 24
Sigma884 0:4b9b28d45e51 25 case 12:
Sigma884 0:4b9b28d45e51 26 cmd_ctrl_reg1[1] = 0xB0;
Sigma884 0:4b9b28d45e51 27 break;
Sigma884 0:4b9b28d45e51 28
Sigma884 0:4b9b28d45e51 29 case 25:
Sigma884 0:4b9b28d45e51 30 cmd_ctrl_reg1[1] = 0xC0;
Sigma884 0:4b9b28d45e51 31 break;
Sigma884 0:4b9b28d45e51 32 }
Sigma884 0:4b9b28d45e51 33
Sigma884 0:4b9b28d45e51 34 i2c -> frequency(400000);
Sigma884 0:4b9b28d45e51 35 i2c -> write(slave, cmd_ctrl_reg1, 2, true);
Sigma884 0:4b9b28d45e51 36 wait(0.5f);
Sigma884 0:4b9b28d45e51 37 }
Sigma884 0:4b9b28d45e51 38
Sigma884 0:4b9b28d45e51 39 void LPS25H_lib :: setFIFO(int size){
Sigma884 0:4b9b28d45e51 40 cmd_ctrl_reg2[0] = CTRL_REG2;
Sigma884 0:4b9b28d45e51 41 cmd_ctrl_reg2[1] = 0x40;
Sigma884 0:4b9b28d45e51 42 cmd_fifo_ctrl[0] = FIFO_CTRL;
Sigma884 0:4b9b28d45e51 43 switch(size){
Sigma884 0:4b9b28d45e51 44 case 0:
Sigma884 0:4b9b28d45e51 45 cmd_ctrl_reg2[1] = 0x00;
Sigma884 0:4b9b28d45e51 46 cmd_fifo_ctrl[1] = 0x00;
Sigma884 0:4b9b28d45e51 47 break;
Sigma884 0:4b9b28d45e51 48
Sigma884 0:4b9b28d45e51 49 case 2:
Sigma884 0:4b9b28d45e51 50 cmd_fifo_ctrl[1] = 0xC1;
Sigma884 0:4b9b28d45e51 51 break;
Sigma884 0:4b9b28d45e51 52
Sigma884 0:4b9b28d45e51 53 case 4:
Sigma884 0:4b9b28d45e51 54 cmd_fifo_ctrl[1] = 0xC3;
Sigma884 0:4b9b28d45e51 55 break;
Sigma884 0:4b9b28d45e51 56
Sigma884 0:4b9b28d45e51 57 case 8:
Sigma884 0:4b9b28d45e51 58 cmd_fifo_ctrl[1] = 0xC7;
Sigma884 0:4b9b28d45e51 59 break;
Sigma884 0:4b9b28d45e51 60
Sigma884 0:4b9b28d45e51 61 case 16:
Sigma884 0:4b9b28d45e51 62 cmd_fifo_ctrl[1] = 0xCF;
Sigma884 0:4b9b28d45e51 63 break;
Sigma884 0:4b9b28d45e51 64
Sigma884 0:4b9b28d45e51 65 case 32:
Sigma884 0:4b9b28d45e51 66 cmd_fifo_ctrl[1] = 0xDF;
Sigma884 0:4b9b28d45e51 67 break;
Sigma884 0:4b9b28d45e51 68 }
Sigma884 0:4b9b28d45e51 69
Sigma884 0:4b9b28d45e51 70 i2c -> write(slave, cmd_ctrl_reg2, 2, true);
Sigma884 0:4b9b28d45e51 71 i2c -> write(slave, cmd_fifo_ctrl, 2, true);
Sigma884 0:4b9b28d45e51 72 wait(0.5f);
Sigma884 0:4b9b28d45e51 73 }
Sigma884 0:4b9b28d45e51 74
Sigma884 0:4b9b28d45e51 75 int LPS25H_lib :: whoAmI(){
Sigma884 0:4b9b28d45e51 76 cmd_who_am_i[0] = WHO_AM_I;
Sigma884 0:4b9b28d45e51 77 i2c -> write(slave, cmd_who_am_i, 1, true);
Sigma884 0:4b9b28d45e51 78 i2c -> read(slave | 1, &cmd_who_am_i[0], 1, false);
Sigma884 0:4b9b28d45e51 79 if(cmd_who_am_i[0] == 0xBD){
Sigma884 0:4b9b28d45e51 80 return 0;
Sigma884 0:4b9b28d45e51 81 }
Sigma884 0:4b9b28d45e51 82 else{
Sigma884 0:4b9b28d45e51 83 return -1;
Sigma884 0:4b9b28d45e51 84 }
Sigma884 0:4b9b28d45e51 85 }
Sigma884 0:4b9b28d45e51 86
Sigma884 0:4b9b28d45e51 87 float LPS25H_lib :: getPres(){
Sigma884 0:4b9b28d45e51 88 cmd_p[0] = P_XL;
Sigma884 0:4b9b28d45e51 89 cmd_p[1] = P_L;
Sigma884 0:4b9b28d45e51 90 cmd_p[2] = P_H;
Sigma884 0:4b9b28d45e51 91 for(int c1 = 0; c1 < 3; c1 ++){
Sigma884 0:4b9b28d45e51 92 i2c -> write(slave, &cmd_p[c1], 1, true);
Sigma884 0:4b9b28d45e51 93 i2c -> read(slave | 1, &cmd_p[c1], 1, false);
Sigma884 0:4b9b28d45e51 94 data_p[c1] = (int)cmd_p[c1];
Sigma884 0:4b9b28d45e51 95 }
Sigma884 0:4b9b28d45e51 96 return (float)(data_p[0] | data_p[1] << 8 | data_p[2] << 16) / 4096.0f;
Sigma884 0:4b9b28d45e51 97 }
Sigma884 0:4b9b28d45e51 98
Sigma884 0:4b9b28d45e51 99 float LPS25H_lib :: getTemp(){
Sigma884 0:4b9b28d45e51 100 cmd_t[0] = T_L;
Sigma884 0:4b9b28d45e51 101 cmd_t[1] = T_H;
Sigma884 0:4b9b28d45e51 102 for(int c1 = 0; c1 < 2; c1 ++){
Sigma884 0:4b9b28d45e51 103 i2c -> write(slave, &cmd_t[c1], 1, true);
Sigma884 0:4b9b28d45e51 104 i2c -> read(slave, &cmd_t[c1], 1, false);
Sigma884 0:4b9b28d45e51 105 data_t[c1] = (int)cmd_t[c1];
Sigma884 0:4b9b28d45e51 106 }
Sigma884 0:4b9b28d45e51 107 if(data_t[1] >= 128){
Sigma884 0:4b9b28d45e51 108 return 42.5 - (float)(65536 - (data_t[0] | data_t[1] << 8)) / 480.0f;
Sigma884 0:4b9b28d45e51 109 }
Sigma884 0:4b9b28d45e51 110 else{
Sigma884 0:4b9b28d45e51 111 return 42.5 + (float)(data_t[0] | data_t[1] << 8) / 480.0f;
Sigma884 0:4b9b28d45e51 112 }
Sigma884 0:4b9b28d45e51 113 }
Sigma884 0:4b9b28d45e51 114
Sigma884 0:4b9b28d45e51 115 float LPS25H_lib :: getAlt(float P_0, float T_0){
Sigma884 0:4b9b28d45e51 116 pres_0 = P_0;
Sigma884 0:4b9b28d45e51 117 temp_0 = T_0;
Sigma884 0:4b9b28d45e51 118 pres_now = getPres();
Sigma884 0:4b9b28d45e51 119
Sigma884 0:4b9b28d45e51 120 return -(273.0 + temp_0) / 0.0342 * log(pres_now / pres_0);
Sigma884 0:4b9b28d45e51 121 }