Генератор ШИМ сигнала с изменением скважности

ШИМ генератор с ЖК-индикатором

ШИМ генератор с магазин ICstation

Что может этот генератор? Взглянем на параметры.

  1. Рабочее напряжение: 3.3 – 30V;
  2. Частота генерации: 1Hz – 150KHz;
  3. Точность генерации частоты: 2%;
  4. Мощность нагрузки: 5…30mА;
  5. Амплитуда выходного сигнала равна напряжению питания;
  6. Температура окружающей среды: -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% от установленной частоты соблюдается.

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

Генератор ШИМ сигнала с изменением скважности

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

Автор: Провада Юрий Петрович
Опубликовано 16.09.2011
Создано при помощи КотоРед.

Поздравляю radiokot.ru и Главного Кота с Днём Рождения! А также модераторов и всех, кто помогает сайту становиться все лучше и интересней. Желаю всего самого доброго! Так держать! Лично я отметил день рождения Кота, как на картинке, чего и всем советую.

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

В наше время весь мир крутится вокруг широтно-импульсной модуляции (ШИМ), да что и говорить, даже день и ночь – и те подвластны ШИМу (зимой день короче чем ночь и наоборот J ). ШИМ сейчас используется везде, где только можно представить его применение: регуляторы, стабилизаторы, преобразователи, блоки питания и прочие устройства. Учитывая тенденцию увеличения мощности, неуклонного роста используемых частот в силовой и преобразовательной технике, а также уменьшению массо – габаритных показателей, я решил что иметь у каждого в домашней лаборатории широкодиапазонный генератор ШИМ просто обязательно. Но это, конечно же, должен быть не просто генератор. Нужно что бы он имел регулировку частоты в широком диапазоне, регуляторы коэффициента заполнения, регуляторы DEAD TIME, однотактный и двухтактный выходы, а также инверсию выходов для каждого. Инверсия выходов необходима для проверки мостового преобразователя. Да и мало ли чего ещё захочется исследовать. Но в тоже время он должен быть простым для сборки, наладки и повторения. В данном случае будет достаточно перекрыть диапазон частот в однотактном режиме от 60 кГц до 2 МГц, в двухтактном режиме от 30 кГц до 1 МГц. Регулировать коэффициент заполнения в однотактном режиме от 1 % до 99%, а в двухтактном режиме от 2 % до 98%, с возможностью регулирования паузы DEAD TIME («мертвая зона»). Генератор должен иметь минимальное число переключателей по диапазонам. Все должно регулироваться плавно и без скачков. Желательно иметь настройку грубо и точно на каждый параметр регулирования.

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

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

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

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

Ради прикола, беру самый первый советский операционник К140УД1Б и загоняю его на испытания. Показатели у него значительно лучше, чем у LM358.

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

Даже проверил, как себя поведет стабилитрон TL431 на частоте 1,3 МГц:

Желтым – вход, синим – выход.

А также испытать и проверить многое другое…….

Вот, вкратце, возможности моего генератора.

Когда я поставил перед собой задачу, попробовал погуглить и найти готовое решение. Поиски не увенчались успехом. В итоге было решено самому создать схему отвечающую запросам. Теперь я ознакомлю вас с результатами моих исследований длившихся около года

Исследование первое: на готовом ШИМ регуляторе.

На первый взгляд самой привлекательной и простой схемой, найденной в даташитах и интернете, показалась схема на основе готового PULSE WIDTH MODULATION контроллера типа TL494 и её аналогах КА7500. TL 494 и ее последующие версии – наиболее часто применяемая микросхема для построения двухтактных преобразователей питания.

Но на деле это решение подходит под наши задачи только на 1/10 решения и её нельзя использовать на частотах более 100 кГц – в однотактном режиме и до 50 кГц – в двухтактном режиме. Почему? Хотя по даташиту она может использоваться и до 300кГц, мне не понравилось, как она себя ведет на частотах выше 100 кГц.

Что гласит даташит:

Допустимы рабочие частоты от 1 до 300 кГц, рекомендованный диапазон Rt = 1. 500кОм, Ct=470пФ. 10мкФ. При этом типовой температурный дрейф частоты без учета дрейфа навесных компонентов +/-3%, а уход частоты в зависимости от напряжения питания – в пределах 0.1% во всем допустимом диапазоне. Да только дело то не в уходе частоты, а в непостоянстве регулирования коэффициента заполнения в зависимости от частоты.

Я попробовал испытать её возможности, и хотел перекрыть нужный мне диапазон в 2 МГц, но на частоте выше 1 МГц она нормально так и не запустилась. Пришлось пока ограничиться только 1 МГц. Сделал пять диапазонов регулирования частоты, поставил стабилизатор напряжения на 12 вольт по питанию с блокировочными конденсаторами, чтобы не нарушалась чистота эксперимента и начал испытание.

Макетная плата подопытной схемы:

Джамперы для выбора частоты:

Результаты проведенного испытания возможностей TL494:

