ina219, ina226 - максимальный ожидаемый ток

Andco

✩✩✩✩✩✩✩
9 Окт 2020
10
0
Здравствуйте! Помогите понять параметр "Maximum Expected Current" (максимальный ожидаемый ток). Как ожидаемый ток влияет на показания? Почему не используется максимальный измеряемый ток как максимальное измеряемое напряжение на шунте деленное на сопротивление шунта (I=0,082/Rш)? Зачем вообще в даташите введен этот параметр?
Для измерения до 7 ампер, заменил комплектный шунт на на шунт в 0.0112 Ом (измерен образцовым омметром и проверен по току и падению напряжения), но точные показания получаются только если инициализировать с указанием сопротивления 0.0078 Ом (INA226 ina(0.0078f, 7.0f, 0x40); ). Вот и не пойму это экземпляр ina226 у меня такой или неправильно задаю параметры при инициализации? Как в принципе правильно инициализировать ina?
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
Для калибровки и введения размерности разрешающей способности.
Напр шунт у вас есть только такой, но ток вы планируете измерять до 4 апмер. Вы задаете вес одного бита разрешения в такой конфигурации.
 

Andco

✩✩✩✩✩✩✩
9 Окт 2020
10
0
Перечитываю который раз даташит на ina226 и все равно никак не соображу... :( В примере взяли ожидаемый ток=15А и получили 457мкА/бит, потом для удобства приняли разрешение как 1мА/бит. Что соответствует максимальному ожидаемому току в 33А. Т.е. параметр "максимальны ожидаемый ток" влияет на калибровочный регистр, но его принимают на свое усмотрение? Где логика? Учитывая, что инициализируя мой экземпляр ina226 (возможно брак), для достоверных показаний пришлось указать сопротивление шунта почти в 1,5 раза, то вообще запутался в этих расчетах...
В итоге вопрос: если калибровочный регистр зависит от константы (сипротивление шунта) и произвольного значения максимального ожидаемого тока, то как должны получаться точные значения тока, если они зависят от произвольно взятого аргумента?
Хочется понять, а не просто подгоном подобрать. Спасибо.
1710060091939.png
 

poty

★★★★★★✩
19 Фев 2020
3,265
950
@Andco, прочитайте абзац, который идёт непосредственно перед выражением 1, он Вам объяснит многое. Вычисления с числами, наподобие 457,7 мкА/бит, это довольно затратное мероприятие. Проще "загрубить" разрешение до 1мА/бит и получить значение сразу в миллиамперах, без всяких вычислений.
 

Andco

✩✩✩✩✩✩✩
9 Окт 2020
10
0
@poty, вопрос не про вычислительные мощности, а про результат функции, который должен быть точен, но, как я сейчас понимаю (или скорее не понимаю) зависит от рандомного аргумента... Хотелось бы пройти путь вручную на калькуляторе от задания сопротивления шунта и максимально ожидаемого тока до фактически измеренного тока и понять почему и как...

@Геннадий П,
1710070045380.png
 

poty

★★★★★★✩
19 Фев 2020
3,265
950
@Andco, а что мешает? Все выражения даны. Принцип описан. Фактически Вам дана возможность контроля внутреннего преобразования измеренной величины напряжения (в абстрактных единицах) в ток. При заданных 15А в примере и расчёте корректирующего регистра по этому значению получаете максимальное разрешение (не путать с точностью) 457,7 мкА/бит. Хотите использовать с таким разрешением - есть формула расчёта реального тока. В указанном мной ранее абзаце приведён способ облегчить вычисления, использовав корректирующий регистр таким образом, чтобы получившиеся в выходном регистре данные можно было бы использовать "как есть", без вычислений на калькуляторе или в программе, но с меньшим разрешением. Используйте тот метод, что Вам ближе. Результат в обоих случаях будет одинаков (с учётом разрешения, конечно).
Что касается измеренного сопротивления шунта и его применения в реальности, то я бы измерил его по факту впайки в плату. Сотые/тысячные доли Ома вполне могли набежать из-за припоя, сопротивления металлизации отверстия и прочее.
 
  • Лойс +1
Реакции: Andco

Геннадий П

★★★★★★✩
14 Апр 2021
1,975
635
45
Как вы измеряли сопротивление? На контактах разъема, в точках пайки нового шунта, в точках пайки старого шунта?
И да, при таком подходе старый шунт лучше отпаивать.
 

Andco

✩✩✩✩✩✩✩
9 Окт 2020
10
0
@poty, похоже начал осознавать: Current Register (04h) принимает значения с учетом калибровочного регистра. И максимальный ожидаемый ток влияет только на дискретность получаемых данных. Чем меньше ожидаемый ток, тем меньше будет шаг при измерениях. Верно?

@Геннадий П, образцовым миллиомметром - 0,0125 Ом. Параллельно с 0,1 - это 0,0111. Перепроверил в работе: при 6 амперах падение на шунте 0,071В - итого примерно 0,0118 Ом. Расчетные значения до и после пайки похожи, а подогнанное значение Rшунта=0,0078 (для верных измерений) при инициализации получилось далеко от реальности.
 

poty

★★★★★★✩
19 Фев 2020
3,265
950
@Andco, да, именно так.
@Andco, при всех этих вычислениях цену бита учитывали?
 

Andco

✩✩✩✩✩✩✩
9 Окт 2020
10
0
при всех этих вычислениях цену бита учитывали?
Не понял, для чего? Я просто нашел реальное сопротивление шунта, инициализировал с ним и ничего не получилось, начал подгонять значение шунта в инициализации и дошел до 0,0078 Ом, когда INA226 начала выдавать правду по току. Увидев разбежку параметра реального и заданного в 1,5 раза, полез в даташит и в исходники GyverINA. Ну и запутался... ;) Причину такой разбежки списываю на "качественный" китайский чип.
 

