Курс AVR123.nm.ru


Electronic Banner Exchange (ElBE)
 


Краткий курс - Самоучитель - AVR - быстрый старт с нуля

 

Книги и учебники по электронике и AVR  там

Язык Си для микроконтроллеров - самое нужное там

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

PWM   или   ШИМ

 

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


 

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

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

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

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

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

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

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

 

В конце задачи PWM примеры для  ATmega8 и для ATmega128

 

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


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

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

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

 

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

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

- частота ШИМ равная   1 / T    выражается  в Герцах - Гц.

- величина ШИМ - коэффициент заполнения -  duty cycle -
это отношение А / Т      Если умножить на 100 то получим в процентах.

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

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

 

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

 

Зачем  ШИМ ? 

 

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

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

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

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

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

Цепь питания мотора будет замыкаться когда напряжение "PWM In" будет выше 4.5 вольт - т.е. достаточным для открывания транзисторов серии  IRL - в данном случае IRL540  IRLZ44 недорого по почте.

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

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

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

Мощные полевые и IGBT транзисторы правильно переключать с помощью специальных драйверов - например IRS2110 подавая на затвор MOSFET напряжение более 10 вольт, а на  IGBT более 15 вольт.

 

     
 

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

 
     



Пример: Упрощенно -
Если вы возьмете электромотор стеклоподъемника ВАЗ или стеклоочистителя на 12 вольт и подключите по  схеме выше к питанию 24 вольт то при подаче на "PWM In"  вот таких сигналов: 


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

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

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

 


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

 

Реклама недорогих радиодеталей почтой:

 

 

Теория, практика, схемы и исходники берите 
в АпНоутах   AVR, PIC, Motorola, Ti

 

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


 

 

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

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

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

 

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

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

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

AVR ATmega128  имеет 6 аппаратных PWM

AVR ATmega64  наверно 7 аппаратных ШИМ
 

 

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

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

     
 

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

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

Вот например Ti предлагает:  

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

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

 
     

 

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

 

     
 

DDRD |= (1<<5); /* сделать "1" бит 5 в DDRD
это ножка PD5(OC1A)-PWM Timer1 OUT

ножку PD5 назначили выходом */

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

TCCR1B = 0x00; //stop Timer

/* prescale:1  clock 7.37 MHz
делитель 1 - т.е. таймер считает с частотой такта - частотой кварца.

    Режим 7:      PWM 10bit fast, TOP=0x03FF
Частота ШИМ:      7200 Hz  */


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

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

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

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

OCR1BH = 0x03;
OCR1BL = 0xFF;

ICR1H = 0x03;
ICR1L = 0xFF; 

TCCR1A = 0x83; // 10000011  

TCCR1B = 0x09; // 00001001 - start Timer
 

 
     

 

После выполнения этого участка программы  на ножку PD5 будет выводиться ШИМ с коэффициентом заполнения (duty cycle, величина ШИМ) почти 100 %  -  т.е. на PD5 почти постоянно будет лог. "1" с очень короткими "0".

 

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


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

     
 

// pwm_val - это число от 0 до 1023
// PWM на PD5 будет примерно  OCR1A / 10.24  (в %) 

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

 
     

 

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

   
 

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

Напомню !   (char)pwm_val    означает на Си :
преобразовать значение переменной
  pwm_val  к типу    char     

т.е. от числа хранящегося в переменной pwm_val будет взяты только младшие 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 ДШ ATmega16 стр. 111 

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

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

 

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

Всего несколько щелчков мышкой !

 

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 стали выходами я думаю вам очевидно! ( стр. 2 курса )

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

TCCR1A=0xA3; // 1010 0011

описание этого регистра на стр. 109 ДШ - даташита ATmega16.

Биты_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 - и это будет определять величину ШИМ PWM.

 

   
 

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

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

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

 
     

 

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

ШИМ на ножке PD5 будет работать так же как и работал в первом примере -
значит ни какого кода добавлять не нужно.

А вот ШИМ на ножке PD4  я сделаю постоянным, добавив в программу 
перед строкой     
while(1){   

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

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

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

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

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

 

Очень удобно наблюдать ШИМ в 4 канальном осциллографе PROTEUS !  Попробуйте...
Скриншот есть ниже.

 

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

 

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

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

Вот скриншот симуляции - это интересно. Там 2 PWM сигнала.

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

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

 

   
 


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


 
     

 

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

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

 

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

 

 

 

Задачи Курса

 

 


AVR раз, два, три...   это просто!

Краткий Курс  
МикроКонтроллеры 

AVR Начинающим "с нуля" 

http://proavr.narod.ru
-

 

     
 

Прерывания в AVR  -  подробно описаны
на странице  3 курса.

 
     

 



 

          

 

   
 

Вот пример создания трех ШИМ сигналов с частотой 50 Гц в ATmega128 для управления модельными рулевыми машинками (servo).

Здесь архив для  CVAVR,  PROTEUS  и  VMLAB 

К сожалению VMLAB не верно показывает период ШИМ
сигнала в этом примере и не симулирует ШИМ на PB7.

Зато PROTEUS работает прекрасно!    Cкачать PROTEUS там

Ниже скриншот с осциллограммами генерируемых сигналов.

А еще ниже скриншот настройки Timer_1 в компиляторе ICC


 
     

 

Осциллограммы ШИМ сигналов на выводах PB5  PB6  и  PB7  

 

 

Настройка Timer_1 в компиляторе ICC 


Пояснения к настройкам и файлы в архиве выше.

 

 

 

Напомню: Самая подробная и полная информация 
по МК содержится КОНЕЧНО в ДШ на МК !

Он доступен в оригинале и на русском языке.  

 

 

ключевые слова: программирование микроконтроллеров, как написать программу для микроконтроллера, обучение программированию микроконтроллеров, микроконтроллеры atmega128, как запрограммировать микроконтроллер, как прошить микроконтроллер, отладка программы для AVR, моделирование работы электронных схем, электронные проекты, хобби, язык си для микроконтроллеров, язык программирования си Основы программирования (кнопочки, светодиоды) Работа с портами. Прерывания и таймеры. Основы ШИМ, программная и аппаратная реализация. Сервоприводы. Работа с АЦП Настройка и программирование UART Работа с I2C Связь (UART, I2C, SPI) 
AT76C712 , AT76C713 , AT90CAN128 , AT90CAN128 Automotive , AT90CAN32 , AT90CAN64 , AT90PWM2 , AT90PWM3 , AT90S1200 , AT90S2313 , AT90S2323 , AT90S2343 , AT90S4433 , AT90S8515 , AT90S8535 , ATmega128 , ATmega1280 , ATmega1281 , ATmega16 , ATmega161 , ATmega162 , ATmega163 , ATmega164 , ATmega165 , ATmega168 , ATmega168 Automotive , ATmega169 , ATmega2560 , ATmega2561 , ATmega32 , ATmega323 , ATmega324 , ATmega325 , ATmega3250 , ATmega329 , ATmega3290 , ATmega406 , ATmega48 , ATmega48 Automotive , ATmega64 , ATmega640 , ATmega644 , ATmega645 , ATmega6450 , ATmega649 , ATmega6490 , ATmega8 , ATmega8515 , ATmega8535 , ATmega88 , ATmega88 Automotive , ATtiny11 , ATtiny12 , ATtiny13 , ATtiny15L , ATtiny2313 , ATtiny25 , ATtiny26 , ATtiny28L , ATtiny45 , ATtiny85

 

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


Проекты - Товары - Программы - Документация - Ссылки - Форум - О нас

Проекты:

Omega Виртуальная мини-лаборатория Omega. Интегрированный комплекс различных измерительных и сервисных устройств. В состав комплекса входят: логический анализатор, программатор EPROM/MCU, генератор, осциллограф, частотомер,
Разработка продолжается...
Программаторы Orange. Предназначены для программирования микросхем памяти (Serial EEPROM) и микроконтроллеров. Наличие встроенного языка программирования предоставляет практически неограниченные возможности добавления новых протоколов.
Orange2 - Orange3 - Orange4
Orange
UniLogic

Универсальный Логический анализатор UniLogic.   Позволяет использовать любой ПК, оснащенный LPT портом, в качестве логического анализатора с буфером 64K отсчетов, генератора цифровых последовательностей, частотомера...

Программатор BiDiPro. Поддерживает EPROM, FLASH память и микроконтроллеры. Использует LPT порт в режиме Bidirectional/EPP. FREEWARE. BiDiPro

 

Универсальный логический анализатор UniLogic


Логический анализатор

 
  • Просмотр сигналов в реальном масштабе времени
  • Запоминание сигналов с возможностью последующего просмотра и записи на диск (буфер - 64 кБ)
  • Частотомер
  • Максимальное число каналов - 4 (8)
  • Диапазон входных сигналов 0...5 В (TTL)
  • Максимальная рабочая частота определяется быстродействием ПK и составляет 300...1000 кГц.
  • Подключение через стандартный LPT порт (схема подключения)

 

Дополнительно в PRO версии:

  • Декодирование последовательных протоколов I2C, Microwire, SDA2506 и других...
  • Воспроизведение записанных сигналов
  • Графический редактор
  • Регулируемое число каналов
  • Экспорт в текст

 

ulog20d.rar 87 Kb  Программа логического анализатора UniLogic v2.00 shareware
ulogic25.rar 97 Kb  Программа логического анализатора UniLogic v2.50 pro Для получения пароля обратитесь в службу технической поддержки
log2bin.rar 16 Kb  Log2bin convertor v1.2

 

линки:

CnC Lab Если есть интерес к раскодированию магнитол, программированию ПЗУ и Вы что-нибудь слышали о программаторе "ORANGE" или логическом анализаторе "UNILOGIC", то Вам наверняка сюда.

Автор всего этого - Алексей Плющев (Alex Plusov), а некоторые несознательные личности в своих письмах неправильно пишут его фамилию :)

