Понадобился 2-х канальный амперметр-показометр + вольтметр, выбрал arduino + INA3221 + 1602
Поискал по интернету, собрал, прошил - сюрпризы:
- До 0,3А ток измереный INA3221 совпадает с показаниями мультиметра, а дальше INA3221 начинает занижать показания - при реальном токе 0,4А показывает 0,2А… Такая фигня на всех 3-х каналах…
- Врет вольтметр вместо 10В показывает >10,5…
- Бонусом - при запитке силовой нагрузки от сетевого блока питания загорается красный светодиод( вероятно из за наводок между блоками питания компьютера - блока нагрузки)
- Ну и вишенка на тортике - переодически на 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 секунда
}
