Pwm или шим (широтно импульсная модуляция) на avr для новичков. часть 1

PWM или ШИМ (широтно импульсная модуляция) на AVR для новичков. Часть 1

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

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

Для начала вспомним, что такое ШИМ. ШИМ сигнал – это импульсный сигнал определенной частоты и скважности:

Частота, это количество периодов за одну секунду. Скважность- отношение длительности импульса к длительности периода. Можно изменять и то и другое, но для управления светодиодами достаточно управлять скважностью. На картинке выше мы видим ШИМ сигнал со скважностью 50 %, так как длительность импульса (ширина импульса) ровно половина от периода.

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

Если мы изменим скважность на 75%, то яркость светодиода будет на 3 четверти от полной, а график будет выглядеть так:

Получается, что мы можем регулировать яркость светодиода от 0 до 100 %. А теперь поговорим о таком параметре ШИМ, как разрешение. Разрешение- это количество градаций (шагов)  регулировки скважности, мы будем рассматривать разрешение в 256 шагов.

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

В микроконтроллерах есть аппаратная поддержка ШИМ и несколько каналов для него, в нашем случае 3. За выдачу ШИМ отвечают определенные выводы МК, в нашем случае OC2, OC1A, OC1B (15,16,17 нога в DIP корпусе). Так же для этого используются таймеры микроконтроллера, в нашем случае TC1, TC2.

Так как же сконфигурировать МК для выдачи сигнала необходимой скважности? Все очень просто, для начала сконфигурируем нужные нам ноги на выход:

PORTB=0x00;
DDRB=0x0E; // 0b00001110

Далее начнем конфигурировать таймеры. Для таймера TC1 нам потребуются два регистра: TCCR1A и TCCR1B. Открываем даташит и читаем как настраиваются эти регистры. Я настроил его на 8 битный сигнал ШИМ, что соответствует разрешению в 256 шагов:

TCCR1A=0xA1;
TCCR1B=0x09;

Для таймера TC2 мы будем использовать регистр TCCR2=0x69;. Его настройка выглядит так:

TCCR2=0x69;

Всё, таймеры сконфигурированы. Скважность будем задавать регистрами OCR1A,OCR1B, OCR2:

Зададим требуемые скважности:

OCR1A=0x32; //50 шагов
OCR1B=0x6A; //106 шагов OCR2=0xF0; //240 шагов

Ну и поместим инкремент и декремент этих регистров в бесконечный цикл:

While(1)
{
OCR1A++;
OCR1B–;
OCR2++; delay_ms(50);
}

Первая тестовая программа готова и выглядит для CVAVR она так:

#include “mega8.h”
#include “delay.h” void main(void)
{
PORTB=0x00;
DDRB=0x0E; // 0b00001110 TCCR1A=0xA1;
TCCR1B=0x09; TCCR2=0x69; OCR1A=0x32; //50 шагов
OCR1B=0x6A; //106 шагов OCR2=0xF0; //240 шагов while (1) { OCR1A++; OCR1B–; OCR2++; delay_ms(50); };
}

Компилируем и пробуем в протеусе:

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

В следующей статье рассмотрим программный ШИМ, который необходим в случае если число аппаратных нам недостаточно или в силу других причин.

Прикрепленные файлы:

Источник: http://cxem.net/mc/mc231.php

Широтно-Импульсная Модуляция (ШИМ, PWM). Урок AVR 8

Источник: http://articles.greenchip.com.ua/1-1-20.html

Программный ШИМ — DRIVE2

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

1.

Шим в циклеТут подход предельно прост: на выходе устанавливается высокий уровень, затем запускается цикл, часто пустой, выдерживающий паузу высокого уровня, затем на порту устанавливается низкий уровень и ещё одна пауза, для удержания низкого уровня. Что-то вроде этого:for(;;) {set_port_high();for (int i = 0; i < duty_cycle; i++) {}set_port_low();for (int i = duty_cycle; i < cycle_len; i++) {}}

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

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

2. Шим в прерыванииЗдесь подход такой: настраивается периодически срабатывающее прерывание, например, по переполнению таймера, или по сравнению, если таймер работает в режиме CTC.

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

Например так:ISR(TIMER0_COMPA_vect) {pwm_counter++;if (pwm_conter >= cycle_len) pwm_counter = 0;if (pwm_counter < duty_cycle1) set_port1_high(); else set_port1_low();if (pwm_counter < duty_cycle2) set_port2_high(); else set_port2_low();}

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

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

В результате скорость ШИМ на несколько порядков ниже частоты работы ядра. Например, при частоте 9,6 МГц, и 7 битном ШИМ (счёт от 0 до 127), скорость ШИМ будет меньше 1 кГц.

Оптимизируем!Одна из очевидных оптимизаций, это не вызывать прерывание в те моменты, когда изменение уровня на порту не предполагается.

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

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

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

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

Но это не упрощает процедуру планирования следующего запуска, а значит всё равно разрешающая способность остаётся довольно низкой.

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

Планируем заранее!Можно заметить, что в цикле ШИМ с N выводами происходит не более N+1 действий: первое действие устанавливает высокие уровни на всех выводах, а последующие N действий устанавливают низкие уровни на тех или иных выводах.Иначе говоря, мы создаём микрокод — массив из описаний действий.

Каждое из действий это:1) перечень логических уровней, которые нужно вывести на порт;2) значение таймера, на которое нужно настроиться для следующего действия.

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

3) признак, что значение таймера нужно ожидать, не выходя из прерывания.

Наконец, мы хотим, чтобы выдаваемые значения ШИМ можно было менять. Но чего точно не хотим, чтобы они менялись посреди цикла ШИМ, или начали выполняться в момент построения микрокода.

https://www.youtube.com/watch?v=Xki0CD3uy0Y

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

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

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

4) признак, что это не последняя операция в микрокоде (т.е. команда продолжать выполнять текущий микрокод)

ПримерчикТут два примера для ATtiny13A. Один — простая демонстрация с использованием 5 ШИМ выводов. Другой отображает температуру на RGB светодиоде. Замер температуры происходит путём сравнения скоростей осцилляторов системного генератора и сторожевого таймера.

Исходники тут:
aterlux.ru/files/SoftPWM.zip (5 ШИМ выводов)
aterlux.ru/files/SoftPWMthermo.zip (замер температуры сравнением скоростей осцилляторов)

Не буду расписывать детали реализации, все комментарии есть в исходниках. Расскажу только то что получилось:1) до 6 ШИМ выходов, с разрешающей способностью в 16 тактов процессора. Т.е. между двумя изменениями уровней может быть всего 16 тактов процессора.2) ШИМ в 128 шагов. Т.е.

вывод значения 0 – «постоянный низкий уровень», 128 – «постоянный высокий уровень». Т.е. частота 1 / 2048 от частоты процессора, и при скорости 9,6 МГц это будет 4,6 кГц.3) Смена уровней на выводах, при одинаковых значениях коэффициентов заполнения, происходит строго одновременно.

Можно также настроить использование нескольких выводов от одного коэффициента, при этом настроить инверсию на некоторые, и добиться работы в противофазе.

4) Можно настроить управление регистром не PORTB, а DDRB, тогда будет работа ШИМ в режиме «открытого стока», как это сделано в примере с измерением температуры.

Использование библиотечкиВ библиотеке три функции:

swpwm_start() — запускает ШИМ.

swpwm_stop() — останавливает ШИМ.
swpwm_update() — компилирует заданные значения коэффициентов заполнения в микрокод.

Для указания коэффициентов заполнения есть массив swpwm[].Т.е. принцип работы такой:Запускаем swpwm_start(), задаём коэффициенты, записывая значения в swpwm[] и применяем их вызовом swpwm_update().

Всё остальное, в исходном коде.

Источник: https://www.drive2.ru/b/484782649219481995/

Шим — широтно-импульсная модуляция

ШИМ или PWM (англ. Pulse-Width Modulation) – широтно-импульсная модуляция – это метод предназначен для контроля величины напряжения и тока. Действие ШИМ заключается в изменении ширины импульса постоянной амплитуды и постоянной частотой.

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

Принцип действия ШИМ

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

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

где:

  • Ton – время высокого уровня
  • Toff – время низкого уровня
  • T – период сигнала

Время высокого уровня и время низкого уровня сигнала показано на нижнем рисунке. Напряжение U1- это состояния высокого уровня сигнала, то есть его амплитуда.

На следующем рисунке представлен пример сигнала ШИМ с определенным временным интервалом высокого и низкого уровня.

Расчет коэффициента заполнения ШИМ

Расчет коэффициента заполнения ШИМ на примере:

Для расчета процентного коэффициента заполнения необходимо выполнить аналогичные вычисления, а результат умножить на 100%:

Как следует из расчета, на данном примере, сигнал (высокого уровня) характеризуется заполнением, равным 0,357 или иначе 37,5%. Коэффициент заполнения является абстрактным значением.

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

Значение T, в нашем примере, следует взять уже в секундах для того, чтобы совпали единицы в формуле. Поскольку, формула частоты имеет вид 1/сек, поэтому 800ms переведем в 0,8 сек.

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

Для вычисления среднего значения напряжения ШИМ необходимо знать коэффициент заполнения, поскольку среднее значение напряжения является произведением коэффициента заполнения и амплитуды напряжения сигнала.
Для примера, коэффициент заполнения был равен 37,5% (0,357) и амплитуда напряжения U1 = 12В даст среднее напряжение Uср:

В этом случае среднее напряжение сигнала ШИМ составляет 4,5 В.

ШИМ дает очень простую возможность понижать напряжение  в диапазоне от напряжения питания U1 и до 0. Это можно использовать, например, для регулировки яркости свечения светодиодов, или скорости вращения двигателя DC (постоянного тока), питающиеся от величины среднего напряжения.

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

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

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

Сигнал ШИМ поступает на базу транзистора VT1 через резистор R1, иначе говоря, транзистор VT1 с изменением сигнала то включается, то выключается. Это подобно ситуации, при которой транзистор можно заменить обычным выключателем, как показано ниже:

Упрощенная схема управления светодиодом.

Когда переключатель замкнут, светодиод питается через резистор R2 (ограничивающий ток) напряжением 12В. А когда переключатель разомкнут, цепь прерывается, и светодиод гаснет. Такие переключения с малой частотой в результате дадут мигающий светодиод.

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

Чем меньше коэффициент заполнения, тем слабее будет светиться светодиод, поскольку во время одного периода светодиод  будет гореть меньшее время.

Такой же принцип и подобную схему можно использовать и для управления двигателем постоянного тока. В случае двигателя необходимо, однако, применять более высокую частоту переключений (выше 15-20 кГц) по двум причинам.

Первая из них касается звука, какой может издавать двигатель (неприятный писк). Частота 15-20 кГц является теоретической границей слышимости человеческого уха, поэтому частоты выше этой границы будут неслышны.

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

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

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

Управляя  двигателем постоянного тока с помощью ШИМ, следует помнить о применении диода для защиты транзистор VТ1 от индукционных всплесков, появляющимся в момент выключения транзистора. Благодаря использованию диода, индукционный импульс разряжается через него и внутреннее сопротивление двигателя, защищая тем самым транзистор.

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

Для сглаживания всплесков питания между клеммами двигателя, можно подключить к ним параллельно конденсатор небольшой емкости (100nF), который будет стабилизировать напряжение между последовательными переключениями транзистора. Это также снизит помехи, создаваемые частыми переключениями транзистора VT1.

Источник: http://www.joyta.ru/7532-shim-shirotno-impulsnaya-modulyaciya/

ATmega16 – PWM с помощью T/C0, T/C1, T/C2

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}
");let k=document.querySelector(".flat_pm_modal[data-id-modal=\""+a.ID+"\"]");if(-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(k,d):jQuery(k).html(b+d),"px"==a.how.popup.px_s)e.bind(h,()=>{e.scrollTop()>a.how.popup.after&&(e.unbind(h),f.unbind(i),j())}),void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{e.unbind(h),f.unbind(i),j()});else{let b=setTimeout(()=>{f.unbind(i),j()},1e3*a.how.popup.after);void 0!==a.how.popup.close_window&&"true"==a.how.popup.close_window&&f.bind(i,()=>{clearTimeout(b),f.unbind(i),j()})}f.on("click",".flat_pm_modal .flat_pm_crs",()=>{jQuery.arcticmodal("close")})}if(void 0!==a.how.outgoing){let b,c="0"==a.how.outgoing.indent?"":" style=\"bottom:"+a.how.outgoing.indent+"px\"",e="true"==a.how.outgoing.cross?"":"",f=jQuery(window),g="scroll.out"+a.ID,h=void 0===flatPM_getCookie("flat_out_"+a.ID+"_mb")||"false"!=flatPM_getCookie("flat_out_"+a.ID+"_mb"),i=document.createElement("div"),j=jQuery("body"),k=()=>{void 0!==a.how.outgoing.cookie&&"false"==a.how.outgoing.cookie&&h&&(jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show"),j.on("click",".flat_pm_out[data-id-out=\""+a.ID+"\"] .flat_pm_crs",function(){flatPM_setCookie("flat_out_"+a.ID+"_mb",!1)})),(void 0===a.how.outgoing.cookie||"false"!=a.how.outgoing.cookie)&&jQuery(".flat_pm_out[data-id-out=\""+a.ID+"\"]").addClass("show")};switch(a.how.outgoing.whence){case"1":b="top";break;case"2":b="bottom";break;case"3":b="left";break;case"4":b="right";}jQuery("body > *").eq(0).before("
"+e+"
");let m=document.querySelector(".flat_pm_out[data-id-out=\""+a.ID+"\"]");-1===d.indexOf("go"+"oglesyndication")?flatPM_setHTML(m,d):jQuery(m).html(e+d),"px"==a.how.outgoing.px_s?f.bind(g,()=>{f.scrollTop()>a.how.outgoing.after&&(f.unbind(g),k())}):setTimeout(()=>{k()},1e3*a.how.outgoing.after),j.on("click",".flat_pm_out .flat_pm_crs",function(){jQuery(this).parent().removeClass("show").addClass("closed")})}countMode&&(flat_count["block_"+a.ID]={},flat_count["block_"+a.ID].count=1,flat_count["block_"+a.ID].click=0,flat_count["block_"+a.ID].id=a.ID)}catch(a){console.warn(a)}}function flatPM_start(){let a=flat_pm_arr.length;if(0==a)return flat_pm_arr=[],void jQuery(".flat_pm_start, .flat_pm_end").remove();flat_body=flat_body||jQuery("body"),!flat_counter&&countMode&&(flat_counter=!0,flat_body.on("click","[data-flat-id]",function(){let a=jQuery(this),b=a.attr("data-flat-id");flat_count["block_"+b].click++}),flat_body.on("mouseenter","[data-flat-id] iframe",function(){let a=jQuery(this),b=a.closest("[data-flat-id]").attr("data-flat-id");flat_iframe=b}).on("mouseleave","[data-flat-id] iframe",function(){flat_iframe=-1}),jQuery(window).on("beforeunload",()=>{jQuery.isEmptyObject(flat_count)||jQuery.ajax({async:!1,type:"POST",url:ajaxUrlFlatPM,dataType:"json",data:{action:"flat_pm_ajax",data_me:{method:"flat_pm_block_counter",arr:flat_count}}})}).on("blur",()=>{-1!=flat_iframe&&flat_count["block_"+flat_iframe].click++})),flat_userVars.init();for(let b=0;bflat_userVars.textlen||void 0!==a.chapter_sub&&a.chapter_subflat_userVars.titlelen||void 0!==a.title_sub&&a.title_subc&&cc&&c>d&&(b=flatPM_addDays(b,-1)),b>e||cd||c-1!=flat_userVars.referer.indexOf(a))||void 0!==a.referer.referer_disabled&&-1!=a.referer.referer_disabled.findIndex(a=>-1!=flat_userVars.referer.indexOf(a)))&&(c=!0),c||void 0===a.browser||(void 0===a.browser.browser_enabled||-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser))&&(void 0===a.browser.browser_disabled||-1==a.browser.browser_disabled.indexOf(flat_userVars.browser)))){if(c&&void 0!==a.browser&&void 0!==a.browser.browser_enabled&&-1!=a.browser.browser_enabled.indexOf(flat_userVars.browser)&&(c=!1),!c&&(void 0!==a.geo||void 0!==a.role)&&(""==flat_userVars.ccode||""==flat_userVars.country||""==flat_userVars.city||""==flat_userVars.role)){flat_pm_then.push(a),flatPM_setWrap(a),flat_body.hasClass("flat_pm_block_geo_role")||(flat_body.addClass("flat_pm_block_geo_role"),flatPM_ajax("flat_pm_block_geo_role")),c=!0}c||(flatPM_setWrap(a),flatPM_next(a))}}}let b=jQuery(".flatPM_sticky");b.each(function(){let a=jQuery(this),b=a.data("height")||350,c=a.data("top");a.wrap("
");let d=a.parent()[0];flatPM_sticky(this,d,c)}),debugMode||countMode||jQuery("[data-flat-id]:not([data-id-out]):not([data-id-modal])").contents().unwrap(),flat_pm_arr=[],jQuery(".flat_pm_start, .flat_pm_end").remove()}

Опубликовано 2010-04-25 15:30:54 автором Ruslan

Наверное, вы не раз задавались вопросом, как можно регулировать мощность потребителя, например управлять яркостью светодиода или регулировать обороты двигателя. Самый простой способ – последовательно нагрузке, например светодиоду, включить резистор, но ведь он будет греться и забирать драгоценную энергию, и чем мощней светодиод, тем сильней будет греться наш резистор, такой вариант не для нас. А что если светодиод очень быстро включать и выключать, при этом меняя длительность включений при константной частоте? Например, включать светодиод на 0,2 милисекунди каждую милисекунду, то светодиод засветится, но не на полную яркость. Аналогично с двигателем – включать движок на 30 секунд каждую минуту – тогда двигатель раскрутится, но не на полную скорость — относительно большой вес ротора сгладит рывки от включающегося двигателя, а сопротивление от трения будет его притормаживать. Таким образом, двигатель будет крутится на половину своей мощности. – приближение желаемого сигнала (многоуровневого или непрерывного) к действительным бинарным сигналам (с двумя уровнями – вкл / выкл), так, что, в среднем, за некоторый отрезок времени, их значения равны.

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

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

Основное преимущество ШИП – высокий КПД его усилителей мощности, который достигается за счет использования исключительно в ключевом режиме. Это значительно уменьшает выделение мощности на силовом преобразователе (СП).

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

С помощью задания скважности (длительности импульсов) можно менять среднее напряжение на выходе ШИМ.

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

Самое главное находится в прошивке:

void main(void)
{ PORTB=0x00; //Выставляем все выходы порта B на 0
DDRB=0xFF; //Делаем порт B как выход, чтобы мы могли менять лог уровень на ножках (устанавливать или 0 или 1)
while (1) //Организовываем бесконечный цикл { PORTB.1=1; //Включаем светодиод на 1 выходе порта B delay_us(5); //разрешаем светодиоду посветится 5 микросекунд PORTB.1=0; //Выключаем светодиод на 1 выходе порта B delay_us(5); //Делаем задержку на 5 микросекунд };
}

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

Апаратный ШИМ

Таймер может генерировать ШИМ в нескольких режимах:

  • Phase Correct PWM (симметричный ШИМ)В этом режиме таймер считает от нуля до определенного значения в зависимости от режима, а потом считает в обратном направлении до нуля.Вывод OCxx при первом совпадении с регистром сравнения сбрасывается, при втором устанавливается.
  • Fast PWM (быстрый ШИМ)В этом режиме таймер работает так:
    • увеличивает переменную TCNTX от 0 до top, при переполнении TCNTX она сбрасывается в 0, и счет начинается снова.
    • при каждом увеличении TCNTX проверяет, не равен ли он регистру сравнения OCRXA/OCRXB, если равен, то соответствующий ему вывод ОСхх сбрасываeтся в ноль. При обнулении счетчика этот вывод устанавливается в 1

  • СТС (сброс при совпадении)

    Таймер тикает от 0 до регистра сравнения, при совпадении с регистром сравнения сбрасывается в 0. Этот режим хорошо подходит для регулировки частоты, или когда нужно отсчитывать периоды.

Итак, для наших нужд (регулировка яркости светодиода) подходит режим Fast PWM. Запускаем CodeWizard AVR, переходим на вкладку timers->timer1, выставляем все, как показано на скриншоте

здесь:

  • Clock Source – выбор источника тактирования таймера, выбираем System Clock – таймер тактируeтся частотой, на которой работает микроконтроллер
  • Clock Value – выбор частоты работы таймера, здесь мы установили 1000000 hz, это значит, что переменная TCNT1 будет переполнятся с частотой 1000000/255 = 3921 hz, частота ШИМ будет 3921 khz
  • out A (вывод А) определяет состояния ножки OC1A при совпадении счетного регистра и регистра сравнения
  • Comp. A значение регистра сравнения

Кликаем File->Generate and save.

#include void main(void)
{
// Port B initialization
PORTB=0x00;
DDRB=0x02; // Timer/Counter 1 initialization
TCCR1A=0x81;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x64;// число 100 в шестнадцатеричном виде
OCR1BH=0x00;
OCR1BL=0x00; while (1) { };
}

Компилим и закидаем в мк, теперь наш светодиод должен светиться примерно на половину яркости. Давайте теперь попробуем что-нибудь пропищать с помощью таймера:

Схема подключения динамика к мк:

Таймер мы установим в режим Fast PWM и будем плавно менять частоту от 0 – 4 khz.
Код такой программы выглядит следующим образом:

В статье описаны методы запуска и формирования PWM (Pulse-Width Modulation, или по-русски ШИМ) в микроконтроллерах AVR с помощью встроенных таймеров/счетчиков T/C0, T/C1 и T/C2. ШИМ широко применяется для цифро-аналогового преобразования, генерации сигналов произвольной формы, регулирования.

[Использование T/C0]

1. T/C0 является 8-восьмибитным, сам счетчик находится в регистре TCNT0.

При переполнении (переход 0xFF->0x00) может генерироваться прерывание TIMER0_OVF (Timer/Counter0 Overflow, флаг TOV0).

Это прерывание запрещается (маскируется) битом TOIE0 (бит 0 регистра TIMSK). Флаг TOV0 автоматически очищается при выполнении процедуры прерывания.

2. Для счетчика TCNT0 определены 3 специальных значения, по которым могут происходить определенные события:

   BOTTOM == 0x00    MAX == 0xFF

   TOP == MAX или OCR0

3. TCNT0 может считать как вверх (инкрементироваться), так и вниз (декрементироваться). Это определяется выбранным режимом работы.

4. Для TCNT0 источник тактирования и его частота выбирается битами CS02:0 (биты 0..2 регистра TCCR0). Можно даже совсем запретить работу TCNT0 (записав в CS02:0 все нули).

5. Имеется 8-битный регистр OCR0 – регистр цифрового компаратора. При совпадении TCNT0 == OCR0 устанавливается Output Compare Flag (OCF0) и может генерироваться прерывание TIMER0_COMP (Timer/Counter0 Compare Match).

Флаг OCF0, как водится, автоматически очищается при выполнении процедуры прерывания. Прерывание TIMER0_COMP запрещается (маскируется) битом OCIE0 (бит 1 регистра TIMSK). Кроме того, это событие может генерировать аппаратный PWM-сигнал на выводе OC0 процессора (ножка 4 корпуса DIP40, порт PB3).

Сигнал Timer/Counter0 Compare Match используется генератором сигнала PWM.

6. Тип PWM выбирается битами Waveform Generation Mode – WGM01:0 (биты 3 и 6 регистра TCCR0 соответственно). От них также зависит, когда устанавливается флаг The Timer/Counter Overflow (TOV0). По этому флагу может генерироваться прерывание TIMER0_OVF. Всего существует 4 режима:

Mode WGM01(CTC0) WGM00(PWM0) Режим T/C0 TOP ИзменениеOCR0 УстановкаTOV0
Normal (не PWM) 0xFF сразу MAX
1 1 Phase Correct PWM 0xFF TOP BOTTOM
2 1 CTC (не PWM) OCR0 сразу MAX
3 1 1 Fast PWM 0xFF BOTTOM MAX

Примечание: имена бит CTC0 и PWM0 устарели. Вместо них используйте имена WGM11:0. Однако функционал и размещение этих бит совместим с предыдущей версией таймера.

7. Генератор PWM использует сигнал OCF0 (Timer/Counter0 Compare Match) и установки битов WGM01:0 и Compare Output mode (COM01:0, биты 5 и 4 регистра TCCR0), а также сигналы BOTTOM и TOP.

8. Бит Force Output Compare (FOC0) может принудительно изменить состояние ножки OC0 процессора, при этом счетчик не сбрасывается и прерывание не генерируется.

9. Состояние ножки 4 OC0 принудительно переключается в режим PWM, если установлен хотя бы один бит COM01:0, однако вход будет ножка 4 или выход, по прежнему определяется регистром DDR, поэтому регистр DDR надо обязательно настроить на выход перед включением режима PWM.

10. Режим Normal, не PWM (WGM01:0 = 0), влияние события Compare Match на ножку 4 OC0:

COM01 COM00 Описание
Нормальная работа порта PB3, OC0 отсоединен.
1 Переключение OC0 в противоположное состояние при событии compare match.
1 Сброс OC0 при событии compare match.
1 1 Установка OC0 при событии compare match.

Режим Normal самый простой – в этом режиме TCNT0 всегда считает в инкремент (вверх, в сторону увеличения), и не происходит очистка TCNT0.

При переполнении (переход 0xFF->0x00) Timer/Counter Overflow Flag (TOV0) устанавливается в 1, и возможен вызов прерывания TIMER0_OVF. Флаг TOV0 работает как девятый бит с тем отличием, что он только устанавливается.

Однако можно программно увеличить разрядность таймера, если использовать вызов прерывания TIMER0_OVF (при этом TOV0 автоматически очищается).

11. В режиме Clear Timer on Compare или CTC mode (WGM01:0 = 2), регистр OCR0 используется для изменения разрешения (диапазона счета) счетчика TCNT0 – счетчик сбрасывается в ноль, когда он равен OCR0.

Таким образом, OCR содержит предельную величину TOP счетчика, что определяет его разрешающую способность. В момент достижения счетчиком величины TOP может генерироваться прерывание (по флагу OCF0). В обработчике прерываний можно изменить величину TOP в регистре OCR0.

Нужно быть внимательным с малыми величинами OCR, иначе возможна потеря срабатывания компаратора, и счетчик продолжит считать до 0xFF.    Режим CTC хорош для генерирования меандра, для этого выход OC0 включается в режим переключения (COM01:0 = 1).

Максимальная частота будет равна fOC0 = fclk_IO/2, когда OCR0==0x00. Общая формула вычисления частоты

   fOC0 = fclk_IO / (2 * N * (1 + OCR0)), где N равен коэффициенту деления (prescale factor 1, 8, 64, 256, или 1024).

   Флаг TOV0 устанавливается MAX -> 0x00.

12. Fast PWM Mode, влияние события Compare Match на ножку 4 OC0:

COM01 COM00 Описание
Нормальная работа порта PB3, OC0 отсоединен.
1 Зарезервировано.
1 Сброс OC0 при событии compare match, установка при BOTTOM (PWM без инверсии).
1 1 Установка OC0 при событии compare match, сброс при BOTTOM (PWM с инверсией).

Этот режим генерирует в 2 раза бОльшую частоту, чем режим Phase Correct PWM Mode. Как работает Fast PWM Mode, понятно из таблицы. Остается добавить, что Timer/Counter Overflow Flag (TOV0) устанавливается, когда TCNT0 достигает MAX (0xFF). Общая формула вычисления частоты PWM:

   fOC0PWM = fclk_IO / N * 256, где N равен коэффициенту деления (prescale factor 1, 8, 64, 256, или 1024).

13. Phase Correct PWM Mode, влияние события Compare Match на ножку 4 OC0:

COM01 COM00 Описание
Нормальная работа порта PB3, OC0 отсоединен.
1 Зарезервировано.
1 Сброс OC0 при событии compare match когда счет вверх, установка при счете вниз (PWM без инверсии).
1 1 Установка OC0 при событии compare match когда счет вверх, сброс при счете вниз (PWM с инверсией).

Режим отличается вдвое меньшей частотой PWM, но имеет более высокое качество формирования сигнала, вплоть до предельных значений OCR0 (0x00 и 0xFF). Режим хорошо подходит для управления моторами.

В этом режиме TCNT0 сначала считает вверх, достигает 0xFF, потом начинает считать вниз, достигает 0x00, начинает считать вверх и процесс повторяется.

Timer/Counter Overflow Flag (TOV0) устанавливается каждый раз, когда TCNT0 достигает BOTTOM (0x00). Общая формула вычисления частоты PWM:

   fOC0PWM = fclk_IO / N * 510, где N равен коэффициенту деления (prescale factor 1, 8, 64, 256, или 1024).

14. При работе от внутренней тактовой частоты 1 МГц (значение по умолчанию) максимальная частота ШИМ в режиме fast PWM будет равна
1000000/256 = 3906,25 Гц.

Такая частота подойдет для медленно меняющихся процессов. Если поднять тактовую частоту до 8 МГц (для этого надо записать fuses CKSEL3..0 в значение 0100), то частота ШИМ будет
8000000/256 = 31250 Гц

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

15. Пример настройки PWM в режиме fast PWM:

//Скважность импульсов будет 50%: OCR0 = 127;//Очистка OC0 при compare match (1

Источник: http://microsin.net/programming/avr/atmega16-pwm-howto.html

ШИМ-контроллер: схема, принцип работы, управление :

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

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

В этом режиме получается достичь коэффициента полезного действия около 75-80% и более.

Что такое ШИМ?

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

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

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

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

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

Формирование ШИМ-сигналов

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

Стандартная схема контроллера ШИМ предполагает наличие следующих выходов:

  • Общий вывод (GND). Он реализуется в виде ножки, которая подключается к общему проводу схемы питания устройства.
  • Вывод питания (VC). Отвечает за электропитание схемы. Важно не спутать его с соседом с похожим названием – выводом VCC.
  • Вывод контроля питания (VCC). Как правило, чип контроллера ШИМ принимает на себя руководство силовыми транзисторами (биполярными либо полевыми). В случае если напряжение на выходе снизится, транзисторы станут открываться лишь частично, а не целиком. Стремительно нагреваясь, они в скором времени выйдут из строя, не справившись с нагрузкой. Для того чтобы исключить такую возможность, необходимо следить за показателями напряжения питания на входе микросхемы и не допускать превышения расчетной отметки. Если напряжение на данном выводе опускается ниже установленного специально для этого контроллера, управляющее устройство отключается. Как правило, данную ножку соединяют напрямую с выводом VC.

Выходное управляющее напряжение (OUT)

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

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

Существуют и аналоги ШИМ-контроллеров для управления однотактными (одноплечевыми) каскадами (примеры: прямой/обратный, повышающий/понижающий, инвертирующий).

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

Для быстрого закрытия необходимо добиться быстрой разрядки емкостей “затвор – исток” и “затвор – сток”.

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

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

Ещё о функциях контроллеров ШИМ

Задумав спроектировать контроллер ШИМ своими руками, необходимо как следует продумать все детали его реализации. Только так можно создать работающее устройство. Кроме вышеуказанных выходов, работа ШИМ-контроллера подразумевает наличие следующих функций:

  • Опорное напряжение (VREF). Фабричные изделия для удобства обычно дополняются функцией выработки стабильного опорного напряжения. Специалисты заводов-изготовителей рекомендуют соединять данный вывод с общим проводом через емкость не менее 1 мкФ для повышения качества и возможности стабилизации опорного напряжения.
  • Ограничение тока (ILIM). Если показатели напряжения на данном выводе существенно превышают установленное (как правило, около 1 В), то контроллер автоматически закрывает силовые ключи. В случаях, когда показатель напряжения превышает второе пороговое значение (в пределах 1,5-2 В), устройство тут же обнуляет напряжение на подключении к мягкому старту.
  • Мягкий старт (SS). Показатель напряжения на данном выходе определяет максимально допустимую ширину будущих модулируемых импульсов. На данный вывод подает ток установленной величины. Если между ним и всеобщим кабелем вмонтировать дополнительную емкость, то она будет медленно, но уверенно заряжаться, что приведет к постепенному расширению каждого импульса от минимума вплоть до окончательного расчетного значения. Благодаря этому можно обеспечить плавное, а не стремительное нарастание величин тока и напряжения в общей схеме устройства, благодаря чему такая система и заслужила свое название “мягкий старт”. При этом, если специально ввести ограничение по напряжению на данном выводе, допустим, подключив делитель напряжения и систему диодов, можно и вовсе ограничить превышение импульсами некоего задаваемого значения ширины.

Частота работы устройств, синхронизация

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

  • Резистор и емкость, задающие частоту работы всего устройства (RT, CT). Каждый контроллер может работать лишь на определенно заданной частоте. Каждый из импульсов следует лишь с этой частотой. Устройство может менять длительность импульсов, их форму и протяженность, но только не частоту. На практике это означает, что чем меньше протяженность импульса, тем длительнее пауза между ним и следующим. При этом частота следования всегда неизменна. Емкость, подключенная между ножкой CT и общим кабелем, и резистор, подключенный к выходу RT и общему кабелю, в комбинации могут задавать частоту, на которой будет работать контроллер.
  • Синхроимпульсы (CLOCK). Весьма распространены случаи, в которых требуется отладить работу нескольких контроллеров так, чтобы выходные сигналы формировались синхронно. Для этого к одному из контроллеров (как правило, ведущему) требуется подключить частотозадающие емкость и резистор. На выходе CLOCK контроллера сразу же появятся короткие импульсы, соответствующие напряжению, которые подаются на аналогичные выходы всей группы устройств. Их принято называть ведомыми. Выводы RT таких контроллеров следует объединить с ножками VREF, а CT – с общим кабелем.
  • Напряжение сравнения (RAMP). На этот вывод следует подавать сигнал пилообразной формы (напряжение). При возникновении синхроимпульса на выходе устройства образуется открывающее контрольное напряжение. После того как показатель напряжения на RAMP становится больше в несколько раз, чем величина выходного напряжения на усилителе ошибки, на выходе можно наблюдать импульсы, отвечающие закрывающему напряжению. Длительность импульса может рассчитывать от момента возникновения синхроимпульса вплоть до момента многократного превышения показателя напряжения на RAMP над величиной выходного напряжения усилителя ошибки.

ШИМ-контроллеры в составе блоков питания

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

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

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

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

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

ШИМ-контроллеры для блоков питания дают возможность стабилизировать схему, а также воплотить множество дополнительных функций.

Составляющие схемы блоков питания с ШИМ-контроллерами

Типовая схема состоит из генератора импульсов, в основе которого лежит ШИМ-контроллер.

Широтно-импульсная модуляция дает возможность собственноручно контролировать амплитуду сигнала на выходе ФНЧ, изменяя при необходимости длительность импульса или его скважность.

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

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

ШИМ-контроллеры для источников питания большой мощности могут иметь также элементы управления выходным ключом (драйверы). В качестве выходных ключей рекомендуется использовать IGBT-транзисторы.

Основные проблемы ШИМ-преобразователей

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

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

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

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

Диагностика неисправностей

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

Кроме того, существуют и другие неисправности, которые несколько сложнее обнаружить. Перед тем как проверить ШИМ-контроллер непосредственно, можно рассмотреть самые распространенные случаи поломок. К примеру:

  • Контроллер глохнет после старта – обрыв петли ОС, перепад по току, проблемы с конденсатором на выходе фильтра (если таковой имеется), драйвером; возможно, разладилось управление ШИМ-контроллером. Надо осмотреть устройство на предмет сколов и деформаций, замерить показатели нагрузки и сравнить их с типовыми.
  • ШИМ-контроллер не стартует – отсутствует одно из входных напряжений или устройство неисправно. Может помочь осмотр и замер выходного напряжения, в крайнем случае, замена на заведомо рабочий аналог.
  • Напряжение на выходе отличается от номинального – проблемы с петлей ООС или с контроллером.
  • После старта ШИМ на БП уходит в защиту при отсутствии КЗ на ключах – некорректная работа ШИМ или драйверов.
  • Нестабильная работа платы, наличие странных звуков – обрыв петли ООС или цепочки RC, деградация емкости фильтра.

В заключение

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

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

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

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

Источник: https://www.syl.ru/article/181948/new_shim-kontroller-shema-printsip-rabotyi-upravlenie

Широтно Импульсная Модуляция (ШИМ, PWM) — DRIVE2

Все микропроцессоры работают с цифровыми сигналами, т.е. с логическим нулем (0 В), или логической единицей (5 В или 3.3 В). Поэтому микропроцессор не может сформировать на выходе промежуточное напряжение. Использование для этих целей внешних ЦАП (www.drive2.ru/b/2558751/) — сложно и задействует сразу много ножек микропроцессора, что неудобно.

В этих случаях применяют Широтно-импульсную модуляцию (ШИМ, англ. pulse-width modulation (PWM)) — процесс управления мощностью, подводимой к нагрузке, путём изменения скважности импульсов, при постоянной частоте. Широтно-импульсная модуляция представляет собой периодический импульсный сигнал.Существуют цифровые и аналоговые ШИМ.

Принцип их работы остается одинаковым вне зависимости от исполнения и заключается в сравнении двух видов сигналов:Uоп – опорное (пилообразное, треугольное) напряжение;Uупр – входное постоянное напряжение.Cигналы поступают на компаратор, где они сравниваются, а при их пересечении возникает / исчезает (или становится отрицательным) сигнал на выходе ШИМ.

Выходное напряжение Uвых ШИМ имеет вид импульсов, изменяя их длительность, мы регулируем среднее значение напряжения (Ud) на выходе ШИМ:

Скважность сигнала при однополярной ШИМ

Однополярная модуляция означает, что происходит формирование импульсов только положительной величины и имеет место нулевое значение напряжения

Скважность импульсов

Если сформированный таким образом сигнал подать на объект, обладающий фильтрующими свойствами, например, на двигатель постоянного тока или лампу накаливания, то объект будет использовать среднюю мощность сигнала.Т.е.

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

Преимущество использования ШИМ — это легкость изменения величины напряжения при минимальных потерях.

Параметры ШИМ

Период тактирования T определяет через какие промежутки времени подаются импульсы.

Длительность импульса — величина показівающая время в течении которого подается сигнал t, с;

Скважность — Соотношение длины импульса (τ) к периоду тактирования (T); пропорционально модулирующей величине. Коэффициент заполнения обычно отображают в процентах (%).

Коэффициент заполнения D – величина обратная скважности.Несмотря на то, что скважность и коэффициент заполнения могут использоваться в одинаковом контексте, физический смысл их отличается.

Эти величины безразмерны.

PS ШИМ может быть реализован не только при помощи микроконтроллеров, но и на аналоговой базе. Например, простейший ШИМ на основе мультивибратора из двух транзисторов:

описание его работы здесь — cxem.net/house/1-277.php
Моя версия этого регулятора — www.drive2.ru/b/456409476786815382/

Источник: https://www.drive2.com/b/2558797/

Режим ШИМа (PWM) В МК AVR

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

Для перевода таймера;счетчика Т1 в режим ШИМа и задания частоты ШИМ-сигнала используют разряды PWMlliPWMlO регистра управления таймером TCCR1A. Соответствие между состоянием этих разрядов и режимом работы таймера;счетчика Т1 приведено в табл. 4.7.

Таблица 4.7. Управление режимом ШИМа таймера;счетчика Т1

PWM11

PWM10

Описание

Режим ШИМа таймера;счетчика выключен

1

8-разрядный ШИМ

1

9-разрядный ШИМ

1

1

10-разрядный ШИМ

Для генерации ШИМ-сигнала используется схема сравнения таймера;счетчика, поэтому в микроконтроллерах АТх8515 модулятор является сдвоенным (два регистра сравнения). Названия регистров сравнения и правила обращения к ним были описаны ранее. Сигнал снимается с выхода схемы сравнения таймера;счетчика.

В рассматриваемом режиме счетчик TCNT1 функционирует как реверсивный, модуль счета которого (ТОР) зависит от режима работы модулятора. Частота ШИМ-сигнала зависит от частоты тактового сигнала fjcKX таймера;счетчика Т1 и модуля счета ШИМа. Значение модуля счета и частота ШИМ-сигнала для каждого режима работы модулятора приведены в табл. 4.8.

Таблица 4.8. Режимы ШИМа

При работе таймера;счетчика Т1 в режиме ШИМа состояние счетчика меняется от О до значения ТОР, а затем снова до О, после чего цикл повторяется.

При равенстве состояния счетчика и содержимого регистра сравнения состояние соответствующего этому регистру вывода микроконтроллера изменяется согласно табл. 4.9 (х обозначает А или В).

Таким образом, длительность ШИМ- сигнала равна 2п1;тски где п – содержимое регистра сравнения.

Таблица 4.9. Поведение выходов схемы сравнения в режиме ШИМа

COMlxl

СОМ 1×0

Поведение вывода ОС 1 х

Таймер;счетчик Т1 отключен от вывода

1

Таймер;счетчик Т1 отключен от вывода

1

Сбрасывается в 0 при прямом счете и устанавливается в 1 при обратном (неинвертирован- ный ШИМ-сигнал)

1

1

Устанавливается в 1 при прямом счете и сбрасывается в 0 при обратном (инвертированный ШИМ-сигнал)

Соответственно если в регистр сравнения записать значение О или ТОР, то при следующем совпадении состояния счетчика и содержимого регистра сравнения выход схемы сравнения переключится в устойчивое состояние согласно табл. 4.10 (х = А или В).

Таблица 4.10. Устойчивые состояния выхода схемы сравнения

COMlxl

СОМ 1×0

Регистр OCR 1х

Состояние вывода OClx

1

1

ТОР

1

1

1

1

1

1

ТОР

Особенностью работы таймера;счетчика Т1 в режиме ШИМа является то, что при записи в регистр сравнения младшие 10 разрядов записываемого числа на самом деле сохраняются в специальном временном регистре.

Изменение содержимого регистра сравнения происходит только в момент достижения счетчиком максимального значения ТОР.

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

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

При работе таймера;счетчика Т1 в режиме ШИМа может генерироваться прерывание по переполнению счетчика, а также прерывание от схемы сравнения.

Флаги прерываний устанавливаются в 1 при изменении счетчиком направления счета: флаг ТОVI – в точке О, а флаги 0CF1A (для регистра 0CR1A) и 0CF1B (для регистра 0CR1B) – в точке ТОР.

Разрешение и обработка соответствующих прерываний выполняются как обычно.

Источник: http://nauchebe.net/2011/02/rezhim-shima-pwm-v-mk-avr/