Рейтинг@Mail.ru

Как подключить датчик тока к Arduino

Print Friendly, PDF & Email
Подключаем к Arduino несколько датчиков тока: аналоговый ACS712 и цифровой INA219, и разбираемся, как с ними работать.

Для проекта нам понадобятся:

Датчики тока, как следует из их названия, служат для измерения силы тока. Существуют датчики, которые основаны на различных физических эффектах и имеют различные особенности. В частности, рассматриваемый датчик ACS712 основан на эффекте Холла, а датчик INA219 имеет в своём составе аналогово-цифровой преобразователь (АЦП). Рассмотрим их по порядку.

1Подключение датчика тока ACS712к Arduino

Датчик тока ACS712 – это датчик, который основан на эффекте Холла. Эффект Холла заключается в том, что когда через проводник, помещённый в магнитное поле, протекает электрический ток, в проводнике возникает напряжение. Это напряжение и служит индикатором силы тока: оно линейно зависит от силы тока. Ещё оно имеет небольшую зависимость от тепературы окружающей среды и поддаётся влиянию внешних магнитных полей. Так, например, на графике ниже показана зависимость напряжения на выходе датчика ACS712 от силы протекающего тока (для одной из разновидностей датчика, об этом чуть ниже) при различных температурах:

Зависимость напряжения на выходе датчика ACS712 от силы тока
Зависимость напряжения на выходе датчика ACS712 от силы тока

Модуль с датчиком ACS712 может выглядеть, например, так:

Модуль с датчиком тока ACS712 и схема подключения
Модуль с датчиком тока ACS712 и схема подключения

Датчик ACS712 имеет следующие характеристики:

  • работает с постоянным и переменным током;
  • ток потребления – до 13 мА;
  • температура эксплуатации -40…+85 °C.

Существуют несколько разновидностей датчика ACS712, которые отличаются измеряемым током. Так, существуют разновидности с максимально измеряемым током 5, 20 и 30 А. Широкий диапазон измеряемых значений тока можно отнести к существенным преимуществам датичка ACS712. Перечисленные модификации имеют чувствительность 185, 100 и 66 мВ/А соответственно.

Как мы помним из курса школьной физики, для измерения тока необходимо пропуститить ток через измерительный прибор, помещённый в разрыв между источником питания и нагрузкой. Соответственно, схема подключения датчика проста:

Вывод датчика ACS712Назначение
VCCПитание, 5 В
GNDЗемля
OUTАналоговый выход датчика, напряжение на котором линейно зависит от протекающего через датчик тока
IP+Вывод 1 для подачи измеряемого тока
IP-Вывод 2 для подачи измеряемого тока

Выводы IP+ и IP- как раз и есть тот разрыв цепи, через который нужно пропустить интересующий ток. Если перепутать полярность, то измерения будут с обратным знаком.

Кстати, эта особенность – измерять ток как с положительным, так и отрицательным знаком, позволяет использовать датчик ACS712 для измерений переменного тока.

Таким образом, для подключения датчика ACS712 к плате Arduino используются 3 провода:

Схема подключения датчика тока ACS712 к Arduino
Схема подключения датчика тока ACS712 к Arduino

Выход сенсора VOUT подключим к любому аналоговому выводу Arduino, например, A0. В качестве нагрузки будем использовать двигатель постоянного тока.

Модуль с датчиком тока ACS712 подключён Arduino, нагрузка – двигатель постоянного тока
Модуль с датчиком тока ACS712 подключён Arduino, нагрузка – двигатель постоянного тока

Либо вместо нагрузки можно использовать мощную лампу накаливания. Либо любую другую нагрузку.

Модуль с датчиком тока ACS712 подключён Arduino, нагрузка – 10 Вт лампа накаливания
Модуль с датчиком тока ACS712 подключён Arduino, нагрузка – 10 Вт лампа накаливания

Питать нагрузку будем от лабораторного источника тока, на котором можно менять напряжение и ток.

В скетче будем постоянно читать значение с порта A0 и выводить в монитор последовательных данных. Напомню, АЦП у разных плат Arduino имеет различную разрядность, обычно 10 или 12 бит. Подробнее здесь. Это означает, что с аналогового порта могут приходить значения от 0 до 210 = 1024 для 10-разрядного АЦП. Будем считать, что у нас датчик тока, диапазон измерений которого от -5 А до +5 А, а чувствительность 185 мВ/А.

Если на 1 А приходится 185 мВ, это соответствует примерно 38 единицам измерения АЦП: 185·1024/5000 = 37.888, (1) где 5000 – это максимальное значение напряжения, которое способен измерить АЦП Arduino, в милливольтах.

На выходе OUT датчика ACS712 при отсутствии измеряемого тока должна быть половина напряжения питания, т.е. 2.5 В. Так как вся шкала АЦП лежит в диапазоне от 0 до 1024, то при отсутствии измеряемого тока мы должны считывать с аналогового порта Arduino число 512. Это начало шкалы отсчёта. Обозначим его value_zero. Отклонение тока value_adc от нулевого уровня в большую или меньшую сторону и будет показывать силу тока. Следовательно, чтобы посчитать в амперах значение тока с датчика ACS712, необходимо разницу нулевого уровня и измеренного значения с аналогового порта A0 поделить на 38. А чтобы получить ток в миллиамперах, следует умножить это значение на 1000: I(mA) = (value_zero − value_adc) / 38·1000. (2)

Пояснение принципа вычисления силы тока
Пояснение принципа вычисления силы тока

На практике значение на аналоговом выводе A0 не будет равняться точно 512. Поэтому, чтобы определить начало отсчёта, добавим в скетч примитивную калибровку. Калибровка будет заключаться в том, что некоторое количество раз прочитаем значение с аналогового порта A0 при отсутствии тока на датчике ACS712, и усредним его. Естественно, нагрузка на время калибровки должна быть выключена, чтобы ток не протекал через датчик.

Скетч для измерения постоянного тока датчиком ACS712 (разворачивается)
const int acs712_pin = A0;

int zero; // уровень нуля, относительно которого измеряется ток, обычно VCC/2

void setup() {
  Serial.begin(9600);
  calibrate();
}

// определим нуль шкалы (до включения нагрузки)
void calibrate(){
  zero = 0;
  int repeats = 10;
  for (int i=0; i<repeats; i++){
    zero += analogRead(acs712_pin);
    delay(100);
  }
  zero /= repeats; // берём среднее арифметическое
  Serial.print("Zero=");
  Serial.println(zero);
}

void loop() {
  int sensorValue = analogRead(acs712_pin); // читаем значение с АЦП и выводим в монитор
  Serial.print(sensorValue); 
  Serial.print(" = ");
  int c = getCurrent(sensorValue); // преобразуем в значение тока и выводим в монитор
  Serial.print(c); 
  Serial.println(" mA");
  delay(100);
}

// рассчитывает ток в мА по значению с АЦП
int getCurrent(int adc) {
  int delta = zero - adc; // отклонение от нуля шкалы
  float scale = 37.888; // сколько единиц АЦП приходится на 1 ампер, по формуле (1)
  int current = (int)delta*1000/scale; // считаем ток в мА и округляем до целых, по формуле (2)
  return current;
}

Загрузим скетч и плавно начнём поднимать напряжение и ток на нагрузке. Какое-то время подождём, а затем начнём снижать ток. В результате получим примерно такую картинку:

Вывод тока датчика ACS712 в монитор последовательного порта и его график
Вывод тока датчика ACS712 в монитор последовательного порта и его график

Как видно, точность показаний датчика ACS712 оставляет желать лучшего, из-за того, что аналоговый сигнал постоянно «прыгает». Чтобы этого избежать, следут добавить в предыдущий скетч сглаживание. То есть, будем проводить несколько измерений подряд, а затем брать среднее аврифметическое от них. Заодно совместим начальную калибровку, т.к. она выполняется точно так же. Вот как изменится в результате скетч:

Скетч для измерения постоянного тока датчиком ACS712 со сглаживанием
const int acs712_pin = A0;

int zero; // уровень нуля, относительно которого измеряется ток, обычно VCC/2

void setup() {
  Serial.begin(9600);
  zero = getSmoothedValue(); // определим нуль шкалы (до включения нагрузки)
  Serial.print("Zero=");
  Serial.println(zero);
}

// получает сглаженное значение с АЦП Arduino
int getSmoothedValue(){
  int value;
  int repeats = 10;
  for (int i=0; i<repeats; i++){ // измеряем значение несколько раз
    value += analogRead(acs712_pin); // суммируем измеренные значения
    delay(1);
  }
  value /= repeats; // и берём среднее арифметическое
  return value;
}

void loop() {
  int sensorValue = getSmoothedValue(); // читаем значение с АЦП и выводим в монитор
  Serial.print(sensorValue); 
  Serial.print(" = ");
  int c = getCurrent(sensorValue); // преобразуем в значение тока и выводим в монитор
  Serial.print(c); 
  Serial.println(" mA");
  delay(100);
}

// рассчитывает ток в мА по значению с АЦП
int getCurrent(int adc) {
  int delta = zero - adc; // отклонение от нуля шкалы
  float scale = 37.888; // сколько единиц АЦП приходится на 1 ампер
  int current = (int)delta*1000/scale; // считаем ток в мА
  return current;
}

Кстати, желательно вынести чувствительность датичка ACS712 в константу в начале скетча, чтобы можно было быстро изменить скетч для модификации датчика с другим диапазоном измерений.

В результате выполнения данного скетча картинка получается гораздо более приятная:

Сглаженный график тока, измеренного датчиком ACS712
Сглаженный график тока, измеренного датчиком ACS712

Однако гораздо точнее датчик тока, который мы рассмотрим в следующем разделе.

2Подключение датчика тока INA219к Arduino

Датчик едет из Китая. Продолжение следует…

Последнее изменениеВторник, 21 Апрель 2020 19:11 Прочитано 497 раз

Поделиться

Print Friendly, PDF & Email

Оставить комментарий