Какое минимальное значение можно измерить с помощью датчика тока ACS712 30A?
Я делаю мультиметр Arduino для измерения тока. Сначала я подумал об использовании шунта, но он не работает, так как мне нужно измерять ток в диапазоне мА.
@VOID seekers, 👍1
2 ответа
Эта модель имеет чувствительность 66 мВ/А, что означает, что на каждый 1 А проходящего через нее тока выдается 66 мВ.
АЦП Arduino при напряжении 5 В имеет разрешение (5/1024) 4,88 мВ на младший бит.
Это означает, что 4,88/66 дает 0,074, или 74 мА на младший бит.
Поскольку 1LSB считается шумовой зоной сигнала, можно ожидать, что минимальное полезное значение будет в два раза больше — 148 мА
Что совершенно бесполезно для измерения токов в диапазоне мА.
Вы бы получили лучшие результаты с вариантом 5A, но все равно не очень.
В техническом описании ACS712 показано следующее:
Это означает, что вариант на 30 А имеет чувствительность 66 мВ/А. Это означает, что показание 1 А покажет 66 мВ плюс некоторое напряжение смещения. АЦП Arduino является 10-битным, что означает, что он имеет 2 ^ 10 = 1024 шага при опорном напряжении 5 В по умолчанию для Uno, Nano и т. Д. Это дает ему разрешение измерения 5 В / 1024 шага = разрешение напряжения 4,88 мВ. 4,88 мВ / 66 мВ/А = 0,074 А или 74 мА.
Итак, разрешение по умолчанию для Arduino Uno, Nano и т. д. составляет 74 мА. В реальности оно будет колебаться вокруг этого значения, так что ваша точность может быть примерно в 3–4 раза больше, или около 300 мА, и ваша точность будет такой же, как и при калибровке, которая легко может быть около этого значения, если вы хорошо откалибруете.
Разрешение 74 мА неплохое, но есть несколько способов его улучшить. Вот некоторые из них:
1. Внешние аппаратные решения:
- Используйте версию на 20 А или 5 А вместо версии на 30 А ACS712. Версия на 5 А имеет чувствительность 185 мВ/А, что автоматически повышает разрешение до 4,88 мВ / 185 мВ/А = 0,026. A, или 26 мА, что составляет 74 мА/26 мА = в 2,8 раза лучше.
- Купите внешний АЦП с высоким разрешением. Этот 16-разрядный АЦП Adafruit ADS1115 (техническое описание) улучшит ваше разрешение на версии ACS712 на 30 А следующим образом. Минимальное разрешение АЦП теперь составляет 5 В/2^16 = 5 В/65535 = 0,0763 мВ вместо 4,88 мВ и 0,0763 мВ / 66 мВ/А = 0,001156 А или 1,156 мА.
2 Программные решения (бесплатно!):
- Измените опорное напряжение, чтобы использовать внутреннее опорное напряжение 1,1 В. Это легко сделать: вызовите
analogReference(INTERNAL)
вsetup()
функция. Сделанный! См.: https://www.arduino.cc/reference/en/language/functions. /аналог-ио/аналоговая ссылка/. Если я правильно помню, это внутреннее опорное напряжение на основе диода (см. техническое описание ATmega328), и оно может отличаться на 10% от части к части, поэтому откалибруйте его для каждого отдельного Arduino, и вы получите хороший результат. полученные результаты! Теперь ваше разрешение АЦП составляет 1,1 В/1024 = 1,07 мВ вместо 4,88 мВ по умолчанию для Arduino, поэтому ваше текущее разрешение составляет 1,07 мВ / 66 мВ/А = 16,2 мА, что равно 74 мА/16,2 мА = В 4,6 раза лучше. - Используйте передискретизацию, чтобы увеличить 10-битный АЦП Arduino примерно до ~16 бит. Примечание по применению Atmel AVR121: Повышение разрешения АЦП путем передискретизации объясняет это очень хорошо, хотя и требует серьезного изучения. Существуют библиотеки, которые могут сделать это за вас, и вы можете найти их в Google. Я написал один из них. Вот ссылка на мой сайт, где я представляю один из таких библиотека, которую я написал. Суть в следующем: чтобы получить 11-битное показание (что на 1 бит лучше, чем разрешение вашего аппаратного АЦП в 10 бит), вам нужно взять 4 ^ 1 = 4 10-битных показания, просуммировать их, а затем разделить на 2. ^1 = 2. Ваше максимальное значение будет 1023 x 2 = 2046. Чтобы получить 16-битное чтение (что на 6 бит лучше, чем разрешение вашего аппаратного АЦП в 10 бит), вам нужно взять 4^6 = 4096 10 -битные показания, суммируйте их и разделите на 2^6 = 64. Ваше максимальное значение будет 1023 x 64 = 65472. Разрешение по напряжению улучшится с 4,88 мВ до ~0,0764 мВ в лучшем случае. Он не будет так хорош, как настоящий 16-битный АЦП, такой как Adafruit выше, но он достаточно хорош для многих применений. Имейте в виду, что 10-битные показания 4096 занимают некоторое время, поэтому я также рекомендую вам ускорить тактовую частоту АЦП, чтобы повысить скорость чтения в 10-битном режиме с ~ 10 кГц до ~ 50 кГц. Здесь также пригодится библиотека, чтобы сделать это легко. Бесплатные решения с открытым исходным кодом уже существуют. Вот таблица, которую я составил, когда впервые прочитал руководство по применению AVR121 и попрактиковался в передискретизации. Считайте значения разрешения выше ~16 бит чисто теоретическими. Передискретизация имеет свои пределы.
Что бы я сделал? Я бы использовал внутреннее опорное напряжение 1,1 В и передискретизацию с увеличенной тактовой частотой АЦП на части ACS712, которая обеспечивает минимально допустимый максимальный ток (т.е. выберите версию 5 А, а не версию 20 А или 30 А, если 5 А достаточно, или версию 20 А). не версия 30А, если 20А достаточно). Просто убедитесь, что ваше максимальное напряжение на аналоговых выводах не превышает значение Vref 1,1 В. Если это так, используйте стандартное опорное напряжение 5 В для АЦП и просто выполняйте передискретизацию. Мое текущее разрешение в конечном итоге составит несколько мА. Если я не могу производить выборку на нужной частоте с помощью передискретизации (я не знаю, какие динамические эффекты вы пытаетесь измерить), я бы использовал внешний АЦП с высоким разрешением, который может производить выборку быстрее, чем передискретизация при высоких разрешениях. разрешить.
А если этого недостаточно, что мне делать? Я бы использовал прецизионный шунт, т.е. «токовый резистор»; с правильным значением, чтобы я мог измерять значения в правильном диапазоне. Если мне нужно усиление, я бы купил внешний АЦП и/или операционный усилитель от Adafruit, пока не подберу все подходящие размеры. Помните, что если ваш шунт (токовой резистор) слишком мал для измерения малых токов, которые вам нужны, сделайте следующее:
- Используйте более высокое значение сопротивления. V = IR (напряжение = ток x сопротивление), поэтому увеличьте R, чтобы увеличить V на нем для данного тока, I.
- Используйте операционный усилитель, чтобы усилить падение напряжения на резисторе (выберите усилитель Adafruit, так как Adafruit упрощает задачу и предлагает лучшие в мире образцы).
- Используйте АЦП с высоким разрешением и/или передискретизацию, чтобы увеличить чувствительность для измерения небольших изменений напряжения.
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
Спасибо, сэр.... Это действительно помогает, @VOID seekers
Рад помочь! Не забудьте щелкнуть стрелку вверх в левом верхнем углу ответов, чтобы проголосовать за ответы, которые вы считаете полезными, и поставить галочку, если хотите пометить ответ как «лучший» или «правильный». . Это помогает вывести лучшие ответы на первое место, чтобы помочь другим после вас, у которых есть тот же вопрос., @Gabriel Staples