@Andco,
т.е. вы сами не считали и свои расчеты в регистры измерителя не записывали? Я так и подумал.
Проверяли ли вы точность показаний по 3 точкам - минимальные, середина и максимальные значения? Если показания точные во всем диапазоне то проблемы чипа маловероятны, АЦП работает верно. Соответственно проблема в коде.
Проверяли ли вы работу измерителя с другими библиотеками?
По местной традици вы не указали контроллер на котором это у вас работает дабы сделать диагностику проблемы более увлекательной )
Либа гайвера тоже по традиции "легкая" и простая дабы не забивать мозги её пользователям понимаем того как работает измеритель.
В ней формула прописана
явным образом из даташита. Но подвох в том что расчеты в ней выполняются над вещественными числами с плавающей запятой и точность этих расчетов зависит от того на каком процессоре эти расчеты выполняются. Если у вас 8-битная атмега, то результаты могут вас сильно удивить. Кроме того у него выполняется truncate от расчета с плавающей запятой, хотя в даташите описана процедура округления в большую сторону до целого следущего порядка. Т.е. что там расчитывает либа на самом деле остается далеко за термином "легкости".
Атмеги у меня нет, но ради интереса я закинул простенький код в
симулятор
float f_rshunt = 0.0118;
double d_rshunt = 0.0118;
float f_maxcur = 7.0;
double d_maxcur = 7.0;
void setup() {
Serial.begin(115200);
Serial.print("Float:\n");
float lsb = f_maxcur / (float)(2<<15);
Serial.print("lsb: "); Serial.println(lsb);
float cal = (float)0.00512 / (lsb * f_rshunt);
Serial.print("cal: "); Serial.println(cal);
Serial.print("truncated cal: "); Serial.println(trunc(cal));
Serial.print("rounded calibration: "); Serial.print(trunc(0.00512f / (f_maxcur / 32768.0f * f_rshunt)));
Serial.print("\nDouble:\n");
double dlsb = d_maxcur / (double)(2<<15);
Serial.print("lsb: "); Serial.println(lsb);
double dcal = (double)0.00512 / (lsb * d_rshunt);
Serial.print("cal: "); Serial.println(cal);
Serial.print("tr cal: "); Serial.println(trunc(dcal));
Serial.print("rounded calibration: "); Serial.print(trunc(0.00512d / (d_maxcur / 32768.0d * d_rshunt)));
}
получилось так
Float:
lsb: inf
cal: 0.00
truncated cal: 0.00
rounded calibration: 2031.00
Double:
lsb: inf
cal: 0.00
tr cal: 0.00
rounded calibration: 2031.0
Аналогичный код на х64 gcc выдает следущее
g++ tst.cpp && ./a.out
Float
lsb: 0.000106812
cal: 4062.28
truncated cal: 4062
Double
lsb: 0.000106812
cal: 4062.28
tr cal: 4062
почувствуйте разницу и дальше думайте сами.