Широкоимпульсная модуляция
![Смещение и описание регистров конфигурации ШИМ (Изображение из руководства пользователя FE310-G002, воспроизведено с разрешения компании SiFive, Inc.)](/EDI/13_02_25_2/1739398847-5454/tutorial/1372/objects/5/files/04-07.jpg)
Рис. 4.7. Смещение и описание регистров конфигурации ШИМ (Изображение из руководства пользователя FE310-G002, воспроизведено с разрешения компании SiFive, Inc.)
Помните, что мы можем легко вычислить адрес каждого из конфигурационных регистров ШИМ-устройства, добавив базовый адрес к смещению регистра. Например, pwmcmp1 PWM1 находится по адресу 0x10025024, а pwms - по адресу 0x10025010
Регистр конфигурации ШИМ
pwmcfg имеет множество битовых полей конфигурации, которые влияют на работу ШИМ-устройства. Они подробно описаны в таблице 91 руководства пользователя:
![Битовые поля регистра конфигурации ШИМ (Изображение из руководства пользователя FE310-G002, воспроизведено с разрешения компании SiFive, Inc.)](/EDI/13_02_25_2/1739398847-5454/tutorial/1372/objects/5/files/04-08.jpg)
Рис. 4.8. Битовые поля регистра конфигурации ШИМ (Изображение из руководства пользователя FE310-G002, воспроизведено с разрешения компании SiFive, Inc.)
И снова мы сосредоточимся только на тех полях, которые влияют на желаемый режим работы:
-
Биты [3:0], pwmscale Это 4-битное поле управляет смещением счетчика ШИМ перед подачей его на компараторы ШИМ. Значение в pwmscale - это битовая позиция в регистре pwmcount начала cmpwidth-битового поля pwms. Значение 0 в pwmscale означает отсутствие масштабирования, и pwms будет равно младшим битам cmpwidth регистра pwmcount. Максимальное значение 15 в pwmscale соответствует делению входящей тактовой частоты на
, поэтому для входной тактовой частоты шины 16 МГц pwms будет увеличиваться с частотой 488,3 Гц. Аналогично, значение 1 в pwmscale означает деление входной частоты на 2, значение 2 - деление на 4, значение 3 - деление на 8, и так далее, и так далее.
- Бит 9, pwmzerocmp Установка этого бита приводит к обнулению счетчика через один цикл после достижения им значения в pwmcmp0. Таким образом, мы хотим установить этот бит.
- Бит 10, pwmdeglitch Установка этого бита предотвращает переход ШИМ-сигнала с высокого уровня на низкий в цикле ШИМ. Это позволяет нам свободно изменять регистры сравнения, не беспокоясь о глюках в ширине импульсов. Таким образом, мы хотим установить этот бит.
- Бит 12, pwmenalways Этот бит включает счетчик безусловно. Другими словами, когда этот бит установлен, у нас есть свободно работающий счетчик. Таким образом, мы хотим установить этот бит.
Пины ШИМ в Red-V Thing Plus
Теперь, если мы хотим передать наши сигналы ШИМ во внешний мир, нам лучше знать, какие пины использовать. Давайте посмотрим на отображение GPIO IOF в таблице 53 руководства FE301:
![Сопоставление IOF0 и IOF1 для каждого вывода GPIO (Изображение из руководства пользователя FE310-G002, воспроизведено с разрешения компании SiFive, Inc.)](/EDI/13_02_25_2/1739398847-5454/tutorial/1372/objects/5/files/04-09.jpg)
Рис. 4.9. Сопоставление IOF0 и IOF1 для каждого вывода GPIO (Изображение из руководства пользователя FE310-G002, воспроизведено с разрешения компании SiFive, Inc.)
Обратите внимание, что только 5 выводов имеют две альтернативные функции IOF. Кажется, что SiFive могла бы обойтись только одной функцией IOF для этого микроконтроллера. Однако большинство микроконтроллеров принадлежат к семейству, члены которого имеют больше функций ввода/вывода, чем другие, поэтому мы, возможно, рассматриваем младшего брата этого семейства.
Теперь вернитесь к схеме Red-V Thing Plus и обратите внимание, что все 12 выходов ШИМ подключены к контактам в заголовках ввода/вывода:
![Частичная схема Red-V Thing Plus, производитель SparkFun Electronics (Изображение любезно предоставлено SparkFun Electronics)](/EDI/13_02_25_2/1739398847-5454/tutorial/1372/objects/5/files/04-10.jpg)
Рис. 4.10. Частичная схема Red-V Thing Plus, производитель SparkFun Electronics (Изображение любезно предоставлено SparkFun Electronics)
Помните, что для режима работы, который мы собираемся использовать, у нас есть только 9 доступных выводов ШИМ: 3 на каждое ШИМ-устройство. Выводы канала 0 недоступны для ШИМ, поскольку регистры pwmcmp0 используются для управления периодом сигналов ШИМ. Однако эти 3 вывода по-прежнему доступны для других функций.
Функции ШИМ в библиотеке Freedom Metal
Теперь, когда мы знакомы с библиотекой Freedom Metal Library, давайте рассмотрим несколько функций, которые мы будем использовать.
Допустим, мы хотим управлять яркостью светодиода, подключенного к выходу канала 1 в PWM1 (сокращенно PWM1_1).
Для генерации ШИМ-сигнала частотой 1 кГц с рабочим циклом 70% в PWM1_1 мы можем просто использовать этот код:
struct metal_pwm *pwm_1; // Экземпляр ШИМ pwm_1 = metal_pwm_get_device(1); // Получение экземпляра ШИМ-устройства metal_pwm_enable(pwm_1); // Включить ШИМ1 metal_pwm_set_freq(pwm_1, 1, 1000); // Установить частоту ШИМ1_1 на 1 кГц metal_pwm_set_duty(pwm_1, 1, 70, METAL_PWM_PHASE_CORRECT_DISABLE); // Установить рабочий цикл для ШИМ1_1 metal_pwm_trigger(pwm_1, 1, METAL_PWM_CONTINUOUS); // Запуск в непрерывном режиме