Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


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



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

На экране осциллографа ШИМ сигнал выглядит следующим образом:

Это практически цифровой сигнал. Он имеет 2 состояния - либо включено (на ножке МК это лог. " 1" ), либо выключено (на ножке МК это лог. " 0" ). Для создания ШИМ сигнала используются различные ключи – например, встроенные в МК или внешние транзисторы или реле.

ШИМ ( англ. PWM ) сигнал имеет следующие основные параметры:

- период ШИМ - это время между фронтами (или спадами) соседних импульсов - обозначается T - обычно он постоянен по времени. С периодом связана обратная величина - частота ШИМ равная 1 / T в Гц.

- величина ШИМ - это отношение А / Т умноженное на 100 - получаем проценты (англ. X % duty cycle).

- размах ШИМ - это разность между значениями вкл. и выкл. Значение выкл. может быть и ненулевым.

 

Применение ШИМ позволяет:

1) регулировать мощность в нагрузке.

Регулирование мощности осуществляется изменением среднего времени подачи питания в нагрузку. При этом коммутирующий (включающий - выключающий) нагрузку транзисторный ключ работает в ключевом режиме и поэтому на нем выделяется минимум тепла.

Вот пример регулирования мощности в электродвигателе:

Мотор подключается к питанию +V когда напряжение " PWM In"

будет достаточным для открывания транзистора IRL540. Мощные полевые и IGBT транзисторы правильно переключать с помощью специальных драйверов – например, IRS2110.

Если частота переключений невысокая (до 2-3 КГц), то можно управлять полевыми транзисторами MOSFET серии IRL ножкой МК через резистор 100 Ом, но лучше использовать транзистор IRLZ44.

Управляя полевым транзистором одной ножкой МK, можно переключать ток 50 -100А. Вместо электродвигателя может быть другой тип нагрузки, например, лампа, нагревательный элемент или смешанная нагрузка - т.е. комбинация R, C и L.

Пример: Если взять электромотор с номинальным напряжением 6 вольт и подключить его по схеме, описанной выше, к питанию 12 вольт, то при подаче на " PWM In" следующих сигналов:

мотор будет развивать такую мощность:

- для верхней диаграммы ШИМ 10% - мощность будет 20%

(от номинальной, при 6 вольтах).

- для средней диаграммы ШИМ 50% - мощность будет 100%

- для нижнего графика ШИМ 90% - значит мощность мотора

превысит в 1.8 раз номинальную (в таком режиме мощность двигателя превышает номинальную почти в 2 раза и при таком режиме велика вероятность скорого выхода двигателя из строя).

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

ФНЧ может быть простейшим - к выводу МК, на который выводится ШИМ подключается резистор, а другой вывод резистора заземляется конденсатором - на этом конденсаторе будет результат ЦА преобразования PWM сигнала. Но лучше использовать более надежный фильтр низких частот – ФНЧ на основе операционных усилителей.

AVR ATmega16 имеет аппаратную возможность формировать 4 ШИМ сигнала на ножках OC0 OC1A OC1B OC2.

AVR ATmega48 -88 -168 имеют 6 аппаратных ШИМ сигналов с частотой до 78 КГц.

AVR ATmega128 имеет 6 аппаратных PWM с разрешением до 16 бит.

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

Таймер (от англ. Timer) — средство обеспечения задержек и измерения времени средствами микроконтроллера.

Существуют два вида таймеров:

Аппаратные таймеры функционируют независимо от центрального процессора и в момент срабатывания посылают прерывание.

Программные таймеры реализуются за счѐ т выполнения в цикле заданного количества одинаковых «пустых» операций. При фиксированной частоте работы процессора это позволяет точно определять прошедшее время. Главными минусами такого метода являются: зависимость количества итераций цикла от типа и частоты процессора, невозможность выполнения других операций во время задержки.

 

В МК ATMega16 есть три таймера/счетчика – два 8-битных ( Timer/Counter0, Timer/Counter2 ) и один 16-битный ( Timer/Counter1 ). Каждый из них содержит специальные регистры, одним из которых является счетный регистр TCNTn (n – это число 0, 1 или 2). Каждый раз, когда процессор выполняет одну команду, содержимое этого регистра увеличивается на единицу (либо каждые 8, 64, 256 или 1024 тактов). Потому он и называется счетным. Помимо него, есть еще и регистр сравнения - OCRn (Output Compare Register), в который можно записать какое-либо число. У 8-битного счетчика эти регистры 8-битные. По мере выполнения программы, содержимое TCNTn растет и в какой-то момент оно совпадет с содержимым OCRn. Тогда (если заданы специальные параметры) в регистре флагов прерываний TIFR ( Timer/Counter Interrupt Flag Register ) один из битов становится равен единице и процессор, видя запрос на прерывание, сразу же отрывается от выполнения бесконечного цикла и идет обслуживать прерывание таймера. После этого процесс повторяется.

Ниже представлена временная диаграмма режима CTC (Clear Timer on Compare). В этом режиме счетный регистр очищается в момент совпадения содержимого TCNTn и OCRn, соответственно меняется и период вызова прерывания.

Это далеко не единственный режим работы таймера/счетчика. Можно не очищать счетный регистр в момент совпадения, тогда это будет режим генерации широтно-импульсной модуляции. Можно менять направление счета, т. е. содержимое счетного регистра будет уменьшаться по мере выполнения программы. Также возможно производить счет не по количеству выполненных процессором команд, а по количеству изменений уровня напряжения на «ножке» T0 или T1 (режим счетчика), можно автоматически, без участия процессора, менять состояние ножек OCn в зависимости от состояния таймера. Таймер/Счетчик1 умеет производить сравнение сразу по двум каналам – А или В.

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

 

Выполнение работы.

 

Вначале сформулируем задачу, которую мы хотим решить и напишем ТЗ. Разработать программу для микроконтроллера ATmega16, которая реализует ШИМ управление в следующем режиме: 2с ШИМ сигнал с величиной ШИМ 1%, 2с ШИМ сигнал величиной 25%, 2с – с величиной 50%, 2с – с величиной 75%, 2с – 99%. Разрядность ШИМ - 1024. Снимаемый ШИМ сигнал можно просматривать, подсоединяя соответствующий вывод МК к осциллографу

Следующим этапом создания устройств на МК является создание алгоритма программы, который заставит работать созданную схему, выполняя ТЗ.

Мы напишем алгоритм в виде псевдокода.

а) старт программы

б) сделать ножку МК, к которой подключен светодиод выходом.

в) сделать ножки МК, с которых снимаем ШИМ сигнал выходами.

г) сконфигурировать таймер1 МК в режим ШИМ сигнала, разрядностью 1024.

д) послать на выход МК 40 единицу(организуем индикацию питания МК).

е) организовать ШИМ сигнал с величиной ШИМ 1%

ж) ждать 2с

з) организовать ШИМ сигнал с величиной ШИМ 25%

и) ждать 2с

к) организовать ШИМ сигнал с величиной ШИМ 50%

л) ждать 2с

м) организовать ШИМ сигнал с величиной ШИМ 75%

н) ждать 2с

о) организовать ШИМ сигнал с величиной ШИМ 99%

п) ждать 2с

р) перейти к пункту д)

Далее нужно записать алгоритм на выбранном языке программирования. Мы будем использовать Си для МК.

Создадим новую папку для нашего проекта C: \cvavreval\Laba4. Далее открываем CodeVision. Создадим новый проект, при этом воспользуемся генератором начального кода.

В появившемся окне генератора начального кода настроим наш МК в соответствии с требованиями программы.

Далее действуем по следующему алгоритму:

1) На вкладке Chip выбираем микроконтроллер Atmega16, задаем частоту тактирования 4МГц.

 

На вкладке Ports задаем бит 0 порта А выходом (этот выход используется для индикации питания МК ), также выходом назначаем бит 5 порта D (этот выход используется для вывода ШИМ сигнала).

3) На вкладке Timers выбираем Timer1 задаем clock value 4000кГц, выбираем режим ( mode ) Fast PWM top=03FF (в этой же вкладке можно задавать и другие режимы работы таймера, например, менять режим ШИМ сигнала, организовывать работу с таймером определенной частоты и т.д.). Задаем выход А ( Out A ) как неинвертированный ( Non-Inv ) выход ШИМ.

4) Далее генерируем и сохраняем файл ( File -> Generate, Save& Exit )

Далее будем следовать созданному нами алгоритму.

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

Объединим пункты (б) и (в) в один. Для их выполнения также не требуется написания программного кода. Эти этапы были реализованы при конфигурировании портов в генераторе начального кода. Чтобы задать те или иные биты портов МК выходами, нужно записать соответствующие значения в регистры PORTx и DDRx. В нашем случае, в регистр DDRA записали число 0х01, в регистр DDRD 0х20 (запись 0х01 означает число 1 в шестнадцатиричной форме или 00000001 в двоичной, соответственно для числа 0х20 представление в двоичной форме имеет следующий вид: 00100000).

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

Строки 66-77 – комментарии, указывающие какой таймер и в каком режиме используется, какие выходы используются. Далее идет конфигурация таймера под нашу задачу. Изменять состояние таймера можно меняя значения в соответствующих регистрах (подробнее смотрите в даташите МК).

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

PortA.0=1;

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

OCR1AH=0x00;

OCR1AL=0x0A;

Таким образом, чтобы изменить величину ШИМ нужно изменить значение в регистре OCR1A. В нашем случае частота тактирования МК 4МГц, режим ШИМ 03FF, что означает, что разрядность ШИМ 1024. Т.е. частота импульсов в нашем случае 4000000/1024≈ 3, 9кГц. Изменять частоту импульсов ШИМ можно, меняя частоту работы МК, либо меняя разрядность ШИМ сигнала. Также менять эту величину можно, меняя значение регистра TCNT1 (более подробное описание смотри в описании МК).

Рассмотрим, почему нужно записать именно число А в регистр OCR1A. А шестнадцатеричное представление числа 10, а 10 – это примерно 1% от 1024, таким образом мы обеспечиваем требуемую величину ШИМ.

Пункты (ж), (и), (л), (н), (п) объединим в один пункт. Как организовать задержку по времени было рассмотрено в предыдущих лабораторных работах. Программно это выглядит следующим образом:

delay_ms(2000);

Также необходимо добавить строку в директивы предпроцессора, включающую описание этой функции:

#include < delay.h>

Пункты (з), (м), (н), (о) объединим в один пункт. В этих пунктах необходимо изменять величину ШИМ сигнала. Для этого необходимо менять содержимое регистра OCR1A подобно тому, как это делалось в пункте (е). Соответственно для 25% необходимо послать 1024*0.25=256, для 50% - 512, для 75% - 768, для 99% - 1014.

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

Общий листинг программы, реализующей данный алгоритм выглядит следующим образом:

#include < mega16.h>

#include < delay.h>

// Declare your global variables here

void main(void)

{

// Declare your local variables here

// Input/Output Ports initialization

// Port A initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=Out

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=0

PORTA=0x00;

DDRA=0x01;

// Port B initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTB=0x00;

DDRB=0x00;

// Port C initialization

// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T

PORTC=0x00;

DDRC=0x00;

// Port D initialization

// Func7=In Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In

// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T

PORTD=0x00;

DDRD=0x30;

// Timer/Counter 0 initialization

// Clock source: System Clock

// Clock value: Timer 0 Stopped

// Mode: Normal top=FFh

// OC0 output: Disconnected

TCCR0=0x00;

TCNT0=0x00;

OCR0=0x00;

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 4000, 000 kHz

// Mode: Fast PWM top=03FFh

// OC1A output: Non-Inv.

// OC1B output: Non-Inv.

// Noise Canceler: Off

// Input Capture on Falling Edge

// Timer 1 Overflow Interrupt: Off

// Input Capture Interrupt: Off

// Compare A Match Interrupt: Off

// Compare B Match Interrupt: Off

TCCR1A=0xA3;

TCCR1B=0x09;

TCNT1H=0x00;

TCNT1L=0x00;

ICR1H=0x00;

ICR1L=0x00;

OCR1AH=0x00;

OCR1AL=0x00;

OCR1BH=0x00;

OCR1BL=0x00;

// Timer/Counter 2 initialization

// Clock source: System Clock

// Clock value: Timer 2 Stopped

// Mode: Normal top=FFh

// OC2 output: Disconnected

ASSR=0x00;

TCCR2=0x00;

TCNT2=0x00;

OCR2=0x00;

// External Interrupt(s) initialization

// INT0: Off

// INT1: Off

// INT2: Off

MCUCR=0x00;

MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization

TIMSK=0x00;

// Analog Comparator initialization

// Analog Comparator: Off

// Analog Comparator Input Capture by Timer/Counter 1: Off

ACSR=0x80;

SFIOR=0x00;

while (1)

{

PORTA.0=1; // Place your code here

OCR1AH=0x00;

OCR1AL=0x0A;

delay_ms(2000);

OCR1AH=0x01;

OCR1AL=0x00;

delay_ms(2000);

OCR1AH=0x02;

OCR1AL=0x00;

delay_ms(2000);

OCR1AH=0x03;

OCR1AL=0x00;

delay_ms(2000);

OCR1AH=0x03;

OCR1AL=0xF6;

delay_ms(2000);

};

}

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

Далее необходимо осуществить симуляцию и получить осциллограммы исследуемого ШИМ сигнала.

Требования к отчету

Отчет должен содержать следующие разделы:

1. Титульный лист

2. Цель работы.

3. Описание принципов ШИМ управления.

4. Ход работы (с текстом программы и схемами в пакете Proteus, а также осциллограммами полученных сигналов).

5. Выводы.

 

Контрольные вопросы

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

2. Для чего используется ШИМ управление?

3. Основные параметры ШИМ сигнала.

4. Примеры расчета параметров работы двигателя при ШИМ управлении.

5. Принципы организации программной реализации ШИМ сигнала?

6. Принципы организации аппаратной реализации ШИМ сигнала?

7. Опишите существующие в МК таймеры.

8. Варианты применения таймеров в МК.

9. Отчего зависит время импульсов ШИМ сигнала при аппаратной реализации ШИМ управления?

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

 

 


Поделиться:



Последнее изменение этой страницы: 2019-03-20; Просмотров: 259; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.071 с.)
Главная | Случайная страница | Обратная связь