Генератор ШИМ сигнала с изменением скважности
Генераторы импульсов на цифровых КМОП микросхемах.
Онлайн калькулятор расчёта элементов генераторов с несимметричной формой
сигнала и генераторов с изменяемой скважностью выходных импульсов.
Так, товарищи! Заканчиваем банкет, убираем рыбные закуски.
Не забываем, что на сегодняшнем мероприятии, посвящённом Дню пивовара России, мы обсуждаем наболевшее: «Исследование разнообразных схемотехнических построений и характеристик генераторов на ИМС структуры КМОП».
Развиваем сюжетную линию, плавно переходим к генераторам прямоугольных импульсов с несимметричной формой сигнала, а также генераторам с изменяемой скважностью выходных импульсов.
Для начала определимся — для чего, собственно, когда и с чем потреблять само понятие «скважность импульсного сигнала»?
Тут как нельзя всё просто: Скважность = Т/tи, где
Т-полный период колебаний,
tи — длительность импульса,
tп — длительность паузы.
При величине скважности, равной 2, импульсный сигнал имеет симметричную форму (меандр), во всех остальных случаях — несимметричную (не меандр).
Рис.1
Теперь также плавно, без рывков и резких падений, переходим с схемотехническим изыскам.
На Рис.2 приведена схема генератора импульсов с раздельной установкой длительности импульса и паузы между ними.
Параметры выходных импульсов генератора описываются следующими приблизительными формулами:
F = 0,77/((R1+R2)×C1))
Скважность импульсов = (R1+R2)/R1
Именно из-за этих соображений, рекомендуется собирать подобные схемы генераторов на цифровых микросхемах, представляющих собой триггер Шмитта (Рис.3).
Мало того, что они просты в реализации, так ещё и исключительно экономичны — при напряжении питания менее 6 В ток потребления составляет всего несколько десятков микроампер.
Частота генерации и скважность для приведённой схемы:
В случае необходимости получить плавную регулировку скважности при неизменной частоте имеет смысл обратить внимание на схему, приведённую на Рис.4.
F = 0,77/((2*R1+R2)×C1))
Макс. скважность импульсов = R2/R1+2
Мин. скважность импульсов = 1+R1/(R1+R2)
Точно таким же образом реализуется плавная регулировка скважности для схем, построенных на триггере Шмитта (Рис.5).
F = 0,86/((2*R1+R2)×C1))
Макс. скважность импульсов = R2/R1+2
Мин. скважность импульсов = 1+R1/(R1+R2)
Все представленные схемы могут быть реализованы на элементах И—НЕ, ИЛИ—НЕ, триггерах Шмитта, или инверторах.
Идём дальше к таблице для расчёта номиналов элементов генераторов, исходя из заданной частоты генерации и скважности выходных импульсов.
ТАБЛИЦА РАСЧЁТА НОМИНАЛОВ ЭЛЕМЕНТОВ ГЕНЕРАТОРОВ НА КМОП МИКРОСХЕМАХ БЕЗ ПЛАВНОЙ РЕГУЛИРОВКИ СКВАЖНОСТИ.
Бросив беглый взгляд на Рис.1, легко заметить, что значение скважности импульсов должно быть больше 1.
Теоретически величины сопротивлений резисторов R1 и R2 должны быть не менее 1кОм, однако на практике, для минимизации влияния выходного сопротивления микросхемы на частоту сигнала, рекомендуется выбирать значения сопротивления этих резисторов — не менее 10кОм. Поэтому послеживайте за рассчитанным значением R2, если оно не вписывается в нужный диапазон — повышайте номинал R1.
ТАБЛИЦА РАСЧЁТА НОМИНАЛОВ ЭЛЕМЕНТОВ ГЕНЕРАТОРОВ НА КМОП МИКРОСХЕМАХ C ПЛАВНОЙ РЕГУЛИРОВКОЙ СКВАЖНОСТИ.
R1 — не менее 1кОм, желательно — не менее 10кОм.
Пределы изменения длительности импульса — больше 1.
Простой генератор ШИМ-сигнала
Широтно-импульсно модулированный сигнал очень часто применяется в электронике для передачи информации, регулировки мощности или формирования постоянного напряжения произвольного уровня. В этой статье описано устройство на операционном усилителе, размером 20х20мм из 15 элементов, которое генерирует ШИМ-сигнал.
Формирование ШИМ-сигнала
ШИМ-сигнал (PWM) представляет собой последовательность импульсов, частота которых неизменна, а модулируется длительность импульсов. Большинство микроконтроллеров легко справляются с этой задачей, но что делать если нет желания программировать и использовать такое мощное средство для такой простой задачи? В этом случае можно использовать дискретные элементы.
Для начала необходимо сформировать последовательность пилообразных импульсов и подать ее на вход компаратора. На второй вход компаратора подается модулирующий сигнал, например, напряжение с переменного резистора. Если напряжение генератора выше напряжения на втором входе — на выходе напряжение близко к напряжению питания. Если напряжение генератора ниже — на выходе ноль.
На рисунке Uк — напряжение команды (постоянный уровень, заданный переменным резистором), Uген — напряжение генератора, UPWM — ШИМ-сигнал.
Схема
Все эти задачи можно легко выполнить при помощи двух операционных усилителей так как показано на схеме.
Схема генератора ШИМ
В схеме применена микросхема LM358N, которая использует однополярное питание и содержит два канала в одном корпусе SO8.
Печатная плата
Все элементы, кроме резистора R3, предназначены для поверхностного монтажа и располагаются на плате с минимальным размером. R3 расположен на обратной стороне платы. Генераторные схемы очень капризны с точки зрения трассировки печатных плат. Если изменить топологию платы нельзя гарантировать ее работоспособность. Первая версия платы генерировала пилообразное напряжение с очень низкой амплитудой и ее было невозможно использовать.
Плата генератора ШИМ-сигнала
Сборка и работа схемы
Сама плата очень маленькая — 20х20 мм и легко изготавливается методом ЛУТ. Она лишь немного больше переменного резистора, изменяющего скважность сигнала.
Плата генератора ШИМ в сборе
Технические характеристики
- напряжение питания, 5-15В
- диапазон изменения скважности, от 1 до бесконечности
- рабочая частота, 500Гц
- потребляемый ток, не более, 2мА
Рабочая частота определяется конденсатором C1. Для снижения частоты можно увеличить его емкость и наоборот.
Список элементов
- ИМС LM358N в корпусе SO8 (DA1), 1 шт.
- Резисторы 20кОм в корпусе 0805 (R1,R2,R4-R6), 5 шт.
- Резисторы 10кОм в корпусе 0805 (R7,R8), 2 шт.
- Любой переменный резистор с шагом выводов 5мм и сопротивлением 50кОм
- Конденсаторы 0,1мкФ в корпусе 0805 (C1,C2,C4), 3шт.
- Конденсатор танталовый 47мкФ, 16В, типоразмера С, T491C476K016AT (C3), 1шт.
Видео работы
Работает плата достаточно стабильно. На видео видно, как меняется яркость светодиода. Неудобство только в том, что используется лишь половина диапазона резистора R3. То есть в первой и последней четверти положения вала напряжение остается без изменения.
Файл печатной платы в формате Sprint Layout 5.0 можно скачать по ссылке.
Высокоточный генератор ШИМ с кнопочным контролем
Как было сказано ранее, очень распространены аналоговые схемы ШИМ-генераторов, в частности на основе NE555. Они просты, неприхотливы, могут работать с большим диапазоном напряжений, но имеют недостаток, который в некоторых случаях может быть недопустим — параметры ШИМ-сигнала (частоту, скважность), во-первых, нельзя установить с большой точностью, а во-вторых, эти параметры могут «уплывать» при изменении температуры, влажности и т.д. Для того, чтобы построить высокоточный генератор ШИМ-сигналов не обойтись без микроконтроллера, тактируемого от точного кварца. В этом случае можно будет настраивать скважность с точностью до 1%, а также выбирать частоту из заранее заданных вариантов. Предусмотрен выбор частот между 10/20/40/80/1,25/2,5/5 кГц, этих вариантов хватит для любого применения ШИМ-генератора. Схема представлена ниже.
Схема собирается на печатной плате, файл прилагается в архиве в конце статьи. Плату можно изготовить методом ЛУТ, процесс при этом стандартный: рисунок распечатывается на лазерном принтере на термотрансферной бумаге, затем переносится на заранее подготовленную поверхность текстолита. После этого лишняя медь стравливается, сверлятся отверстия под компоненты, дорожки залуживаются. После этого плата готова к запаиванию компонентов.
Рекомендуется установить микроконтроллер в панельку с цанговыми зажимами — это позволит в дальнейшем снять с платы микроконтроллер для дальнейшей перепрошивки, если это будет необходимо.
Внешний вид готовой собранной платы:
На фото видны две тактовые кнопки, впаянные прямо в плату, но также можно вывести кнопки и на проводах. Также можно увидеть два штырьковых разъёма — для подачи питания и снятия ШИМ-сигнала. Помимо них также присутствует разъём ISP для прошивки микроконтроллера. Если микроконтроллер прошивается заранее, до установки на плату, выводить этот разъём не обязательно. Не сколько слов о прошивке микроконтроллера. Фьюзы необходимо установить на работу внешнего кварцевого резонатора 8 МГц, внутренний делитель на 8 отключен. Больше никаких требований к фьюзам нет. Для удобства установки фьюзов при прошивке рекомендуется воспользоваться онлайн-калькуляторами установки фьюзов. Прошивается Attiny25(45, 85), например, с помощью доступного и недорого программатора USB ISP, который стоит на Али в районе 100-150 рублей. Программу для прошивки можно использовать, например, ArvDude, она имеет простой и понятный интерфейс.
Генератор сигнала с переменной скважностью импульсов. Регулировка коэффициента заполнения. Ограничение максимального значения. Изменение длительности импульсов
Схема генератора и регулируемым коэффициентом заполнения импульсов, управляемого входным напряжением. Источник импульсного сигнала изменяемой скважности. Ограничение длительности импульсов (10+)
Коэффициент заполнения импульсного сигнала. Скважность — Генератор
1 | 2 | 3 |
Регулировка скважности
Для получения сигнала с управляемой скважностью удобно использовать ШИМ — контроллеры. Эти специализированные микросхемы как раз спроектированы, чтобы формировать сигналы со коэффициентом заполнения, зависящим от внешних условий.
Вашему вниманию подборки материалов:
Конструирование источников питания и преобразователей напряжения Разработка источников питания и преобразователей напряжения. Типовые схемы. Примеры готовых устройств. Онлайн расчет. Возможность задать вопрос авторам
Практика проектирования электронных схем Искусство разработки устройств. Элементная база. Типовые схемы. Примеры готовых устройств. Подробные описания. Онлайн расчет. Возможность задать вопрос авторам
На схеме (A1) изображен генератор импульсов со скважностью, зависящей от уровня входного напряжения, подаваемого на ножку 2. Увеличение входного напряжения приводит к увеличению коэффициента заполнения, то есть уменьшению скважности.
Генератор по схеме (A2) наоборот формирует импульсы с большим коэффициентом заполнения (меньшей скважностью) при уменьшении входного напряжения.
Скважность импульсов генератора (A3) регулируется вручную с помощью подстроечного резистора R5.
Во всех схемах используются одинаковые детали. Выходной сигнал формируется на ножке 14. Подключать к этой ножке можно нагрузку до 2 А (импульсно). Питание осуществляется от источника от 12 до 30 вольт.
Резистор R1 — 10 кОм, подстроечный. С помощью него регулируется начальный уровень сигнала, при котором появятся импульсы минимальной длительности.
Резистор R2 — 100 кОм
Резистор R3 — 500 кОм, подстроечный. Он регулирует чувствительность, то есть увеличение этого резистора приводит к тому, что сигнал заданной амплитуды приводит к большему изменению коэффициента наполнения.
Резистор R4, Конденсатор C1 — задают частоту выходного сигнала. Формула для расчета частоты в зависимости о параметров этих деталей.
Резистор R5 — 100 кОм, подстроечный. Он регулирует максимально возможный коэффициент наполнения, а в схеме (A3), просто коэффициент заполнения.
Конденсатор C1 — 0.1 мкФ.
Готовое устройство, иллюстрирующее управление скважностью — Тренажер для снятия усталости глаз и спазма аккомодации.
Ограничение максимального коэффициента заполнения
Во многих случаях полезно ограничить максимальный коэффициент заполнения. Бывает нужно обеспечить, чтобы вне зависимости от управляющего сигнала коэффициент заполнения не превышал некоторую заданную величину. Это бывает необходимо, например, в повышающей, инвертирующей, обратноходовой, прямоходовой или пуш-пульной топологиях источников питания для того, чтобы магнитопровод дросселя или трансформатора между импульсами успел гарантированно размагнититься.
В схеме удалены все выводы и соединения, не имеющие отношения к нашей задаче ограничения скважности. Для примера выбрана микросхема 1156ЕУ3 или UC3823. Без изменений описанный подход может применяться для микросхемы 1156ЕУ2 или UC3825. Для других микросхем ШИМ может понадобиться подобрать номиналы деталей и учесть цоколевку этих микросхем.
Принцип работы схемы следующий. Ножка 8 отвечает за мягкий старт. На нее внутри микросхемы подается ток 1 мкА. Этот ток заряжает внешний конденсатор. По мере роста напряжения на конденсаторе увеличивается максимально возможный коэффициент заполнения. Так обеспечивается постепенное увеличение ширины импульсов при запуске. Оно необходимо, так как при включении выходной конденсатор разряжен, и, если полагаться на обратную связь, то длительность импульсов будет максимальной, пока этот конденсатор не зарядится до рабочего напряжения. Это нежелательно, так как приводит к перегрузке при включении устройства.
Подстроечный резистор и диод ограничивают максимально возможное напряжение, до которого может зарядиться конденсатор, а значит и максимально возможный коэффициент заполнения. При этом функция мягкого старта полностью сохраняется. Ширина импульсов по мере зарядки конденсатора постепенно нарастает от нуля до установленного значения. Далее рост коэффициента заполнения прекращается.
Диод — любой маломощный, например, КД510
Подстроечный резистор — 100 кОм
1 | 2 | 3 |
К сожалению в статьях периодически встречаются ошибки, они исправляются, статьи дополняются, развиваются, готовятся новые. Подпишитесь, на новости, чтобы быть в курсе.
Если что-то непонятно, обязательно спросите!
Задать вопрос. Обсуждение статьи.
Как не перепутать плюс и минус? Защита от переполюсовки. Схема.
Схема защиты от неправильной полярности подключения (переполюсовки) зарядных уст.
Инвертор, преобразователь, чистая синусоида, синус.
Как получить чистую синусоиду 220 вольт от автомобильного аккумулятора, чтобы за.
Плавная регулировка, изменение яркости свечения светодиодов. Регулятор.
Плавное управление яркостью свечения светодиодов. Схема устройства с питанием ка.
Преобразователь однофазного напряжения в трехфазное. Принцип действия.
Принцип действия, сборка и наладка преобразователя однофазного напряжения в трех.
ШИМ генератор с ЖК-индикатором
ШИМ генератор с магазин ICstation
Что может этот генератор? Взглянем на параметры.
- Рабочее напряжение: 3.3 — 30V;
- Частота генерации: 1Hz — 150KHz;
- Точность генерации частоты: 2%;
- Мощность нагрузки: 5…30mА;
- Амплитуда выходного сигнала равна напряжению питания;
- Температура окружающей среды: -20 … +70 °С.
На дисплей можно вывести только 2 числа по 3 цифры в каждом. В нижней строке отображается скважность ШИМ в процентах, а в верхней – частота. Частота выводится на дисплей по следующим правилам:
- XXX, шаг в 1Гц, в диапазоне 1 – 999Гц;
- X.XX, шаг в 0.01кГц, в диапазоне 1.00 — 9.99кГц;
- XX.X, шаг в 0.1кГц; в диапазоне 10.0 — 99.9кГц;
- X.X.X, шаг в 1 кГц; в диапазоне 100 — 150 кГц.
Дисплей управляется микросхемой HT1621B, дисплей универсальный, на нем имеются символы, необходимые для построения термометра, гигрометра, вольтметра, амперметра и ваттметра, но в нашем случае они не используются. Дисплей имеет яркую синюю подсветку. К слову, замечу, что дисплей на моем генераторе оказался потертым, будто его откуда-то сняли.
Главной микросхемой генератора является микроконтроллер STM8S003F3P6. И поскольку этот микроконтроллер имеет EEPROM память, то настройки сохраняются при выключении.
Управлять генератором можно двумя способами: кнопками и по UART. С кнопками всё ясно, одна пара кнопок управляет частотой, вторая скважностью. А вот с UART всё намного интереснее. Обмен данными должен происходить со следующими параметрами:
- 9600 bps Data bits: 8
- Stop bit: 1
- Check digit: none
- Flow control: none
Для того, чтобы установить частоту генерации, необходимо отправить частоту так, как она отображается на дисплее прибавив перед значением частоты букву F. Например, для установки частоты в 100 Гц необходимо отправить F100, для 105 кГц — F1.0.5, для 10.5 кГц — F10.5 и так далее.
Для установки скважности необходимо отправить трехзначное число скважности добавив перед ним букву D . Например, D050, D100, D001.
Что бы прочитать установленные параметры, необходимо отправить слово «read».
Если отправлена верная команда, то генератор ответит DOWN, если ошибочная – FALL. Но есть одно НО, я так и не смог настроить работу с генератором через UART.
Я решил проверить генератор при помощи логического анализатора. Вот что получилось.
Частота 1 Гц, скважность 1%. Как видим погрешность пока небольшая.
Частота 1 Гц, скважность 50%.
Частота 1 Гц, скважность 99%.
Частота 1 кГц, скважность 1%.
Частота 1 кГц, скважность 50%.
Частота 1 кГц, скважность 99%. Тут мы видим, что при установленных 99% скважности на самом деле заполнение составляет 100%.
Частота 1 кГц, скважность 91%. Я начал снижать скважность, и вплоть до 92% заполнение составляло 100%, и только при 91% ситуация исправляется.
Частота 50 кГц, скважность 1%. Как видим что тут всего 0,2% вместо 1%.
Частота 50 кГц, скважность 50%. Здесь отличается на 1%.
Частота 50 кГц, скважность 99%. И тут снова отклонение -1%.
Частота 100 кГц, скважность 1%. А вот тут ещё ничего нет.
Частота 100 кГц, скважность 2%. А при 2% сигнал появляется, но на самом деле заполнение 0,4%.
Частота 100 кГц, скважность 50%. Отклонение почти -2%.
Частота 100 кГц, скважность 99%. И тут почти -1%.
Частота 150 кГц, скважность 1%. Снова нет сигнала.
Частота 150 Гц, скважность 3%. И появляется сигнал только при 3%, но заполнение составляет 0,6%.
Частота 150 кГц, скважность 50%. Но на самом деле заполнение 46,5%, на -3,5% уже отличие.
Частота 150 кГц, скважность 99%. И тут погрешность, но всего 1,5%.
Выборка достаточно грубая, но на этом исследования не закончены. Я решил измерить скважность при различном заполнении (шаг 5%) и на различных частотах (шаг 25000 Гц) и занести их в таблицу.
Верхняя строка содержит частоту, я выбрал шаг в 25 кГц, левый столбец – установленная скважность, в остальных ячейках замеренная скважность.
В этой таблице указана разница в установленной и замеренной скважности.
Чем выше частота, тем больше отклонение между установленной и замеренной скважностями. Так же замеренная скважность всегда ниже установленной, но строгой закономерности в отклонении не наблюдается.
Так же я проверил соответствие установленной и замеренной частоты. Результат так же занес в таблицу.
Заявленная точность в 2% от установленной частоты соблюдается.
В итоге, если вам необходимо установить точные значения генерации, то проверяйте установленные параметры перед использованием генератора. Если же необходимо просто управлять яркостью светодиода или скоростью вращения двигателя, то этот генератор без проблем подойдет для этих задач.
Генератор ШИМ сигнала на микроконтроллере с регулируемой скважностью
Это простой ШИМ-генератор работающий от стабилизированного источника питания с напряжением 4,75…5,25 В. На его выходе генерируется прямоугольный сигнал с постоянной частотой 1 Гц, но с регулируемым коэффициентом заполнения в диапазоне 0…100% с шагом 1%, в зависимости от установленных перемычек J1-J7.
Устройство найдет применение в мастерской каждого радиолюбителя, например, при тестировании различных прототипов цифровых схем.
Основой генератора является популярный микроконтроллер ATmega48. Вместо него можно использовать модели ATmega88 или ATmega168, которые отличаются только большим объемом памяти.
Управляющая программа написана на ассемблере и идентична для каждого из упомянутых микроконтроллеров (занимает 2440 байт флэш-памяти). После включения источника питания или сброса микроконтроллера с помощью кнопки S1 управляющая программа конфигурирует вывод PB0 (№ 14) в качестве выхода с низким логическим уровнем (LOW), а все остальные выводы — как входы с высоким логическим уровнем (включены внутренние подтягивающие резисторы).
Затем микроконтроллер считывает состояние перемычек J1-J7, которые подключены к контактам PD0…PD6. Если все перемычки открыты (OFF), программа переходит к выполнению цикла, генерирующего сигнал с заполнением 0% (режим 0) и на выходе генератора все еще остается низкое логическое состояние (LOW).
Однако если при помощи перемычек установлено некоторое двоичное значение X = 1…99 (J1 — самый младший бит), то программа переходит к соответствующему циклу (режим X), который выполняется без прерывания.
В каждом таком цикле есть две инструкции, которые переключают состояние выхода PB0 на противоположное. Время между переключениями различается (за исключением 50% заполнения), но их сумма всегда равна 1 секунде. Благодаря этому на выходе генератора получается прямоугольный сигнал с различным заполнением, но всегда с частотой 1 Гц.
Если перемычками установлено двоичное значение X > 99, программа переходит к выполнению цикла, генерирующего 100% сигнал (режим 100), при этом на выходе генератора постоянно высокое логическое состояние (HIGH).
Для правильной работы генератора необходимо использовать кварцевый резонатор Q1 с номинальной частотой 4 МГц, поскольку циклы в управляющей программе написаны именно для этой частоты микроконтроллера.
Резистор R2 и конденсатор C1 образуют низкочастотный фильтр, который подавляет дребезг контактов, возникающий в момент нажатия кнопки S1. Транзисторы VT1 (BC547) и VT2 (BC557) работают в качестве выходного буфера с током до 100 мА.
Все возможные для установки комбинации перемычек J1-J7 и соответствующий им коэффициент заполнения сигнала, приведены в следующей таблице.
После пайки всех элементов убедитесь, что нет коротких замыканий. Подайте питание и запрограммируйте микроконтроллер, используя любой ISP программатор через разъем CON3. Контакты разъема CON3 расположены стандартным образом, рекомендованным Atmel.
При программировании необходимо установить соответствующие fuse и lock биты:
- FL (Fuse Low): $F7
- FH (Fuse High): $DF
- FE (Fuse Extended): $F9 ($FF для ATmega48)
- LB (Lock Bits): $FF
При таких настройках:
- используется внешний кварцевый резонатор (биты CKSEL3-0 = 0111);
- делитель частоты на 8 отключен, что вызывает тактирование микроконтроллера на полной частоте резонатора (CKDIV8 = 1);
- увеличено время запуска до 65 мс после включения напряжения питания (SUT1-0 = 11);
- отключена генерация тактовой частоты микроконтроллера на выводе PB0 (CKOUT = 1);
- включена возможность сброса PC6 (RSTDISBL=1) и программирования через последовательный интерфейс (SPIEN=0).
После программирования микроконтроллера отключите программатор от платы. Затем перемычками J1-J7 установите комбинацию, которая соответствует выбранному коэффициенту заполнения, и нажмите кнопку S1. На выходе генератора должен появиться прямоугольный сигнал с частотой 1 Гц и выбранной скважностью.
Скачать прошивку (2,6 KiB, скачано: 334)
Генерирование и чтение сигналов с Arduino
Начнём с самого простого: генерация импульса заданной длины, такое часто бывает нужно. Проще всего сделать это на delay() и delayMicroseconds() :
Нужно помнить, что digitalWrite() сам по себе выполняется в районе 3.6 мкс (58 тактов процессора). Для ускорения можно использовать например библиотеку directIO или прямую работу с регистрами портов.
Генерирование квадратного сигнала
Программное
Квадратный сигнал может быть использован для тактирования и управления, а также для генерации звука через усилитель. Самый базовый пример, Blink, по сути тоже является генератором квадратного сигнала:
Если заменить 1000 например на 10 , то получится квадратный сигнал с частотой 50 Гц. Этот способ называется программной генерацией сигнала, то есть микроконтроллер своими силами считает время и сам вручную дёргает ногой. Это как мешает работе остального кода, так и остальной код может сбивать частоту. Такую генерацию можно сделать более мене асинхронной на миллисе:
На практике такой способ используется редко, потому что на высокой частоте остальной код программы будет мешать генерации и частота будет плавать.
Функция tone()
В ядре Arduino есть встроенная функция для полуаппаратной генерации квадратного сигнала – tone(pin, frequency, duration) :
- pin – цифровой пин, с которого будет генерироваться сигнал.
- frequency – частота в Герцах. Диапазон 31.. 8’000’000 Гц, целые числа. С увеличением частоты растёт шаг изменения реальной частоты.
- duration – продолжительность сигнала в миллисекундах. Опциональный параметр, если не указывать – сигнал будет генерироваться всё время.
Для ручной остановки генерации сигнала можно вызвать noTone() . Также у генерации при помощи tone() есть особенности:
- Генерация является полуаппаратной: пин дёргается МК “вручную” по прерыванию таймера, что на высокой частоте может чуть тормозить код.
- Генерация использует Timer 2, перенастройка или использование его для других целей (включая ШИМ на пинах D3 и D11 у Nano) отключит активную генерацию или изменит её частоту.
- При вызове tone() таймер перенастраивается на генерацию, то есть можно использовать таймер в своих целях между вызовами tone() .
- Генерация работает только на одном пине в один момент времени, причём для включения генерации на другом пине нужно сначала отключить текущую генерацию, то есть вызвать noTone() .
ШИМ сигнал
Аппаратный таймер позволяет генерировать квадратный сигнал аппаратно и полностью асинхронно работе остального кода, не тратя ни такта процессорного времени: время считается самим таймером, и сам же таймер управляет состоянием ноги МК. Для генерации ШИМ сигнала в среде Arduino есть функция analogWrite(pin, duty) , подробнее мы говорили в ней в уроке про ШИМ. Чтобы сделать ШИМ квадратным, нужно запустить его с duty , равной 128 . Что касается частоты полученного сигнала, то Ардуино настраивает таймеры так, что частота в зависимости от таймера может быть 490 или 980 Гц. Частоту можно изменить с довольно большим шагом, об этом мы говорили в уроке про увеличение частоты ШИМ.
Аппаратный таймер
Можно вручную настроить аппаратный таймер на генерацию квадратного сигнала. Тонкости настройки регистров таймера мы в рамках этих уроков не разбираем, но это можно сделать и при помощи библиотеки, например GyverTimers. Работу библиотеки мы разбирали в уроке о прерываниях таймера. Данная библиотека позволяет настроить генерацию квадратного сигнала с максимально возможной точностью и частотой, а также поднять на одном таймере генерацию двух или трёх (Arduino MEGA) меандров со смещением по фазе. Пример:
Генерирование ШИМ сигнала
Аппаратное
Для генерации ШИМ сигнала с заданным заполнением есть стандартная функция analogWrite(pin, duty) , подробнее обсуждали в уроке про ШИМ сигнал, а частоту можно изменить перенастройкой таймера, как в уроке об увеличении частоты ШИМ. На самом деле таймеры позволяют настроить ШИМ сигнал с более точной или более высокой частотой и другими диапазонами заполнения (до 10 бит), но в ядре Arduino это не предусмотрено. Если такое будет нужно, можно воспользоваться библиотекой GyverPWM. Пример:
Программное
Программная генерация ШИМ сигнала может пригодиться, если не хватает лишнего таймера или частота ШИМ низкая и не повлияет на остальной код, а он на неё. Шим сигнал на миллисе можно организовать вот таким образом:
Полуаппаратный ШИМ
Можно снизить нагрузку на процессор, отдав счёт времени аппаратному таймеру. Примеры на базе GyverTimers:
ОБОРУДОВАНИЕ
ТЕХНОЛОГИИ
РАЗРАБОТКИ
Блог технической поддержки моих разработок
Урок 37. Широтно-импульсная модуляция в Ардуино.
В уроке узнаем о широтно-импульсной модуляции, о реализации этого способа управления в контроллерах Ардуино, о режимах и функциях работы с ШИМ в Ардуино.
Прервемся на урок от разработки контроллера холодильника, для того чтобы научиться работать с широтно-импульсным модулятором Ардуино.
В нашей разработке используется именно такой способ регулирования мощности на элементе Пельтье.
Широтно-импульсная модуляция.
Широтно-импульсная модуляция (ШИМ) это способ управления мощностью на нагрузке с помощью изменения скважности импульсов при постоянной амплитуде и частоте импульсов.
Можно выделить две основные области применения широтно-импульсной модуляции:
- Во вторичных источниках питания, различных регуляторах мощности, регуляторах яркости источников света, скорости вращения коллекторных двигателей и т.п. В этих случаях применение ШИМ позволяет значительно увеличить КПД системы и упростить ее реализацию.
- Для получения аналогового сигнала с помощью цифрового выхода микроконтроллера. Своеобразный цифро-аналоговый преобразователь (ЦАП). Очень простой в реализации, требует минимума внешних компонентов. Часто достаточно одной RC цепочки.
Принцип регулирования с помощью ШИМ – изменение ширины импульсов при постоянной амплитуде и частоте сигнала.
На диаграмме можно увидеть основные параметры ШИМ сигнала:
- Ui — амплитуда импульсов ;
- Ton – время активного (включенного) состояния сигнала;
- Toff – время отключенного состояния сигнала;
- Tpwm – время периода ШИМ.
Даже интуитивно понятно, что мощность на нагрузке пропорциональна соотношению времени включенного и отключенного состояния сигнала.
Это соотношение определяет коэффициент заполнения ШИМ:
Он показывает, какую часть периода сигнал находится во включенном состоянии. Может меняться:
- от 0 – сигнал всегда выключен;
- до 1 — сигнал все время находится во включенном состоянии.
Чаще используют процентный коэффициент заполнения. В этом случае он находится в пределах от 0 до 100%.
Среднее значение электрической мощности на нагрузке строго пропорционально коэффициенту заполнения. Когда говорят, что ШИМ равен, например, 20%, то имеют в виду именно коэффициент заполнения.
Формирование аналогового сигнала.
Если сигнал ШИМ пропустить через фильтр низких частот (ФНЧ), то на выходе фильтра мы получим аналоговый сигнал, напряжение которого пропорционально коэффициенту заполнения ШИМ.
В качестве ФНЧ можно использовать простейшую RC цепочку.
Из-за неидеальной характеристики такого фильтра частота среза должна быть минимум на порядок меньше частоты ШИМ. Для простого RC фильтра частота среза вычисляется по формуле:
- При повышении частоты среза ФНЧ на выходе фильтра увеличиваются пульсации с частотой ШИМ.
- При уменьшении частоты среза фильтра снижается время реакции выходного аналогового сигнала на изменения ширины импульсов.
Из этого вытекает главный недостаток широтно-импульсной модуляции. Метод способен синтезировать только достаточно медленные аналоговые сигналы или требует применения фильтров низких частот с высокой добротностью, сложных в реализации.
Я бы рекомендовал:
- В случае, когда к быстродействию аналогового сигнала жестких требований нет выбирать заведомо заниженную частоту среза фильтра.
- Если необходимо оптимизировать быстродействие аналогового преобразователя, то лучше промоделировать схему.
Даже простейшие моделирующие программы вычисляют уровень пульсаций достаточно точно. Вот результаты моделирования на SwCAD для ШИМ частотой 500 Гц и RC фильтрами с частотами среза 500 Гц, 50 Гц и 5 Гц. Зеленым цветом показана диаграмма ШИМ, синим – напряжение на выходе RC фильтра.
Частота среза 500 Гц (10 кОм, 32 нФ).
Частота среза 50 Гц (10 кОм, 320 нФ).
Частота среза 5 Гц (10 кОм, 3,2 мкФ).
Точность преобразования широтно-импульсных модуляторов определяется погрешностью амплитуды импульсов (т.е. стабильностью питания микроконтроллера) и значением падения напряжения на ключах цифровых выходов микроконтроллера. Как правило, точность ШИМ микроконтроллеров невысока. Добиться высокой точности ШИМ преобразования можно с помощью дополнительной схемы с аналоговыми ключами и источником опорного напряжения.
К недостаткам использования широтно-импульсных модуляторов в качестве ЦАП также следует отнести высокое выходное сопротивление. Оно определяется сопротивлением резистора RC фильтра и не может быть низким из-за малой нагрузочной способности выходов микроконтроллера.
Широтно-импульсные модуляторы в Ардуино.
Платы Ардуино на базе микроконтроллеров ATmega168/328 имеют 6 аппаратных широтно-импульсных модуляторов. Сигналы ШИМ могут быть сгенерированы на выводах 3, 5, 6, 9, 10, 11.
Управление аппаратными ШИМ осуществляется с помощью системной функции analogWrite().
void analogWrite(pin, val)
Функция переводит вывод в режим ШИМ и задает для него коэффициент заполнения. Перед использованием analogWrite() функцию pinMode() для установки вывода в режим “выход” вызывать необязательно.
- pin – номер вывода для генерации ШИМ сигнала.
- val – коэффициент заполнения ШИМ. Без дополнительных установок диапазон val от 0 до 255 и соответствует коэффициенту заполнения от 0 до 100 %. Т.е. разрядность системных ШИМ в Ардуино 8 разрядов.
analogWrite(9, 25); // на выводе 9 ШИМ = 10%
Частота ШИМ Ардуино 488,28 Гц.
Для генерации ШИМ используются все три таймера Ардуино.
Таймер | Используется для генерации ШИМ на выводах |
Таймер 0 | выводы 5 и 6 |
Таймер 1 | выводы 9 и 10 |
Таймер 2 | выводы 3 и 11 |
Если таймер используется для других целей, например для прерывания, то параметры ШИМ соответствующих выводов могут не соответствовать указанным выше.
Поэтому, при использовании библиотек MsTimer2, TimerOne или им подобных некоторые выводы в качестве ШИМ сигналов использовать нельзя.
Увеличение частоты и разрядности ШИМ Ардуино.
Система Ардуино устанавливает на всех выводах ШИМ параметры:
- частота 488,28 Гц;
- разрешение 8 разрядов (0…255).
Очень низкая частота. Для большинства приложений совершенно не допустимая.
В разработке контроллера элемента Пельтье, начатой в предыдущем уроке, частота ШИМ должна быть не менее 30-50 кГц. В интернете достаточно много предложений по увеличению частоты ШИМВо всех описываются методы увеличения частоты до 31 кГц. В принципе приемлемый вариант, но мне захотелось большего.
Я разобрался с Таймером 1 микроконтроллера ATmega168/328, перевел ШИМ в быстродействующий режим и добился частоты ШИМ Ардуино до 62,5 кГц. Заодно я научился менять разрядность ШИМ. Чтобы в следующий раз не копаться в документации на микроконтроллеры ATmega168/328 я свел всевозможные варианты ШИМ для таймера 1 в таблицу.
Строчки из правого столбца для выбранного варианта необходимо написать в функции setup().
Варианты параметров ШИМ на выводах 9 и 10 Ардуино (таймер 1).
Разрешение | Частота ШИМ | Команды установки режима |
8 бит | 62 500 Гц | TCCR1A = TCCR1A & 0xe0 | 1; TCCR1B = TCCR1B & 0xe0 | 0x09; |
7 812,5 Гц | TCCR1A = TCCR1A & 0xe0 | 1; TCCR1B = TCCR1B & 0xe0 | 0x0a; | |
976,56 Гц | TCCR1A = TCCR1A & 0xe0 | 1; TCCR1B = TCCR1B & 0xe0 | 0x0b; | |
244,14 Гц | TCCR1A = TCCR1A & 0xe0 | 1; TCCR1B = TCCR1B & 0xe0 | 0x0c; | |
61,04 Гц | TCCR1A = TCCR1A & 0xe0 | 1; TCCR1B = TCCR1B & 0xe0 | 0x0d; | |
9 бит | 31 250 Гц | TCCR1A = TCCR1A & 0xe0 | 2; TCCR1B = TCCR1B & 0xe0 | 0x09; |
3 906,25 Гц | TCCR1A = TCCR1A & 0xe0 | 2; TCCR1B = TCCR1B & 0xe0 | 0x0a; | |
488,28 Гц | TCCR1A = TCCR1A & 0xe0 | 2; TCCR1B = TCCR1B & 0xe0 | 0x0b; | |
122,07 Гц | TCCR1A = TCCR1A & 0xe0 | 2; TCCR1B = TCCR1B & 0xe0 | 0x0c; | |
30,52 Гц | TCCR1A = TCCR1A & 0xe0 | 2; TCCR1B = TCCR1B & 0xe0 | 0x0d; | |
10 бит | 1 5625 Гц | TCCR1A = TCCR1A & 0xe0 | 3; TCCR1B = TCCR1B & 0xe0 | 0x09; |
1 953,13 Гц | TCCR1A = TCCR1A & 0xe0 | 3; TCCR1B = TCCR1B & 0xe0 | 0x0a; | |
244,14 Гц | TCCR1A = TCCR1A & 0xe0 | 3; TCCR1B = TCCR1B & 0xe0 | 0x0b; | |
61,04 Гц | TCCR1A = TCCR1A & 0xe0 | 3; TCCR1B = TCCR1B & 0xe0 | 0x0c; | |
15,26 Гц | TCCR1A = TCCR1A & 0xe0 | 3; TCCR1B = TCCR1B & 0xe0 | 0x0d; |
Следующий скетч генерирует на выводе 9 ШИМ с частотой 62,5 кГц и коэффициентом заполнения примерно 10 %.
void setup() <
// ШИМ 8 разрядов, 62,5 кГц
TCCR1A = TCCR1A & 0xe0 | 1;
TCCR1B = TCCR1B & 0xe0 | 0x09;
analogWrite(9, 25); // на выводе 9 ШИМ=10%
>
Это максимально возможная частота ШИМ Ардуино для большинства плат (с частотой генератора 16 мГц).
В следующем уроке вернемся к разработке контроллера элемента Пельтье.