INA3221 - не меряет ток более 0,3А

Понадобился 2-х канальный амперметр-показометр + вольтметр, выбрал arduino + INA3221 + 1602

Поискал по интернету, собрал, прошил - сюрпризы:

  1. До 0,3А ток измереный INA3221 совпадает с показаниями мультиметра, а дальше INA3221 начинает занижать показания - при реальном токе 0,4А показывает 0,2А… Такая фигня на всех 3-х каналах…
  2. Врет вольтметр вместо 10В показывает >10,5…
  3. Бонусом - при запитке силовой нагрузки от сетевого блока питания загорается красный светодиод( вероятно из за наводок между блоками питания компьютера - блока нагрузки)
  4. Ну и вишенка на тортике - переодически на LCD значения выводятся до сотых, хотя print(current[0],1); должна обрезать до десятых.

Главный вопрос - как победить ограничение на 0,3А, великая точность мне нафиг не нужна, но и когда вместо диапазона +/-1,63А остаётся +/-0,3А я тупо нужных шунтов на требуемые токи не найду!!!

Желательно привести в чуство вольтметр - а то измерять на 12В акумуляторе напряжене с погрешностью в 0,75В нехорошо.

Остальное мне не принципиальное мне не мешает, для себя и такой показометр сойдет…

Информацию по регистрам INA3221нашел в статье http://rcl-radio.ru/?p=132614, но работа с регистрами выше моих знаний, даже не смог понять как в последнем примере прописываются регистры!

Плата INA3221 у меня с “подвешеными в воздухе” шунтами:

// include the library code:
#include <LiquidCrystal.h>
#include <Wire.h>
#include <INA3221.h>

#define PRINT_DEC_POINTS 3 


// initialize the library by associating any needed LCD interface pin
// with the arduino pin number it is connected to
const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

INA3221 ina3221(INA3221_ADDR40_GND);

float Curent1;

void setup() 
{
  // Инициация/настройки LCD
  pinMode(9, OUTPUT);  
  analogWrite(9, 50);         // устанавливаем ШИМ выход   
  lcd.begin(16, 2);           // устанавливаем кол-во столбцов и строк
  lcd.print("HobbyTronics");  // печать сообщения на LCD

  // Инициация/настройки INA3221
   Serial.begin(9600);
 
    ina3221.begin();
    ina3221.reset();
 
    // Set shunt resistors to 10 mOhm for all channels
    ina3221.setShuntRes(100, 100, 100);                                       //Сопротивление шунтов
 
    // Set series filter resistors to 10 Ohm for all channels.
    // Series filter resistors introduce error to the current measurement.
    // The error can be estimated and depends on the resitor values and the bus
    // voltage.
    ina3221.setFilterRes(100, 100, 100);                                      //Фильтрация мгновенных значений

}
 
void loop() 
{
  // работа с LCD
  // устанавливаем курсор в 13-ом столбце, 0 строка (начинается с 0)
  lcd.setCursor(13, 0);
  lcd.print(millis()/1000); // печать числа секунд после сброса

  // Работа с INA3221
  float current[3];
    float current_compensated[3];
    float voltage[3];
 
    current[0]             = ina3221.getCurrent(INA3221_CH1);
    current_compensated[0] = ina3221.getCurrentCompensated(INA3221_CH1);
    voltage[0]             = ina3221.getVoltage(INA3221_CH1);
 
    current[1]             = ina3221.getCurrent(INA3221_CH2);
    current_compensated[1] = ina3221.getCurrentCompensated(INA3221_CH2);
    voltage[1]             = ina3221.getVoltage(INA3221_CH2);
 
    current[2]             = ina3221.getCurrent(INA3221_CH3);
    current_compensated[2] = ina3221.getCurrentCompensated(INA3221_CH3);
    voltage[2]             = ina3221.getVoltage(INA3221_CH3);
 
    //Вывод измереных значений на LCD
    lcd.setCursor(0, 1);                       //Установка 0 столбец 1 строка
    lcd.print(current[0],1);                   //Вывод значения тока шунта 1
                                               //"print(current[0],1);" - округлить до одного знака после запятой.
                                               //работает 50/50 - часто выводятся и сотые...
    
    lcd.setCursor(6, 1);                       //Установка 0 столбец 1 строка
    lcd.print(current[1],1);                   //Вывод значения тока шунта 2

    lcd.setCursor(12, 1);                      //Установка 0 столбец 1 строка
    lcd.print(current[2],1);                   //Вывод значения тока шунта 3

    //.........................

    Serial.println(millis()/1000);             //Отправка в СОМ порт числа секунд с момента перезагрузки

    //Отправка в СОМ порт даных по току и напряжению по всем 3 входам
    //учитывается "полярность" тока.
    
    Serial.print("Channel 1: \n Current: ");
    Serial.print(current[0], PRINT_DEC_POINTS);
    Serial.print("A\n Compensated current: ");
    Serial.print(current_compensated[0], PRINT_DEC_POINTS);
    Serial.print("\n Voltage: ");
    Serial.print(voltage[0], PRINT_DEC_POINTS);
    Serial.println("V");
 
    Serial.print("Channel 2: \n Current: ");
    Serial.print(current[1], PRINT_DEC_POINTS);
    Serial.print("A\n Compensated current: ");
    Serial.print(current_compensated[1], PRINT_DEC_POINTS);
    Serial.print("\n Voltage: ");
    Serial.print(voltage[1], PRINT_DEC_POINTS);
    Serial.println("V");
 
    Serial.print("Channel 3: \n Current: ");
    Serial.print(current[2], PRINT_DEC_POINTS);
    Serial.print("A\n Compensated current: ");
    Serial.print(current_compensated[2], PRINT_DEC_POINTS);
    Serial.print("\n Voltage: ");
    Serial.print(voltage[2], PRINT_DEC_POINTS);
    Serial.println("V\n");

 delay(1000);                               //Задержка 1 секунда

}

А схема-то где?

И что за библиотека (их много)? Вот эта? Или ещё какая?

// Установите резисторы последовательного фильтра на 10 Ом для всех каналов.
// Резисторы последовательного фильтра вносят погрешность в измерение тока.
// Погрешность может быть оценена и зависит от значений резистора и шины
// напряжение.

На счет схемы вопроса не понял - к Ардуино 4-ре провода, +5 земля SCL SDA, тут либо правильно подключил, либо INA3221 не ответит.

По шунтам Win- всех каналов соеденил, Win+ каждый отдельно(кобда Win- были отдельно тоже косячили).

Замена библиотеки помогла, я так понял у меня была INA3221_v.0.0.1.

Теперь ток 1,34А INA3221 измеряет как 1,44А погрешность 7%, напряжение 10В как 10,536 погрешность 5%, скорее всего китаёзы поставили микрухи с дефектным ИОН.

Спасибо за помощь, меня это уже устраивает, проверенный ИОН есть, посчитаю погрешность поточнее, Ардуино пересчитает перед выводом на дисплей. Возможность калибровки самой INA3221 как понимаю отсутствует…

Это фильтр от ВЧ импульсов, на медленно меняющийся постояный ток/напряжение никак не влияют…

Бывает. Хотя, чего уж тут понимать?

1 лайк

Это нестертый остаток на дисплее от предыдущего вывода, возможно