На АЦП 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 |
Здравствуйте. А как вычислить поправочный коэффициент, что-бы откалибровать показания амперметра?
const float u_kall = 1;
далее проведите измерения на максимальном токе I_max
u_kall = I_max/I_измеренное
Спасибо.
Почему ваш скетч выдает такую ошибку?
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
У меня компиляция проходит без ошибок:
Скетч использует 5508 байт (17%) памяти устройства. Всего доступно 32256 байт.
Глобальные переменные используют 297 байт (14%) динамической памяти, оставляя 1751 байт для локальных переменных. Максимум: 2048 байт.
Повторил схему. Калибруется и работает хорошо. Единственное неудобство заключается в том, что при неподключенной нагрузке показания не в нуле, а плавают (20-50 мАмпер) причем иногда в минусовых пределах. Это как-то можно поправить?
Входы АЦП имеют связь с GND всей схемы?
Поставьте конденсаторы 47мкФ b 0.1мкФ по питанию, отдельно для арудиино и отдельно для ацп.
АЦП только питание берет от ардуино. Конденсаторы попробую поставить. Спасибо за ответ. Я по вашей статье делал показометр на ADS1115 там все отлично работает.
Добрый день! Можно ли изменить скетч под экран 8х2?
lcd.begin(8, 2);// указываем тип дисплея LCD 16X2
замените строки lcd.setCursor(4,0);
на
lcd.setCursor(0,0);
Спасибо!