Вольт-ампер-energy-метр на Arduino. Часть 3. Емкость | 04s.ru

Вольт-ампер-energy-метр на Arduino. Часть 3. Емкость

Исходные данные и доработка

К этому моменту у нас есть вольт-ампер-метр постоянного напряжения с пределами 0..20в, 0..5а (смотрите предыдущую часть). Предполагается, что прибор отградуирован с использование эталонного мультиметра, и мы можем приступать к подсчету емкости. Для этого нам не понадобится изменять схему – появится только новый код.

Емкость обычно измеряется в ампер-часах (Ah) или более мелко – в миллиампер-часах (mAh). Эти единицы общеприняты, но не всегда удобны, поскольку без напряжения ничего не говорят о запасенной (или израсходованной) энергии. Более правильно в этом смысле использовать измерение в ватт-часах (Wh). Один ватт-час эквивалентен 3600 Дж, то есть это чистое измерение энергии. Мы будем измерять обе величины.

Что касается измерения, скажем, в отношении химических источников тока, то их кривые разряда\заряда представляют плавные кривые изменения напряжения от времени (как минимум при постоянном токе). Мы ограничены дискретными измерениями, поэтому будем апроксимировать нашу кривую серией измерений на небольших участках времени – по сути, произведем численное интегрирование. Например, если на участке измерений в 1 секунду средний ток составил 1.0а, а напряжение 10в, то мы зафиксируем 1As и 10Ws соответственно. В следующую секунду, допустим, значения составят 0.95а и 9.5в (0.95As и 9.03Ws) мы добавим эти значения к предыдущим и получим 1.95As и 19.03Ws и тд до окончания процесса. Так мы накопим емкость, а выведем ее уже нормированной к часам.

Для подсчета интервалов времени у нас есть встроенная функция millis() с разрешением 1 миллисекунда. Сами интервалы у нас уже имеются вполне естественным образом – между обновлениями значения на дисплее, но я предпочитаю небольшое дополнительное усреднение и введу еще период интегрирования – количество интервалов, после которого будет рассчитываться и накапливаться очередная порция значений емкости (в любом случае, длина интервала не превзойдет нескольких секунд). Важно, чтобы дискретные границы интервалов примыкали друг к другу без разрывов (например, когда мы выводим на дисплей и ток потребляется и время идет – надо учитывать).

У меня пока нет никакого дополнительного функционала (кнопки начала расчета, например), но просто для подсчета это не сильно и нужно – всегда можно сделать Reset. Для испытания прибора предлагаю либо использовать лабораторный блок питания, либо (что более приближено к целевому назначению), разрядить какой-нибудь аккумулятор, с использованием прибора и обычного резистора подходящего номинала. В последнем случае, как правило, нужно контролировать напряжение – в принципе это одна строка кода, а в качестве управления можно задействовать пока простую пищалку (buzzer).

Исходный код

Далее я приведу изменения в исходном коде, полную версию (в варианте с I2C) можно скачать по ссылке в конце статье.

............
// Интеграция значений по AvgCnt отсчетам, начатым в AvgStart
int AvgCnt = 0;
float AvgAmp = 0.0;
float AvgVolt = 0.0;
unsigned long AvgStart = 0;
float CapAmp = 0.0;
float CapWatt = 0.0;
............
void loop() {
 if (AvgStart == 0) AvgStart = millis();
 ............
 // Интеграция значений емкости
 AvgAmp += Amp;
 AvgVolt += Volt;
 AvgCnt++;
 if (AvgCnt >= 5) {
 float dt = (millis() - AvgStart) / 1000.0; // Интервал интеграции - секунд
 AvgStart = millis(); // Начало нового интервала
 AvgAmp = AvgAmp / AvgCnt;
 AvgVolt = AvgVolt / AvgCnt;
 CapAmp += AvgAmp * dt; // Ампер * Секунд
 CapWatt += (AvgVolt * AvgAmp) * dt; // Ватт * Секунд
 AvgAmp = 0;
 AvgVolt = 0;
 AvgCnt = 0;
 }
 // Вывод данных
 ...........
}
5/5 - (2 голоса)


Место для продажи

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *