My LTC4150 Coulomb counter has finally arrived!
For testing, I hooked up the unit to the spare ESP-12E I have lying around:
All the jumpers on the LTC4150 are soldered (SJ1 = interrupt-driven counting; SJ2, SJ3 = 3.3V circuit).
The code for driving the Coulomb counter is as follows:
When the load is a 1K resistor, expected current draw is ~4V/1K = ~4mA. The following output was observed:
When the load is a 47K resistor, expected current draw is ~4V/47K = ~0.08mA:
I aborted the test after 3 readings because the current draw is so low it was taking too long to get 5 readings. But I think the readings are consistent enough to conclude that the power meter circuit gives reasonably accurate readings.
For testing, I hooked up the unit to the spare ESP-12E I have lying around:
All the jumpers on the LTC4150 are soldered (SJ1 = interrupt-driven counting; SJ2, SJ3 = 3.3V circuit).
The code for driving the Coulomb counter is as follows:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | #include <Time.h> #include <TimeLib.h> const int BATTERY_CAPS = 2300; const byte INT_PIN = D1; const float INT_TO_COULUMB = 0.614439; bool trigger = false, init_done = false; unsigned long total_time = 0, total_interrupts = 0; volatile unsigned long num_interrupts = 0; volatile unsigned long time1 = 0, time2 = 0; void debug(const char *format, ...) { char buf[256]; va_list ap; va_start(ap, format); vsnprintf(buf, sizeof(buf), format, ap); va_end(ap); Serial.println(buf); } void handleInterrupt() { if (time1 == 0) { time1 = millis(); init_done = true; } else { num_interrupts++; time2 = millis(); trigger = true; } } void setup() { Serial.begin(115200); pinMode(INT_PIN, INPUT_PULLUP); attachInterrupt(digitalPinToInterrupt(INT_PIN), handleInterrupt, FALLING); } void loop() { if (init_done) { Serial.println(); init_done = false; } if (trigger) { cli(); trigger = false; unsigned long interval = time2 - time1; unsigned long ni = num_interrupts; time1 = time2; num_interrupts = 0; sei(); total_time += interval; total_interrupts += ni; float ma = (ni * INT_TO_COULUMB) / (interval / 1000.0) * 1000.0; float ma_avg = (total_interrupts * INT_TO_COULUMB) / (total_time / 1000.0) * 1000.0; float lifetime = BATTERY_CAPS / ma_avg / 24.0; debug("\ninterval = %ldms; num_interrupts = %ld; ma = %fmA; ma_avg = %fmA; lifetime = %f days", interval, num_interrupts, ma, ma_avg, lifetime); time1 = time2; } else { Serial.print(time1 == 0 ? '#' : '.'); } delay(10*1000); } |
When the load is a 1K resistor, expected current draw is ~4V/1K = ~4mA. The following output was observed:
interval = 150862ms; num_interrupts = 1; ma = 4.072855mA; ma_avg = 4.072855mA; lifetime = 26.598871 days interval = 150775ms; num_interrupts = 2; ma = 4.075205mA; ma_avg = 4.074029mA; lifetime = 26.591200 days interval = 150829ms; num_interrupts = 3; ma = 4.073746mA; ma_avg = 4.073935mA; lifetime = 26.591818 days interval = 150710ms; num_interrupts = 4; ma = 4.076962mA; ma_avg = 4.074691mA; lifetime = 26.586882 days interval = 150850ms; num_interrupts = 5; ma = 4.073179mA; ma_avg = 4.074389mA; lifetime = 26.588854 days
When the load is a 47K resistor, expected current draw is ~4V/47K = ~0.08mA:
interval = 8380827ms; num_interrupts = 1; ma = 0.073315mA; ma_avg = 0.073315mA; lifetime = 1477.645142 days interval = 8124328ms; num_interrupts = 2; ma = 0.075630mA; ma_avg = 0.074454mA; lifetime = 1455.033325 days interval = 7995918ms; num_interrupts = 3; ma = 0.076844mA; ma_avg = 0.075234mA; lifetime = 1439.949219 days
I aborted the test after 3 readings because the current draw is so low it was taking too long to get 5 readings. But I think the readings are consistent enough to conclude that the power meter circuit gives reasonably accurate readings.
Comments
Post a Comment