Друзья, с наступившим Новым годом и Рождеством!
Несмотря на экстремально низкую цену, начинка китайских микроконтроллеров CH32V003 делает их похожими на топовые модели STM. Меня лично очень заинтересовало наличие в CH32 встроенного операционного усилителя (ОУ). Такой операционник есть только в старших моделях микроконтроллеров STM. А штука эта, между тем, очень полезная! Мы с вами уже имели возможность убедится в этом. Во-первых, ОУ замечательно отыграл свою роль в проекте усилителя мощности класса D, в котором он был использован в качестве предварительного усилителя.
А во-вторых, в генераторе низкочастотных сигналов фильтр на основе встроенного ОУ позволил получить довольно качественный аналоговый синал из импульсов с ШИМ-модуляцией.
Сегодня мы продолжим изучать свойства встроенного ОУ. И основания для этого имеются самые серьезные.
Дело в том, что обычно встроенные операционные усилители снабжаются цепями, позволяющими регулировать коэффициент усиления ОУ при помощи соответствующих регистров микроконтроллера. В микроконтроллерах семейства CH32V003 мы такого роскошества лишены! Коэффициент усиления задается внешними цепями на дискретных элементах.
А что если все-же нужно управлять коэффициентом усиления и делать это программными средствами? Именно эту задачу мы с вами, уважаемые читатели, и попытаемся решить.
Намного теории и схемотехника
Во-первых, давайте вспомним, какие выводы занимает операционный усилитель микроконтроллера CH32V003. Попробую изобразить наглядно на примере самой младшей модели семейства - CH32V003J4M6. Постоянные читатели канала знают мою слабость к миниатюрным решениям с ограниченными возможностями, поэтому все, что я буду делать дальше, будет основано на этой модели. Структура контроллера будет такой:
Разумеется, так будет если мы подключим ОУ к выводам микроконтроллера. Внутри микроконтроллера имеется возможность подключить выход ОУ к АЦП.
Как видно, ОУ занимает сразу 3 ноги контроллера из 8-ми. Еще две - земля и питание. Таким образом, на нашу долю остаются лишь 3 ножки для всех остальных удовольствий. Если вам этого мало, то всегда есть возможность использовать 16-ти или 20-пиновую корпусировку.
Существуют две основных схемы включения операционных усилителя в качестве усилителя с заданным коэффициентом усиления. Первый вариант - неинвертирующий усилитель. Его реализация на основе нашего микроконтроллера будет выглядеть примерно так.
Сразу оговорюсь, что обвязка ОУ соответствует его однополярному питанию. Подключить к нему двуполярное питание, более подходящее для ОУ невозможно, т.к. он питается от линий питания микроконтроллера. В связи с этим для усиления двуполярных сигналов уровень нуля должен быть приподнят до середины напряжения питания. За это отвечает делитель напряжения на резисторах R3,R4. В свою очередь, резисторы обратной связи R1,R2 определяют коэффициент усиления усилителя: КУ = 1+R2/R1. Для нашего случая КУ = 11. Конденсаторы С1 и C2 - разделительные. C1 - не пропускает постоянную составляющую входного сигнала, а C2 - не позволяет усиливаться постоянному сигналу смещения на входе.
Предупреждение. Схемы, которые будут обсуждаться носят упрощенный (лабораторный) вид. Они вполне работоспособны, но на практике для получения хороших характеристик, требуют дополнительной стабилизирующей, подавляющей и частотно-корректирующей обвязки. Если интересно подробнее - спрашивайте в комментариях.
А вот так выглядит типовая схема инвертирующего входной сигнал усилителя.
Назначения компонентов те же самые. Коэффициент усиления схемы равен 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.
Вуаля! Мы получили усилитель с электронно регулируемым коэффициентом усиления. Подбирая нужные резисторы можно обеспечить и нужные коэффициенты усиления.
Что плохо. Прежде всего, мы лишились одной ножки. Ну, тут уж куда деваться - управление требует жертв! Только при этом мы получили всего две ступени регулировки усиления. Не густо, прямо скажем. Можно ли больше? Можно! Например так:
В этой схеме мы и резистор 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-контактный разъем, на который выведены все контакты микроконтроллера позволяет очень легко подключать и отключать макетную плату от отладочной.
Для получения тестового сигнала я буду использовать самодельный генератор, о котором уже упоминал в начале статьи, подавая сигнал с него через переменный резистор.
Прежде всего монтирую на макетной плате входной разъем и переменный резистор.
Конденсатор можно было бы и не ставить. В генераторе на выходе он уже есть. Но, мне показалось, что удобнее соединить емкостью, чем проволочкой!
Снизу припаяна "Земляная" шина.
Кусочек шины торчит, чтобы вешать "крокодил" щупа осциллографа.
Первый эксперимент я проведу со схемой неинвертирующего усилителя с дискретным управлением по двум каналам. Вот такой:
А вот так эта схема выглядит будучи собранной на макетке.
А вот так выглядит мой испытательный стенд.
Компьютер через программатор подключен к отладочной плате. Сигнал от генератора (желтая палочка) подается на вход исследуемой схемы. Осциллограф для контроля.
Резистором уровень входного сигнала выставлен чуто больше, чем 100 мВ, частота - 500 Гц.
Программно я сначала подключал к земле оба резистора. Это сдавало самый большой коэффициент усиления. Затем оставлял только резистор R5, затем - R1, а потом отключал оба. при этом можно было наблюдать следующую картину.
Средний уровень сигнала, как ему и положено, находится на половине напряжения питания (3,3В/2 = 1,65В). Такой сигнал можно подавать на АЦП, например.
Если кому-то интересно, то вот скриншот использованного кода. Там ничего особенного.
Что ж эта схема вполне подтвердила свою работоспособность.
Теперь попробуем проверить возможности плавного управления при помощи ШИМ и полевого транзистора. Для этого соберем следующую схему, которую мы уже обсуждали выше.
Я собрал ее на той же макетной плате, предварительно демонтировав предыдущую схему. Тут нужно сказать, что для работы в линейном режиме нужны подходящие полевые транзисторы. У меня же под рукой оказались одни MOSFET-ы. К сожалению, они хорошо работают только в схемах где требуется высокая скорость переключения. Ну для экспериментов пойдет! Я выбрал BSS138.
MOSFET-ики маленькие, поэтому перед монтажом на обычный слепыш я их припаиваю к кусочку штыревой колодки. Получается вот так.
Характеристики транзистора, измеренные транзистор-тестером.
А полностью собранная схема получилась такой.
Там сверху установлен керамический конденсатор на 1000 пФ. О нем чуть позже.
Первичные испытания схемы выявили две проблемы. Во-первых, участок регулировки получился очень узким. Активная часть рабочей зоны оказалась в диапазоне заполнения ШИМ от 0.1 до 0.3. То есть использовалось всего 20% диапазона. Во-вторых, сигнал был зашумлен высокочастотной помехой. Вот несколько осциллограмм, иллюстрирующих сказанное выше.
Напряжение на затворе полевого транзистора при плавном изменении заполнения ШИМ от 0 до 1 (всего 16 уровней ШИМ).
Напряжение на выходе усилителя без учета постоянной составляющей.
Видно, что регулировка есть, но очень быстрая, а сигнал сильно зашумлен.
В начале я стал разбираться с причиной помех. Выяснилось, что помехи присутствуют только когда работает ШИМ-выход контроллера! Пока выход таймера не подключен к выводу микроконтроллера сигнал чистый! Высокочастотный ШИМ-сигнал наводил помеху на макетную плату. В принципе, это было предсказуемо! Десятки мегагерц и длинные проводники не очень-то сочетаются! Да еще и емкостная нагрузка в виде осциллографа. Чуть ли не генератор получился! В общем, чтобы не переделывать схему я включил в цепь обратной связи усилителя (между 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