Регулятор напряжения питания на Arduino Uno

В этой статье мы рассмотрим проектирование источника изменяющегося напряжения (регулятор) питания с максимальным напряжением 5 В на основе платы Arduino Uno. Для этой цели мы воспользуемся АЦП (аналого-цифровым преобразованием) и ШИМ (широтно-импульсной модуляцией).

Внешний вид регулятора напряжения питания на Arduino Uno

Некоторые электронные устройства работают с напряжением питания 3.3 В, а некоторые — с напряжением 2.2 В. Некоторые схемы работают даже при более низких питающих напряжениях. Поэтому в этом проекте мы создадим простую схему, которая будет обеспечивать на своем выходе напряжение питания в диапазоне 0-5 В с точностью 0.05 В.

Эта схема будет обеспечивать рабочий ток до 100 мА, поэтому ее можно будет использовать для питания большинства используемых в настоящее время датчиков различного назначения. Также эту схему можно применить для зарядки аккумуляторов форматов AA и AAA. С помощью ЖК дисплея можно будет наглядно контролировать величину напряжения и его изменения. Уменьшение и увеличение выходного напряжения в схеме осуществляется с помощью кнопок.

Необходимые компоненты

Плата Arduino Uno
Источник питания с напряжением 5 В
ЖК дисплей 16х2
Конденсатор 100 мкФ (2 шт.)
Кнопка (2 шт.)
Резистор 1 кОм (3 шт.)
Транзистор 2N2222

Работа схемы

Схема устройства представлена на следующем рисунке.

Схема регулятора напряжения питания на Arduino Uno

Напряжение на выходе устройства не будет полностью линейным – оно будет подвержено влиянию шумов. Для нейтрализации этого эффекта параллельно выходу включены конденсаторы. Две кнопки на схеме служат для увеличения и уменьшения напряжения на выходе схемы. ЖК дисплей служит для отображения текущего значения выходного напряжения.

Исходный код программы

Прежде чем приступим к рассмотрению программы кратко повторим принципы использования АЦП и ШИМ в плате Arduino Uno.

Напряжение с выхода схемы мы будем подавать на один из каналов АЦП платы Arduino Uno. После осуществления преобразования (АЦП) мы полученное цифровое значение будем преобразовывать в соответствующее ему значение напряжения и показывать его на экране ЖК дисплея.

Плата Arduino имеет шесть каналов АЦП. Мы можем использовать любой из них. Разрешение АЦП Arduino составляет 10 бит – то есть мы сможем работать с диапазоном целых чисел (0-(2^10) 1023)). Это означает что данный АЦП преобразует входное напряжение от 0 до 5 Вольт в целое число от 0 до 1023. То есть имеем точность АЦП 5/1024= 4.9 мВ. То есть один шаг приращения целого числа на выходе АЦП равен изменению в 4.9 мВ на его входе.

В нашей схеме для АЦП мы будем использовать канал A0. Для осуществления функций АЦП мы должны в программе сделать следующие вещи:

1. analogRead(pin);
2. analogReference();
3. analogReadResolution(bits);

Все каналы АЦП платы Arduino Uno имеют опорное напряжение 5В – то есть это максимальное значение входного напряжения, которое способны обрабатывать данные каналы. Поскольку, к примеру, некоторые датчики обеспечивают на своем выходе диапазон напряжений 0-2.5В, то использование опорного напряжения 5В в данном случае приведет к уменьшению точности измерений. Поэтому в подобных случаях для изменения опорного напряжения целесообразно использовать функцию “analogReference();”. Мы в рассматриваемом случае оставим значение опорного напряжения без изменений.

По умолчанию разрешающая способность каналов АЦП платы Arduino Uno составляет 10 бит. Однако в некоторых случаях (например, для увеличения скорости преобразования) можно уменьшить эту разрешающую способность с помощью команды “analogReadResolution(bits);”. Мы в нашем примере не будем изменять разрешающую способность каналов АЦП.

