Перейти к содержимому

Заметки

10 основных схем операционных усилителей:

Операционные усилители (ОУ) — это линейные устройства, обладающие всеми свойствами, необходимыми для почти идеального усиления постоянного тока, и поэтому широко используемые в обработке или фильтрации сигналов или для выполнения математических операций, таких как сложение, вычитание, интегрирование и дифференцирование. Цель этой заметки — представить 10 базовых схем для новичков в электронных разработках и освежить заржавевшие умы инженеров.

1. Повторитель напряжения

Самая простая схема — это буфер напряжения, так как он не требует никаких внешних компонентов. Поскольку выходное напряжение равно входному напряжению, студенты могут быть озадачены и задаться вопросом, имеет ли этот тип схемы какое-либо практическое применение.

Эта схема позволяет создать вход с очень высоким импедансом и выход с низким импедансом. Это полезно для сопряжения логических уровней между двумя компонентами или когда источник питания основан на делителе напряжения. Рисунок ниже основан на делителе напряжения, и схема не может функционировать. Действительно, импеданс нагрузки может иметь большие колебания, поэтому напряжение Vout может резко меняться, в основном, если импеданс нагрузки имеет значение той же величины, что и R2.

Для решения этой проблемы между нагрузкой и делителем напряжения (см. рисунок ниже) вставляется усилитель. Таким образом, Vout зависит от R1 и R2, а не от значения нагрузки.

Основная цель операционного усилителя, как следует из его названия, — усиление сигнала. Например, выход датчика должен быть усилен, чтобы АЦП мог измерить этот сигнал.

2. Инвертирующий операционный усилитель

В этой конфигурации выходной сигнал подается обратно на отрицательный или инвертирующий вход через резистор R2. Входной сигнал подается на этот инвертирующий вывод через резистор R1.

Положительный вывод соединен с землей.

Это очевидно в частном случае, когда R1 и R2 равны. Такая конфигурация позволяет производить сигнал, который является дополнительным к входному, поскольку выходной сигнал является полной противоположностью входного сигнала.

Из-за отрицательного знака выходной и входной сигналы не совпадают по фазе. Если оба сигнала должны быть в фазе, используется неинвертирующий усилитель.

3. Неинвертирующий операционный усилитель

Эта конфигурация очень похожа на инвертирующий операционный усилитель. Для неинвертирующего входное напряжение напрямую прикладывается к неинвертирующему выводу, а конец петли обратной связи подключается к земле.

Эти конфигурации позволяют усиливать один сигнал. Возможно усиление нескольких сигналов с помощью суммирующих усилителей.

4. Неинвертирующий суммирующий усилитель

Чтобы добавить 2 напряжения, можно добавить только 2 резистора на положительном выводе схемы неинвертирующего операционного усилителя.

Стоит отметить, что добавление нескольких напряжений не является очень гибким решением. Действительно, если добавить третье напряжение с точно такими же сопротивлениями, формула будет Vs = 2/3 (V1 + V2 + V3 ).

Резисторы необходимо изменить, чтобы получить Vs = V1 + V2 + V3, или второй вариант — использовать инвертирующий суммирующий усилитель.

5. Инвертирующий суммирующий усилитель

При параллельном подключении резисторов к инвертирующему входному выводу схемы инвертирующего операционного усилителя все напряжения суммируются.

В отличие от неинвертирующего суммирующего усилителя, можно добавлять любое количество напряжений без изменения номиналов резисторов.

6. Дифференциальный усилитель

Инвертирующий операционный усилитель (см. схему номер 2) усиливал напряжение, которое подавалось на инвертирующий вывод, и выходное напряжение было не в фазе. Неинвертирующий вывод соединен с землей в этой конфигурации.

Если приведенную выше схему модифицировать, подавая напряжение через делитель напряжения на неинвертирующий вход, мы получим дифференциальный усилитель, как показано ниже.

Усилитель полезен не только потому, что он позволяет вам складывать, вычитать или сравнивать напряжения. Многие схемы позволяют вам изменять сигналы. Давайте рассмотрим самые основные из них.

7. Интегратор

Прямоугольную волну очень легко сгенерировать, например, просто переключив GPIO микроконтроллера. Если схеме нужна треугольная форма волны, хорошим способом сделать это будет просто интегрировать сигнал прямоугольной волны. С операционным усилителем, конденсатором на инвертирующем пути обратной связи и резистором на инвертирующем входном выводе, как показано ниже, входной сигнал интегрируется.

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

8. Операционный усилитель-дифференциатор

Дифференциатор работает аналогично интегратору, заменив местами конденсатор и резистор.

Все конфигурации, которые были представлены до сих пор.

9. Преобразователь ток – напряжение

