Измерение среднего тока с помощью uC и токового шунта

Это мой первый пост. Я программист, который пытается делать аппаратное обеспечение, так что будьте осторожны :)

Схема

Я разрабатываю небольшую схему (см. рисунок, и извините за беспорядочную схему), которая представляет собой простую связку МОП-транзисторов и драйверов затворов, предназначенных для переключения резистивных нагрузок (в данном случае грелки) от микроконтроллера. Нагревательные элементы часто имеют очень низкое сопротивление, и для поддержания мощности на нужном уровне МОП-транзисторы переключаются с помощью ШИМ.

Измерение

Помимо чисто функционального аспекта, есть и образовательная направленность. Я хочу иметь возможность получить некоторые отзывы о текущем потреблении. И мой наивный подход заключался в том, чтобы просто добавить микросхемы датчиков шунтирования тока. При использовании мультиметра для измерения выходного напряжения датчика я фактически получаю что-то похожее на средний ток (с переключением ШИМ) из-за «медлительности» амперметра. Но при подключении того же выхода, например, к АЦП atmega328p, я получаю плохие показания - скорость здесь ставит показания в любом месте прямоугольной волны ШИМ.

Итак, мой вопрос: как мне измерить (средний) ток при переключении с ШИМ?

Кажется, с дизайном все в порядке, но я мог что-то упустить как в дизайне, так и в том, как следует использовать АЦП uC в этом контексте.

схематический

Я думаю, что фильтр можно использовать для получения среднего напряжения от ШИМ. Интересная статья, объясняющая такой фильтр и используемые значения на основе частоты ШИМ, — вот эта .
В этом вопросе есть несколько связанных ответов . Но они просто упоминают об использовании шунтов и интегральных схем для измерения тока. Однако там нет упоминания о ШИМ.
Спасибо за комментарии. @alexan_e: TI показывает входной фильтр в таблице данных INA197, но я не был уверен в его использовании. Это может быть выходом, когда нет стабильного напряжения.
Я думаю, что это решение вашей проблемы, но я бы предпочел, чтобы кто-то с большим опытом дал подробный ответ, поэтому я разместил это как комментарий.
Поскольку выход представляет собой ШИМ с переменной скважностью, вы можете использовать схему пикового детектора и измерить его с помощью АЦП.

Ответы (2)

Иногда то, что кажется простым, на самом деле не так просто. Вам нужно провести довольно сложное измерение, но вы хотите получить простой результат. То, что вы хотите измерить, не является постоянным, оно меняется во времени. В зависимости от вашего уровня требований вы можете вычислить одно или несколько свойств текущего потребления. Эти свойства помогут вам лучше контролировать систему. Я предлагаю вам 3 разных решения, в порядке возрастания сложности.

Решение 1. Среднее

Вы хотите получить результат с одним значением -> получить среднее значение по времени. Как уже было предложено @akellyirl, используйте фильтр нижних частот. Вычислите float y = alpha*input + (1-alpha)*yдля каждого образца, где alphaкоэффициент сглаживания. Подробности смотрите в Википедии .

Решение 2: Максимум + Среднее

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

if (y > max)
  max = y;

Решение 3: стандартное отклонение + максимальное + среднее

Почему?

См. диаграммы ниже. Есть 3 сигнала разной формы. Треугольник , синус и пиковый сигнал . Все они периодические с одинаковым периодом, одинаковой амплитудой , одинаковым средним значением и одинаковыми минимумом и максимумом . Но, у них разные формы, да и вообще у них совсем другая история...

Сигналы и их гистограмма

Одним из отличий является стандартное отклонение. Вот почему я предлагаю вам расширить ваши измерения и включить стандартное отклонение. Проблема в том, что стандартный способ вычисления потребляет ресурсы ЦП. Надеюсь, есть одно решение.

Как?

Используйте метод гистограммы . Постройте гистограмму всех измерений и эффективно извлеките статистику (минимальное, максимальное, среднее, стандартное отклонение) набора данных. Гистограмма объединяет значения, которые имеют одинаковое значение или одинаковый диапазон значений. Преимущество состоит в том, чтобы избежать хранения всех выборок (увеличение количества во времени) и иметь быстрые вычисления на ограниченном количестве данных.

Перед началом измерения создайте массив для хранения гистограммы. Это одномерный целочисленный массив размером 32 , например:

int histo[32];

В зависимости от диапазона амперметра адаптируйте приведенную ниже функцию. Например, если диапазон составляет 256 мА, это означает, что ячейка 0 гистограммы будет увеличиваться на значение от 0 до 8 мА, ячейка 1 — на значение от 8 до 16 мА и т. д. Итак, вам понадобится целое число для представления номер бина гистограммы:

short int index;

Каждый раз, когда вы получаете образец, найдите соответствующий индекс бина:

index = (short int) floor(yi);

И увеличьте этот бин:

histo[index] += 1;

Чтобы вычислить среднее значение, запустите этот цикл:

float mean = 0;
int N = 0;
for (i=0; i < 32 ; i++) {
  mean = i * histo[i]; // sum along the histogram
  N += i; // count of samples
}
mean /= N; // divide the sum by the count of samples.
mean *= 8; // multiply by the bin width, in mA: Range of 256 mA / 32 bins = 8 mA per bin.

Чтобы вычислить стандартное отклонение, запустите этот цикл:

float std_dev = 0;

for (i=0; i < 32 ; i++) {
  std_dev = (i - mean) * (i - mean) * histo[i]; // sum along the histogram
}
std_dev /= N; // divide the sum by the count of samples.
std_dev = sqrt(std_dev); // get the root mean square to finally convert the variance to standard deviation.

Стратегия метода гистограммы состоит в том, чтобы выполнять медленные операции с несколькими бинами вместо всех полученных выборок сигнала. Чем больше размер выборки, тем лучше. Если вам нужны подробности, прочитайте эту интересную страницу The Histogram, Pmf and Pdf .

очень подробное и понятное объяснение. С практической точки зрения, как вы гарантируете, что выборка АЦП распределяется «хорошим образом», то есть не привязана к ШИМ-сигналу каким-либо образом? Я должен признать, что прямо сейчас я просто использую Arduino (hw + sw) для выборки как ШИМ, так и АЦП. Возможно, я должен сам настроить встроенные таймеры. Я предполагаю, что частота дискретизации должна быть немного выше, чем частота ШИМ, верно?
Как только вы начинаете сэмплировать, все становится довольно сложно. Первое, что нужно сделать, это иметь в виду теорему Найквиста-Шеннона. Что интуитивно понятно, так это то, что чем выше частота дискретизации, тем больше у вас информации. Но что не является интуитивным, хотя и фундаментальным, так это то, что перед дискретизацией на частоте Fs вы должны абсолютно фильтровать низкие частоты (в аналоговой/электронной области) сигнала на частоте Fs/2. В противном случае на вас повлияет псевдоним. Я предлагаю вам выбрать самую высокую частоту дискретизации. Что-то вроде ~ 10-кратной частоты ШИМ, если это возможно.
Это распространенное неправильное понимание теоремы Найквиста-Шеннона, которая на самом деле утверждает, что вам нужно сэмплировать с удвоенной пропускной способностью. Псевдоним может быть полезен. Никакого неуважения, но это похоже на ответ из учебника. Предложение ~10-кратной выборки ШИМ в этом сценарии, когда высокочастотная детализация, скорее всего, не имеет значения, является излишним.

Вы правильно понимаете проблему: вам нужно получить «среднее» ШИМ, как и измеритель, который вы используете для измерений.

Вы можете использовать RC-фильтр для сигналов A1,2,3, постоянная времени которых как минимум в десять раз превышает период ШИМ. Это означает, что если ваш период ШИМ составлял 10 микросекунд, то постоянная времени RC должна быть 100 микросекунд. Например, 10 кОм x 10 нФ = 100 мкс.

Лучшим решением является цифровая фильтрация сигналов в микроконтроллере следующим образом:

float y = (1-0.99)*input + 0.99*y; 

Измените значение «0,99», чтобы изменить постоянную времени этого цифрового фильтра.

Остерегайтесь псевдонимов, если вы делаете это в коде.
Псевдоним не обязательно является проблемой. Все мы знаем, что для восстановления сигнала частота дискретизации должна быть как минимум в два раза выше самой высокой частоты. Но когда сигнал ограничен полосой пропускания, вам нужно всего лишь сэмплировать в два раза большую полосу пропускания . Это называется недостаточной выборкой. Поскольку сигнал предположительно низкочастотный, потому что он приводит в действие грелку, разумные частоты дискретизации в диапазоне от 100 до 1000 SPS должны быть приемлемыми. См.: ni.com/newsletter/50078/en
Было бы разумно убедиться, что частота ШИМ и частота дискретизации взаимно просты при использовании недостаточной дискретизации.
Именно мои мысли - при измерении через АЦП и генерации ШИМ в одном и том же микроконтроллере может быть тенденция к тому, чтобы оба были заблокированы во времени.
Сигнал имеет частоту ШИМ, а не низкую частоту. Если бы это была низкая частота, вероятно, было бы менее ресурсоемко просто производить выборку за один период и усреднять, чем использовать таким образом математику с плавающей запятой.
Как я вижу, сигнал низкочастотно модулирован на несущей ШИМ. Текущий сигнал может иметь высокочастотное содержание, которое необходимо сохранить. Но это не похоже на эту ситуацию из описания.
Спасибо всем. Я немного поиграюсь с программным фильтром и посмотрю, что он мне даст. @akellyirl, если я правильно вас понял, вы предлагаете (если был выбран аппаратный RC-фильтр) фильтр на выходе датчика. Но в даташите написано, что лучше бы его на вход ставили? Кроме того, не могли бы вы уточнить, почему фильтр SW лучше? Спасибо.
Установка фильтра на вход осложняется низким входным импедансом INA197, вызывающим смещения, для уменьшения которых необходимо позаботиться (как описано в техническом описании). Поставить RC на выходе проще. Вы теряете преимущество очень низкого выходного импеданса INA197 (что хорошо для управления нагрузками), но в техническом описании Atemga328P говорится: «АЦП оптимизирован для аналоговых сигналов с выходным импедансом приблизительно 10 кОм или меньше. используется источник, время выборки будет незначительным». Так что использование резистора 1 кОм должно быть в порядке. Фильтр dig не требует компонентов.