Широтно-импульсная модуляция

Мы уже говорили раньше, что таймеры могут работать в разных режимах. Один из них позволит нам управлять яркостью светодиода. Дабы разобраться, какой режим нам нужен, давайте порассуждаем.

Человеческий глаз — штука сложная. В нём есть палочки и колбочки, а яркость, с которой мы наблюдаем объекты, зависит от количества упавших на них фотонов. Особенность заключается в том, что «оцифровка» количества фотонов происходит не сразу. Они работают как сумматор, т. е. накапливают «заряд», и через какой-то промежуток времени показания снимаются. Это называют инертностью человеческого зрения. Другими словами, если объект будет мерцать быстрее, чем происходит снятие показаний — мы просто не заметим мерцания. Зачем нам это нужно? Всё просто! Время «регистрации» фиксировано (меняется от человека к человеку), а значит, на колбочку/палочку может упасть фиксированное (если мы берем конкретный источник света) количество фотонов. Если половину этого времени светодиод будет гореть, а вторую половину нет — то на колбочку/палочку попадет в два раза меньше фотонов, чем в том случае, если светодиод будет гореть постоянно. Примерная частота, при которой среднестатистический человек не заметит мерцания — 50 Гц1.

Такой принцип используется не только для регулировки яркости светодиодов, но и при управлении некоторыми электродвигателями. Модуляция возможна разная, но самая популярная из них — это ШИМ (широтно-импульсная модуляция, с англ. PWM — Pulse Width Modulation). Частота (период) фиксирована, а вот заполнение (англ. duty) может меняться.

pwm generation

В реальности наши органы чувств имеют логарифмическую характеристику чувствительности, будь то слух или зрение. Это позволяет им работать в огромном диапазоне интенсивностей (закон Фехнера — Вебера). В связи с этим, линейно меняя заполнение, нам не удастся «плавно» менять яркость. Впрочем, мы пренебрежем этим знанием и реализуем зажигание и угасание светодиода по линейному закону (оставив возможность реализации «того, как правильно» на вашу совесть).

В разделе «Таймеры. Обзор» мы рассматривали возможности таймеров, и как не сложно догадаться, нам потребуется режим генерации ШИМ. Согласно схеме светодиод подключен к ножке PA3. Её следует настроить как альтернативный выход с подтяжкой. Настройка таймера в начале не многим отличается от того, что мы уже делали с TIM4, нам просто не нужно использовать прерывание. У таймера TIM2 имеется четыре канала, которые могут работать независимо друг от друга.

pwm oc

Частота для каждого канала будет одна и та же, а вот заполнение можно сделать разным. Более того, генерацию можно сделать инвертированной.

К ножке PA3 подведён 4 канал, соответственно его-то и нужно использовать. Выбрать его для генерации ШИМ нужно обратившись к регистру CCER, установив туда 1 в бит CC4E. Второй бит из этого регистра, CC4P, отвечает за активный уровень — запись 0 делает активным уровнем высокий (т.е. до того как счётчик досчитает до значения в ARR), а 1 низкий.

pwm ccer

Все каналы могут работать как на вход (англ. capture), так и на выход (англ. compare). Так как мы собираемся генерировать ШИМ, нужно настроить нужный канал через регистры CCMR1 (1 и 2 канал) и CCMR2 (3 и 4 канал).

pwm ccmr2

Записав 00 в CC4S канал настраиваемся на выход.

Записав в OC4M последовательность 110 активируется прямая модуляция (PWM mode 1), для получения инвертированной (PWM mode 2) придётся записать 111.

Напишем функцию изменения яркости светодиода. Пусть для простоты будет 256 (uint8_t) градаций яркости.

Протестируем функцию, и добавим её вызов в функцию main(). Светодиод долен плавно загораться и тухнуть.

Код урока можно найти на github: CMSIS.


Назад | Оглавление | Дальше


1 Согласно санитарным нормам, частота источников света должна быть больше 300 Гц.