poty

★★★★★★✩
19 Фев 2020
3,265
950
@Andco, ещё раз: значение в регистре Current - это не ток, а некоторое число, которое нужно умножить на "цену бита", чтобы получить ток.
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
Причину такой разбежки списываю на "качественный" китайский чип
если хотите действительно разобраться с калькулятором, то не стоит полагаться на чужие библиотеки - программируйте чип сами и расчитываете необходимые значения на основе данных в регистрах. Тогда не придется списывать на качество китайских чипов (которые на самом деле от TI).
 

Andco

✩✩✩✩✩✩✩
9 Окт 2020
10
0
Тогда не придется списывать на качество китайских чипов (которые на самом деле от TI).
Вообще-то я и пытался сам рассчитать после того как пример из чужой библиотеки не завелся сходу. Поэтому и полез и в даташит и в исходники чужой библиотеки, убедился, что формулы в библиотеке совпадают с даташитом, осознал что содержит Current Register (04h)... но так и не нашел причину ошибки по току в 1,5 раза ни вручную на калькуляторе, ни в библиотеке. Поэтому раз ошибок в ПО нет, то она очевидно (пока) в железе. Если вы считаете, что я неоправданно "списываю" погрешность на железо, то помогите найти ошибку в коде (библиотеки).
ЗЫ В любом случае спасибо всем за компанию в процессе изучения. ;)
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
@Andco,
т.е. вы сами не считали и свои расчеты в регистры измерителя не записывали? Я так и подумал.
Проверяли ли вы точность показаний по 3 точкам - минимальные, середина и максимальные значения? Если показания точные во всем диапазоне то проблемы чипа маловероятны, АЦП работает верно. Соответственно проблема в коде.
Проверяли ли вы работу измерителя с другими библиотеками?
По местной традици вы не указали контроллер на котором это у вас работает дабы сделать диагностику проблемы более увлекательной )
Либа гайвера тоже по традиции "легкая" и простая дабы не забивать мозги её пользователям понимаем того как работает измеритель.
В ней формула прописана явным образом из даташита. Но подвох в том что расчеты в ней выполняются над вещественными числами с плавающей запятой и точность этих расчетов зависит от того на каком процессоре эти расчеты выполняются. Если у вас 8-битная атмега, то результаты могут вас сильно удивить. Кроме того у него выполняется truncate от расчета с плавающей запятой, хотя в даташите описана процедура округления в большую сторону до целого следущего порядка. Т.е. что там расчитывает либа на самом деле остается далеко за термином "легкости".

Атмеги у меня нет, но ради интереса я закинул простенький код в симулятор

C++:
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
почувствуйте разницу и дальше думайте сами.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
501
149
@vortigont,
Не понял, что вы хотели сказать своим примером?
Что нельзя писать
float lsb = f_maxcur / (float)(2<<15);
Так у гайвера такого нет.
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
Не понял, что вы хотели сказать своим примером?
еще раз процитирую
расчеты в ней выполняются над вещественными числами с плавающей запятой и точность этих расчетов зависит от того на каком процессоре эти расчеты выполняются.

писать можно что угодно
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
501
149
писать можно что угодно
Спору нет, писать можно что угодно.
Но если вместо
f_maxcur / (float)(2<<15);
написать
f_maxcur / (float)(1L<<15); или f_maxcur / (1L<<15); или f_maxcur / 32768.0;
то возможно вопросы к точности отпадут.
 