Данная микросхема для моего требования к генератору не подходит, и никакие средства и ухищрения разогнать её на большую частоту так ни к чему и не привели. Предел мечтаний с ней это 100 кГц (с большой натяжкой 150 кГц). На более высокой частоте даёт о себе знать очень уж медленный компаратор, использующийся в схеме кристалла. Также мешает повышению частоты и встроенная коррекция. Читаем из даташита особенности данной микросхемы:

Для стабильной работы триггера – время переключения цифровой части TL494 составляет 200 нс. На тактовых частотах до 150 кГц при нулевом управляющем напряжении фаза покоя = 3% периода (эквивалентное смещение управляющего сигнала 100..120 мВ), на больших частотах встроенная коррекция расширяет фазу покоя до 200..300 нс. Так как в ней очень медленные усилители ошибки (фактически, операционные усилители с Ку = 70..95 дБ по постоянному напряжению, Ку = 1 на 300 кГц), я их не использую в схеме испытания вообще, и они заблокированы. Эти усилители не предназначены для работы в пределах одного такта рабочей частоты. При задержке распространения сигнала внутри усилителя в 400 нс они для этого слишком медленные, да и логика управления триггером не позволяет (возникали бы побочные импульсы на выходе). В реальных схемах преобразователей напряжения частота среза цепи ОС выбирается порядка 2 – 10кГц.

Читайте также:  Задающий генератор для трехфазного инвертора

Замечания по работе микросхемы 494 на повышенной частоте, которые меня не устраивают:

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

Осциллограммы работы генератора на разных частотах:

2. Сильная зависимость коэффициента заполнения от частоты, которая проявляется с нарастающим эффектом после прохождения частоты 100 кГц.

Рассматривая осциллограммы работы ШИМ регулятора с TL494 на разных частотах, при максимальном и минимальном коэффициенте заполнения, чётко заметны изменения минимального и максимального коэффициента заполнения в зависимости от частоты.

Как видно, изменение минимального коэффициента заполнения на частоте 50 кГц =5% и на частоте 1 МГц = 14,3% отличаются почти в три раза. А вот изменение максимального коэффициента заполнения, тут вообще удивляет: на частоте 50 кГц = 93% и на частоте 1 МГц = 60,7% отличаются на 32%.

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

Исследование второе: на 555 таймере.

Дальше на пути у меня была схема на NE555 таймере, которую я использовал лишь только в качестве генератора пилообразного напряжения. Я и не предполагал, что он тоже окажется довольно медленным, но все же, немного лучше, чем предыдущая TL494. С ним можно подняться к частотам около 200 кГц в однотактном режиме. Только надо добавить компаратор и триггер с логикой ИЛИ-НЕ.

Схема генератора на 555 таймере:

Осциллограммы работы генератора пилообразного напряжения на 555 таймере на частотах 332 кГц и 462 кГц.

Тут видно округление вершин и спада импульса. На частоте более 500 кГц пила становится неузнаваема.

Разочаровавшись в готовых решениях только на аналоговых элементах, я пробовал синтезировать ШИМ чисто на цифровых логических элементах и счетчиках с триггерами, без использования аналоговых компонентов, но там меня подстерегали другие, куда более сложные проблемы. Выравнивание задержек распространения сигнала по элементам и т.п. Особенно большую проблему составляют триггеры и счетчики, которые совсем не хотят щелкать на малой длительности импульса и просто тупо пропускают счет. А это значит, что ключам, на которые будет работать генератор, очень скоро придет конец. Отказался от этой затеи через неделю боя с 561 логикой. Она, оказывается, ну уж очень медленная для таких частот – 20 МГц при делении ШИМа по 10 %. Ещё через две недели отказался и от 1533 тоже.

Финальная схема генератора.

После нескольких неудачных попыток воплотить мечту в реальность (иметь в своей домашней лаборатории генератор с 2 МГц ШИМа), недельку- другую отдохнул, подумал, набрался сил и снова приступил к решению проблемы. На этот раз без выкрутасов и лёгких путей, учитывая предыдущие наработки и ошибки. Из всех опробованных решений самое большее удобство пользования предоставляла схема на TL494 или на таймере. Поэтому было решено клонировать начинку NE555 и TL494 на быстродействующих компонентах и собирать некий «симбиоз» двух микросхем на отдельных компараторах и логике. Компараторы с ТТЛ выходом я взял те, что были у меня в столе – КР597СА2, но можно и любые другие, главное быстродействующие и с ТТЛ выходом. Ну, если вдруг захочется позверствовать, то ЭСЛ будет куда круче (тогда и 20 МГц не предел), но мне пока не нужна такая большая частота (разве для преобразователя с индуктивностью без ферритового сердечника). Тогда надо ставить КР597СА1, и логику серии К500.

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

Схема состоит из генератора пилообразного напряжения (состоящего из стабилизатора тока на транзисторах VT1, VT2, VT3; двух компараторов DA1, DA2; триггера DD1 и разрядного транзистора VT4), схемы выделения прямоугольных импульсов (с шириной зависящей от порогового напряжения на DA3), двух стабилизаторов опорного напряжения (2,5в и 2,9в), формирователя двухтактного сигнала (на триггере DD2 и элементах DD3 DD4 2-ИЛИ-НЕ), повторителя и инвертора для однотактного выхода (на DD5, DD6).

Фото макетной платы:

Для облегчения процесса настройки я приведу осциллограммы напряжений в каждой важной точке схемы. Итак…

Генератор пилообразного напряжения. Конденсатор заряжается через стабилизатор тока. Канал 1 – напряжение на конденсаторе С5, канал 2 – напряжение на базе разрядного транзистора VT4.

По графикам заметен необъяснимый факт ухода напряжения в область отрицательных значений, но это работе не мешает, так как в схему выделения прямоугольных импульсов в задающее напряжение позже я также внесу небольшое отрицательное смещение с помощью делителя R6, R10 для охвата всего диапазона изменения напряжения «пилы». R1 подбирается для ограничения верхней максимальной частоты (я ограничился лишь 2 МГц, хотя вся схема нормально работает и до 5 МГц).

Осциллограммы напряжений на выходах компараторов DA1, DA2 на разной частоте. Канал 1 – напряжение на компараторе DA1 вывод 14, канал 2 – напряжение на компараторе DA2 вывод 14:

Для борьбы со «звоном» компаратора вблизи зоны переключения, в схеме выделения прямоугольных импульсов на DA3, я ввел резисторы ПОС (положительной обратной связи) R16, R15 на одноименных входах – выходах компаратора. ПОС нужна на частоте ниже 1 МГц. На частоте в 2МГц данная цепь не требуется и сама перестает участвовать в работе, что видно по осциллограммам. Осциллограммы напряжений на входах компаратора DA3 на разной частоте. Канал 2 – напряжение на компараторе DA3 вывод 2 – задание порога переключения, канал 1 – напряжение на компараторе DA3 вывод 3 с генератора «пилы». Осциллограмма на частоте 96 кГц. Канал 2 увеличено. Видна волнистая линия синхронно переключению компаратора – это и есть работа ПОС для задания гистерезиса. Глубину гистерезиса можно было бы и уменьшить, но на карту поставлены ключи, которыми будет управлять генератор, поэтому оставим все без изменения.

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

Здесь все понятно. Только если нужен для работы двухтактный выход, то увлекаться очень малым ( 99%) коэффициентом заполнения не стоит. Так как триггер на малой длительности входного импульса не успевает переключаться, и будет просто пропускать периоды, выдавая на выходе вместо двухтактных импульсов по очереди – два одинаковых, однотактных, а это чревато нехорошими последствиями, типа сквозного пробоя одновременно открытых ключей.

Дальше я покажу, как переключается триггер, когда длительность импульса достаточна для его нормальной работы на разных входных частотах. Частота на выходе D триггера равна половине частоты на входе, и всегда имеет коэффициент заполнения 50% независимо от коэффициента заполнения на входе. Все это видно ниже на графиках.

А вот так хулиганит триггер при входных импульсах недостаточной длительности:

Видно как сбивается развертка и просматривается тот самый пропуск импульса. А это приводит например в полумостовом преобразователе к сквозному «кототоку».

Далее покажу, как формируется полтакта двухтактного импульса, пройдя компаратор, триггер и логический элемент 2ИЛИ-НЕ:

То, что получилось на выходных контактах, я поместил в первой картинке. Внимательно смотрим, изучаем. Как видно из графиков, минимальная длительность импульсов на двухтактном выходе завышена до 5%, для того, чтобы триггер четко переключался при входной частоте 2 МГЦ. На частотах до 500 кГц её можно установить и 1 % не опасаясь за пропуски импульса.

Основной нюанс по настройке генератора: самое главное – чтобы стояли блокировочные керамические конденсаторы типа КМ-5 по 0,1 мкф минимум, или SMD импортные, на каждом корпусе микросхемы. Без них схема работает очень неустойчиво. Одна сторона платы используется для дорожек, а вторая используется как экран, её нужно соединить с корпусом в нескольких точках.

Блок питания каких–либо особенностей не имеет. Для канала +12в используется КРЕНка или 7812, а для канала – 6в используется 7906

Об выходных драйверах на 2 МГц напишу позже, а то и так много читать надо. Можно использовать готовые микросхемы драйверов, можно собирать на дискретных элементах.

Спасибо за внимание, и за терпение, и за то, что хватило сил дочитать до этой строки.

Ещё поздравляю и желаю много валерианки.

Макетная плата в Layout 5, видео работы генератора в разных режимах и картинки отдельно в файлах.

Azovsky2 › Блог › Диммер под любые задачи на микроконтроллере. Программный ШИМ. Часть 1.

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

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

В современных микроконтроллерах как правило есть аппаратный ШИМ (PWM ), и не редкость, когда он многоканальный. То есть его можно вывести на разные “ноги” МК. Но. Аппаратный ШИМ имеет недостаток. Все каналы будут работать на одной частоте.
С изменением скважности дело обстоит лучше. Она будет меняться не зависимо для каждого канала.

На помощь придет программный ШИМ если:
а) заняты все каналы CCP (для PIC), либо контроллер их не имеет вовсе.
б) на один из каналов программного ШИМ “повесили” пищалку, для которой частота постоянно меняется.

Для его реализации пойдет практически любой микроконтроллер, желательно с двумя таймерами, и желательно что бы один из них, был 16 ти битным. Микроконтроллер иногда, можно добыть из игрушек при условии, что его можно распознать.
Как правило таймеров в микроконтроллере три, но может быть как больше, так и меньше.
TMR0— программно не отключаемый, восьмибитный (считает 0-255 раз). Можно изменить скорость “тиков” выбором коэффициента деления.
TMR1— отключаемый 16ти битный (0-65535). Имеет делители. Имеет два регистра по восемь бит, старший и младший, в которые записывается значения, досчитав до которого, таймер переполниться и начнет считать по новой. Эти регистры буферные, требуют хитрого алгоритма записи. Допустим надо записать в регистры значение 0xCBFA. Сначала в младший регистр запишется 0xCB (хотя нам туда надо записать FA), на следующем этапе, при записи FA, оно протолкнет CB, в старший регистр, а само запишется в младший. Посему младший регистр перед записью желательно очистить, что бы в процессе записи, TMR1 а) не переполнился, б) во избежании “проталкивания” в старший регистр значения, которое находилось ранее в младшем регистре. Вот такая вот заморочка.
TMR2— отключаемый восьмибитный(может быть 16ти битным, при определенных условиях, при максимальном значении коэффициентов). Имеет делители и обязательно регистр PR2. Таймер будет считать до записанного туда значения.
Вашему вниманию, предоставляю исходник на языке программирования Си, и проект в Proteus. Файлы с расширением .c; h; лучше просматривать в Notepad++ . Также они доступны для просмотра в Proteus. Кому нужен .coff могут самостоятельно получить его в MPLAB, собрав и скомпилировав там проект.
Обработчик кнопок, можно расширить до 16 buttons, он полноценен и годиться для серьезных проектов.
Полностью совместим с кодом, написанным под Тимофеевский обработчик.
В проекте, функция обработчика кнопок вызывается 25 раз в секунду. Время ее вызова меняется в условии
if (tic_ButtonTimeout >= 5)// 20ms = 0,02 sec
<
tic_ButtonTimeout = 0, Task_Buttons();
>

Запись в комментариях не верна, забыл исправить, ее следует читать как 40ms = 0,04 sec
Но если функция будет использоваться в серьезных проектах, то вызывать ее надо каждые 20ms(50 раз в секунду).
Подробности здесь. Мой пост с разъяснениями там под № 94, и на сегодняшнюю дату, крайний в этом топике.
Проект написан под частоту диммера 100 гЦ, разрядность 10 бит, при частоте кварца 4мГц.
Как изменить эти значения, подробно распишу ниже.
Цепочку управления каналом АЦП оставил в схеме, но кода под работу с ней не писал. (На самом деле он есть, но в этом проекте удалил). Есть возможность расширить для работы например под регулятор мощности паяльника.

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

Специально написал под PIC16F72, где всего один канал CCP. МК старый, не популярный. Не стоит делать проекты на нем.
Лучше посмотреть в сторону PIC12(L)F1501, восьминогой букашки, с потрясающими возможностями . По ссылке их список.

В конце второй части, расширю список рекомендованных МК, как нельзя лучше подходящих для применения в атомобилях.
—————————————-
В проекте удалось добиться:
— плавной регулировки яркости, куда ж без нее;
— плавного реверса изменения направления яркости, на любом этапе;
— быстрой перестройки в коде, алгоритма изменения яркости ” лампа накаливания — светодиод, либо иное устройство ( линейно, по экспоненте, либо Lg закону)”;
— быстрой перестройки в коде, скорости изменения яркости;
— быстрой перестройки в коде, под постоянно нажатую кнопку, либо под кратковременное ее нажатие, для дальнейшего автоматического изменения яркости;
— быстрой перестройки в коде, частоты ШИМ, а вместе с ней и разрядности;
— добиться при частоте источника тактирования 4 мГц, частоты ШИМ более 500 Гц(можно и выше, только нет смысла), при разрядности 8 бит, а при частоте 125 Гц, 10 битного разрешения;
Исходник написан для PIC16, что сильно жирно, только для подобной задачи, “выдернут” из моего готового проекта. Но переделать его под любой другой PIC, либо Тиньку поскромнее, не сложно.

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

Здесь должно быть видео, о работе устройства на основе этого кода. Но камера старая, и после съемке дергаются кадры. Теряется весь эффект плавного розжига. Позже попробую снять на камеру высокого разрешения.

Ссылка на проект Proteus реализации подобной задачи посредствам BAM (Binary Angle Modulation), под переменные резисторы на PIC12F675 . Годиться для многоканальных задач. Для его открытия запустить Proteus. Далее- files- open project — Тип файла “design files” — два клика по нему. После открытия, нажать Play. Доступен пошаговый просмотр работы кода, во время паузы.Хочу заметить, что при такой реализации, сильнее заметны мерцания, нежели с ШИМ. Но как говориться, може кому то надо…
———————————————–
О настройках в исходном коде. Начну настроек под 500 Гц 8 бит, дабы потом показать как их в комплексе изменять

Строка 8 подключает .h файл проекта.
Строка 9 подключает файл компилятора. По правилам его надо ставить выше .h файла. Но не критично. Он у меня ушел ниже в результате коррекции кода.
Строка 11, макрос для записи в 16 ти битный таймер. Регистры у него буферные. Запись должна производиться сначала в старший, а затем в младший. Создав такой макрос, заботится о последовательности записи в регистры TMR1, уже не придется.
Если будет использован 8ми битный таймер, можно обойтись и без макроса.
14-18 Строки конфигурации.
Ниже структура для хранения флагов, ее можно засунуть в хейдер, но для наглядности, вытащил ее сюда.
31,32. объявляем глобальные переменные для генерации ШИМ. При разрядности ШИМ 8 бит и ниже, они могут быть объявлены как unsigned char тогда второй таймер, может быть 8ми битным, либо нужно заставить считать 16 ти битный таймер до 255 (8мь бит).
36. Счетчик для вызова функции обработчика кнопок.
Ниже строчки с прототипами объявленных функций используемых в программе.

Ими же будем задавать частоту нашего шим.
81. Выбираем его источник тактирования. Внешний кварц, либо внутренний генератор.
83-87. Действия понятны из комментариев.
86. строчка, конфигурирует TMR1. В данном случае, его предделитель выбран равным предделителю TMR0. При таком выборе PWM будет 8 ми битным. Иные варианты, поясню ниже по тексту.
88. Разрешаем все прерывания. Выход из функции.
Далее разбираем что твориться в прерываниях.
Предисловие.
Таймер в микроконтроллерах, это счетчик, который считает до определенной цифры, и начинает вновь считать по новой с нуля после переполнения. По окончании счета, он поднимает флаг (записывает единицу в спец ячейку), который сам не сбрасывается в ноль, не смотря на то, что таймер продолжит счет. Этот флаг мы должны сбросить сами. Таймеры живут своей жизнью, имеют свои источники тактирования, и не влияют на ход выполнения программы, если мы их об этом не попросим. Допустим попросили повлиять. Тогда, после переполнения, вместе с поднятием флага, возникнет так называемое прерывание. Микроконтроллер бросит все дела, и пойдет читать задание, которое написано в специальной функции обработки прерываний. Это задание мы пишем там сами.
Принцип генерации Шим сигнала, заключается в переводе одного из портов МК в “единицу( на выходе будет напряжение питания МК), и гашении его в ноль, через некий промежуток времени. В Сети об этом полно статей и видео, посему пойдем дальше.
Для реализации этого принципа, одним таймером будем “взводит” порт МК в единицу, другим гасить в ноль, спустя некоторое время. И не важно что достанется тому или иному таймеру.
Допустим поднятие порта, досталось нулевому таймеру, и делать это он будет всегда, через равные промежутки времени. Тем самым задавая частоту ШИМ. Второй же таймер, будет гасить порт, через не равные промежутки времени, задавая скважность. Задача сводится к синхронизации процесса. Похоже на стрельбу пушки через винт самолета. Пять снарядов лопасть не заденут, а шестой ее повредит, если не принять меры. В этом случае роль лопасти достается, нулевому таймеру. TMR1-будет стрелять из пушки.
Пишем в функции обработки прерываний следующий простой код для нулевого таймера.
1. if (TMR0IF) <
2. TMR0IF = 0;
3. if (Flag.BrightDimmerUp || Flag.BrightDimmerDown) <
4. RB3 = 1;
5. TMR1_WRITE(

DutyCycle_PWM);
6. TMR0 = 0;
7. TMR1ON = 1;
>

1 строка. Если был взведен флаг по переполнению нулевого таймера (Timer0 Interrupt Flag).
2я. Сбрасываем его.
3. Если есть условие для изменения яркости на увеличение (Flag.BrightDimmerUp) или уменьшение( Flag.BrightDimmerDown), (нажата ли кнопка, повернут движок перемешки…), определяемое флагами в скобках (они взводятся в основном цикле программы), тогда будут выполнены предписания в строчках 4-7.
Если нет, эти условия будут игнорированы.
4. Допустим условия есть, тогда переводим порт в единицу. Возбуждаем то, что подключено к порту.
5. Записываем в TMR1, некое начальное значение, чтобы он не считал до 65535, а например до 127. Сие значение, уже хранится в переменной DutyCycle_PWM. Поскольку TMR1 16 ти битный, ( TMR 0 восьми, считает до 255+1), мы затыкаем ему старший регистр единицами (1111 1111 1000 0000) инвертировав значение 127 (хранится в DutyCycle_PWM). Не сделай этого, в таймер запишется 127, и он будет тикать 65535-127 раз, и “перебежит” TMR0. Иными словами, заставляем считать TMR1 до 127, после чего он погасит нам порт, ровно по средине цикла ( TMR0 зажгет его вновь, когда досчитает до 255), обеспечив скважность в 50%.
При равных коэффициентах делителей обеих таймеров, можно обеспечить гашение порта в пределах периода в 255 ти местах. В бинарном виде это число влазит в восемь ячеек 1111 1111 Поэтому и говорят, что разрядность ШИМ равно 8 бит.