Если все необходимые настройки канала АЦП сделаны (или оставлены по умолчанию), то для чтения значения с выхода АЦП можно воспользоваться функцией “analogRead(pin);”, где pin обозначает контакт платы Arduino, который мы будем использовать для аналого-цифрового преобразования, в нашем случае это будет контакт “A0”. Для того чтобы сразу сохранить значение с выхода АЦП в переменной можно использовать команду вида ”float VOLTAGEVALUE = analogRead(A0);”, в результате этой команды значение с выхода АЦП будет сохранено в переменной “VOLTAGEVALUE”.

Контакты платы Arduino Uno, на которых возможно формирование ШИМ сигнала, обозначены символом “~”. Всего таких каналов на плате Arduino Uno шесть. Мы в рассматриваемом примере для формирования ШИМ сигнала будем использовать контакт PIN3.

Как использовать ШИМ сигнал в Arduino? Это можно сделать, к примеру, с помощью функции analogWrite(3,VALUE) – эта функция на 3-м контакте сформирует ШИМ сигнала со значением (коэффициентом заполнения), определяемым параметром VALUE. Параметр VALUE может изменяться в диапазоне от 0 до 255. 0 соответствует самому низшему значению, а 255 – самому высшему. При VALUE=255 в результате приведенной команды мы получим 5В на контакте PIN3. Если VALUE=125, то на PIN3 мы получим среднее значение напряжения равное 2,5 В.

Кнопки в схеме подключены к контактам PIN4 и PIN5 платы Arduino Uno. При нажатии одной кнопки мы будем увеличивать коэффициент заполнения ШИМ, а при нажатии другой – уменьшать. Таким образом, мы будем изменять коэффициент заполнения ШИМ на контакте PIN3.

ШИМ сигнал с контакта PIN3 подается на базу NPN транзистора, который обеспечивает изменяющееся напряжение на своем эмиттере. Поскольку на базе транзистора за счет изменения коэффициента заполнения ШИМ напряжение будет изменяться, то и на его эмиттере напряжение также будет изменяться. Таким образом, мы получили источник изменяющегося напряжения питания (регулятор питания).

С выхода схемы напряжение подается на канал АЦП платы Arduino Uno чтобы визуализировать его потом на экране ЖК дисплея.

#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 10, 11, 12, 13);//RS,EN,D4,D5,D6,D7
int voltageadjust =125; // устанавливаем начальное значение выходного напряжения 2.5В
float check =0;

void setup()
{
pinMode(3,OUTPUT); // выходной контакт для ШИМ сигнала
pinMode(4,INPUT); // кнопка 1
pinMode(5,INPUT); // кнопка 2

lcd.begin(16, 2); // устанавливаем тип используемого ЖК дисплея
lcd.print(" CIRCUITDIGEST"); // показываем ЖК дисплее начальное сообщение
lcd.setCursor(0, 1);
delay (2500);
delay (2500);

lcd.clear();
lcd.print("VOLTAGE= ");
lcd.setCursor(9, 0);
}

void loop()
{
float VOLTAGEVALUE = (analogRead(A0)); // считываем значение АЦП с канала A0
VOLTAGEVALUE = (VOLTAGEVALUE*5)/1024; // конвертируем цифровое значение в значение напряжения

if ((check > (VOLTAGEVALUE+0.05))|(check < (VOLTAGEVALUE-0.05)))
// если изменение напряжения больше чем 0.05 (для предотвращения флуктуаций)
{
lcd.print(VOLTAGEVALUE);
lcd.print("V ");
lcd.setCursor(9, 0); // переводим курсор на 9-ю позицию
check = VOLTAGEVALUE; // сохраняем предыдущее значение
}

analogWrite(3,voltageadjust); // формируем ШИМ сигнал на PIN3

if (digitalRead(4)==LOW)
{
if (voltageadjust<250)
{
voltageadjust++; // если кнопка 1 нажата и voltageadjust меньше чем 250, то увеличиваем на 1 значение voltageadjust (коэффициент заполнения ШИМ)
delay(30);
}
}
if (digitalRead(5)==LOW)
{
if (voltageadjust>0)
{
voltageadjust--; // // если кнопка 2 нажата и voltageadjust больше 0, то уменьшаем на 1 значение voltageadjust (коэффициент заполнения ШИМ)
delay(30);
}
}

delay(200);
}

Видео, демонстрирующее работу схемы

(1 голосов, оценка: 5,00 из 5)
Загрузка...
469 просмотров

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

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