Добавить в корзинуПозвонить
Найти в Дзене
Terrabyte

Управляем операционным усилителем, встроенным в микроконтроллер CH32V003

Друзья, с наступившим Новым годом и Рождеством! Несмотря на экстремально низкую цену, начинка китайских микроконтроллеров CH32V003 делает их похожими на топовые модели STM. Меня лично очень заинтересовало наличие в CH32 встроенного операционного усилителя (ОУ). Такой операционник есть только в старших моделях микроконтроллеров STM. А штука эта, между тем, очень полезная! Мы с вами уже имели возможность убедится в этом. Во-первых, ОУ замечательно отыграл свою роль в проекте усилителя мощности класса D, в котором он был использован в качестве предварительного усилителя. А во-вторых, в генераторе низкочастотных сигналов фильтр на основе встроенного ОУ позволил получить довольно качественный аналоговый синал из импульсов с ШИМ-модуляцией. Сегодня мы продолжим изучать свойства встроенного ОУ. И основания для этого имеются самые серьезные. Дело в том, что обычно встроенные операционные усилители снабжаются цепями, позволяющими регулировать коэффициент усиления ОУ при помощи соответствующих
Оглавление

Друзья, с наступившим Новым годом и Рождеством!

Несмотря на экстремально низкую цену, начинка китайских микроконтроллеров CH32V003 делает их похожими на топовые модели STM. Меня лично очень заинтересовало наличие в CH32 встроенного операционного усилителя (ОУ). Такой операционник есть только в старших моделях микроконтроллеров STM. А штука эта, между тем, очень полезная! Мы с вами уже имели возможность убедится в этом. Во-первых, ОУ замечательно отыграл свою роль в проекте усилителя мощности класса D, в котором он был использован в качестве предварительного усилителя.

А во-вторых, в генераторе низкочастотных сигналов фильтр на основе встроенного ОУ позволил получить довольно качественный аналоговый синал из импульсов с ШИМ-модуляцией.

Сегодня мы продолжим изучать свойства встроенного ОУ. И основания для этого имеются самые серьезные.

Дело в том, что обычно встроенные операционные усилители снабжаются цепями, позволяющими регулировать коэффициент усиления ОУ при помощи соответствующих регистров микроконтроллера. В микроконтроллерах семейства CH32V003 мы такого роскошества лишены! Коэффициент усиления задается внешними цепями на дискретных элементах.

А что если все-же нужно управлять коэффициентом усиления и делать это программными средствами? Именно эту задачу мы с вами, уважаемые читатели, и попытаемся решить.

Намного теории и схемотехника

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

Операционный усилитель в микроконтроллере CH32V003J4M6
Операционный усилитель в микроконтроллере CH32V003J4M6

Разумеется, так будет если мы подключим ОУ к выводам микроконтроллера. Внутри микроконтроллера имеется возможность подключить выход ОУ к АЦП.

Как видно, ОУ занимает сразу 3 ноги контроллера из 8-ми. Еще две - земля и питание. Таким образом, на нашу долю остаются лишь 3 ножки для всех остальных удовольствий. Если вам этого мало, то всегда есть возможность использовать 16-ти или 20-пиновую корпусировку.

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

Неинвертирующий усилитель на микроконтроллере CH32V003J4M6
Неинвертирующий усилитель на микроконтроллере CH32V003J4M6

Сразу оговорюсь, что обвязка ОУ соответствует его однополярному питанию. Подключить к нему двуполярное питание, более подходящее для ОУ невозможно, т.к. он питается от линий питания микроконтроллера. В связи с этим для усиления двуполярных сигналов уровень нуля должен быть приподнят до середины напряжения питания. За это отвечает делитель напряжения на резисторах R3,R4. В свою очередь, резисторы обратной связи R1,R2 определяют коэффициент усиления усилителя: КУ = 1+R2/R1. Для нашего случая КУ = 11. Конденсаторы С1 и C2 - разделительные. C1 - не пропускает постоянную составляющую входного сигнала, а C2 - не позволяет усиливаться постоянному сигналу смещения на входе.

Предупреждение. Схемы, которые будут обсуждаться носят упрощенный (лабораторный) вид. Они вполне работоспособны, но на практике для получения хороших характеристик, требуют дополнительной стабилизирующей, подавляющей и частотно-корректирующей обвязки. Если интересно подробнее - спрашивайте в комментариях.

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

