ТЕОРИЯ ШИМ НА МИКРОКОНТРОЛЛЕРАХ СЕМЕЙСТВА 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 поддерживает несколько режимов работы таймеров:

  1. Fast PWM — быстрый ШИМ, счётчик считает от 0 до MAX (255 или 1023)
  2. Phase Correct PWM — симметричный, меньше искажений, но медленнее
  3. 🧪 CTC — не совсем ШИМ, но может использоваться для генерации частоты

Самый популярный — Fast PWM.


⛓️ Как устроен Fast PWM на 8 бит?

PWM график

Таймер считает от 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
  • 📏 Как рассчитывать частоту сигнала
  • 💡 Как всё это настроить в коде

ШИМ — это очень мощный инструмент! Он прост в освоении, но открывает массу возможностей в управлении аналогоподобными устройствами. 💪