top of page

Вольтметр на Ардуино NANO

Вольтметр

1 этап

  1. На аналоговый вход Ардуино (А0 например) подаем напряжение от 0 до + 5V. АЦП Ардуино преобразует аналоговое напряжение в код АЦП в диапазоне 0 – 1023 (тип unsigned int: положительные числа 0… 65 535).

2 этап

  1. После этого, код АЦП (тип int) умножаем на коэффициент Кацп = 0,00488 (тип float) и на коэффициент делителя (например Кдел = 2,44 тип float). Получится число типа float (дробное).

  2. Кацп считается так: Кацп = 5V / 1024 = 0,00488V. Т.е если входное напряжение изменится на 4.88 мВ (4,88мВ = 0,00488 В) АЦП изменится на 1.

  3. Пример: Подаем на аналоговый вход (А0) Ардуино напряжение  2.5 В (2500 мВ). АЦП это напряжение преобразует в код, который будет равен 512. Теперь, если напряжение на входе увеличить на 0,00488 В (4,88 мВ) код АЦП будет равен 513. Если уменьшить на 0,00488 В (4,88 мВ) код АЦП будет равен 511.

3 этап

  1. После этого выводим получившееся число (типа float) в СОМ порт или на 7сегмент. индикатор.

  2. Если у Вас 7сегмент. индикатор выполнен на чипе MAX7219, а библиотеку Вы используете HCMAX7219.h, то число типа float нужно преобразовать в unsigned int.

  3. Пример: Voltmeter_10V_del_12V.ino  Вольтметр 10 вольт, делитель на 12,2 вольт.

  4. Пример: Voltmeter_10V_del_23V.ino  Вольтметр 10 вольт, делитель на 23,27 вольт.

 

  1. Чтобы «выпрямить» ВАХ (Вольт Амперную Характеристику) можно на 2 этапе ввести поправочные коэффициенты.
    Пример: Voltmeter_10V_del_12V_koeff.ino  Вольтметр 10 вольт, делитель на 12,2 вольт + коэфф-ты.

Борьба с «шумом», «дрожанием» входного сигнала.

Из этого видео видно, что "среднее" значение давления равно приблизительно 16,5 кПа.

Нижнее = 14 кПа, а верхнее = 18 кПа.

Задача: нужно, чтобы цифровой дисплей отображал давление в пределах: 16.4 кПа - 16,6 кПа.

Точность вольтметра нужна в пределах +/- 0,02 V в диапазоне 0 - 10 V.

Нужно это для того, чтобы вольтметр прошёл поверку в ЦСМ (Центр Стандартизации и Метрологии).

  1. Можно создать массив из 10 – 63 ячеек. При каждом измерении АЦП заполнять массив данными с АЦП (в диапазоне 0 – 1023 тип unsigned int). Когда массив заполниться, суммировать данные и разделить полученную сумму на количество ячеек массива (среднее арифметическое).
    Затем 2 этап, потом 3 этап.
    Пример: Voltmeter_10V_array.ino

 

  1. Можно создать счетчик на 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 вольта. Для моих целей, это лучшая прошивка.

  2. Voltmeter_10V_count_long.ino

 

  1. Можно попробовать «среднее скользящее» (moving average ) .
    Создать массив из 10 – 63 ячеек.  Переменные типа unsigned int вмещают  положительные числа от  0 до 65 535.

  2. Поэтому:  65535 / 1024 = 63.99 max колличество ячеек ).

  3. При каждом новом измерении АЦП заполнять массив. Когда он будет полностью заполнен, удалять данные из первой ячейки массива,  записывать новые данные с АЦП. После этого, делим сумму содержимого всех ячеек, на кол-во ячеек.И так по кругу. Записывать новое число с АЦП, удаляя одно старое.
    Затем 2 этап, потом 3 этап.
    Пример: Voltmeter_10V_average_array.ino  Максимальное входное напряжение этого делителя = 12,2 вольта.

  1. Можно попробовать «среднее скользящее» (moving average )  без создания массива (мало чем отличается от массива, но попробовать стоит).

  2. Создаем переменную типа (unsigned int) и константу типа  byte (const byte) равную например 10 для счетчика.

  3. Первый проход: первые десять данных с АЦП суммируются и делятся на 10. Получаем среднеарифметическое за 10 замеров АЦП.

  4. Второй и последующии проходы: новое среднее значение = старое среднее умножаем на 9, прибавляем только что полученное новое и все это делим на 10.

  5. Короткая запись: "новое среднее значение" = ( "старое среднее" * 9  + "текущее значение") / 10.

  6. В "шапке" скетчей указаны сайты с которых была взята информация для написания всех скетчей на этом сайте.

  7. Пример: 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

bottom of page