Инвертирующий усилитель на микроконтроллере CH32V003J4M6
Инвертирующий усилитель на микроконтроллере CH32V003J4M6

Назначения компонентов те же самые. Коэффициент усиления схемы равен R2/R1. Для нашего случая КУ = 10.

В глаза бросается очень интересная особенность операционных усилителей - зависимость коэффициента усиления лишь от соотношения сопротивлений в цепи обратной связи (ОС). Это наводит на мысль, что для управления коэффициентом усиления нужно, по-сути, управлять сопротивлением либо резистора R1 либо R2. Но, если вспомнить, что умеет делать наш микроконтроллер, то по-сути его выходная схема позволяет подключить любую ножку либо к "Земле", либо к питанию, либо вообще "подвесить в воздухе" - оставить неподключенной. Для этого он имеет следующую организацию выходов:

Организация выходов микроконтроллера
Организация выходов микроконтроллера

Когда открыт транзистор Q1, выход подключается к питанию, а когда Q2 - к "Земле". Если оба закрыты - выход висит в воздухе.

Значит, если на эту ножку повесить резистор, то его можно, в нужный момент, подключить к "Земле". Где это нам может пригодится? Да вот-же - посмотрим на первую схему (неинвертирующий усилитель). Резистор R1 как раз подключается к "Земле". Правда, через конденсатор, но для выходной логики MOSFET это не имеет особого значения. Тогда можно представить следующее решение.

Усилитель с переключаемым коэффициентом усиления
Усилитель с переключаемым коэффициентом усиления

Внутри микроконтроллера я изобразил только нижний транзистор. Верхний можно вообще не задействовать. Нам же не нужно резистор к питанию подключать! Для этого у выводов микроконтроллера есть режим открытого стока - open drain (OD). Если транзистор закрыт (для этого в соответствующий регистр должен быть записана 1), то резистор R5 никуда не подключен и коэффициент усиления определяется только соотношением 1+R2/R1 = 1+100/51 = 3. Но если в регистр выхода мы запишем 0, транзистор будет подключен к "Земле", а, следовательно, параллельно R1. В этом случае их совместное сопротивление будет равно: RR = (R1*R5)/(R1+R5) = 8,36 кОм. Соответственно, коэффициент усиления станет равным: КУ = 1+100/8,36 = 13.

Вуаля! Мы получили усилитель с электронно регулируемым коэффициентом усиления. Подбирая нужные резисторы можно обеспечить и нужные коэффициенты усиления.

Что плохо. Прежде всего, мы лишились одной ножки. Ну, тут уж куда деваться - управление требует жертв! Только при этом мы получили всего две ступени регулировки усиления. Не густо, прямо скажем. Можно ли больше? Можно! Например так:

Усилитель с 4-мя ступенями усиления
Усилитель с 4-мя ступенями усиления

В этой схеме мы и резистор R1 подключили к выводу микроконтроллера. Соответственно, существует 4 варианта подключения.

Вариант 1. Оба резистора отключены. Усилитель охвачен 100%-ной обратной связью. Его коэффициент усиления равен 1.

Вариант 2. К "Земле" подключен только R1. КУ = 1+100/51 = 3.

Вариант 3. К "Земле подключен только R5. КУ = 1 + 100/10 = 11.

Вариант 4. К "Земле" подключены оба резистора. КУ = 1 + 100/8,36 = 13.

Ага! Уже больше свободы! Но, правда, еще одна нога отвалилась. Печаль!

Так, а почему мы рассматриваем только неинвертирующий усилитель? Да потому, что управление подключением резистора к "Земле" возможно только в этой схеме. Хотя... Подождите-ка! Мы же знаем, что для получения больших коэффициентов усиления в инвертирующих усилителях используют схему с Т-образным включением резисторов. Вот такую:

Усилитель с Т-образной обратной связью
Усилитель с Т-образной обратной связью

Коэффициент усиления такой схемы вычисляется чуть сложнее.

КУ = (R2/R1)*(1+ R3/R2 + R3/R4).

Для представленного на схеме случая равных сопротивлений R1...R3 формула упрощается: КУ = 2 + R3/R4 = 2 + 10000/100 = 102. Заметили? Коэффициент усиления определяется резистором, подключенным к "Земле"! А значит, регулировка становится возможной! При помощи вот такой схемы, например.

Инвертирующий усилитель с управляемой Т-образной ОС
Инвертирующий усилитель с управляемой Т-образной ОС