Изменено:

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
@Bruzzer, да, вы правы, с двойкой я опечатался, точность соответствует, но результаты все равно инетресные

C++:
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)(1<<15);
    Serial.print("lsb: "); Serial.println(lsb, 9);
    float cal = (float)0.00512 / (lsb * f_rshunt);
    Serial.print("cal: "); Serial.println(cal);
    Serial.print("cal is less than zero? "); Serial.println(cal<0 ? "true" : "false");
    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 / 32768.0f;
    Serial.print("dlsb: "); Serial.println(dlsb, 9);
    double dcal = (double)0.00512 / (dlsb * d_rshunt);
    Serial.print("dcal: "); Serial.println(dcal);
    Serial.print("dcal is less than zero? "); Serial.println(dcal<0 ? "true" : "false");
    Serial.print("tr cal: "); Serial.println(trunc(dcal));
    Serial.print("rounded calibration: "); Serial.print(trunc(0.00512d / (d_maxcur / 32768.0d * d_rshunt)));
}
void loop() {
  // put your main code here, to run repeatedly:
}
выдает вот такой результат, по крайней мере в эмуляторе так
Код:
Float:
lsb: -0.000213623
cal: -2031.14
cal is less than zero? true
truncated cal: -2031.00
rounded calibration: 2031.00

Double:
dlsb: 0.000213623
dcal: 2031.14
dcal is less than zero? false
tr cal: 2031.00
rounded calibration: 2031.00
у результата появляется "минус". Хотя на х64 результат одинаковый.
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
501
149
@vortigont,
(я в своем ответе сначала забыл добавить L. Потом добавил, но незадолго до вашего ответа).
Дело не во float или double, а в размере int 16 или 32 bit
f_maxcur / (float)(1L<<15);
 
  • Лойс +1
Реакции: vortigont

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
да, sizeof(int) на атмеге == 2, а флоат и дабл похоже вообще одно и тоже 4х байтное. Впрочем для подробного анализа все же лучше воспользоваться библиотекеой, которая позволяет самому манипулировать установкой коэффциентов измерителя.
 

Andco

✩✩✩✩✩✩✩
9 Окт 2020
10
0
Проверяли ли вы точность показаний по 3 точкам - минимальные, середина и максимальные значения?
Да, во всем диапазоне точно. Да mega328p.
т.е. вы сами не считали и свои расчеты в регистры измерителя не записывали? Я так и подумал.
Плохо обо мне думали... Считал в excel, но не записывал в регистр, а сравнивал с тем что туда записала библиотека:

Rshi_maxcur_lsbcal
0,0078​
8​
0,000244141​
2688,656​

1710443180808.png

Вроде бы то что посчитал 8-ми битный контроллер и 64 бит эксель (без округления) совпадает... Что в этом эксперименте не так?

у результата появляется "минус". Хотя на х64 результат одинаковый.
Потому что вы используете при сдвиге знаковый тип, попробуйте заменить на беззнаковый и минус не появится:
C++:
float lsb = f_maxcur / ((unsigned int)1<<15);
 

vortigont

★★★★★★✩
24 Апр 2020
1,022
543
Saint-Petersburg, Russia
Да, во всем диапазоне точно. Да mega328p.
это хороший признак, снимает претензии к работе АЦП. Предположить такой глюк АЦП когда он равномерно врет в 1,5 раза во всем диапазоне измерения довольно сложно. Остаются варианты либо с самим шунтом либо с настройкой измерителя.

Плохо обо мне думали...
ну уж простите... прочие подробности вы упускаете.
Если таки интересно докопаться то могу порекоммендовать замерить мультиметром потенциал на ножках АЦП измерителя при достоверно известном проверенном значении тока. Тогда поймете что же действительно замеряет АЦП на входе. Ну и/или подправить библиотеку и считывать данные напряжения с АЦП из регистра без перерасчета в амперы и сравнить с ожидаемым значением. Тогда будет понятно где искать ошибку - в подключении шунта или расчете показаний измерителя.
 

Andco

✩✩✩✩✩✩✩
9 Окт 2020
10
0
замерить мультиметром потенциал на ножках АЦП измерителя при достоверно известном проверенном значении тока.
Это было ранее в 11 посте:
Итого: значение шунта достоверно известно, в калибровочный регистр записывается верно рассчитанное значение, значение токового регистра не соответствуют действительности, достоверные показания получены методом подгонки значения сопротивления токового шунта. Вывод - проблема несоответствия в конкретном экземпляре ina226.
Или есть еще мысли?