Цифровой ШИМ генератор на дискретной логике

Однажды мне в голову пришла идея сделать генератор сигнала ШИМ на дискретной логике с кнопочным управлением. 

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

Я решил придерживаться принципа генерации ШИМ сигнала используемого в микроконтроллере.

Некоторый счетчик считает от 0 до максимума и в момент обнуления генерирует сигнал сброса. В регистре хранится значение скважности ШИМ и каждый такт система сравнивает текущее значение счетчика с значением из регистра. Если они равны, то генерируется сигнал установки. В итоге получаем ШИМ сигнал.

Для начала необходим тактовый генератор. Так как в схеме будет кнопочное управление, для кнопки было решено применить схему подавления дребезга на триггере Шмидта, К155ТЛ2 или 7414. А значит тактовый генератор логичней всего собрать по следующей схеме.

Примерную частоту такого генератора можно посчитать по следующей схеме: f = 0.59 / (R1*C1) 

Давайте сразу глянем на общую схему устройства и разберемся как оно все работает.

Сигнал с тактового генератора подаем на счетчик U2. В моем случае я выбрал счетчик на 10, К155ИЕ2 или 7490. Еще один такой же счетчик U3 будем использовать как регистр, значения в который будем загружать с помощью кнопки. Для него так же необходимо сформировать сигнал первоначального сброса, чтобы при подачи питания в нем был загружен 0. Для этого на одном из триггеров Шмидта делаем классическую схему первоначального сброса из RC цепочки R1 и C2. При подачи питания на выходе этого узла появится логический ноль с некоторой задержкой, которая зависит от емкости конденсатора C2 и сопротивления R1. В результате счетчик сбросится в ноль и схема будет ждать действий пользователя.

Используя микросхему U4 «ИСКЛЮЧАЮЩЕГО ИЛИ» К155ЛП5 или 7486 формируем сравнение 4 линий с первого счетчика с 4 линиями второго счетчика. Выходы микросхемы соединяются через диоды в одну точку по схеме «ИЛИ» на диодах. Это все формирует сигнал установки. Для формирования сигнала сброса используется такая же схема «ИЛИ» на диодах, которая выдает логический ноль при обнулении счетчика U2.

В качестве элемента с устойчивым состоянием в схеме использован D Триггер U6 микросхема К155ТМ2 или 7474. Для того, чтобы избежать неопределенного состояния триггера сигнал сброса и установки подается через буферный каскад на элементах U5.2, U5.1 и U1.5, U1.3. Вот таблица истинности для такой схемы.

A B S R
0 0 1 1
0 1 1 0
1 0 0 1
1 1 1 1

Как не сложно заметить, эта схема реализует защиту входов установки и сброса D триггера. Так же, на линию сброса добавлены два элемента U5.4 и U5.3, для того чтобы вход сброса немного запаздывал от входа установки. В таком случае, когда в регистре U3 будет установлен ноль, то на триггер пойдет комбинация S=1 и R=1, что должно привести к включению режима хранения. Однако из-за того что сигнал R немного запаздывает, то триггер успеет сбросится перед тем как перейдет в режим хранения. 

В качестве силового транзистора я применил IRL2203, так как серия IRL рассчитана на управление логическим уровнем, а значит от 5 вольт транзистор полностью откроется и не будет греться. Ну а главным источником тепла на плате станет линейный стабилизатор 7805, однако его можно заменить на импульсный DC/DC понижающий преобразователь.

Счетчик на 10 в схеме не просто так, так как в качестве индикации было решено использовать семисегментный индикатор и дешифратор КР514ИД2. Для увеличения тока сегментов по схеме стоят Q2-Q8, а R17-R23 выполняют роль токоограничивающих резисторов. В результате на индикаторе будут отображаться цифры от 0 до 9.

При проектировании печатной платы, хотелось сделать красиво. Получилось вот так:

 

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

Получается два режима от почти 0 до 90% заполнения ШИМ и от 10 до почти 100%. Для переключения между режимами на плате есть место под джампер, который по сути подключает затвор силового транзистора или к прямому, или к инверсному выходу D триггера.

Проект со схемой и печатной платой можно найти вот тут: https://easyeda.com/naym1993/discretepwm

Список радиоэлементов

Обозначение Тип Номинал Количество Примечание Магазин Мой блокнот
U1 ИС буфера, драйвера SN74LS14 1 К155ТЛ2
U2, U3 Специальная логика SN74LS90 2 К155ИЕ2
U4 Вентиль SN74LS86A 1 К155ЛП5
U5 Вентиль SN74LS00 1 К155ЛА3
U6 Триггер SN74LS74A 1 К155ТМ2
U7 Логическая ИС КР514ИД2 1
U8 Светодиод АЛС338А1 1 7 сегментный индикатор
Q1 MOSFET-транзистор IRL2203N 1
D1-D8 Выпрямительный диод 1N4148 8
U9 Линейный регулятор LM7805 1
Q2-Q8 Биполярный транзистор BC557 7 КТ3107
R28 Резистор 100 кОм 1
R10-R16 Резистор 1.5 кОм 7
Резистор 1 кОм 13
R17-R23 Резистор 200 Ом 7
R27 Резистор 51 Ом 1
C13 Электролитический конденсатор 220 мкФ 1
C4 Электролитический конденсатор 100 мкФ 1
C2 Электролитический конденсатор 10 мкФ 1
Конденсатор 100 нФ 8
C11-C12 Конденсатор 1 нФ 2
KEY1 Кнопка Тактовая 1