Подключение датчика напряжения к Arduino
Arduino Uno, как и многие микроконтроллеры, имеет встроенный аналого-цифровой преобразователь (АЦП), который может преобразовать аналоговое напряжение на выводе в цифровое число. Однако максимальное напряжение на аналоговом входе ограничено 5В. Вы можете столкнуться с этим ограничением, если ваш проект требует измерения напряжений, превышающих 5В. В таких случаях можно создать делитель напряжения на дискретных резисторах.
Но есть более простой способ измерять напряжения, особенно если они ниже 25В: использовать датчик напряжения. Это готовая схема делителя напряжения, использующая прецизионные резисторы для обеспечения точных показаний.
В этом руководстве мы рассмотрим, как использовать датчик напряжения с Arduino, чтобы сделать задачи измерения напряжения проще и эффективнее. Давайте начнём!
Обзор оборудования
Датчик напряжения, по сути, представляет собой простую схему делителя напряжения из двух резисторов — ничего сложного.
Принципиальная схема датчика напряжения показана на следующем изображении.
В этой схеме два резистора. Резистор (R1), расположенный ближе к входному напряжению, имеет номинал 30 КОм, а резистор (R2), расположенный ближе к земле, — 7.5 КОм. Падение напряжения на R2 и есть наше разделённое напряжение. Этот сигнал выведен на контактный вывод, обозначенный S.
Эта простая схема делит входное напряжение в 5 раз. Именно поэтому этот датчик напряжения может помочь вам измерять напряжения менее 25 вольт с помощью Arduino.
Считывание показаний датчика напряжения
Считывание показаний датчика напряжения, или любого делителя напряжения, очень простое. Мы можем использовать уравнение делителя напряжения.
Уравнение делителя напряжения предполагает, что вам известны три значения приведённой выше схемы: входное напряжение (Vin) и оба значения резисторов (R1 и R2). Зная эти значения, мы можем использовать уравнение для нахождения выходного напряжения (Vout):
Однако в нашем случае мы будем измерять выходное напряжение (Vout) схемы делителя напряжения с помощью АЦП Arduino. Следовательно, неизвестным значением является Vin.
Давайте перестроим уравнение выше для нахождения входного напряжения (Vin).
Это уравнение говорит нам, что входное напряжение (Vin) равно выходному напряжению (Vout), делённому на отношение сопротивления второго резистора (R2) к суммарному сопротивлению (R1 + R2) в цепи.
Распиновка датчика напряжения
Теперь давайте рассмотрим распиновку.
Входная клемма
VCC — подключается к положительному выводу источника напряжения, который вы хотите измерить. Рекомендуемый диапазон напряжения для этого вывода — от 0 до 25В.
GND — подключается к отрицательному выводу источника входного напряжения.
Выходной разъём
S — вывод сигнала датчика напряжения. Он выдаёт аналоговое напряжение, пропорциональное уровню входного напряжения. Обычно подключается к одному из аналоговых входных выводов Arduino.
+ — ни к чему не подключён.
– — общий вывод заземления.
Схема подключения
Подключить датчик напряжения к Arduino очень просто.
Для начала подключите источник напряжения, который вы хотите измерить, к входной винтовой клемме. Затем подключите вывод «S» датчика напряжения к аналоговому пину «A0» на Arduino, а вывод «–» — к земле.
Изображение ниже показывает, как всё подключить.
Пример кода для Arduino
Вот простой скетч, который считывает аналоговое напряжение на аналоговом пине A0, вычисляет входное напряжение по уравнению делителя напряжения и выводит результаты в монитор последовательного порта.
// Define analog input
#define ANALOG_IN_PIN A0
// Floats for ADC voltage & Input voltage
float adc_voltage = 0.0;
float in_voltage = 0.0;
// Floats for resistor values in divider (in ohms)
float R1 = 30000.0;
float R2 = 7500.0;
// Float for Reference Voltage
float ref_voltage = 5.0;
// Integer for ADC value
int adc_value = 0;
void setup(){
// Setup Serial Monitor
Serial.begin(9600);
}
void loop(){
// Read the Analog Input
adc_value = analogRead(ANALOG_IN_PIN);
// Determine voltage at ADC input
adc_voltage = (adc_value * ref_voltage) / 1024.0;
// Calculate voltage at divider input
in_voltage = adc_voltage*(R1+R2)/R2;
// Print results to Serial Monitor to 2 decimal places
Serial.print("Input Voltage = ");
Serial.println(in_voltage, 2);
// Short delay
delay(500);
}
Загрузите скетч в Arduino и наблюдайте за результатами.
Для проверки точности измерьте реальное напряжение с помощью цифрового мультиметра. Значение, отображаемое на мультиметре, должно совпадать с показанием в мониторе последовательного порта.
Следующий результат получен при подаче 5В на датчик напряжения:
А при подаче 12В:
Объяснение кода:
Это довольно простой скетч, поэтому у вас не должно возникнуть проблем с его пониманием. Скетч начинается с определения нескольких глобальных переменных, которые будут использоваться в программе.
Первая строка определяет аналоговый входной пин Arduino, который мы используем для считывания напряжения со схемы делителя напряжения. В данном случае мы используем пин A0.
#define ANALOG_IN_PIN A0
Далее определяются два числа с плавающей точкой — adc_voltage и in_voltage — для хранения показаний напряжения на АЦП и на входе делителя напряжения соответственно.
float adc_voltage = 0.0;
float in_voltage = 0.0;
Переменные R1 и R2 хранят значения сопротивлений делителя напряжения. Если вы используете другие резисторы для создания собственного делителя напряжения, вам нужно будет изменить эти значения.
float R1 = 30000.0;
float R2 = 7500.0;
ref_voltage — опорное напряжение для АЦП, обычно 5В для Arduino Uno.
float ref_voltage = 5.0;
Последняя переменная adc_value используется для хранения необработанного цифрового значения, считанного с АЦП.
int adc_value = 0;
В функции setup() мы настраиваем последовательную связь со скоростью 9600 бод.
void setup(){
Serial.begin(9600);
}
В основном цикле функция analogRead() используется для чтения напряжения на пине A0. Возвращённое значение сохраняется в переменной adc_value.
adc_value = analogRead(ANALOG_IN_PIN);
Это значение затем преобразуется в напряжение (adc_voltage) путём умножения на опорное напряжение и деления на 1024 (поскольку Arduino имеет 10-битный АЦП, значит 2^10 = 1024 различных значений).
adc_voltage = (adc_value * ref_voltage) / 1024.0;
Входное напряжение делителя напряжения затем вычисляется по формуле делителя напряжения:
in_voltage = adc_voltage*(R1+R2)/R2;
Наконец, вычисленное входное напряжение выводится в монитор последовательного порта с точностью до 2 десятичных знаков. После этого Arduino ждёт 500 миллисекунд перед повторением цикла.
Serial.print("Input Voltage = ");
Serial.println(in_voltage, 2);
delay(500);