Вольтметр на Ардуино NANO
Вольтметр
1 этап
-
На аналоговый вход Ардуино (А0 например) подаем напряжение от 0 до + 5V. АЦП Ардуино преобразует аналоговое напряжение в код АЦП в диапазоне 0 – 1023 (тип unsigned int: положительные числа 0… 65 535).
2 этап
-
После этого, код АЦП (тип int) умножаем на коэффициент Кацп = 0,00488 (тип float) и на коэффициент делителя (например Кдел = 2,44 тип float). Получится число типа float (дробное).
-
Кацп считается так: Кацп = 5V / 1024 = 0,00488V. Т.е если входное напряжение изменится на 4.88 мВ (4,88мВ = 0,00488 В) АЦП изменится на 1.
-
Пример: Подаем на аналоговый вход (А0) Ардуино напряжение 2.5 В (2500 мВ). АЦП это напряжение преобразует в код, который будет равен 512. Теперь, если напряжение на входе увеличить на 0,00488 В (4,88 мВ) код АЦП будет равен 513. Если уменьшить на 0,00488 В (4,88 мВ) код АЦП будет равен 511.
3 этап
-
После этого выводим получившееся число (типа float) в СОМ порт или на 7сегмент. индикатор.
-
Если у Вас 7сегмент. индикатор выполнен на чипе MAX7219, а библиотеку Вы используете HCMAX7219.h, то число типа float нужно преобразовать в unsigned int.
-
Пример: Voltmeter_10V_del_12V.ino Вольтметр 10 вольт, делитель на 12,2 вольт.
-
Пример: Voltmeter_10V_del_23V.ino Вольтметр 10 вольт, делитель на 23,27 вольт.
-
Чтобы «выпрямить» ВАХ (Вольт Амперную Характеристику) можно на 2 этапе ввести поправочные коэффициенты.
Пример: Voltmeter_10V_del_12V_koeff.ino Вольтметр 10 вольт, делитель на 12,2 вольт + коэфф-ты.
Борьба с «шумом», «дрожанием» входного сигнала.
Из этого видео видно, что "среднее" значение давления равно приблизительно 16,5 кПа.
Нижнее = 14 кПа, а верхнее = 18 кПа.
Задача: нужно, чтобы цифровой дисплей отображал давление в пределах: 16.4 кПа - 16,6 кПа.
Точность вольтметра нужна в пределах +/- 0,02 V в диапазоне 0 - 10 V.
Нужно это для того, чтобы вольтметр прошёл поверку в ЦСМ (Центр Стандартизации и Метрологии).
-
Можно создать массив из 10 – 63 ячеек. При каждом измерении АЦП заполнять массив данными с АЦП (в диапазоне 0 – 1023 тип unsigned int). Когда массив заполниться, суммировать данные и разделить полученную сумму на количество ячеек массива (среднее арифметическое).
Затем 2 этап, потом 3 этап.
Пример: Voltmeter_10V_array.ino
-
Можно создать счетчик на 100 – 250 отсчетов. При каждом измерении АЦП записывать данные в переменную (типа unsigned long = 0 - 4 294 967 295), прибавляя новые данные с АЦП к старым. И так 100 – 250 раз. Потом (по полному заполнению счетчика 100 – 250 отсчетов) разделить получившуюся сумму на количество отсчетов счетчика (100 - 250) (получим среднее арифметическое, но с созданием всего одной переменной типа unsigned long).
Затем 2 этап, потом 3 этап.
Пример: Voltmeter_10V_count.ino Максимальное входное напряжение этого делителя = 12,2 вольта. Для моих целей, это лучшая прошивка.
-
Можно попробовать «среднее скользящее» (moving average ) .
Создать массив из 10 – 63 ячеек. Переменные типа unsigned int вмещают положительные числа от 0 до 65 535. -
Поэтому: 65535 / 1024 = 63.99 max колличество ячеек ).
-
При каждом новом измерении АЦП заполнять массив. Когда он будет полностью заполнен, удалять данные из первой ячейки массива, записывать новые данные с АЦП. После этого, делим сумму содержимого всех ячеек, на кол-во ячеек.И так по кругу. Записывать новое число с АЦП, удаляя одно старое.
Затем 2 этап, потом 3 этап.
Пример: Voltmeter_10V_average_array.ino Максимальное входное напряжение этого делителя = 12,2 вольта.
-
Можно попробовать «среднее скользящее» (moving average ) без создания массива (мало чем отличается от массива, но попробовать стоит).
-
Создаем переменную типа (unsigned int) и константу типа byte (const byte) равную например 10 для счетчика.
-
Первый проход: первые десять данных с АЦП суммируются и делятся на 10. Получаем среднеарифметическое за 10 замеров АЦП.
-
Второй и последующии проходы: новое среднее значение = старое среднее умножаем на 9, прибавляем только что полученное новое и все это делим на 10.
-
Короткая запись: "новое среднее значение" = ( "старое среднее" * 9 + "текущее значение") / 10.
-
В "шапке" скетчей указаны сайты с которых была взята информация для написания всех скетчей на этом сайте.
- Пример: Voltmeter_10V_average_count.ino Максимальное входное напряжение этого делителя = 12,2 V
В этом видео в Arduino NANO загружен скетч Voltmeter_10V_count.ino без коэфф-тов.
Выбирайте любую версию прошивки для Ваших условий эксплуатации вольтметра.
Пробуйте изменить код под ваши требования.
Схема вольтметра (Рис.1) с делителем на 12,2 В довольно проста.
Не нужно искать резисторы с точно такими же номиналами. Главное правильно посчитать коэффициент деления делителя. В "шапке" любого скетча рассказано как это сделать.
Рис. 1
Индикатор с чипом MAX7219
Рис. 2
Рис. 3
Рис. 4
Рис. 5
Из представленных таблиц видно, что правильно выбранный делитель напряжения довольно сильно влияет на точность вольтметра. Особенно на краях ВАХ. Можно конечно скорректировать ВАХ , как это сделано в Voltmeter_10V_del_12V_koeff. ino
В таблицах:
Образ = Образцовое напряжение поданое на вольтметр (собранный на Arduino NANO).
Вольтметр = показания на дисплее вольтметра (обранного на Arduino NANO).
Отклонение = отклонение напряжения (обранного на Arduino NANO) от образцового.
почта: kar095@yandex.ru