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

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


Напевно, ви не раз задавалися питанням, як можна регулювати потужність споживача, наприклад, керувати яскравістю світлодіода або регулювати обороти двигуна. Найпростіший спосіб - послідовно навантаженню, наприклад, - світлодіоду, включити резистор. Але ж він буде грітися і забирати дорогоцінну енергію, і чим потужніше світлодіод, тим сильніше буде грітися наш резистор. Такий варіант не для нас. А що, якщо світлодіод дуже швидко включати і вимикати, при цьому змінюючи тривалість включень за константної частоти? Наприклад, якщо включати світлодіод на 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 мікросекунд 
      } ; 
} 

Kомпілюємо і закидаємо в мк , світлодіод повинен світиться на половину яскравості. Але ви, напевно, вже встигли помітити , що наша програма тільки те й робить, що встановлює лог -рівні на виводі мк . Щоб звільнити головний цикл від цієї рутинної роботи , ми скористаємося таймером.

Апаратний ШІМ
Таймер може генерувати ШІМ в декількох режимах:

  • Phase Correct PWM (симетричний ШИМ)

    режім Phase Correct PWM
    У цьому режимі таймер рахує від нуля до певного значення, залежно від режиму , а потім рахує в зворотному напрямку до нуля. Вивід OCxx при першому збігу з регістром порівняння скидається , при другому встановлюється.

  • Fast PWM (швидкий ШИМ)

    режим Phase Correct PWM

    У цьому режимі таймер працює так :

    • збільшує змінну TCNTX від 0 до top , при переповненні TCNTX вона скидається в 0 , і рахунок починається знову.
    • при кожному збільшенні TCNTX перевіряє , чи не рівний він регістру порівняння OCRXA / OCRXB , якщо дорівнює , то відповідний йому вивід ОСхх скидається в нуль. При обнуленні лічильника цей вивід встановлюється в 1

  • СТС (скидання при збігу )

    режім Phase Correct PWM

    Таймер рахує від 0 до регістру порівняння , при збігу з регістром порівняння скидається в 0 . Цей режим добре підходить для регулювання частоти , або коли потрібно відраховувати періоди .

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

режім Fast PWM timer1

тут :

  • Clock Source - вибір джерела тактування таймера , вибираємо System Clock - таймер тактується частотою , на якій працює мікроконтролер
  • Clock Value - вибір частоти роботи таймера , тут ми встановили 1000000 hz , це означає , що змінна TCNT1 буде переповняться з частотою 1000000 / 255 = 3921 hz , частота ШІМ буде 3921 khz
  • out A ( висновок А ) визначає стан ніжки OC1A при збігу рахункового регістра і регістра порівняння
  • Comp . A значення регістра порівняння

Клікаємо File - > Generate and save .

# include <mega8.h>

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 ) 
      { 
      } ; 
} 

Kомпілюємо і закидаємо в мк , тепер наш світлодіод повинен світитися приблизно на половину яскравості.

Давайте тепер спробуємо що-небудь пропищати за допомогою таймера :
Схема підключення динаміка до мк :

подключенія динаміка до мк

Таймер ми встановимо в режим Fast PWM і будемо плавно міняти частоту від 0 - 4 khz .
Код такої програми виглядає наступним чином:

  # include <mega8.h>
  # include <delay.h> 
void main ( void )
{ 
// Port B initialization 
PORTB = 0x00; 
DDRB = 0x02 ; 

// Timer / Counter 1 initialization 
TCCR1A = 0x40 ; 
TCCR1B = 0x09 ; 
TCNT1H = 0x00; 
TCNT1L = 0x00; 
ICR1H = 0x00; 
ICR1L = 0x00; 
OCR1AH = 0x00; 
OCR1AL = 0x64 ; 
OCR1BH = 0x00; 
OCR1BL = 0x00; 

while ( 1 ) 
      { 
        OCR1AL + + ; / / Збільшуємо регістр порівняння на 1 , щоб змінилася частота 
        delay_ms (100); 
      } ; 
} 

Комментарии - (0)

Добавить комментарий

Для отправки комментария вы должны авторизоваться.