Высокоточный амперметр на АЦП MCP3421 (Arduino)

Шунт 0.01 Ом

На АЦП MCP3421 совместно с Arduino можно сделать очень простой но высокоточный амперметр. В качестве датчика используется шунт 0.01 Ом, на котором при токе 10 А происходит падение напряжения всего в 100 мВ. Главной особенностью является то, что напряжение шунта измерятся при помощи 18-битного АЦП на пределе 0.256 В, что дает возможность измерять ток с достаточно большой точностью от 1 мА до 10 А, при разрешении 100 мкА до 1 А и 1 мА при токе свыше 1 А. Фактически амперметр может измерять ток до 25 А, но имеющийся у меня шунт при большом токе сильно нагревается, поэтому все тесты были ограничены 10 А при небольшом нагреве шунта.

Результаты измерения выводятся на дисплей LCD1602 на базе контроллера HD44780, связь с АЦП на  MCP3421 (модуль) осуществляется по интерфейсу I2C.

Для более точного измерения тока амперметр необходимо откалибровать, в переменной float r нужно указать сопротивление шунта, а в переменной float u_kall поправочный коэффициент при помощи которого можно откалибровать показания амперметра.

Сопротивление шунта может быть другим, главное чтобы, падение напряжения при максимальном токе не превышало 0.256 В.

Библиотека и описание MCP3421 — АЦП 18 bit (Arduino)

#include <Wire.h>
#include <MCP3421.h>
#include <LiquidCrystal.h>
 
  MCP3421 mcp;
  LiquidCrystal lcd(7, 6, 2, 3, 4, 5);// RS,E,D4,D5,D6,D7 подключение LCD
 
  const float u_kall = 1.0193696; 
  const float r = 0.01;
  float u,u_sum,dig,i;
  int x;
 
void setup(){ 
  Wire.begin();lcd.begin(16, 2);
  mcp.setConfig(3,3); // 12 14 16 18 bit - 0-3 // 1x 2x 4x 8x gain - 0-3
}
 
void loop(){
  for(x=0;x<10;x++){
  dig = mcp.readWire();u = dig * 0.256 /131071*u_kall;delay(100);u_sum=u_sum+u;}
  u=u_sum/10;u_sum=0;i=0;
  i = u/r;
  if(i>=1){lcd.setCursor(4,0);lcd.print(i,3);lcd.print(" A    ");}
  if(i<1){lcd.setCursor(4,0);lcd.print(i*1000,1);lcd.print(" mA    ");}
}

Результаты тестов

Амперметр Калибратор Н4-7

 

Comments

  1. Почему ваш скетч выдает такую ошибку?

    C:\Users\olegp\Desktop\sketch_dec09a\sketch_dec09a.ino: In function ‘void loop()’:
    sketch_dec09a:20:7: error: void value not ignored as it ought to be
    dig = mcp.readWire();u = dig * 0.256 /131071*u_kall;delay(100);u_sum=u_sum+u;}
    ^
    exit status 1
    void value not ignored as it ought to be

    1. У меня компиляция проходит без ошибок:
      Скетч использует 5508 байт (17%) памяти устройства. Всего доступно 32256 байт.
      Глобальные переменные используют 297 байт (14%) динамической памяти, оставляя 1751 байт для локальных переменных. Максимум: 2048 байт.

  2. Повторил схему. Калибруется и работает хорошо. Единственное неудобство заключается в том, что при неподключенной нагрузке показания не в нуле, а плавают (20-50 мАмпер) причем иногда в минусовых пределах. Это как-то можно поправить?

Добавить комментарий

Войти с помощью: