Страницы курса:

Уроки

Задания


index.htm
01.htm
02.htm
03.htm
04.htm
05.htm
06.htm
07.htm
08.htm
09.htm


z1.htm
z2.htm
z3.htm
z4.htm
z5.htm
z6.htm
z7.htm
z8.htm
z9.htm
z10.htm
z11.htm

New! - ФОРУМ!

Совет - умейте правильно находить информацию!


Задача - упражнение  8

PWM   или   ШИМ

Цифровое регулирование  мощности,
тока, напряжения. 


Для выполнения этой задачи нужно :   

  • - Компилятор Си для AVR  CodeVisionAVR 

  • - Программный эмулятор для AVR  VMLAB == Visual Micro Lab

  • - DataSheet (ДШ) на МК AVR  ATmega16

  • - знание других материалов курса

  • - твердое знание первой страницы курса на 5 с плюсом !  

  • - свободное время и желание.

  в конце задачи есть файлы и для  -  ATmega8

Что такое PWM <> ШИМ и чем он так хорош? 


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


На экране осциллографа (например SCOPE в симуляторе VMLAB) кусочек ШИМ сигнала выглядит примерно так:


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

 

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

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

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

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

Значение выкл. может быть и не нулевым !

Зачем  ШИМ ? 

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

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

Регулирование мощности осуществляется изменением среднего времени  подачи питания в нагрузку.  

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

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

Мотор будет подключаться к питанию +V когда напряжение "PWM In" будет достаточным для открывания транзистора IRL540.

Мощные полевые и IGBT транзисторы правильно переключать с помощью специальных драйверов - например IRS2110. Если частота переключений не высокая то можно управлять полевиками серии IRL ножкой МК через резистор 100 Ом причем можно использовать несколько ножек МК параллельно. Подробно по управлению электромоторами написано и нарисовано в соответствующих апноутах и исходниках к ним.

Управляя полевым транзистором одной ножкой МK  вы можете легко переключать ток  50 -100  ампер !

     
 

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

 
     



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


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

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

- для нижнего графика  ШИМ 90% - значит мощность мотора
превысит в 1.8 раз номинальную. Осторожно ! Не спалите !

Электропривод более подробно     описан в  он-лайн  курсе 

     
 

Основы электроники по-русски ТУТ !
Это курс для начинающих - самые нужные сведения по электронике !  Всего 1.08 Мб

Там рассказано с картинками - что такое полупроводники, транзисторы, резисторы, конденсаторы, индуктивности, операционные усилители, типовые схемы, диоды, тиристоры и многое другое !

 
     

2) ШИМ позволяет выполнить ЦАП  - нужно лишь добавить ФНЧ - фильтр нижних частот. 

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

Но лучше сделать ФНЧ на ОУ как в задаче 9 курса.

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

Аппаратную - значит не загружая процессор вычислениями. 

AVR ATmega48  -88  -168  имеют 6 аппаратных PWM с частотой до 78 КГц

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

Если вам этого мало то :

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

     
 

Еще PWM'чиков бы ...   да Аппаратных !  

Ну  подключите к МК по последовательному интерфейсу SPI (или иному) внешний многоканальный PWM контроллер ! Вот например Ti.com предлагает чудо чудное:  

TLC5941  16-канальный PWM LED Driver

Вам совсем  не обязательно к нему светодиоды подключать !

 
     

Вот простой пример на Си как вывести 10 битный ШИМ
на ножку PD5 микроконтроллера ATmega16 для компилятора CodeVisionAVR:

     
 

DDRD=0x20; // 00100000 PD5(OC1A)-PWM Timer1 OUT
// ножку PD5 назначить выходом

// Настройка TIMER1 для генерации ШИМ

//TIMER1 initialize
//prescale:1  clock 7.37 MHz
// WGM: 7) PWM 10bit fast, TOP=0x03FF
// actual value: 7200,000Hz (100,0%)
// последнее - это частота ШИМ сигнала


TCCR1B = 0x00; //stop Timer

TCNT1H = 0xFC; // 11111100  
TCNT1L = 0x01; // 00000001  

/* значение в 16 битном регистре OCR1A определяет величину генерируемого ШИМ сигнала на ножке PD5 - если поделить ее  на 10.23 то получим PWM в процентах*/

OCR1AH = 0x03; // PWM(PD5) = OCR1A / 10.23 
OCR1AL = 0xFF; // 0x03FF это число 1023

/* регистр OCR1A состоит из двух 8-ми битных регистров OCR1AH и OCR1AL запись в них нужно проводить в указанной последовательности! */

OCR1BH = 0x03;
OCR1BL = 0xFF;

ICR1H = 0x03;
ICR1L = 0xFF; 

TCCR1A = 0x83; // 10000011  

TCCR1B = 0x09; // 00001001 - start Timer

// Теперь ШИМ 100% - т.е. на ножке PD1 лог. "1"

 
     

После выполнения этого участка программы  на ножку PD1 выводится ШИМ сигнал величиной 100 %  -  т.е. на ней постоянно присутствует высокий уровень - лог. "1"

Изменить величину генерируемого ШИМ можно так: 

Вычислите новое значение из диапазона 0 - 1023 для записи в   OCR1A   и запишите вот такими строками программы: 

     
 

// pwm_val - это число от 0 до 1023
// PWM(PD5) = OCR1A / 10.23  (%) 

OCR1AH = (char)(pwm_val>>8);
OCR1AL = (char)pwm_val;

 
     

 

После выполнения этого участка программы  на ножку PD1 начнет выводится ШИМ сигнал величиной (pwm_val/10.23) в процентах.  

   
 

Совсем не обязательно возится с  %%%   

Это только одна и величин которой можно охарактеризовать величину ШИМ. 

Вы можете использовать любые удобные вам единицы.

Напомню !   (char)pwm_val    означает на Си : преобразовать значение переменной  pwm_val  к типу    char     т.е. от числа в переменной будет взяты только младшие 8 бит.

 
     

Вот скриншот симуляции - получился прекрасный ШИМ на
ножке PD5 и видна передача данных по USART на ножке PD1.


Нижний график DAC  -  это выход ШИМ с ножки PD5 после ФНЧ состоящего из резистора 500 КОм  и конденсатора 10 нФ   -  по сути это результат 10 битного ЦАП  числа в переменной  pwm_val 

Пожалуйста : скачайте архив с файлами для CVAVR и VMLAB

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

Я очень подробно и с картинками рассмотрел симуляцию программы в VMLAB в задаче 3.

Откройте ДШ МК и разберитесь с регистрами использованными в примере, что делает каждый бит ! 

Давайте выведем 2 ШИМ сигнала 

Код конфигурации таймера 1 создадим с помощью мастера CVAVR.

1) Запустите компилятор CodeVisionAVR и кликните по серой шестеренке  в панели инструментов - запустится  мастер начального кода.

2) Выберите МК и частоту кварца вот так:


3) Щелкните по ярлыку - таймеры и затем таймер_1


4) Нужно сделать следующие установки: 

  • - оставить источник тактирования таймера без изменения - "систем клок"

  • - выбрать тактирующую частоту равной частоте кварца 

  • - режим ШИМ  mode 7 - по таблице 47 ДШ стр. 111 

  • - выходы Out A: и B:  установите "не инвертирующими". 

Должно получится вот так:

Вот и все установки для 2-х каналов 10 битных  (top = 3FFh)  ШИМ на ножках PD4PD5. 

Несколько щелчков мышкой !

4) Давайте посмотрим код инициализации. 

Нажмите   File  ->  Program Preview

И... О! боже ... Ну конечно! 

Мы ж не заглянули в ярлык порты и не сконфигурировали 
ножки PD4 и PD5 выходами  -  вот мастер и возопил ! 


Кликаем "Yes" ...   и  потом еще раз "Yes"  и появляется окно с кодом. 

Нас интересуют вот эти строки :

     
 

DDRD=0x30; // PD4 PD5 теперь выходы

// ..........

// ..........

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 7370,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;

 
     

Проанализируем этот код.

Как PD4 PD5 стали выходами я думаю вам очевидно!

Далее идут комментарии настройки таймера_1 и строка кода:

TCCR1A=0xA3; // 1010 0011

описание этого регистра на стр. 109 ДШ.

Биты_7_6 влияют на  ШИМ на ножке PD5    
Биты_5_4 влияют на  ШИМ на ножке PD4

Как влияют написано в таблице 45 ДШ 

Биты_1_0  совместно  с  битами_5_4  регистра  TCCR1B  определяют 
режим работы ШИМ по таблице  47

У нас так :

TCCR1B=0x09; // 0000 1001

значит комбинация 4-х битов определяющая режим ШИМ такова:   0111
по таблице 47 это режим 7  - как мы и заказывали мастеру !

Биты_2_0  регистра  TCCR1B  определяют коэф. деления источника тактового сигнала прежде чем он будет тикать таймер_1  

У нас это 001  по таблице 48  коэф. деления  1   - т.е. таймер_1 
считает с частотой кварца.

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

Следующие 4 регистра нас не интересуют сейчас. Вы почитайте сами в ДШ  зачем они !

Следующие 4 регистра нас ОЧЕНЬ даже интересуют !

OCR1AH=0x00;
OCR1AL=0x00;


OCR1BH=0x00;
OCR1BL=0x00;

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

   
 

Помните в мастере опцию - не инвертирующий ?

Выбрав inverted вы замените величину ШИМ на скважность !

"1" и "0" на выходах OC1x просто поменяются местами и задав (записью соответствующего числа в регистры OCR1xx) величину ШИМ  например 25 %  на выходе вы получите сигнал со скважностью 25%  - соответственно величина такого ШИМ сигнала будеи 75%  

 
     

 

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

while(1){   

такие строчки:

// вывести ШИМ около 25% на PD4
OCR1BH = 0x00; 
OCR1BL = 0xFF; // PWM(PD4) 255/10.23 = 24.9(%) 

Чтобы увидеть второй ШИМ сигнал на виртуальном осциллографе SCOPE
симулятора  VMLAB нужно в файле проекта  vmlab.prj  внести добавку:

.plot V(PD1) V(PD4) V(PD5) V(DAC)

добавку я обозначил красным цветом !

Все, теперь можно скомпилировать программу и запустить симуляцию.

Скачайте второй архив для CVAVR и VMLAB

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

Вот скриншот симуляции - это интересно ! 

Там 2 PWM сигнала !

Самостоятельно определите параметры ШИМ 
с помощью курсоров в SCOPE симулятора VMLAB. 

Как это делать смотрите в задаче - упражнении 2

   
 

Вот архив файлов  2-х каналов   ШИМ PWM  для  ATmega8 в CVAVR и VMLAB

 
     

Дополнительные материалы : 

Си для МК кратко

Задачи - упражнения по программированию AVR

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Rating All.BY Rambler's Top100 МЕТА - Украина. Рейтинг сайтов


2009-2015 123avr.com