HP20x_dev.cpp 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250
  1. /*
  2. File name : HP20x_dev.cpp
  3. Description: Driver for I2C PRECISION BAROMETER AND ALTIMETER [HP206C]
  4. Author : Oliver Wang from Seeed studio
  5. Version : V0.1
  6. Create Time: 2014/04
  7. Change Log :
  8. */
  9. /****************************************************************************/
  10. /*** Include files ***/
  11. /****************************************************************************/
  12. #include "HP20x_dev.h"
  13. #include <Wire.h>
  14. #include <Arduino.h>
  15. #include "KalmanFilter.h"
  16. /****************************************************************************/
  17. /*** Local Variable ***/
  18. /****************************************************************************/
  19. HP20x_dev HP20x;
  20. /****************************************************************************/
  21. /*** Class member Functions ***/
  22. /****************************************************************************/
  23. /*
  24. **@ Function name: HP20x_dev
  25. **@ Description: Constructor
  26. **@ Input: none
  27. **@ OutPut: none
  28. **@ Retval: none
  29. */
  30. HP20x_dev::HP20x_dev() {
  31. OSR_CFG = HP20X_CONVERT_OSR1024;
  32. OSR_ConvertTime = 25;
  33. }
  34. /*
  35. **@ Function name: begin
  36. **@ Description: Initialize HP20x_dev
  37. **@ Input: none
  38. **@ OutPut: none
  39. **@ Retval: none
  40. */
  41. void HP20x_dev::begin() {
  42. Wire.begin();
  43. /* Reset HP20x_dev */
  44. HP20x.HP20X_IIC_WriteCmd(HP20X_SOFT_RST);
  45. HP20x.HP20X_EnableCompensate();
  46. }
  47. /*
  48. **@ Function name: ReadTemperature
  49. **@ Description: Read Temperature from HP20x_dev
  50. **@ Input:
  51. **@ OutPut:
  52. **@ Retval:
  53. */
  54. ulong HP20x_dev::ReadTemperature(void) {
  55. HP20X_IIC_WriteCmd(HP20X_WR_CONVERT_CMD | OSR_CFG); //ADC convert
  56. delay(OSR_ConvertTime); //difference OSR_CFG will be difference OSR_ConvertTime
  57. HP20X_IIC_WriteCmd(HP20X_READ_T);
  58. ulong Temperature = HP20X_IIC_ReadData();
  59. return Temperature;
  60. }
  61. /*
  62. **@ Function name: ReadPressure
  63. **@ Description: Read Pressure value
  64. **@ Input:
  65. **@ OutPut:
  66. **@ Retval: value
  67. */
  68. ulong HP20x_dev::ReadPressure(void) {
  69. HP20X_IIC_WriteCmd(HP20X_WR_CONVERT_CMD | OSR_CFG);
  70. delay(OSR_ConvertTime);
  71. HP20X_IIC_WriteCmd(HP20X_READ_P);
  72. ulong Pressure = HP20X_IIC_ReadData();
  73. return Pressure;
  74. }
  75. /*
  76. **@ Function name: ReadAltitude
  77. **@ Description: Read Pressure value
  78. **@ Input:
  79. **@ OutPut:
  80. **@ Retval: value
  81. */
  82. ulong HP20x_dev::ReadAltitude(void) {
  83. HP20X_IIC_WriteCmd(HP20X_READ_A);
  84. ulong Altitude = HP20X_IIC_ReadData();
  85. return Altitude;
  86. }
  87. /*
  88. void ReadPressureAndTemperature(void)
  89. {
  90. HP20X_IIC_WriteCmd(HP20X_WR_CONVERT_CMD|OSR_CFG);
  91. Timer_Delayxms(OSR_ConvertTime*2);
  92. HP20X_IIC_WriteCmd(HP20X_READ_PT);
  93. Temperature=HP20X_IIC_ReadData();
  94. Pressure=HP20X_IIC_ReadData3byte();
  95. }
  96. void IIC_ReadAltitudeAndTemperature(void)
  97. {
  98. HP20X_IIC_WriteCmd(HP20X_WR_CONVERT_CMD|OSR_CFG);
  99. Timer_Delayxms(OSR_ConvertTime*2);
  100. HP20X_IIC_WriteCmd(HP20X_READ_AT);
  101. Temperature=HP20X_IIC_ReadData();
  102. IIC_ACK();
  103. Altitude=HP20X_IIC_ReadData3byte();
  104. IIC_NoAck();
  105. IIC_Stop();
  106. }*/
  107. /****************************************************************************/
  108. /*** Local Functions ***/
  109. /****************************************************************************/
  110. /*
  111. **@ Function name: HP20X_IIC_WriteCmd
  112. **@ Description:
  113. **@ Input:
  114. **@ OutPut:
  115. **@ Retval:
  116. */
  117. void HP20x_dev::HP20X_IIC_WriteCmd(uchar uCmd) {
  118. /* Port to arduino */
  119. Wire.beginTransmission(HP20X_I2C_DEV_ID);
  120. Wire.write(uCmd);
  121. Wire.endTransmission();
  122. }
  123. /*
  124. **@ Function name: HP20X_IIC_ReadReg
  125. **@ Description:
  126. **@ Input:
  127. **@ OutPut:
  128. **@ Retval:
  129. */
  130. uchar HP20x_dev::HP20X_IIC_ReadReg(uchar bReg) {
  131. /* Port to arduino */
  132. uchar Temp = 0;
  133. /* Send a register reading command */
  134. HP20X_IIC_WriteCmd(bReg | HP20X_RD_REG_MODE);
  135. Wire.requestFrom(HP20X_I2C_DEV_ID, 1);
  136. // while(Wire.available())
  137. // {
  138. // Temp = Wire.read();
  139. // }
  140. Temp = Wire.read();
  141. return Temp;
  142. }
  143. /*
  144. **@ Function name: HP20X_IIC_WriteReg
  145. **@ Description:
  146. **@ Input:
  147. **@ OutPut:
  148. **@ Retval:
  149. */
  150. void HP20x_dev::HP20X_IIC_WriteReg(uchar bReg, uchar bData) {
  151. Wire.beginTransmission(HP20X_I2C_DEV_ID);
  152. Wire.write(bReg | HP20X_WR_REG_MODE);
  153. Wire.write(bData);
  154. Wire.endTransmission();
  155. }
  156. /*
  157. **@ Function name: HP20X_IIC_ReadData
  158. **@ Description:
  159. **@ Input:
  160. **@ OutPut:
  161. **@ Retval:
  162. */
  163. ulong HP20x_dev::HP20X_IIC_ReadData(void) {
  164. /* Port to arduino */
  165. ulong Temp = HP20X_IIC_ReadData3byte();
  166. return Temp;
  167. }
  168. /*
  169. **@ Function name: HP20X_IIC_ReadData3byte
  170. **@ Description:
  171. **@ Input:
  172. **@ OutPut:
  173. **@ Retval:
  174. */
  175. ulong HP20x_dev::HP20X_IIC_ReadData3byte(void) {
  176. ulong TempData = 0;
  177. ulong tmpArray[3] = {0};
  178. int cnt = 0;
  179. /* Require three bytes from slave */
  180. Wire.requestFrom(HP20X_I2C_DEV_ID, 3);
  181. while (Wire.available()) { // slave may send less than requested
  182. uchar c = Wire.read(); // receive a byte as character
  183. tmpArray[cnt] = (ulong)c;
  184. cnt++;
  185. }
  186. /* MSB */
  187. TempData = tmpArray[0] << 16 | tmpArray[1] << 8 | tmpArray[2];
  188. if (TempData & 0x800000) {
  189. TempData |= 0xff000000;
  190. }
  191. /* // 24 bit to 32 bit
  192. if(TempData&0x800000)
  193. {
  194. // 1:minus
  195. TempData |= 0x80000000;
  196. TempData &= 0xff7fffff;
  197. }
  198. else
  199. {
  200. // 0:plus
  201. //do noting
  202. } */
  203. return TempData;
  204. }
  205. /**
  206. @brief Enable Compensation by set CMPS_EN bit on 0x0F PARA register
  207. */
  208. void HP20x_dev::HP20X_EnableCompensate(void) {
  209. HP20X_IIC_WriteReg(REG_PARA, OK_HP20X_DEV);
  210. }
  211. /**
  212. @brief Disable Compensation by clear CMPS_EN bit on 0x0F PARA register
  213. */
  214. void HP20x_dev::HP20X_DisableCompensate(void) {
  215. HP20X_IIC_WriteReg(REG_PARA, 0);
  216. }
  217. /**************************************END OF FILE**************************************/