Последние комментарии

Занятие №8. Реализация ШИМ

Задача: Разработаем программу управления яркостью лампы накаливания на 12 Вольт при помощи ШИМ. При нажатии на кнопку «Больше» яркость лампы увеличивается, при нажатии на кнопку «Меньше» яркость уменьшается. Схема нашего будущего устройства показана на рисунке. Как обычно используем микроконтроллер Atmega8, который будет тактироваться от внутреннего генератора частотой 4MHz. Собственно у нас получится диммер, эти устройства предназначены для регулировки яркости осветительных приборов. Сейчас наибольшее распространение получили светодиодные диммеры.

Для простоты к нашей схеме можно тоже подключить светодиод, но с лампочкой будет нагляднее. Кнопки подключены к выводам PD0, PD1. Нагрузку подключаем к выводу PB1(OC1A) через резистор и полевой транзистор MOSFET, который и будет работать у нас в качестве ключа (в ключевом режиме). Полевой транзистор предпочтительней потому, что его затвор изолирован от силовой схемы и управление производится электрическим полем, а ток управления достигает микроампер. Это позволяет, используя один-два транзистора, управлять нагрузкой огромной мощности (до десятков ампер и десятков-сотен вольт), не нагружая микроконтроллер. Учитывая также тот факт, что полевые транзисторы можно соединять параллельно (в отличие от биполярных), возможно получить еще более мощный каскад на сотни ампер.

Теперь разберемся, как микроконтроллер реализует ШИМ и напишем программу. Как уже говорилось ранее, в нашем МК есть 3 таймера, и все они могут работать в ШИМ-режиме. Мы будем работать с шестнадцатиразрядным таймером/счетчиком. Битами WGM13-10 настроим наш таймер на работу FastPWM с верхним пределом счета ICR1. Принцип программы такой, наш таймер считает от 0 до 65535(0xFFFF), в регистр ICR1 впишем число 255, это будет верхний предел счета таймера(TOP), частота ШИМ сигнала у нас будет постоянной. Также наш таймер настроен на то, что при совпадении счетного регистра и регистра сравнения (TCNT1 = OCR1A) будет переключатся вывод контроллера OC1A. Коэффициент заполнения ШИМ можно изменить, записав в регистр сравнения OCR1A определенное число от 0 до 255, чем больше это число тем больше будет коэффициент заполнения, тем ярче будет гореть лампа. В зависимости от того какая кнопка нажата меняется переменная i, а потом она записывается в регистр OCR1A.

Полный текст программы представлен ниже. В комментариях более подробно описана работа программы.

/***Занятие №8. Формирование ШИМ сигналов***/
#include <avr/io.h>
#include <util/delay.h>
int main(void)
{
unsigned int i=0; //определяем переменную i
/***Настройка портов ввода-вывода***/
PORTB = 0x00;
DDRB |= (1 << PB1);
PORTD |= (1 << PD1)|(1 << PD0); // подключаем внутренние нагрузочные резисторы
DDRD = 0x00;
/***Настройка таймера***/
TCCR1A |= (1 << COM1A1)|(0 << COM1A0) // Установим биты COM1A1-COM1A0:0b10, означает сброс вывода канала A при сравнении
       |(1 << WGM11)|(0 << WGM10); // Установим биты WGM13-10:0b1110, согласно таблице это
TCCR1B |= (1 << WGM13)|(1 << WGM12) // будет режим - FAST PWM, где верхний предел счета задается битом ICR1
       |(0 << CS12)|(0 << CS11)|(1 << CS10); // Битами CS12-10:0b001 задаем источник тактового сигнала для таймера МК, включен без делителя
TCNT1 = 0x00; // начальная установка счетчика
ICR1 = 0xFF; // задаем период ШИМ, здесь у нас число 255,
 // по формуле fPWM=fclk_I/O/N*(1+ICR1)// вычисляем частоту ШИМ, она будет равна 15625 Hz
OCR1A = 0x00; // начальный коэффициент заполнения ШИМ
/***Основной цикл программы***/
while(1)
{
if((PIND&(1 << PD0)) == 0) //если кнопка "больше" нажата
{
if (i < 254)
{ // коэффициент заполнения ШИМ изменяется от 0 до 255
i=i+1; // увеличиваем i на единицу
OCR1A = i; // записываем переменную в регистр сравнения
_delay_ms(30); // задержка 30ms
}
}
if((PIND&(1 << PD1)) == 0) //если кнопка "меньше" нажата
{
if (i > 0) // коэффициент заполнения ШИМ изменяется от 255 до 0
{
i--; // уменьшаем i на единицу(так тоже можно писать)
OCR1A = i; // записываем переменную в регистр сравнения
_delay_ms(30); // задержка 30ms
}
}
}
}

Внимание! Сперва подаем питание на микроконтроллер, потом нужно убедиться, что транзистор подсоединен к выводу МК, и лишь затем подавать питание в цепь с лампой и полевым транзистором. Иначе можете сжечь транзистор. Дело в том, что в выключенном состоянии "ножки" МК "болтаются в воздухе" - они ни к чему не подключены, и на них возникают наводки. Этих слабеньких наводок достаточно, чтобы частично открыть очень чувствительный полевой транзистор. Тогда его сопротивление между стоком и истоком упадет от нескольких МОм до нескольких Ом или долей Ом и через него потечет большой ток к лампе. Но транзистор не откроется полностью, т. к. для этого нужно подать на затвор не 1-3 В наводки, а стабильные 5 В, и его сопротивление будет намного больше минимального. Это приведет к выделению на нем большого количества тепла, и он задымится, а может и сгореть.

Печать

  • Просмотров: 72851

Комментарии  

0 #41 AxMeD 17.12.2014 23:02
А где рисунок со схемой?
Сообщить модератору

Советуем посмотреть...

Авторизация