Это мой первый пост. Я программист, который пытается делать аппаратное обеспечение, так что будьте осторожны :)
Я разрабатываю небольшую схему (см. рисунок, и извините за беспорядочную схему), которая представляет собой простую связку МОП-транзисторов и драйверов затворов, предназначенных для переключения резистивных нагрузок (в данном случае грелки) от микроконтроллера. Нагревательные элементы часто имеют очень низкое сопротивление, и для поддержания мощности на нужном уровне МОП-транзисторы переключаются с помощью ШИМ.
Помимо чисто функционального аспекта, есть и образовательная направленность. Я хочу иметь возможность получить некоторые отзывы о текущем потреблении. И мой наивный подход заключался в том, чтобы просто добавить микросхемы датчиков шунтирования тока. При использовании мультиметра для измерения выходного напряжения датчика я фактически получаю что-то похожее на средний ток (с переключением ШИМ) из-за «медлительности» амперметра. Но при подключении того же выхода, например, к АЦП atmega328p, я получаю плохие показания - скорость здесь ставит показания в любом месте прямоугольной волны ШИМ.
Итак, мой вопрос: как мне измерить (средний) ток при переключении с ШИМ?
Кажется, с дизайном все в порядке, но я мог что-то упустить как в дизайне, так и в том, как следует использовать АЦП uC в этом контексте.
Иногда то, что кажется простым, на самом деле не так просто. Вам нужно провести довольно сложное измерение, но вы хотите получить простой результат. То, что вы хотите измерить, не является постоянным, оно меняется во времени. В зависимости от вашего уровня требований вы можете вычислить одно или несколько свойств текущего потребления. Эти свойства помогут вам лучше контролировать систему. Я предлагаю вам 3 разных решения, в порядке возрастания сложности.
Вы хотите получить результат с одним значением -> получить среднее значение по времени. Как уже было предложено @akellyirl, используйте фильтр нижних частот. Вычислите float y = alpha*input + (1-alpha)*y
для каждого образца, где alpha
коэффициент сглаживания. Подробности смотрите в Википедии .
Вам интересно получить среднее и максимальное значение. Мониторинг максимального значения может быть интересен, например, для определения размеров компонентов.
if (y > max)
max = y;
См. диаграммы ниже. Есть 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 .
Вы правильно понимаете проблему: вам нужно получить «среднее» ШИМ, как и измеритель, который вы используете для измерений.
Вы можете использовать RC-фильтр для сигналов A1,2,3, постоянная времени которых как минимум в десять раз превышает период ШИМ. Это означает, что если ваш период ШИМ составлял 10 микросекунд, то постоянная времени RC должна быть 100 микросекунд. Например, 10 кОм x 10 нФ = 100 мкс.
Лучшим решением является цифровая фильтрация сигналов в микроконтроллере следующим образом:
float y = (1-0.99)*input + 0.99*y;
Измените значение «0,99», чтобы изменить постоянную времени этого цифрового фильтра.
alexan_e
Рикардо
лтж
alexan_e
Мартин