Это не совсем гуд, потому как будет видна еле заметная ступенька в процессе увеличения или уменьшения яркости того же светодиода. Хотя для некоторых задач, этого более чем достаточно. Как увеличить разрядность ШИМ, расскажу позже.
6. Обнуляем значение нулевой таймер, потому как он тикает все время и его нельзя остановить. Пока мы возились с первым таймером, в нем уже натикало.
7. Запускаем TMR1, который будет считать до значения, заданного в DutyCycle_PWM. Досчитав, теперь уже он спровоцирует прерывания и пойдет читать свое задание в функцию обработки прерываний.

Поэтому делаем так, что бы условие в строке 108 с первого прохода не выполнилось. подождем пока инкриминируемая переменная s_Slov_voltag_dimmer++ станет равной по значению PWM_DutyCicleRate.Значение последней, рассчитывается в главном цикле. О ней позже.
Проигнорировав вышеозвученное условие, при не соблюдении равенства, следующей прочтется строка 116, в которой мы гасим порт. В результате, на начальном этапе розжига, на светодиод воздействуют очень короткие импульсы с частотой прерывания TMR0. это и обеспечит минимальную яркость на начальном этапе розжига светодиода.

Когда на одном из прерываний, условие if(s_Slov_voltag_dimmer++ == PWM_DutyCicleRate) станет верным, произойдет изменение скважности путем инкриминирования DutyCycle_PWM++; , и “иголочка” для светодиода станет толще. По мере нарастания яркости, мы уменьшаем в главном цикле задержку путем постепенного уменьшения значений PWM_DutyCicleRate, и на каком то этапе, примерно на 30% процентной скважности, начинаем увеличивать ее (скважность) равномерно, потому как этого требует “концепция светодиода”. По мере достижения значения if (DutyCycle_PWM ==255) <для 8 ми битного ШИМ, в строке 111 данного условия, считаем яркость достигшей 100% го значения, и перестаем заниматься ее увеличением, сбросив флаги когда то нажатых кнопок. Поднимаем флаг, максимальной яркости, если это нужно. Строки 112-113.
Далее пойдем смотреть, что у нас там в главном цикле.

176. Проверка состояния счетчика для вызова функции обработчика кнопок. Настраивается на время вызова через каждые 20 ms. 50 раз в секунду, либо через иное время.
Ниже код, для работы с кнопками, разобраться в котором не сложно самостоятельно.
В одной из строк, вызывается функция мигалки для лампочки. По сути, тот же ШИМ, только очень медленный. Уменьшая значения переменных в этой функции, до разумных пределов, можно сгенерировать ШИМ без всяких таймеров, но на высокую разрядность, рассчитывать не стоит.
Продолжение во второй части.

Будут примеры алгоритмов для:
-лампы накаливания;
-ДХО, дальний в пол накала;
-светодиодов;
-возможно еще чего нибудь;

Генератор сигнала с переменной скважностью импульсов. Регулировка коэффициента заполнения. Ограничение максимального значения. Изменение длительности импульсов

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

Коэффициент заполнения импульсного сигнала. Скважность – Генератор

Регулировка скважности

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

Читайте также:  Генератор тесла своими руками на 220 вольт

Вашему вниманию подборки материалов:

Конструирование источников питания и преобразователей напряжения Разработка источников питания и преобразователей напряжения. Типовые схемы. Примеры готовых устройств. Онлайн расчет. Возможность задать вопрос авторам

Практика проектирования электронных схем Искусство разработки устройств. Элементная база. Типовые схемы. Примеры готовых устройств. Подробные описания. Онлайн расчет. Возможность задать вопрос авторам

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

Генератор по схеме (A2) наоборот формирует импульсы с большим коэффициентом заполнения (меньшей скважностью) при уменьшении входного напряжения.

Скважность импульсов генератора (A3) регулируется вручную с помощью подстроечного резистора R5.

Во всех схемах используются одинаковые детали. Выходной сигнал формируется на ножке 14. Подключать к этой ножке можно нагрузку до 2 А (импульсно). Питание осуществляется от источника от 12 до 30 вольт.

Резистор R1 – 10 кОм, подстроечный. С помощью него регулируется начальный уровень сигнала, при котором появятся импульсы минимальной длительности.

Резистор R2 – 100 кОм

