Широкоимпульсная модуляция
Это три случая одного и того же ШИМ-сигнала. Обратите внимание, что период одинаков: все три сигнала достигают высокого уровня в одно и то же время, то есть их длительность (или период) одинаковы.
Если мы подадим эти сигналы на нагрузку (светодиод, двигатель или нагреватель), нагрузка получит дозу общей возможной мощности, эквивалентную рабочему циклу.
Светодиод будет излучать 50%, 75% или 25% от своей полной яркости.
Двигатель будет работать на 50%, 75% или 25% от своей полной скорости.
Нагреватель будет вырабатывать 50%, 75% или 25% своего полного тепла.
Вот и весь ШИМ.
Широтно-импульсные модуляторы в микроконтроллерах
Практически все микроконтроллеры имеют модуль ШИМ. Чаще всего микроконтроллеры поддерживают ШИМ как функцию в модуле таймера. Модули таймера обычно реализуют операции ввода и вывода. Их схема проста:
Таймеры имеют регистр, который работает как счетчик.
Этот счетчик увеличивает свое значение в каждом цикле входного тактового сигнала.
Этот тактовый сигнал может поступать из нескольких источников, например, от системных часов, и обычно имеется делитель для уменьшения частоты, если он вам нужен.
Этот свободно работающий счетчик с постоянной входной частотой обычно поступает от надежного осциллятора, выступающего в качестве эталона времени.
Таймеры имеют специальный набор регистров, называемых регистрами значений, для выполнения операций ввода и вывода. На каждый входной/выходной вывод приходится один регистр значений.
Здесь представлены 3 наиболее популярные операции ввода/вывода, реализуемые модулями таймеров:
- Захват ввода Эта функция похожа на секундомер. Регистр значений может автоматически сохранять время, когда на входном контакте произошло событие. Например, нам может понадобиться точно знать, когда входной пин перешел из низкого уровня в высокий. В этот точный момент значение счетчика автоматически копируется в регистр значений этого вывода. Схема таймера выполняет эту операцию за нас.
- Сравнение выводов Это похоже на будильник. Выходной вывод может автоматически менять свое состояние, когда счетчик таймера достигает значения, которое мы сохранили в регистре значений. Например, нам может понадобиться выводить 1 в течение определенного времени, поэтому мы можем установить этот вывод в 1, а затем записать значение таймера плюс длительность желаемого импульса в регистр значений (как при установке будильника на 5 часов от текущего времени). Когда счетчик достигнет регистра значения, вывод автоматически изменит свое состояние на 0. Схема таймера позаботится об этой операции за нас.
- ШИМ Схема сравнения выходов вместе с опцией Toggle-on-Overflow (переключение при переполнении) делают ШИМ возможным и простым в реализации. Мы просто включаем функцию Toggle-on-Overflow и записываем желаемую ширину импульса в регистр значений для выбранного вывода. ШИМ-сигнал будет генерироваться на этом выводе, и его ширина импульса будет меняться каждый раз, когда мы изменяем содержимое регистра значений.
Широтно-импульсный модулятор в FE310
FE310 нетипичен тем, что реализует ШИМ в специальном типе устройства, называемом широтно-импульсным модулятором. У него их 3 (PWM0, PWM1, PWM2), и в нем нет таймеров общего назначения с функциями захвата входа и сравнения выхода. Каждое устройство PWM способно управлять максимум 4мя каналами (0, 1, 2, 3) через назначенные пины GPIO.
Широтно-импульсный модулятор FE310 имеет несколько режимов работы, некоторые из которых накладывают определенные ограничения на генерируемые сигналы. По этой причине в данной лекции мы рассмотрим только самый гибкий режим работы, который также является наиболее распространенным случаем использования. Этот режим позволит нам выводить ШИМ-сигналы через каналы 1, 2 и 3, и активируется он установкой конфигурационного бита pwmzerocmp.
Если вы хотите узнать о других режимах работы (ШИМ с выравниванием по центру, вывод 4-го ШИМ-сигнала через канал 0, периодические прерывания и многое другое), пожалуйста, подождите, пока вы не пройдете эту главу, а затем обратитесь к руководству.
Упрощенная версия
Из-за большого количества регистров и терминов конфигурация и использование ШИМ-модуля могут быть чрезмерно сложными и запутанными. Поэтому мы рассмотрим интересующий нас конкретный случай использования с простым объяснением.
Допустим, наш счетчик настроен на счет от 0 до 6. Счетчик виден в регистре pwms.
Следующая временная диаграмма показывает поведение всех 8 возможных ШИМ-сигналов, генерируемых в канале X (1, 2 или 3). Регистры значений называются регистрами сравнения, поэтому для канала X регистр сравнения будет pwmcmpX.
![Временная диаграмма всех возможных случаев сигнала с периодом 7 единиц счета (Изображение из руководства пользователя FE310-G002, воспроизведено с разрешения компании SiFive, Inc.)](/EDI/20_01_25_2/1737325222-1077/tutorial/1372/objects/5/files/04-04.jpg)
Рис. 4.4. Временная диаграмма всех возможных случаев сигнала с периодом 7 единиц счета (Изображение из руководства пользователя FE310-G002, воспроизведено с разрешения компании SiFive, Inc.)
Обратите внимание на следующие детали временной диаграммы:
- Выход ШИМ увеличивается, когда счетчик (pwms) достигает значения сравнения.
- Выход ШИМ переходит в низкий уровень, когда счетчик обнуляется.
- Это означает, что регистр pwmcmpX управляет шириной импульса низкого уровня, а не высокого.
- Не беспокойтесь об этом. Чтобы заставить pwmcmpX управлять широтой импульсов высокого уровня, мы можем инвертировать выход пина GPIO. Помните регистр out_xor?
- Это упрощенный пример с периодом в 7 единиц счета. Хотя это функционально, в ваших практических приложениях, скорее всего, будет использоваться что-то вроде 100, 1 000 или 20 000 единиц счета…
Блок-схема ШИМ FE310
Здесь мы рассмотрим упрощенную блок-схему ШИМ-контроллера FE310. Важно знать эту схему, поскольку она поможет вам понять, почему нам нужно взаимодействовать с каждым из задействованных регистров.
Пожалуйста, обратите внимание: пусть вас не пугает аппаратное обеспечение. Оно не очень сложное, и вы в любом случае будете использовать высокоуровневые программные инструменты для управления им. Просто сядьте поудобнее и терпеливо наблюдайте. В итоге вы получите доступ к высокоуровневой библиотеке для настройки и использования всех модулей.
Для каждого ШИМ-устройства (в FE310 их 3) имеется следующая схема, которая управляет до 4 выходных выводов:
![Схема для каждого ШИМ-устройства в микроконтроллере FE310 (Изображение из руководства пользователя FE310-G002, воспроизведено с разрешения компании SiFive, Inc.)](/EDI/20_01_25_2/1737325222-1077/tutorial/1372/objects/5/files/04-05.jpg)
Рис. 4.5. Схема для каждого ШИМ-устройства в микроконтроллере FE310 (Изображение из руководства пользователя FE310-G002, воспроизведено с разрешения компании SiFive, Inc.)
Теперь мы рассмотрим некоторые детали этой схемы.
Длинные прямоугольники с треугольником справа - это регистры конфигурации ШИМ-устройства. Все они привязаны к памяти (имеют адрес и битовое смещение), и вы можете записывать в них данные программно. Вот что они делают:
- pwmcfg: Регистр конфигурации ШИМ Этот регистр содержит биты конфигурации для управления поведением ШИМ-устройства. Все именованные сигналы, подключенные к входам на схеме (кроме wurst), являются битами из этого регистра.
- pwmcount: Регистр подсчета ШИМ Это счетчик. Он имеет (cmpwidth + 15) бит, причем cmpwidth - это размер регистров для сравнения (8 бит для PWM0, и 16 бит для PWM1 и PWM2). Остальные старшие биты до 31 всегда читаются как 0. Для PWM0 pwmcount - это 23-битный счетчик, поскольку регистры сравнения имеют ширину 8 бит. Для PWM1 и PWM2 pwmcount является 31-битным счетчиком, поскольку регистры сравнения имеют ширину 16 бит.
- pwms: Масштабированный регистр подсчета ШИМ Это умная и элегантная реализация пределителя от SiFive. Вместо деления входящей тактовой частоты, конфигурируемая часть счетчика наблюдается и отправляется в регистры сравнения. Технически, это не обязательно должен быть регистр, просто селектор битов cmpwidth в pwmcount. Смещение битов для этого выбора находится в поле pwmscale в регистре pwmconfig. Посмотрите на схему, она хорошо показывает эту логику.
- pwmcmp{1,2,3}: Регистры сравнения ШИМ 1, 2, 3 Это регистры значений. Как показано на схеме, когда счет становится больше или равен значению в одном из этих регистров, его компаратор выдает 1. Когда счет меньше значения в одном из этих регистров, его компаратор выдает 0. Каждый из этих компараторов может влиять на один выходной вывод.
- pwmcmp0: Регистр сравнения ШИМ 0 Это специальный регистр среди 4 регистров сравнения, поскольку он используется для хранения периода ШИМ-сигналов, которые могут генерироваться на выходных каналах 1, 2 и 3. Выходной вывод, связанный с каналом 0, не будет генерировать ШИМ-сигнал. Вместо этого, когда масштабированный счетчик достигает значения в pwmcmp0, счетчик обнуляется. Это означает, что pwmcmp0 эффективно управляет периодом всех трех выходных сигналов.
Регистры ШИМ в микроконтроллере FE310
FE310 имеет 3 устройства ШИМ, пользователю доступно до 12 выводов (9 в выбранном нами режиме работы). Как и в случае с GPIO, все регистры конфигурации упакованы в блоки, которые начинаются с соответствующего базового адреса регистра каждого устройства, как показано в таблице 88 руководства пользователя:
![Экземпляры устройств ШИМ в микроконтроллере FE310 (Изображение из руководства пользователя FE310-G002, воспроизведено с разрешения компании SiFive, Inc.)](/EDI/20_01_25_2/1737325222-1077/tutorial/1372/objects/5/files/04-06.jpg)
Рис. 4.6. Экземпляры устройств ШИМ в микроконтроллере FE310 (Изображение из руководства пользователя FE310-G002, воспроизведено с разрешения компании SiFive, Inc.)
ncmp - количество каналов, поддерживаемых ШИМ-устройством.
cmpwidth - ширина регистров сравнения.
Каждый 32-битный конфигурационный регистр расположен по определенному смещению. Эти смещения указаны в таблице 89 руководства пользователя: