ШИМ-регулятор на микроконтроллере ATmega8515

В своей статье я хочу представить проект ШИМ-регулятор на микроконтроллере Atmega8515 (даташит PDF) для управления какой-либо нагрузкой.

Что же такое ШИМ? ШИМ — это широтно-импульсная модуляция, иначе говоря-управление средним значением напряжения на нагрузке путём изменения скважности импульсов, управляющих ключом.
Скважность — один из классификационных признаков импульсных систем, определяющий отношение его периода следования (повторения) к длительности импульса.

Чтобы все встало на свои места привожу поясняющую картинку.

Принцип ШИМ

В данном примере будем управлять яркостью светодиода(5-ти ступенчатая регулировка) с помощью двух тактовых кнопок(+/-).

Итак для сборки ШИМ нам понадобится:

1) Микроконтроллер ATmega8515.
2) Тактовая кнопка — 2шт;
3) Резистор на 4,7кОм — 2шт;
4) Резистор на 200 Ом-1шт;
5) Панелька под микросхему DIP40;
6) Любой светодиод-1шт;
7) Стабилизированный источник питания для МК на 3-5В.

Принципиальная схема устройства:

Схема

Это устройство может изменять скважность импульсов с помощью двух тактовых кнопок S3(+) и S4(-), соответственно будет изменяться яркость светодиода.

Исходный код программы написан в среде CodeVisionAvr   и представлен в конце статьи.

Небольшие комментарии к исходному коду:

В этой части кода мы прописываем обработчик внешнего прерывания(INT0/INT1).

 interrupt [EXT_INT0] void ext_int0_isr(void) {      i++;    delay_ms(50); }       interrupt [EXT_INT1] void ext_int1_isr(void) {      i--;    delay_ms(50);  }      

Настраиваем порты микроконтроллера, устанавливаем условие глобальных прерываний от INT0 и INT1, разрешаем глобальные прерывания.

 MCUCR |= (0<<ISC01)|(0<<ISC00); //устанавливаем условие внешнего прерывания от INT0 GICR |= (1<<INT0);    MCUCR |= (0<<ISC10)|(0<<ISC11); //устанавливаем условие внешнего прерывания от INT1 GICR |= (1<<INT1); PORTB=0x00;//Все пины порта В в 0 DDRB=0xFF;  //Все пины Порта B на выход PORTA.0=0x00;//пин порта A в 0 DDRA.0=0xFF;  //пин Порта A на выход PORTC=0x00;//Все пины порта С в 0 DDRC=0xFF;  //Все пины Порта B на выход PORTD.0=0x00;  //Все пины порта D в 0 DDRD.0=0xFF;  //Все пины Порта D на выход TIMSK=0x00; TCCR0=0x6B;//start timer TCNT0=0x00; OCR0=0x00;// задаем величину генерируемого ШИМ сигнала  #asm("sei")//разрешаем глобальные прерывания 

Цикл,Оператор выбора из множества вариантов, регистром OCR0 настраивается скважность импульса (1-255).

   while(1){        switch(i){        case 1:        {           PORTC=0x06;              OCR0=50;                       break;           } ........ 

Фото готового устройства:

DSCN6477.jpg

Схема безобразно проста и чтобы убедится в ее работоспособности устройство было собрано на обычной пластиковой обложке от какой-то папки.

Можно собрать ШИМ и на печатной плате (Плата нарисована в программе SprintLayout 5.0):

Плата

Несколько осциллограмм демонстрирующих изменение скважности импульсов с помощью двух тактовых кнопок::

   Значение регистра OCR0= 50    Значение регистра OCR0= 100

DSCN6481.jpgDSCN6482.jpg

   Значение регистра OCR0= 150    Значение регистра OCR0= 200

DSCN6483.jpgDSCN6484.jpg

   Значение регистра OCR0= 254

DSCN6485.jpg

Без изменения прошивки к микроконтроллеру можно подключить любой 7-ми сегментный индикатор с общим катодом, который будет отображать номер режима работы ШИМ-регулятора(от 1 до 5). Катод индикатора подключается на 39 ножку МК, а анод через токоограничительные   резисторы (100-250 Ом) на 21-27 ножки МК.

mc211_sch2.png

Фьюзы для прошивки выставлять не надо! Оставляем их стандартными.

Это устройство имеет широкое применение. Например его можно использовать для управления яркостью светодиодов, управлять оборотами вентилятора, применить для регулировки оборотов двигателя сверлильного станочка и т.п.

Более мощную нагрузку (вентилятор, большое кол-во светодиодов) необходимо подключать через транзистор.

Синусоидальный сигнал

А здесь будет приведен пример, как получить синусоидальный сигнал.

Схема  не представляет никаких трудностей т.к. здесь используется один микроконтроллер (Atmega8515) и низкочастотный фильтр (R1 и C1) через который мы пропускаем генерируемый сигнал и на выходе получаем постоянное напряжение.

Схема

В данном случае получается синус с частотой 35 Гц.

Частоту синуса можно высчитать по следующей формуле:

Fs = Fckl/(256 * N * M)

Fs=8000000/(256 * 8 * 112)=34.8 Гц.
где Fclk — тактовая частота микроконтроллера, N — коэффициент деления предделителя, M — число отсчетов сигнала.

Прошивка писалась в среде CodeVisionAvr, исходники прилагаются в конце статьи.

Для построение синуса была написана библиотека, в которой прописан константный массив, содержащий значения синуса.

Осциллограмма

Прикрепленные файлы:

  • PWM-PROTEUS.rar (29 Кб)
  • PWM.rar (5 Кб)
  • Прошивка.rar (1 Кб)
  • Исходники.rar (7 Кб)
  • Синус.rar (8 Кб)

Теги: