В этой статье описывается портативный регулируемый источник питания, совместимый с макетными платами без пайки, разработанный как идеальный источник питания для проектов Arduino и других схем с низким энергопотреблением.

Блок питания способен обеспечивать от 0 В до 5,5 В при токе до 0,5 А и питается от двух перезаряжаемых литий-ионных элементов. Напряжение на выходе можно настроить с помощью поворотного энкодера, а его значение отображается на трехзначном 7-сегментном индикаторе. Вся схема управляется микроконтроллером ATmega328.

Источник питания для макетных плат без пайки

Технические характеристики

Существующие источники питания для макетных плат обычно выдают 3,3 В и 5 В от входа USB или регулируемое напряжение от источника постоянного тока. Однако всем им не хватает некоторых функций, которые я хотел бы от источника питания:

  1. Он должен питаться от аккумуляторов, чтобы не привязываться к розетке;
  2. Диапазон регулировки напряжения должен начинаться от нуля, чтобы была возможность исследовать поведение схемы с неисправной батареей, найти напряжение, при котором загорается светодиод, проверить падение напряжения или построить цепи низкого напряжения;
  3. Он должен отображать выходное напряжение, чтобы не подключать мультиметр для проверки напряжения.

Поскольку блок питания предназначен для тестирования проектов на AVR, напряжение выше 5,5 В как правило не требуется. Это означает, что в источнике питания можно использовать две литий-ионные батареи напряжением 3,7 В.

Данный источник питания мог быть сделан на стандартном регулируемом стабилизаторе, таком как LM317, но тогда минимальное напряжение составит только 1,25 В. Поэтому я выбрал LT3080 от Linear Technology, эта микросхема обеспечивает ток до 1,1 А и регулировку напряжения почти от 0 Вольт.

Схема

Источник питания для макетных плат без пайки - схема

LT3080 требует минимальной нагрузки для правильной работы регулятора, указанной в описании, около 500 мкА. Самый простой способ организовать это - подключить резистор к выходу. Я выбрал сопротивление 220 Ом, при использованиии которого наименьшее напряжение без нагрузки было 0,05 В, но появилась дополнительная нагрузка в 25 мА при максимальном напряжении. Пульсации на выходе составляют ниже 2 мВ RMS.

В этом проекте нет необходимости в точном времени, поэтому можно обойтись без внешнего кварца и использовать внутренний генератор ATmega328.

LT3080 доступен во множестве различных корпусов. Я выбрал корпус для поверхностного монтажа SOT-223. Язычок регулятора припаян к большому полигону на печатной плате, также я прикрепил к нему небольшой радиатор с помощью термоклейкой ленты для дополнительного охлаждения. При проверке источника питания нагрузкой в 0,5 А, радиатор оставался холодным. Теоретически он способен отдавать до 1 А, но при больших токах, вероятно, понадобится более мощный радиатор.

Чтобы сгенерировать 5,5 В для управления цифровой схемой и обеспечить опорное напряжение для АЦП, я использовал регулируемый стабилизатор LM317L в корпусе SOT-89, который можно настроить с помощью двух резисторов. Выходное напряжение равно U = 1,25*(1 + R2/R1); значения R1 = 200 Ом и R2 = 680 Ом дают нам ровно 5,5 В.

В устройстве был использован энкодер Adafruit, который выдает 24 импульса на оборот.

Индикатор

В схеме используется недорогой 0,28-дюймовый трехразрядный 7-сегментный светодиодный дисплей с общим анодом, типа KYX2381BS. Также можно использовать дисплей с общим катодом, изменив процедуру Display().

Элементы питания

Плата рассчитана на батарейный отсек размером AA. В качестве элементов питания я выбрал две аккумуляторные батареи 3,7 В типа 14250, это половина высоты батареи AA, поэтому в держателе батареи поместятся две, что в сумме дает 7,4 В. Обратите внимание, что большинство перезаряжаемых батарей 14250 не имеют схемы защиты, поэтому они не должны разряжаться ниже 3 В. В качестве альтернативы можно использовать неперезаряжаемые батареи 14250 (например, Saft) или никель-кадмиевые батареи NiCad PP3.

Источник питания для макетных плат без пайки - плата

Я разработал плату в Eagle и отправил ее в Ragworm для изготовления. В схеме используется смесь выводных компонентов и SMD для достижения компактного расположения при использовании легко доступных компонентов:

В этом разделе объясняются различные разделы управляющей программы.

Чтение поворотного энкодера

Энкодер подключен к двум входам, PC2 и PC3. Они сконфигурированы с подтяжкой к плюсу питания в setup(), а изменению состояния PC2 срабатывает прерывание:

PORTC = 1 << PORTC2 | 1 << PORTC3; // Подтяжка к плюсу питания выводов A и B
PCMSK1 = 1 << PCINT10; // Прерывание по изменению состояния вывода A (PC2/PCINT10)
PCICR = 1 << PCIE1; // Разрешаем прерывание
PCIFR = 1 << PCIF1; // Очищаем флаг прерывания

Процедура обслуживания прерывания по изменению состояния вывода считывает состояние двух входов, определяет, в каком направлении должны изменяться значения, и вызывает ChangeValue(). Переменные a и b содержат текущие состояния двух входов, глобальная переменная a0 содержит предыдущее состояние, а c0 содержит неактивное состояние:

ISR (PCINT1_vect) {
  int a = PINC >> A & 1;
  int b = PINC >> B & 1;
  if (a != a0) {              // Если изменилось
    a0 = a;
    if (b != c0) {
      c0 = b;
      ChangeValue(a == b);
    }
  }
}

Напряжение источника питания регулируется цифровым выходом, который генерирует ШИМ-сигнал на PD3. С помощью таймера/счетчика 2, который настраивается в setup(), происходит генерация ШИМ с фазовой коррекцией:

DDRD = 1 << DDD3; // Делаем PD3 (OC2B) выходом для ШИМ
TCCR2A = 2 << COM2B0 | 1 << WGM20; // Нормальный режим, фазовая коррекция ШИМ
TCCR2B = 1 << WGM22 | 2 << CS20; // Предделитель таймера на 8
OCR2A = Steps - 1; // Разделим диапазон на 220 шагов по 0,025 В
TIMSK2 = 1 << TOIE2; // Включим прерывание по переполнению

Вращение поворотного энкодера вызывает процедуру ChangeValue(), которая увеличивает или уменьшает значение глобальной переменной Count:

void ChangeValue (bool Up) {
  Count = max(min((Count + (Up ? 1 : -1)), Steps-1), 0);
  SetVoltage(Count);
  Overload = false;
}

Это, в свою очередь, вызывает SetVoltage(), в которой изменяется значение регистра OCR2B:

void SetVoltage (int Count) {
  Target = Count * Stepsize;
  OCR2B = Count;
}

Чтение выходного напряжения

Стабилизированное выходное напряжение считывается аналоговым входом ADC0 на выводе PC0. Регистры АЦП настраиваются в setup(), чтобы использовать Vcc в качестве опорного напряжения:

ADMUX = 1 << REFS0 | 0 << MUX0; // Источник опорного напряжения - Vcc, вход ADC0(PC0)
ADCSRA = 1 << ADEN | 7 << ADPS0; // Включение АЦП, частота 62,5 кГц

Аналоговое значение считывается подпрограммой ReadADC():

int ReadADC () {
  uint8_t low, high;
  ADCSRA = ADCSRA | 1 << ADSC;           // Старт
  while (ADCSRA & 1 << ADSC);            // Ждем пока идет преобразование
  low = ADCL;
  high = ADCH;
  return high << 8 | low;
}

Отображение напряжения

Наконец, аналоговое напряжение отображается на трехзначном 7-сегментном дисплее. Для простоты я использовал тот же таймер, таймер/счетчик 2, для режима мультиплексирования. Каждые 220 тиков таймера происходит переполнение счетчика, это используется для вызова подпрограммы обслуживания прерывания:

ISR (TIMER2_OVF_vect) {
  DisplayNextDigit();
}

Прерывание, в свою очередь, вызывает DisplayNextDigit(). Процедура помещает соответствующие данные сегмента в PORTB для отображения следующей цифры, а затем включает высокий уровень общей линии разрядов на PORTD. Число, которое будет отображаться на каждом разряде дисплея, определяется массивом Buffer[]:

void DisplayNextDigit() {
  static int LastVoltage;
  DDRD = DDRD & ~(1 << Digits[digit]);         // Делаем предыдущий бит цифры вводом
  digit = (digit+1) % (Ndigits+1);
  if (digit < Ndigits) {
    char segs = charArray[Buffer[digit]];
    if (digit == 0) segs = segs | 0x80;        // Десятичная точка
    PORTB = ~segs;
    DDRB = segs;
    DDRD = DDRD | 1 << Digits[digit];          // Делаем цифровой бит выводом
    PORTD = PORTD | 1 << Digits[digit];        // Принимаем высокий разряд цифры
  } else {
    DDRB = 0;                                // Все сегменты выключены
    int Voltage = (ReadADC() * (long)MaxVoltage)/1024;
    // Добавляем гистерезис, чтобы остановить скачок дисплея
    if (abs(LastVoltage - Voltage) >= 10) {
      LastVoltage = Voltage;
      // Защита от перегрузки - если выходное напряжение ниже целевого значения более чем на 0,5 В
      if (Target - Voltage > 500) {
        Overload = true;
        SetVoltage(0);
        Count = 0;
      }
      if (Overload) Buffer[0] = Buffer[1] = Buffer[2] = Dash;
      else Display(Voltage/10);
    }
  }
}

Каждый четвертый цикл эта процедура считывает АЦП и вызывает Display() для записи соответствующих значений в буфер дисплея Buffer[]. Чтобы предотвратить мерцание дисплея между двумя соседними значениями, подпрограмма обновляет дисплей только в том случае, если напряжение изменилось не менее чем на 10 мВ.

Отключение по перегрузке

LT3080 включает защиту от короткого замыкания, ограничивающую выходной ток примерно до 1,4 А, но этого все же достаточно, чтобы повредить неправильно подключенную цепь. Поэтому я предусмотрел отключение по перегрузке, которое срабатывает, если заданное напряжение, установленное поворотным энкодером, более чем на 500 мВ выше измеренного выходного напряжения. Это условие обрабатывается проверкой в DisplayNextDigit(), которая устанавливает флаг перегрузки, если произошла перегрузка. Выходное напряжение устанавливается в ноль, и на дисплее отображаются прочерки. Чтобы сбросить отключение по перегрузке, поверните энкодер.

Кнопка сброса

В качестве дополнительной меры безопасности вы можете вручную включить отключение по перегрузке, нажав кнопку поворотного энкодера, например, если вы чувствуете запах или перегрев элементов вашей схемы. Кнопка подключена к PD2, который настроен в setup() для генерации прерывания на INT0:

PORTD = 1 << PORTD2; // Подтяжка к плюсу питания
EICRA = 2 << ISC00; // Прерывание по заднему фронту
EIMSK = 1 << INT0; // Разрешаем прерывание

Затем процедура обслуживания прерывания просто активирует флаг перегрузки и устанавливает нулевое напряжение:

ISR (INT0_vect) {
  Overload = true;
  SetVoltage(0);
  Count = 0;
}

Программирование микроконтроллера

Вы можете запрограммировать ATmega328 с помощью ISP (внутрисистемное программирование) через 6-контактный разъем ISP, расположенный на печатной плате. Я использовал программатор USBASP. В качестве альтернативы вы можете использовать Sparkfun Tiny AVR Programmer или Arduino Uno в качестве программатора ISP.

IDE Arduino не включает конфигурацию с использованием внутреннего генератора, поэтому я создал такую, которую вы можете скачать с GitHub - ATmegaBreadboard. После копирования ее в папку hardware директории Arduino выберите параметр ATmegaBreadboard в менеджере плат. Затем выберите из следующих параметров: B.O.D. Enabled(4.3V), ATmega328P и 8 MHz(internal). Запишите загрузчик, чтобы настроить fuse-биты, и загрузите программу в микроконтроллер.


Файлы к статье "Источник питания для макетных плат без пайки"
Описание:

Схема и макет печатной платы Eagle, исходный код Arduino IDE

Размер файла: 44.15 KB Количество загрузок: 148 Скачать