Подбором номиналов можно добиться требуемых коэффициентов усиления.

Но, что если управлять усилением нужно с большим количеством уровней? А если вообще нужна плавная регулировка? А в добавок, что если мы еще хотели бы и число используемых выводов уменьшить! И тут решение тоже имеется! Прада чуть более сложное. Нам потребуется ШИМ!

Взгляните вот на такую схему.

Инвертирующий усилитель с плавной регулировкой усиления
Инвертирующий усилитель с плавной регулировкой усиления

Предположим, что на 7-м выводе формируется сигнал с управляемой шириной импульса (ШИМ). Этот сигнал поступает на фильтр низких частот, выполненный на дросселе L1 и конденсаторе C7. Фильтр выделяет постоянную составляющую ШИМ-сигнала, которая используется для управления полевым транзистором Q1. Под воздействием напряжение на затворе его сопротивление исток-сток меняется, а значит меняется и сопротивление в цепи обратной связи. Следовательно, будет меняться и коэффициент усиления. Его максимальное значение соответствует полностью открытому транзистору и равно: КУ = 2 + 10000/100 = 102. Минимальное же сопротивление соответствует закрытому транзистору. КУ = (R2+R3)/R1 = (10+10)/10 = 2.

Вот так! И еще два вывода в запасе!

Но, все это теория... Самое время проверить на практике!

Практическая реализация управления усилением

Проверку идей, изложенных выше я буду на самодельной отладочной плате, разработанной специально для нужд экспериментов. Подробно о ней я рассказывал вот здесь:

Дополнительно к основной плате я изготовил плату расширения из куска "слепыша", на которой буду проверять все идеи.

Отладочная плата (слева) и макетная (справа)
Отладочная плата (слева) и макетная (справа)

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

Макетная плата подключена к отладочной (вид сбоку)
Макетная плата подключена к отладочной (вид сбоку)

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

Прежде всего монтирую на макетной плате входной разъем и переменный резистор.

Входные цепи
Входные цепи

Конденсатор можно было бы и не ставить. В генераторе на выходе он уже есть. Но, мне показалось, что удобнее соединить емкостью, чем проволочкой!

Снизу припаяна "Земляная" шина.

Вид макетной платы снизу
Вид макетной платы снизу

Кусочек шины торчит, чтобы вешать "крокодил" щупа осциллографа.

Первый эксперимент я проведу со схемой неинвертирующего усилителя с дискретным управлением по двум каналам. Вот такой:

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

А вот так эта схема выглядит будучи собранной на макетке.

Схема, смонтированная на макетной плате
Схема, смонтированная на макетной плате

А вот так выглядит мой испытательный стенд.

Испытательный стенд
Испытательный стенд

Компьютер через программатор подключен к отладочной плате. Сигнал от генератора (желтая палочка) подается на вход исследуемой схемы. Осциллограф для контроля.

Резистором уровень входного сигнала выставлен чуто больше, чем 100 мВ, частота - 500 Гц.

Входной сигнал
Входной сигнал

Программно я сначала подключал к земле оба резистора. Это сдавало самый большой коэффициент усиления. Затем оставлял только резистор R5, затем - R1, а потом отключал оба. при этом можно было наблюдать следующую картину.

Четыре градации усиления
Четыре градации усиления

Средний уровень сигнала, как ему и положено, находится на половине напряжения питания (3,3В/2 = 1,65В). Такой сигнал можно подавать на АЦП, например.

Если кому-то интересно, то вот скриншот использованного кода. Там ничего особенного.

Код программы управления
Код программы управления

Что ж эта схема вполне подтвердила свою работоспособность.

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

Инвертирующий усилитель с плавной регулировкой усиления
Инвертирующий усилитель с плавной регулировкой усиления

Я собрал ее на той же макетной плате, предварительно демонтировав предыдущую схему. Тут нужно сказать, что для работы в линейном режиме нужны подходящие полевые транзисторы. У меня же под рукой оказались одни MOSFET-ы. К сожалению, они хорошо работают только в схемах где требуется высокая скорость переключения. Ну для экспериментов пойдет! Я выбрал BSS138.

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

Транзистор, припаяный к гребенке контактов
Транзистор, припаяный к гребенке контактов

Характеристики транзистора, измеренные транзистор-тестером.

Характеристики транзистора
Характеристики транзистора

А полностью собранная схема получилась такой.

