В своей статье я хочу представить проект ШИМ-регулятор на микроконтроллере 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, исходники прилагаются в конце статьи.
Для построение синуса была написана библиотека, в которой прописан константный массив, содержащий значения синуса.
Прикрепленные файлы:
- PWM-PROTEUS.rar (29 Кб)
- PWM.rar (5 Кб)
- Прошивка.rar (1 Кб)
- Исходники.rar (7 Кб)
- Синус.rar (8 Кб)