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

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

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

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

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

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

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

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

Это устройство может изменять скважность импульсов с помощью 2-х тактовых кнопок 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;
}
……..

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Fs = Fckl/(256 * N * M)

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

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

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


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

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

Ваш адрес email не будет опубликован.