Многоканальный программный ШИМ в AVR. Программная ШИМ (PWM)

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

1. Принцип генерации аналогового сигнала с помощью ШИМ (PWM)

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


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

1.1 Характеристики сигнала

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

Минимальный шаг изменения аналогового сигнала (разрешение) будет определяться выражением:


dUa = Umax/2^n,


где Umax максимальная амплитуда аналогового сигнала (В), а n - разрядность счетчика реализующего ШИМ.

Например, ШИМ сигнал формируется с помощью программного 8-ми разрядного счетчика. Количество градаций ШИМ сигнала, которые можно получить с помощью этого счетчика, равно 2^8 = 256. Тогда разрешение аналогового сигнала при Umax = 5 В будет равно


dUa = 5/256 = 0,0195 В.


Частота ШИМ сигнала будет определять так:


Fpwm = Fcpu/(K*2^n),


где Fcpu - тактовая частота микроконтроллера (Гц), K - коэффициент предделителя счетчика, n - разрядность счетчика.

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

Fpwm = 8000000/(8*256) = ~3906 Гц


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

Fa = Fpwm/Ns = Fcpu/(K*2^n*Ns),


где Fpwm - частота ЩИМ сигнала, а Ns - количество отсчетов аналогового сигнала.

Например, ШИМ сигнал реализуется на 8-ми разрядном счетчике с коэффициентом предделителя равным 8 и тактовой частотой микроконтроллера 8 МГц. В памяти микроконтроллера записано 32 отсчета синусоидального сигнала, которые представляют собой один его период. Тогда частота выходной синусоиды будет равна:

Fa = 8000000/(8*2^8 * 32) = ~122 Гц

