ammeter.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. #pragma once
  2. #include "Arduino.h"
  3. #define ADS115_ADDR 0x48
  4. #define EEPROM_ADDR 0x51
  5. #define ADS1115_RA_CONVERSION 0x00
  6. #define ADS1115_RA_CONFIG 0x01
  7. #define ADS1115_PGA_6144 0x00
  8. #define ADS1115_PGA_4096 0x01
  9. #define ADS1115_PGA_2048 0x02 // default
  10. #define ADS1115_PGA_1024 0x03
  11. #define ADS1115_PGA_512 0x04
  12. #define ADS1115_PGA_256 0x05
  13. #define ADS1115_MV_6144 0.187500F
  14. #define ADS1115_MV_4096 0.125000F
  15. #define ADS1115_MV_2048 0.062500F // default
  16. #define ADS1115_MV_1024 0.031250F
  17. #define ADS1115_MV_512 0.015625F
  18. #define ADS1115_MV_256 0.007813F
  19. #define ADS1115_RATE_8 0x00
  20. #define ADS1115_RATE_16 0x01
  21. #define ADS1115_RATE_32 0x02
  22. #define ADS1115_RATE_64 0x03
  23. #define ADS1115_RATE_128 0x04 // default
  24. #define ADS1115_RATE_250 0x05
  25. #define ADS1115_RATE_475 0x06
  26. #define ADS1115_RATE_860 0x07
  27. #define ADS1115_MUX_P0N1 0x00 // ammeter only support
  28. #define ADS1115_COMP_MODE_HYSTERESIS 0x00 // default
  29. #define ADS1115_COMP_MODE_WINDOW 0x01
  30. #define ADS1115_MODE_CONTINUOUS 0x00
  31. #define ADS1115_MODE_SINGLESHOT 0x01 // default
  32. #define AMMETER_PRESSURE_COEFFICIENT 0.05
  33. #define AMMETER_PAG_6144_CAL_ADDR 208
  34. #define AMMETER_PAG_4096_CAL_ADDR 216
  35. #define AMMETER_PAG_2048_CAL_ADDR 224
  36. #define AMMETER_PAG_1024_CAL_ADDR 232
  37. #define AMMETER_PAG_512_CAL_ADDR 240
  38. #define AMMETER_PAG_256_CAL_ADDR 248
  39. #define AMMETER_MEASURING_DIR -1
  40. typedef enum {
  41. PAG_6144 = ADS1115_PGA_6144,
  42. PAG_4096 = ADS1115_PGA_4096,
  43. PAG_2048 = ADS1115_PGA_2048, // default
  44. PAG_1024 = ADS1115_PGA_1024,
  45. PAG_512 = ADS1115_PGA_512,
  46. PAG_256 = ADS1115_PGA_256,
  47. } ammeterGain_t;
  48. typedef enum {
  49. RATE_8 = ADS1115_RATE_8,
  50. RATE_16 = ADS1115_RATE_16,
  51. RATE_32 = ADS1115_RATE_32,
  52. RATE_64 = ADS1115_RATE_64,
  53. RATE_128 = ADS1115_RATE_128, // default
  54. RATE_250 = ADS1115_RATE_250,
  55. RATE_475 = ADS1115_RATE_475,
  56. RATE_860 = ADS1115_RATE_860,
  57. } ammeterRate_t;
  58. typedef enum {
  59. SINGLESHOT = ADS1115_MODE_SINGLESHOT,
  60. CONTINUOUS = ADS1115_MODE_CONTINUOUS,
  61. } ammeterMode_t;
  62. class Ammeter {
  63. private:
  64. void i2cBegin();
  65. bool i2cReadBytes(uint8_t addr, uint8_t reg_addr, uint8_t* buff, uint16_t len);
  66. bool i2cWriteBytes(uint8_t addr, uint8_t reg_addr, uint8_t* buff, uint16_t len);
  67. bool i2cReadU16(uint8_t addr, uint8_t reg_addr, uint16_t* value);
  68. bool i2cWriteU16(uint8_t addr, uint8_t reg_addr, uint16_t value);
  69. float getResolution(ammeterGain_t gain);
  70. uint16_t getCoverTime(ammeterRate_t rate);
  71. uint8_t getPGAEEEPROMAddr(ammeterGain_t gain);
  72. uint8_t _ads1115_addr;
  73. uint8_t _eeprom_addr;
  74. float pga_256_calibration_5v_value = 10187;
  75. float pga_2048_calibration_25v_value = 6368;
  76. public:
  77. ammeterGain_t _gain;
  78. ammeterRate_t _rate;
  79. ammeterMode_t _mode;
  80. float resolution;
  81. uint16_t cover_time;
  82. int16_t adc_raw;
  83. float calibration_factor;
  84. public:
  85. Ammeter(uint8_t ads1115_addr=ADS115_ADDR, uint8_t eeprom_addr=EEPROM_ADDR);
  86. void setGain(ammeterGain_t gain);
  87. void setRate(ammeterRate_t rate);
  88. void setMode(ammeterMode_t mode);
  89. float getCurrent(bool calibration = true);
  90. int16_t getConversion(uint16_t timeout = 125);
  91. int16_t getAdcRaw();
  92. bool isInConversion();
  93. void startSingleConversion();
  94. bool EEPORMWrite(uint8_t address, uint8_t* buff, uint8_t len);
  95. bool EEPORMRead(uint8_t address, uint8_t* buff, uint8_t len);
  96. bool saveCalibration2EEPROM(ammeterGain_t gain, int16_t hope, int16_t actual);
  97. bool readCalibrationFromEEPROM(ammeterGain_t gain, int16_t* hope, int16_t* actual);
  98. };