|
| |||||||
|
Опубликовано 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омпілюємо і закидаємо в мк , світлодіод повинен світиться на половину яскравості. Але ви, напевно, вже встигли помітити , що наша програма тільки те й робить, що встановлює лог -рівні на виводі мк . Щоб звільнити головний цикл від цієї рутинної роботи , ми скористаємося таймером.
Отже , для наших потреб ( регулювання яскравості світлодіода ) підходить режим Fast PWM . Запускаємо CodeWizard AVR , переходимо на вкладку timers - > timer1 , виставляємо все , як показано на скріншоті
тут :
Клікаємо 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) Добавить комментарийДля отправки комментария вы должны авторизоваться. |
|||||||