В своей статье я хочу представить проект ШИМ-регулятор на микроконтроллере 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; } ........
Фото готового устройства:
Схема безобразно проста и чтобы убедится в ее работоспособности устройство было собрано на обычной пластиковой обложке от какой-то папки.
Можно собрать ШИМ и на печатной плате (Плата нарисована в программе SprintLayout 5.0):
Несколько осциллограмм демонстрирующих изменение скважности импульсов с помощью двух тактовых кнопок::
Значение регистра 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 Кб)
Комментарии (8) | Я собрал (0) | Подписаться
Для добавления Вашей сборки необходима регистрация
[Автор]
[Автор]
По расчетам получается 250 Ом для 20 мА, но это, на сколько я помню, максимальное значение для светодиода. Следовательно он проработает не очень долго. А если еще собрать эту схему с нормальным источником на 5В и поставить резистор на 200 Ом то будет ток 25 мА, что уже очень много...
2/0.02=100 Ом. Подсчитаем для 5-ти Вольт 5-1.8=3.2
3.2/0.02=160 Ом. Так что 200 Ом тут за глаза...