В электронике многие аналоговые схемы, особенно те, что построены на операционных усилителях (ОУ), требуют двуполярного питания. Например, для корректной работы некоторых ОУ необходимо подавать не только +5 В, но и −5 В относительно общего провода. Однако стандартные источники питания чаще всего обеспечивают только положительное напряжение, что создаёт необходимость в генерации отрицательного напряжения.
Отрицательный источник питания позволяет сместить рабочую точку усилителя в середину диапазона, обеспечивая линейное усиление сигналов переменного тока без искажений. Но как его получить? В статье рассмотрим наиболее простой способ получение отрицательного напряжения.
Понадобилось мне как-то измерять ток на шунте в DC/DC преобразователе. Ток пульсирующий и достигает десятков ампер, по этому дабы избежать потерь на нагрев было решено взять шунт в 1мОм. Пульсации напряжения на таком сопротивлении довольно маленькие, по этому возникла потребность в использовании ОУ для усиления сигнала хотябы в 5-10 раз. По идее можно использовать rail-to-rail операционные усилители, но они либо дороги либо слишком медленны. По этому было решено использовать быстрый ОУ и довольно дешевый ОУ NE5532 (скорость нарастания выходного напряжения 9V/uS). Ниже приведена схема неинвертирующего усилителя с двуполярным питанием. Сигнал с ОУ можно либо подавать на компаратор для защиты по порогу либо на вход АЦП микроконтроллера.

Для получения напряжения -5V было решено использовать схему инвертирующего преобразователя на полевом P канальном транзисторе, по английски inverting buck-boost converter. Принцип работы такой же как и у обычного buck преобразователя: накопление энергии в индуктивности в первой фазе и разряд во второй. Отличие только в схеме соединение индуктивности и диода.
Рассмотрим более подробно физику процесса:

1. Фаза накопления энергии (транзистор Q3 открыт)
Ток течёт через катушку (L) и ключ (Q3) на землю.
Энергия запасается в магнитном поле катушки.
Диод (D9 закрыт (анод на земле, катод на VOUT = отрицательное напряжение).
Конденсатор (C) разряжается, питая нагрузку.
Напряжение в точке А приблизительно равно 5В, в точке В -7.5В
2. Фаза передачи энергии (транзистор Q3 закрыт)
При закрытии ключа ток через катушку не исчезает а медленно спадает за счет накопленной энергии магнитного поля.
Напряжение на катушке инвертируется (полярность меняется) и точка А как бы провалиется вниз.
Диод (D) открывается, и ток течёт через него в сглаживающий конденсатор (C17) и нагрузку (R61).
На выходе формируется отрицательное напряжение (VOUT).

Из формулы следует что мы можем получить выходное отрицательное напряжение больше по амплитуде чем входное положительное. Таким образом если мы имеет +5 на входе и нам надо получить на выходе -7.5 то коэффициент заполнения D должен быть равен 0.6. Почему именно -7.5В ? Дело в том что для нормальной работы микросхемы 70L05 входное напряжение должно быть больше выходного минимум на 2 вольта. Однако стоит понимать что точное значение выходного напряжения зависит так же от тока потребления и даже частоты преобразорвателя, по этому его приходится вручную настраивать путем изменения скважности ШИМ.

Так как на устройствах чаще всего имеется микроконтроллер, то частоту возьмем именно с него. Ниже приведу код для генерации ШИМ сигнала на таймере для микроконтроллера CH32V003 (максимально дешевый и довольно шустрый кмушек на архитектуре RISC-V, максимально похож на STM32F030). Обратите внимание что выбрал режим PWM2 - инверсный ШИМ. Настройку следует производить с маленького коэффициента ШИМ и потихоньку увеличивать пока напряжение не примет нужную величину. Ниже приведенный код настраивает ножку PC0 как выход TIM2CH3.
#include "debug.h"
void periph_init(void){
RCC->APB1PCENR |= RCC_APB1Periph_TIM2; //Включаем тактирование модуля TIM2
RCC->APB2PCENR |= RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO;
GPIOC->CFGLR &= 0xFFFFFFF0; //Clear config
GPIOC->CFGLR |= 0x9; //PC0 -> TIM2CH3 out
// Настройка таймера TIM2
//TIM2CH3->PC0->PWM для -5V
TIM2->CTLR1 = 0; // Сброс регистра управления
TIM2->CTLR1 |= TIM_CounterMode_Up; // Режим счета вверх
TIM2->PSC = 0; // Предделитель (делитель частоты) = 1 (24 МГц)
TIM2->ATRLR = 120 - 1; // Автоперезагрузка (ARR) = 120 (200 кГц)
TIM2->CH3CVR = 35; // Заполнение 35 / 120
TIM2->CCER |= TIM_CC3E; //включаем ШИМ для инвертора -5V
// Настройка канала TIM2CH3 в режиме PWM
TIM2->CHCTLR2 &= ~(0b111 << 4); // Очистка настроек канала CH3
TIM2->CHCTLR2 |= (0b111 << 4); // Режим PWM (Output Compare PWM Mode 2)
TIM2->CTLR1 |= 1; // Включение таймера TIM2
}
int main(void)
{
periph_init();
while(1)
{
}
}
Так же не стоит забывать что нельзя допускать чтобы на затворе транзистора продолжительное время был низкий уровень напряжения, иначе постоянный ток пойдет пойдет через дроссель на землю и спалит транзистор.