Собранная схема с транзисторной регулировкой усиления
Собранная схема с транзисторной регулировкой усиления

Там сверху установлен керамический конденсатор на 1000 пФ. О нем чуть позже.

Первичные испытания схемы выявили две проблемы. Во-первых, участок регулировки получился очень узким. Активная часть рабочей зоны оказалась в диапазоне заполнения ШИМ от 0.1 до 0.3. То есть использовалось всего 20% диапазона. Во-вторых, сигнал был зашумлен высокочастотной помехой. Вот несколько осциллограмм, иллюстрирующих сказанное выше.

Напряжение на затворе полевого транзистора при плавном изменении заполнения ШИМ от 0 до 1 (всего 16 уровней ШИМ).

Напряжение на затворе MOSFET-транзистора
Напряжение на затворе MOSFET-транзистора

Напряжение на выходе усилителя без учета постоянной составляющей.

Напряжение на выходе усилителя (постоянная составляющая отсечена)
Напряжение на выходе усилителя (постоянная составляющая отсечена)

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

В начале я стал разбираться с причиной помех. Выяснилось, что помехи присутствуют только когда работает ШИМ-выход контроллера! Пока выход таймера не подключен к выводу микроконтроллера сигнал чистый! Высокочастотный ШИМ-сигнал наводил помеху на макетную плату. В принципе, это было предсказуемо! Десятки мегагерц и длинные проводники не очень-то сочетаются! Да еще и емкостная нагрузка в виде осциллографа. Чуть ли не генератор получился! В общем, чтобы не переделывать схему я включил в цепь обратной связи усилителя (между 1-м и 8-м выводами микроконтроллера конденсатор на 1000 пФ. Емкость даже не рассчитывал. Первый подходящий, что попался под руку. В результате сигнал был очищен. Теперь его вид стал таким (с постоянной составляющей).

Сигнал на выходе усилителя с конденцатором в цепи обратной связи
Сигнал на выходе усилителя с конденцатором в цепи обратной связи

Или без постоянной (для сравнения с осциллограммой в шумах).

Сигнал на выходе усилителя без постоянной составляющей
Сигнал на выходе усилителя без постоянной составляющей

Начало периода примерно совпало с левой границей экрана. Видно, что усиление нарастает как-бы скачком от начала 3-й клетки до окончания 4-й.

Теперь надо было решать задачу более плавного управления усилением. Для этого есть два пути. Первый путь - увеличить количество уровней ШИМ. Второй - сместить характеристики транзистора в нужную область регулировки. Первый путь чисто программный. Реализовать его проще всего. Для этого можно, например увеличить число уровней ШИМ до, например 64-х (в 4 раза) и использовать уровни с 5-го по 24-й. Это уровни регулировки, которые получились у меня. Для другого транзистора уровни могут быть несколько иными. Разброс параметров может быть значительным.

Вот пример осциллограммы, которая получилась при этом. Здесь ШИМ линейно увеличивается в области регулировки, а затем также уменьшается.

Разрядность ШИМ увеличена
Разрядность ШИМ увеличена

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

#define START_PWM 5
#define STOP_PWM 24
uint8_t pwm_counter = START_PWM;
int8_t direction = 1;
while(1) {
pwm_counter += direction;
if ((pwm_counter == STOP_PWM) || (pwm_counter == START_PWM)) direction = -direction;
TIM1->CH4CVR = pwm_counter;
DLY_ms(1);
}

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

Полная схема плавной регулировки усиления
Полная схема плавной регулировки усиления

На схеме я указал и тот самый конденсатор частотной коррекции - C4, о котором говорил выше. При качественном монтаже на печатной плате его можно не ставить, или поставить, но емкость уменьшить до одного - двух десятков пикофарад, если возникают проблемы с возбуждением на высоких частотах. Резисторы R7,R8 образуют те самые цепи смещения, которые позволяют вывести рабочую точку транзистора в требуемую рабочую область. Я указал номиналы при которых у меня получилось задействовать почти всю шкалу ШИМ.

Спасибо, что читаете-смотрите Terrabyte! Подписывайтесь, если вам интересна радиолюбительская тематика, микроконтроллеры, мини-ПК, необычные компьютерные решения и инновационные разработки! Спасибо всем, кто поддерживает меня своими комментариями и лайками!

Наша группа ВК: https://vk.com/terrabyte

Наш канал на VK-Video: https://vk.com/video/@terrabyte/all