Разрядность ЦАП`a сделанного на основе ШИМ эквивалентна разрядности используемого счетчика.

1.2 Аппаратная реализация ШИМ

Все современные микроконтроллеры имеют в своем составе таймеры/счетчики. Один или несколько режимов этих таймеров предназначены для генерации ШИМ сигнала. Как правило этот сигнал генерируется на специальных выводах. Например, у микроконтроллера mega16 фирмы Atmel 8-ми разрядный таймер/счетчик Т0 имеет два режима генерации ШИМ сигнала (быстрый ШИМ и ШИМ с точной фазой), а для вывода сигнала используется пин порта B - OC0 (PINB3).

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

1.3 Программная реализация ШИМ

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

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

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

Ниже приведен пример кода, который выполняет функцию генерацию аналогового сигнала с помощью аппаратной и программной широтно-импульсной модуляции. Код написан для микроконтроллера atmega16, тактовая частота 8 МГц, компилятор IAR. На выходах PB2 и PB3 генерируются две синусоиды (разной частоты) из 32 двух отсчетов.


#include
#include
#include

#define SPWM_PIN 2

//таблица синуса
__flash uint8_t tableSin =
{
152,176,198,218,234,245,253,255,
253,245,234,218,198,176,152,128,
103, 79, 57, 37, 21, 10, 2, 0,
2, 10, 21, 37, 57, 79,103,128
};

uint8_t softCount = 0;
uint8_t softComp = 0;

int main(void)
{
//настройка портов
PORTB = 0;
DDRB = 0xff;

//разрешение прерывания по совпадению Т0
TIMSK = (1< //режим FastPWM, неинв. шим сигнал, предделитель 8
TCCR0 = (1< (0<

//обнуляем счетный регистр
TCNT0 = 0;
OCR0 = 0;

Enable_interrupt();
while(1);
return 0;
}

//прерывание таймера Т0
#pragma vector = TIMER0_COMP_vect
__interrupt void Timer0CompVect(void)
{
static uint8_t i = 0;
static uint8_t j = 0;

OCR0 = tableSin[i];
i = (i + 1) & 31;

//программный ШИМ
softCount++;
if (softCount == 0){
PORTB |= (1< softComp = tableSin[j];
j = (j + 1) & 31;
}

If (softCount == softComp){
PORTB &= ~(1< }
}

1.4 Фильтр для ШИМ

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

Рассмотрим пример. ШИМ сигнал генерируется аппаратным 8-ми разрядным счетчиком с коэффициентом предделителя равным 8, тактовая частота микроконтроллера 8МГц, количество отсчетов аналогового сигнала - 32.

Частота ШИМ сигнала будет равна:

Fpwm = Fcpu/(K*2^n) = 8000000/(8*256) = ~3906 Гц

Частота аналогового сигнала будет равна:

Fa = Fpwm/Ns = 3906/32 = 122 Гц

Выберем частоту среза равную 200 Гц и рассчитаем номиналы пассивного низкочастотного RC фильтра. Частота среза такого фильтра определяется выражением:

Fc = 1/(2*Pi*R*C),

где R - номинал резистора (Ом), а C -емкость конденсатора (Ф).

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


C = 1/(2*Pi*Fc*R) = 1/(6.28 * 1000*200) = ~0.8 мкФ


Выбираем ближайшее значение из ряда E12 - 0.82 мкФ. При таких номиналах фильтра мы получим уже похожий аналоговый сигнал.

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

26 сентября 2012 в 13:36

Многоканальный программный ШИМ в AVR

  • Разработка под Arduino

Что такое ШИМ и как он работает особо подробно расписывать не буду, информацию без труда найдёте на просторах интернета. Коснусь лишь общих понятий. ШИМ - это Широтно-Импульсная Модуляция, (по-английски PWM - Pulse Width Modulation) уже из самого названия ясно, что здесь что-то связанное с импульсами и их шириной. Если изменять ширину (длительность) импульсов постоянной частоты, то можно управлять, например, яркостью источника света, скоростью вращения вала электродвигателя или температурой какого-либо нагревательного элемента. Обычно, именно с помощью ШИМ микроконтроллер управляет подобной нагрузкой. Микроконтроллеры имеют аппаратную реализацию ШИМ, но, к сожалению, количество аппаратных ШИМ-каналов ограничено, например, в AТmega88 их аж шесть штук, в ATtiny2313 - четыре, в ATmega8 - три, а в ATtiny13 только два. В AVR ШИМ-каналы используют таймеры и их регистры сравнения OCRxx. Изменяя их содержимое и задавая параметры таймеров, в зависимости от задач, можно управлять состоянием, связанного с регистром, выхода - подавать на него 1 либо 0. То же самое можно организовать программно, управляя любым выводом контроллера, а главное, реализовать большее количество ШИМ-каналов, чем имеется на борту аппаратных. Практически, количество каналов ограничено лишь количеством ножек-выводов микроконтроллера (по крайней мере, если говорить о семействах Mega или Tiny). Как оказалось, алгоритм довольно прост, но у меня ушло некоторое время на его понимание и полное осознание.

Данный алгоритм подробно изложен в оригинальном Appnote AVR136: Low-Jitter Multi-Channel Software PWM. Принцип работы программной реализации заключается в имитации работы таймера в режиме ШИМ. Требуемая длительность импульсов задаётся переменными, соответственно, по одной на каждый канал (в моём коде lev_ch1, lev_ch2, lev_ch3), а так же задаются «близнецы» этих переменных, которые хранят значение для конкретного периода работы таймера (в моём коде buf_lev_ch1, buf_lev_ch2, buf_lev_ch3). Восьмибитный таймер запускается на основной частоте МК и генерирует прерывание по переполнению, то есть, каждые 256 тактов. Это накладывает ограничение на длительность процедуры обработки прерывания - необходимо уложиться в 256 тактов, чтобы не пропустить следующее прерывание. В результате, один полный период ШИМ равняется 256*256=65536-и тактам. Восьмибитная переменная-счетчик (в моём примере counter) увеличивается на единицу каждое прерывание и действует, как указатель позиции внутри цикла ШИМ. Всё это обеспечивает разрешение (минимальный шаг) ШИМ в 1/256, а частоту импульсов в ƒ/(256*256), где ƒ-частота задающего генератора микроконтроллера. Следует заметить, что тактовая частота микроконтроллера должна быть довольно высокой. В моём примере ATtiny13 работает на максимально возможной частоте, без применения внешнего генератора - 9,6МГц. Это даёт период ШИМ в 9600000/65536≈146,5Гц чего вполне достаточно в большинстве случаев.
Код на C, пример реализации идеи для МК ATtiny13 (три канала ШИМ на выводах PB0, PB1, PB2):

#define F_CPU 9600000 //fuse LOW=0x7a #include #include uint8_t counter=0; uint8_t lev_ch1, lev_ch2, lev_ch3; uint8_t buf_lev_ch1, buf_lev_ch2, buf_lev_ch3; void delay_ms(uint8_t ms) //функция задержки { while (ms) { _delay_ms(1); ms--; } } int main(void) { DDRB=0b00000111; // установка PortB пины 0,1,2 выходы TIMSK0 = 0b00000010; // включить прерывание по переполнению таймера TCCR0B = 0b00000001; // настройка таймера, делитель выкл sei(); // разрешить прерывания lev_ch1=0; //начальные значения lev_ch2=64; //длительности ШИМ lev_ch3=128; //трёх каналов while (1) //бесконечная шарманка { for (uint8_t i=0;i<255;i++) { lev_ch1++; //увеличиваем значения lev_ch2++; //длительности ШИМ lev_ch3++; //каждого канала delay_ms(50); //пауза 50мс } } } ISR (TIM0_OVF_vect) //обработка прерывания по переполнению таймера { if (++counter==0) //счетчик перехода таймера через ноль { buf_lev_ch1=lev_ch1; //значения длительности ШИМ buf_lev_ch2=lev_ch2; buf_lev_ch3=lev_ch3; PORTB |=(1<Думаю, всё достаточно наглядно и пояснения излишни. Для значений длительности и их буферов, при большем числе каналов, возможно, будет лучше использовать массивы, но в данном примере, я этого делать не стал, ради большей наглядности.
Проверено на avr-gcc-4.7.1 и avr-libc-1.8.0. Компиляция и получение файла прошивки:
avr-gcc -mmcu=attiny13 -Wall -Wstrict-prototypes -Os -mcall-prologues -std=c99 -o softPWM.obj softPWM.c
avr-objcopy -O ihex softPWM.obj softPWM.hex
Для правильной работы нужно выставить младшие fuse-биты в 0x7a (частота 9,6МГц). в avrdude это, например, делается так:
avrdude -p t13 -c usbasp -U lfuse:w:0x7a:m

Мой вариант реализации на ассемблере. Программа делает абсолютно то же самое, что и предыдущий код на C.
;чтобы не тянуть include-файл.list .equ DDRB= 0x17 .equ PORTB= 0x18 .equ RAMEND= 0x009f .equ SPL= 0x3d .equ TCCR0B= 0x33 .equ TIMSK0= 0x39 .equ SREG= 0x3f ;это лишь демонстрация, потому регистров и не жалеем.def temp=R16 .def lev_ch1=R17 .def lev_ch2=R18 .def lev_ch3=R19 .def buf_lev_ch1=R13 .def buf_lev_ch2=R14 .def buf_lev_ch3=R15 .def counter=R20 .def delay0=R21 .def delay1=R22 .def delay2=R23 .cseg .org 0 ;таблица прерываний из даташита: rjmp RESET ; Reset Handler rjmp EXT_INT0 ; IRQ0 Handler rjmp PIN_CHG_IRQ ; PCINT0 Handler rjmp TIM0_OVF ; Timer0 Overflow Handler rjmp EE_RDY ; EEPROM Ready Handler rjmp ANA_COMP ; Analog Comparator Handler rjmp TIM0_COMPA ; Timer0 CompareA Handler rjmp TIM0_COMPB ; Timer0 CompareB Handler rjmp WATCHDOG ; Watchdog Interrupt Handler rjmp ADC_IRQ ; ADC Conversion Handler ;RESET: EXT_INT0: PIN_CHG_IRQ: ;TIM0_OVF: EE_RDY: ANA_COMP: TIM0_COMPA: TIM0_COMPB: WATCHDOG: ADC_IRQ: reti RESET: ldi temp,0b00000111 ; назначаем PortB пины PB0, PB1 out DDRB,temp ; и PB2 выходами ldi temp,0 ; выставляем все выводы out PORTB,temp ; PortB в 0 ldi temp,low(RAMEND) ; инициализация out SPL,temp ; стека ldi temp,0b00000001 ; вкл. таймер out TCCR0B,temp ; без делителя ldi temp,0b00000010 ; вкл. прерывание out TIMSK0,temp ; таймера по переполнению sei ; разрешить прерывания start_pwm: ; бесконечная шарманка inc lev_ch1 ; увеличиваем значения inc lev_ch2 ; длительности ШИМ inc lev_ch3 ; по всем каналам rcall delay ; небольшая пауза для плавности rjmp start_pwm delay: ; процедура задержки ldi delay2,$01 ; выставляем число ldi delay1,$77 ; до скольки считать ldi delay0,$00 ; $017700 - даст задержку в 50мс loop: subi delay0,1 ; считаем sbci delay1,0 ; считаем sbci delay2,0 ; считаем brcc loop ret TIM0_OVF: ; обработка прерывания таймера push temp ; на всякий пожарный сохраняем in temp,SREG ; temp и SREG в стеке push temp inc counter ; счетчик перехода таймера через 0 cpi counter,0 ; если не 0, то проверяем brne ch1_off ; не надо ли чего погасить mov buf_lev_ch1,lev_ch1 ; если счетчик 0 mov buf_lev_ch2,lev_ch2 ; то задаем новые mov buf_lev_ch3,lev_ch3 ; значения длительности ШИМ каналов ldi temp,0b00000111 ; включить все out PORTB,temp ; три выхода ch1_off: ; а не погасить ли нам cp counter,buf_lev_ch1 ; первый канал? brne ch2_off ; нет, рано - проверяем второй cbi PORTB,0 ; да погасить ch2_off: ; а не погасить ли нам cp counter,buf_lev_ch2 ; второй канал? brne ch3_off ; нет, рано - проверяем третий cbi PORTB,1 ; да погасить ch3_off: ; а не погасить ли нам cp counter,buf_lev_ch3 ; третий канал? brne irq_end ; нет, рано - двигаемся к выходу из прерывания cbi PORTB,2 ; да, погасить irq_end: ; достаем из стека pop temp ; SREG и temp out SREG,temp pop temp reti ;выходим из прерывания
Компилируется с помощью avra или tavrasm. Не забыть про fuse-биты (см. выше).

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

Так как для меня самым важным было применение ШИМ именно для управления яркостью светодиодов, то именно их я и буду использовать в примерах. В качестве микроконтроллера будем использовать горячо любимый 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); }; }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

В заключение

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

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

Обновлено 16.12.15. Всем привет. Разобравшись в прошлой записи с памятью EEPROM, сегодня мы поговорим о том что такое ШИМ (PWM)? Расшифруется как широтно-импульсная модуляция (pulse-width modulation), это среднее значение напряжения, которое изменяется скважностью импульса. В свою очередь скважность это длительность импульса с некоторой частотой повторения. Т.е. более простыми словами все это изменение ширины импульса при неизменной их величине. Для чего это нам надо?

ШИМ (PWM) используется в транзисторной схеме для регулирования напряжения без механики, в свою очередь управление мощностью. Например управление яркостью светодиодов, управление яркостью подсветки на LCD-мониторе, управление двигателями и т.д. Если отобразить на рисунке, то выход с микроконтроллера примерно будет следующим, как на картинке ниже. Где видно что скважность это заполнение импульса, если вся ширина импульса это 5 В, то при 30% заполнении импульса, в среднем на выходе мы получим примерно 1,5В. В микроконтроллерах AVR ШИМ управление задается в восьмиразрядных таймерах/счетчиках T0/(T2) и шестнадцатиразрядный T1 (T3 в некоторых моделях). А также есть другие модели где битность ШИМа можно задавать, например ATmega 128. Рассмотрим настройку шестнадцатиразрядного таймера/счетчика Т1. Данные берем соответственно таблицам либо из справочника, либо из даташита (литература — статья №1).

В общем для такого счетчика в мк можно выбрать три режима: Fast PWM, Phase Correct PWM, Phase and Frequency Correct PWM (зависит от модели )

Рассмотрим второй режим - ШИМ с точной фазой . Здесь счетный регистр функционирует как реверсивный счетчик, изменения состояния которого изменяется от $0000 до максимального значения а затем обратно до $0000. Для управления таймером/счетчиком используем три регистра управления TCCR1A, TCCR1B, TCCR1C. В которых для выбора режима таймера/счетчика необходимо установить разряды WGMn1: WGMn0 и WGMn1: WGMn0. В зависимости от их установки максимальное значение счетчика(Разрешение ШИМ сигнала) является либо фиксированным значением, либо определяется содержимым определенных регистров таймера/счетчика. Разрешающая способность определяется выражением:

g = log (TOP+1)/log2, где ТОР – модуль счета, выбирается из таблицы соответственно разрешающей способности.

После того как определились с режимом работы таймера счетчика, необходимо выбрать режим работы блока сравнения COMnA1:COMnA0, COMnB1:COMnB0, COMnC1:COMnC0, который определяет поведение вывода OCnx при наступлении события “Совпадение”.

Ну и последний штрих определимся с частотой. Нам необходимо выставить разряды CSn2…CSn0 регистра TCCR1B, которые отвечают за определение источника тактового сигнала. Вот таким программным образом выглядит настройка ШИМ-управления на выходе OC1A. Например:

/*Настройки ШИМ */
TCCR1A=(1< /*На выводе OC1A единица, когда OCR1A==TCNT1, Сбрасывается в 0 при OCR1A==TCNT1 и устанавливается в 1 при достижении максимального значения восьми битный ШИМ Phase Correct PWM , номер режима 1 . модуль счета ТОР $00FF*/
TCCR1B=(1<OCR1A = 50; /* при модуле счета 255 и при напряжении 5 В на выходе OC1A получим примерно 1 В*/

Из программы видно, что для получения ШИМ используем регистр сравнения OCR1A. При достижении счетчиком максимального значения, в данном случае 255, происходит смена направления счета, но счетчик остается в этом состоянии в течении одного периода сигнала. В этом и заключается более медленная частота работы по сравнению с первым режимом. Но в этом и состоит симметричность изменения счетчика. Что более подходит для управления двигателем. В этом же такте происходит обновления содержимого регистра сравнения. При достижении счетчиком минимального значения также происходит смена направления счета и одновременно устанавливается флаг прерывания TOV1 регистра TIFR. Пр равенстве содержимого счетного регистра и какого-либо регистра сравнения устанавливается соответствующий флаг OCF1A/OCF1B/OCF1C регистра TIFR. Одновременно изменяется состояние выхода блока сравнения OCnx. Частота генерируемого сигнала fOCn= f/(2*N*TOP), где N – коэффициент деления пред делителя, f — частота кварца. Также можно посмотреть еще примеры настройки и использования ШИМ, например .

На этом сегодня все. В следующем посте рассмотрим контроллер любительского станка ЧПУ . Я постараюсь использовать предыдущие посты из этого блога для набора программы, как конструктор. Так будет более понятно когда один раз написали и его использовали в следующем проекте. Всем пока.