ТЕОРИЯ ШИМ НА МИКРОКОНТРОЛЛЕРАХ СЕМЕЙСТВА ATMEGA
⚡ Что такое ШИМ на AVR? Понятное объяснение с примерами
ШИМ (широтно-импульсная модуляция, англ. PWM – Pulse Width Modulation) — это способ управления мощностью, подаваемой на нагрузку, путём изменения длительности импульсов. Очень полезен для:
- 💡 управления яркостью светодиодов,
- 🎛️ регулировки скорости моторов,
- 🔊 генерации звуков,
- 📡 создания аналогоподобного выхода.
🔍 Основы ШИМ — как это работает?
Представим, что вы включаете и выключаете питание на светодиоде:
- 🕐 Длительность включения — сколько сигнал находится в высоком уровне (HIGH)
- 🕑 Период — общее время одного цикла (вкл + выкл)
Ширина импульса (англ. Duty Cycle) выражается в процентах:
ШИМ% = (время_высокого_уровня / период) × 100%
Например:
- 🔅 10% — почти всё время выключен
- 💡 50% — наполовину включен
- 🔆 90% — почти постоянно включен
📐 Что значит «8-битный» ШИМ?
Когда говорят "8-битный ШИМ", это означает, что регистр управления (например, OCR0A
или OCR1A
) может принимать значения от 0
до 255
— это 2⁸ = 256
уровней.
Чем больше битов — тем выше разрешение, т.е. плавность регулировки:
- 🔸 8-бит: 256 уровней
- 🔹 10-бит: 1024 уровня
- 🔷 16-бит: 65536 уровней
Для большинства задач 8 бит хватает за глаза — особенно для света или мотора.
🛠️ Режимы ШИМ на ATmega328P
ATmega поддерживает несколько режимов работы таймеров:
- ⚡ Fast PWM — быстрый ШИМ, счётчик считает от 0 до MAX (255 или 1023)
- ⏳ Phase Correct PWM — симметричный, меньше искажений, но медленнее
- 🧪 CTC — не совсем ШИМ, но может использоваться для генерации частоты
Самый популярный — Fast PWM.
⛓️ Как устроен Fast PWM на 8 бит?
Таймер считает от 0
до 255
, а при совпадении с регистром сравнения (OCRx
) переключается выход:
- 🟢 До OCR — сигнал высокий
- 🔴 После OCR — сигнал низкий
OCR = 128 → ШИМ = 50%
OCR = 64 → ШИМ = 25%
OCR = 192 → ШИМ = 75%
📏 Расчёт частоты ШИМ
Формула для Fast PWM 8-bit:
f_PWM = f_CPU / (N × 256)
Где:
f_CPU
— тактовая частота (например, 16 МГц)N
— предделитель (1, 8, 64, 256, 1024)- 256 — потому что 8-бит
Пример (без делителя):
f_PWM = 16_000_000 / (1 × 256) ≈ 62.5 кГц
С делителем 64:
f_PWM = 16_000_000 / (64 × 256) ≈ 976 Гц
Чем выше частота, тем меньше заметны "мерцания" на светодиодах и меньше слышен "писк".
🧪 Пример конфигурации Fast PWM
// Настройка PWM на пине D9 (OC1A)
void PWM_Init() {
DDRB |= (1 << PB1); // Выход
TCCR1A |= (1 << COM1A1) | (1 << WGM10); // Fast PWM, 8-бит
TCCR1B |= (1 << WGM12) | (1 << CS11); // Предделитель 8
}
Вы можете менять яркость:
OCR1A = 128; // 50%
OCR1A = 255; // 100%
OCR1A = 64; // 25%
📌 Какие таймеры на ATmega328P поддерживают ШИМ?
Таймер | Битность | Выходы | Пины Arduino |
---|---|---|---|
Timer 0 | 8-бит | OC0A, OC0B | D6, D5 |
Timer 1 | 16-бит | OC1A, OC1B | D9, D10 |
Timer 2 | 8-бит | OC2A, OC2B | D11, D3 |
Важно: Timer0 используется для delay()
и millis()
, так что не стоит его трогать без необходимости.
🎯 Вывод
Теперь вы знаете:
- 🔎 Что такое ШИМ и зачем он нужен
- 📶 Чем отличается 8-битный от 10-битного
- ⚙️ Как работает Fast PWM на таймерах AVR
- 📏 Как рассчитывать частоту сигнала
- 💡 Как всё это настроить в коде
ШИМ — это очень мощный инструмент! Он прост в освоении, но открывает массу возможностей в управлении аналогоподобными устройствами. 💪