Фотодетектор  преобразует свет в ток. Для преобразования тока в напряжение простая схема с операционным усилителем, обратной связью через резистор на неинвертирующем выводе и диодом, включенным между двумя входными контактами, позволяет получить выходное напряжение, пропорциональное току, генерируемому фотодиодом, что видно по световым характеристикам .

Приведенная выше схема применяет закон Ома с фундаментальной формулой: напряжение равно сопротивлению, умноженному на ток. Сопротивление измеряется в Омах и всегда положительно. Но благодаря операционным усилителям можно спроектировать отрицательное сопротивление!

10. Отрицательное сопротивление

Обратная связь на инвертирующем выводе заставляет выходное напряжение быть вдвое больше входного. Поскольку выходное напряжение всегда выше входного, положительная обратная связь через резистор R1 на неинвертирующем выводе имитирует отрицательное сопротивление.

Наконец, схема с операционным усилителем не обязательно изменяет входной сигнал, а записывает его подобно усилителю с пиковым детектором.

Также: Операционный усилитель пикового детектора

Конденсатор используется в качестве памяти. Когда входное напряжение на неинвертирующем входе выше напряжения на инвертирующем входе, которое также является напряжением на конденсаторе, усилитель входит в насыщение, а диод открыт и заряжает конденсатор. Если предположить, что конденсатор не имеет быстрого саморазряда, когда входное напряжение Ve ниже напряжения на конденсаторе, диод заблокирован. Следовательно, пиковое напряжение регистрируется благодаря конденсатору.

Вырезка из даташита на ОУ OPA627:

Аудио сигнал:

Подробно:

Битовые операции

Операция сдвига

Для числа 1 (Dec, в десятичной системе 1) — 00000001 (Bin, в двоичной системе 0b00000001):

1 << 0 = 1 (00000001);
1 << 1 = 2 (00000010);
1 << 2 = 4 (00000100)
1 << 5 = 32 (00100000);
1 >> 2 = 0 (00000000).

Операция конъюнкция «&» (логическое И, AND) :

1101 0001 (209)
& 
0000 0111 (7)
----------------
0000 0001 (1) 

Операция дизъюнкция «|» (логическое ИЛИ, OR):

1101 0001 (209)
|
0000 0111 (7)
----------------
1101 0111 (215) 

Операция инверсия «~» (логическое НЕ):

1101 0001(209)
~
----------------
0010 1110(46) 

Применение битовых операций.

  1. Установка бита в регистре.

Например для включения тактирования на порту А нужно установить 3 бит в регистр APB2ENR можно использовать любую из следующих конструкций операторов, все инструкции выполняют идентичную задачу:

RCC->APB2ENR = RCC->APB2ENR | 4;
RCC->APB2ENR = RCC->APB2ENR | (1 << 2);
RCC->APB2ENR |= 0x000004;
RCC->APB2ENR |= (1 << 2);

Чтобы установить несколько бит в регистре нужно использовать битовую операцию «или» например установка 3 и 4 бита одной инструкцией:

RCC->APB2ENR |= ( 1 << 2 ) | ( 1 << 3 );

2. Сброс битов в регистре.

Для сброса разрядов в регистре необходимо использовать битовую операцию «&» (логическое «И»), которая применяется к двум битам (бинарная операция) и даёт единицу только в том случае если оба исходных бита имеют единичное значение, также необходима битовая операция «~» (логическое «НЕ», инверсия).

Для того чтобы сбросить например 5-й бит (10011101) в регистре нужно подготовить маску (как при установке битов), инвертировать ее биты «~», а потом выполним битовую операцию «&» над текущим значением регистра и полученной инвертированной маской.

Для подготовки маски выполним сдвиг битов на 4 разрядов в числе 1 (00000001).

0000 0001 (1)
<< 4
----------------
0001 0000 (16)

Маска готова, получили число 16 (00010000), 2 в 4-й степени. Выполним инверсию битов:

0001 0000 (16)
~ 
----------------
1110 1111 (239)

Готово, осталось применить маску к содержимому регистра используя битовую операцию «&»:

1001 1101 (157)
&
1110 1111 (239) 
----------------
1000 1101 (141)

В языке Си данные операции можно выполнить используя любую из приведенных ниже, идентичных по результату команд, например ниже приведена команда сброса флага окончания преобразования АЦП end of conversion:

ADC1->SR = ADC1->SR &~ 0x02;
ADC1->SR = ADC1->SR & ~( 1 << 1 );
ADC1->SR &= ~( 1 << 1 );

Для одновременного сброса нескольких битов регистра нужно использовать битовую операцию «или» . Сброс 2 и 3 бита:

ADC1->SR &= ~(1 << 1)|(1 << 2);


Чтобы, записать или считать какое значение в, из ячейки памяти по адресу 0x40010800 в языке СИ,используется указатель «*».

*((uint32_t*)0x40010800)

Теперь напишем программу pwm на портах

Прежде чем приступить к написанию программы для микроконтроллера, нужно подключить тактирование нужных блоков, за это отвечают регистры RCC — reset and clock control. Описание работы и их расположение можно узнать из reference manual к данной серии контроллеров https://www.st.com/content/ccc/resource/technical/document/reference_manual/59/b9/ba/7f/11/af/43/d5/CD00171190.pdf/files/CD00171190.pdf/jcr:content/translations/en.CD00171190.pdf. Затем нужно найти регистры которые включают тактирование.


Нам нужно включить тактирование на таймере 2 и на порту GPIOA.

Как видим для этого нужно установить 2 бит в регистре APB2ENR и 0 бит в регистре APB1ENR. Теперь осталось определить адреса этих регистров чтобы обратиться к ним. В refernce manual заходим в раздел memory map

Там находим адрес RCC Reset and clock control регистров, 0x40021000 теперь осталось определить смещение APB2ENR и APB1ENR регистров.


Соответственно регистр APB2ENR имеет адрес 0x40021018, а APB1ENR по адресу 0x4002101C. Функция установки битов будет иметь следующий вид.

void RCC_ENABLE(void)
{
    *((uint32_t*)0x40021018)|= 1 << 2;
    *((uint32_t*)0x4002101C)|= 1 << 0;
}

При запуске в режиме отладки в keil мы введя в поле memory адрес регистров увидеть как он изменяется 0x04=b0100

Каждый порт GPIO (GPIOA, GPIOB и т. д.) имеет 7 регистров:

2 используются для индивидуальной настройки шестнадцати битов порта,

2 — для параллельного чтения / записи шестнадцати битов порта,

2 — для индивидуальной установки / сброса шестнадцати битов порта,

1 — для реализации «последовательности блокировки», которая предназначена для предотвращения случайного изменения мошенническим кодом конфигурации порта. Эта последняя функция может помочь минимизировать вероятность того, что программные ошибки приводят к аппаратным сбоям; например, случайно вызвав короткое замыкание.

Структура регистров портов GPIO:

typedef struct
{
volatile uint32_t CRL;
volatile uint32_t CRH;
volatile uint32_t IDR;
volatile uint32_t ODR;
volatile uint32_t BSRR;
volatile uint32_t BRR;
volatile uint32_t LCKR;
} GPIO_TypeDef;

Адреса регистров различных портов в библиотеке stm32f10x.h:

#define PERIPH_BASE ((uint32_t)0x40000000)
#define APB2PERIPH_BASE (PERIPH_BASE + 0x10000)
#define GPIOA_BASE (APB2PERIPH_BASE + 0x0800)
#define GPIOA ((GPIO_TypeDef *) GPIOA_BASE)

Подмножество процедур, доступных для управления портами GPIO:

void GPIO_Init(GPIO_TypeDef* GPIOx ,
GPIO_InitTypeDef* GPIO_InitStruct);
uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx ,
uint16_t GPIO_Pin);
uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx ,
uint16_t GPIO_Pin);
uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
void GPIO_SetBits(GPIO_TypeDef* GPIOx , uint16_t GPIO_Pin);
void GPIO_ResetBits(GPIO_TypeDef* GPIOx , uint16_t GPIO_Pin);
void GPIO_WriteBit(GPIO_TypeDef* GPIOx , uint16_t GPIO_Pin ,
BitAction BitVal);
void GPIO_Write(GPIO_TypeDef* GPIOx , uint16_t PortVal);

Адреса периферийных устройств:

0x40013800 - 0x40013BFF USART1
0x40013000 - 0x400133FF SPI1
0x40012C00 - 0x40012FFF TIM1 timer
0x40012400 - 0x400127FF ADC1 

Основные этапы инициализации, необходимые для использования любого из периферийных устройств STM32:

  1. Включить тактирование на периферию
  2. Настроить контакты, необходимые для периферийных устройств
  3. Настроить периферийное оборудование
#include <stm32f10x.h>
#include <stm32f10x_rcc.h>
#include <stm32f10x_gpio.h>
void Delay(uint32_t nTime);
int main(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
// Enable Peripheral Clocks
... (1) ...
// Configure Pins
... (2) ...
// Configure SysTick Timer
... (3) ...
while (1) {
static int ledval = 0;
// toggle led
... (4) ...
Delay(250); // wait 250ms
}
}
// Timer code
... (5) ...
#ifdef USE_FULL_ASSERT
void assert_failed(uint8_t* file, uint32_t line)
{
/* Infinite loop */
/* Use GDB to find out why we're here */
while (1);
}
#endif