BiDiPro Если есть необходимость в программировании ПЗУ и нет подходящего программатора, то BiDiPro для Вас! Максимум возможностей при минимуме стоимости. Автор железа и, главное, идеи - Эдуард Панченко . Изготовитель плат - Игорь Попов (P.E.co.). А модульный софт к этому программатору написал тот самый Алексей Плющов!
Tomi Engdahl's Tomi Engdahl's Video Technology Page - все о TV и Video, масса полезной информации!
И конечно, главный сайт Microchip! ( Кстати, кто в свое время делал ZX-Spectrum с музыкальным сопроцессором AY8910 или AY8912, то их производил все тот же Microchip, правда тогда он назывался GI Microelectronic).
НПО «ИНТЕГРАЛ» Местный (читай- белорусский) флагман микросхемосдирания.

60% китайской бытовой электроники содержит кремниевые чипы этого завода.

(Как я понимаю эти 60% относятся к тому что продается в наших ларьках :)

Радио Главный сайт журнала "РАДИО"
Радиолюбитель Сайт журнала "Радиолюбитель". Тут конечно еще работать и работать, но главное - начать.
Радиохобби Главный сайт журнала "Радиохобби"
RadioFanat Интернет-журнал "РадиоФанат". - наиболее часто обновляется, масса интересных вещей

И немного ссылок на другие генераторы телевизионных сигналов:

Генератор сигналов 1 Автор: Rickard Gunee. Контроллер PIC16F84
Генератор сигналов 2 Автор: Александр Мусатов. Контроллер PIC16F84
Генератор сигналов 3 Автор: Eugene Контроллер PIC16F84, можно почерпнуть схемы включения MC13077 и CXA1145
Генератор сигналов 4 S51KQ Hardware & Software, в том числе и генератор.


Список современных микроконтроллер 8051 MCS-51 

Курс по МК 8051 для начинающих с нуля.

New!marks chips added in the last 60 days.
New!marks chips added in the last 30 days.

Сайт управляется системой uCoz