Резистор R3 – 500 кОм, подстроечный. Он регулирует чувствительность, то есть увеличение этого резистора приводит к тому, что сигнал заданной амплитуды приводит к большему изменению коэффициента наполнения.

Резистор R5 – 100 кОм, подстроечный. Он регулирует максимально возможный коэффициент наполнения, а в схеме (A3), просто коэффициент заполнения.

Конденсатор C1 – 0.1 мкФ.

Готовое устройство, иллюстрирующее управление скважностью – Тренажер для снятия усталости глаз и спазма аккомодации.

Ограничение максимального коэффициента заполнения

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

В схеме удалены все выводы и соединения, не имеющие отношения к нашей задаче ограничения скважности. Для примера выбрана микросхема 1156ЕУ3 или UC3823. Без изменений описанный подход может применяться для микросхемы 1156ЕУ2 или UC3825. Для других микросхем ШИМ может понадобиться подобрать номиналы деталей и учесть цоколевку этих микросхем.

Принцип работы схемы следующий. Ножка 8 отвечает за мягкий старт. На нее внутри микросхемы подается ток 1 мкА. Этот ток заряжает внешний конденсатор. По мере роста напряжения на конденсаторе увеличивается максимально возможный коэффициент заполнения. Так обеспечивается постепенное увеличение ширины импульсов при запуске. Оно необходимо, так как при включении выходной конденсатор разряжен, и, если полагаться на обратную связь, то длительность импульсов будет максимальной, пока этот конденсатор не зарядится до рабочего напряжения. Это нежелательно, так как приводит к перегрузке при включении устройства.

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

Диод – любой маломощный, например, КД510

Подстроечный резистор – 100 кОм

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

Если что-то непонятно, обязательно спросите!
Задать вопрос. Обсуждение статьи.

Как не перепутать плюс и минус? Защита от переполюсовки. Схема.
Схема защиты от неправильной полярности подключения (переполюсовки) зарядных уст.

Грубая регулировка и точная подстройка. Схемы, решения.
Приемы растягивания диапазона регулировки, обеспечения точной настройки.

Инвертор, преобразователь, чистая синусоида, синус.
Как получить чистую синусоиду 220 вольт от автомобильного аккумулятора, чтобы за.

Arduino.ru

Управление частотой и скважностью ШИМ-сигнала

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

Добрый день, коллеги!

Прошу у Вас совета по управлению высокочастотным сигналом.

Проблема следующая: Требуется получить световые импульсы (светодиода, лазера и проч. источников) с частотой от 0 до 10 000 Гц, при этом время импульса должно быть управляемым. Импульсы нужны прямоугольные, как на рисунке:

На ум сразу пришло два пути:

1. Управление родным 8-битным ШИМ Arduino. Но тут проблема в частоте – она составляет примерно 500 Гц, не регулируется и даже иногда скачет, как пишут коллеги на форуме. И точность ограничена 8 битами.

2. Управление через классический сценарий мигания светодиодом.

Однако, здесь не понятно – гарантируется ли прямоугольный сигнал или это будет периодическое включение / выключение всё того же сигнала 500 Гц?

Можно ли организовать на Arduino управление частотой прямоугольного сигнала от 0 до 10 000 Гц при заданной скважности?

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

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

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

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

Спасибо! Правда Вы работаете с довольно высокими частотами, мне будет достаточно и 10 кГц. Но скетч, как мне кажется, может подойти. Вообще идея проекта – высокочастотный стробоскоп для съемки летящих со скоростью 10-30 м/с частиц при выдержке фотокамеры 0,01-1 с. Как думаете, можно ли бужет реализовать прерыватель света на таком коде?

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

Я попробовал Ваш код, всё работает.

Только один вопрос:

Как регулировать время импульса? Я пытаюсь задась время импульса от 1 мкс и выше при частоте до 50 кГц.

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

Anatolyekb, не понял вопроса. Что значит время импульса?. В смысле скважность? Там всё написано -энкодером. Duty cycle регулируется в процентах от 1 до 100.

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

Постараюсь объяснить языком неэлектронщика.

Хочу иметь управляющий сигнал для регулирования частоты мерцания светодиода (лазера). Управляющий сигнал будет идти на базу транзистора для управления питанием светодиода (лазера). Предполагается частота до 50 кГц. Но помимо частоты я ещё имею желание управлять временем импульса (чтобы с момента подачи напряжения на базу транзистора до прекращения подачи напряжения проходило заданное время). Время импульса не обязательно задавать в секундах, я был был рад и процентам от “длины волны”.

Например, на подграфике “а” я получил частоту 1 Гц, соответственно “длину волны” 1 с, а время импульса 0,5 с (или 50 % от длины волны). А вот на подграфике “б” при тех же Ч = 1 Гц и ДВ = 1 с уже другое время импульса 0,25 с (или 25 % от длины волны).

Как же управлять временем импульса?

Простите, если я нарушил какие законы физики при описании проблемы.

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

Anatolyekb, это и есть скважность, или duty cycle по зарубежному. В чём проблема то, вы не нашли как регулируется скважность?

Генератор ШИМ сигнала с изменением скважности

  • Уроки
  • Базовые уроки Arduino
  • ШИМ сигнал

ШИМ сигнал

Очень часто в робототехнике возникает необходимость плавно управлять каким-то процессом, будь то яркость светодиода, мощность обогревателя или скорость вращения моторчика. Вполне очевидно, что управление напрямую связано с изменением напряжения на потребителе: и светодиод будет по-другому светить, и моторчик крутиться с другой скоростью. Но проблема в том, что управлять напряжением может только такая штука, как ЦАП – цифро-аналоговый преобразователь, а в нашем микроконтроллере встроенного ЦАПа нет, у нас есть только цифровой сигнал, т.е. либо вкл, либо выкл:

Можно ли добиться плавного управления цифровым сигналом? Оказывается можно! Представьте себе вентилятор, вращающийся на полной мощности, напряжение постоянно. Представим теперь, что секунду напряжение подаётся, и секунду – нет, и так продолжается “по кругу”. Вентилятор начнёт крутиться в два раза медленнее, но мы скорее всего будем замечать моменты включения и выключения, особенно если вентилятор маленький. Большой вентилятор более инертен и там можно даже не заметить изменений скорости в пределах двух секунд. Можно теперь включать напряжение на 0.5 секунды, а на остальные 1.5 секунды – выключать. Вентилятор будет крутиться со скоростью 25% от максимальной. Мы с вами смогли представить так называемый ШИМ сигнал, широтно-импульсную модуляцию

С лампочкой накаливания оно тоже будет работать, она ведь весьма инертна, но вот со светодиодом мы будем видеть, как он включается и выключается, потому что он практически не имеет задержки включения/выключения. Что же делать? Всё очень просто, поднять частоту. В мысленном эксперименте у нас был период 2 секунды, что есть 0.5 Гц. А теперь представьте себе такой сигнал с частотой скажем 1000 Гц. Или 25’000 Гц (25 кГц). Теперь роль играет инертность глаза, он не заметит вспышек на такой частоте, для него это будет просто уменьшение яркости. Задача решена!

Изменяя так называемое “заполнение” ШИМ сигнала можно менять “суммарное” напряжение (интегрированное) за некоторый период. Чем больше заполнение ШИМ, тем выше напряжение, но не выше напряжения, которое мы “ШИМим”:

При помощи ШИМ сигнала можно даже модулировать сложные аналоговые сигналы, например – синусоиду. На картинке ниже показан ШИМ (снизу) и этот же ШИМ после фильтров:

Вот таким образом кстати и работают инвертеры DC-AC. Возвращаясь к свойствам ШИМ сигнала, их всего два: частота (frequency) и заполнение (duty), с ними мы разобрались. Давайте перейдём к генерации ШИМ при помощи Arduino.

Arduino и ШИМ

В уроке про функции времени я рассказывал, что у микроконтроллера есть так называемые счётчики, которые считают “пинки” от тактового генератора (кварца). Данные счётчики как раз и генерируют ШИМ сигнал, т.е. само вычислительное ядро микроконтроллера в этом не участвует. Помимо расчётов, даже вывод сигнала с ноги МК ложится на плечи счётчика. Это очень важно понимать, потому что ШИМ сигнал не тормозит выполнение кода, так как его генерацией занимается буквально “другая железка”.

На платах UNO/Nano/Pro Mini у нас есть три таймера-счётчика, у каждого таймера есть по два выхода на пины МК, то есть у нас есть 2*3=6 пинов, способных генерировать ШИМ сигнал. Для генерации ШИМ у нас есть готовая функция analogWrite(pin, duty)

  • pin – пин, являющийся выводом таймера. Для Нано/Уно это пины D3, D5, D6, D9, D10, D11. На некоторых платах они помечены * звёздочкой
  • duty – заполнение ШИМ сигнала. По умолчанию все “выходы” ШИМ у нас 8-битные, то есть duty может принимать значение с “разрешением” 8 бит, а это 0-255

Совместим эти знания с прошлым уроком и попробуем менять яркость светодиода, подключенного через резистор к пину D3. Потенциометр подключен к пину A0

Рассмотренный пример меняет яркость светодиода в зависимости от положения рукоятки потенциометра.

Пару слов о “стандартном” ШИМ сигнале – мы получаем его с такими настройками, какие нам даёт библиотека Arduino.h, а настройки эти сильно занижены по сравнению с возможностями Arduino. Про “улучшение” ШИМ мы поговорим позже, а сейчас давайте глянем на характеристики ШИМ “из коробки”:

Таймер
ПиныЧастотаРазрешение
Timer 0D5 и D6976 Гц8 бит (0-255)
Timer 1D9 и D10488 Гц8 бит (0-255)
Timer 2D3 и D11488 Гц8 бит (0-255)

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

Видео


Рейтинг
( Пока оценок нет )
Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: