Опубликован: 24.11.2024 | Доступ: свободный | Студентов: 2 / 0 | Длительность: 05:47:00
Лекция 5:

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

Смещение и описание регистров конфигурации ШИМ (Изображение из руководства пользователя FE310-G002, воспроизведено с разрешения компании SiFive, Inc.)

Рис. 4.7. Смещение и описание регистров конфигурации ШИМ (Изображение из руководства пользователя FE310-G002, воспроизведено с разрешения компании SiFive, Inc.)

Помните, что мы можем легко вычислить адрес каждого из конфигурационных регистров ШИМ-устройства, добавив базовый адрес к смещению регистра. Например, pwmcmp1 PWM1 находится по адресу 0x10025024, а pwms - по адресу 0x10025010

Регистр конфигурации ШИМ

pwmcfg имеет множество битовых полей конфигурации, которые влияют на работу ШИМ-устройства. Они подробно описаны в таблице 91 руководства пользователя:

Битовые поля регистра конфигурации ШИМ (Изображение из руководства пользователя FE310-G002, воспроизведено с разрешения компании SiFive, Inc.)

Рис. 4.8. Битовые поля регистра конфигурации ШИМ (Изображение из руководства пользователя FE310-G002, воспроизведено с разрешения компании SiFive, Inc.)

И снова мы сосредоточимся только на тех полях, которые влияют на желаемый режим работы:

  • Биты [3:0], pwmscale Это 4-битное поле управляет смещением счетчика ШИМ перед подачей его на компараторы ШИМ. Значение в pwmscale - это битовая позиция в регистре pwmcount начала cmpwidth-битового поля pwms. Значение 0 в pwmscale означает отсутствие масштабирования, и pwms будет равно младшим битам cmpwidth регистра pwmcount. Максимальное значение 15 в pwmscale соответствует делению входящей тактовой частоты на 2^{15} (32 768), поэтому для входной тактовой частоты шины 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.)

Рис. 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)

Рис. 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);                // Запуск в непрерывном режиме