Модуляция с широтно-импульсной модуляцией с помощью SAM4S Xplained Pro
В этой статье рассматриваются все, что вам нужно знать, чтобы генерировать сигналы с широтно-импульсной модуляцией с помощью платы разработки Atmel SAM4S Xplained Pro.
Вспомогательная информация
- Введение в разработку проекта с помощью Atmel SAM4S Xplained Pro
- Превратите свою ШИМ в ЦАП
- Низкочастотный фильтр ШИМ-сигнал в аналоговое напряжение
Требуемое оборудование / программное обеспечение
- Комплект оценки SAM4S Xplained Pro
- Студия Atmel
Перед PWM DAC нам нужна PWM
Эта статья призвана опираться на недавнюю серию из двух статей, в которой была рассмотрена методика, посредством которой цифроаналоговое преобразование достигается путем фильтрации по нижнему частотному каналу сигнала с широтно-импульсной модуляцией. (Щелкните здесь для части 1 и здесь для части 2.). Общий вывод из этих статей заключается в том, что ЦМР PWM стоит рассмотреть, если
- вы не можете или не хотите использовать внешний ЦАП или микроконтроллер со встроенным ЦАП,
- аппаратное обеспечение PWM обеспечивает разрешение ЦАП, которое подходит для вашего приложения,
- ваше цифровое напряжение питания является точным и предсказуемым, и
- вы можете достичь приемлемой выходной пульсации и времени установления с помощью не более чем базового RC низкочастотного фильтра.
Мы рассмотрели теоретическую сторону этой темы, и теперь пришло время применить теорию на практике, а затем взглянуть на некоторые реальные результаты. Для этого мы будем использовать SAM4S Xplained Pro «оценочный комплект», который является термином, который использует Atmel для чего-то, что я бы склонен назвать «панель разработки». Мы также будем использовать платы расширения PROTO1 и I / O1, оба из которых включены в стартовый комплект SAM4S Xplained Pro. На самом деле, хотя для этого проекта платы расширения являются удобством, а не необходимостью; если все, что у вас есть, это плата SAM4S, вы можете подключить низкочастотную схему с помощью макета или что-то в этом роде.
Прежде чем мы сможем превратить ШИМ-сигнал в аналоговое напряжение с цифровым управлением, нам необходимо сформировать сигнал ШИМ, и, на мой взгляд, это не так просто, как можно было бы ожидать. Мне кажется, что часть PWM системы Atmel Software Framework (ASF) несколько плохо документирована, и есть несколько небольших деталей, которые вам нужно получить прямо перед тем, как вы увидите ожидаемую форму ШИМ на ожидаемом значке. Таким образом, мы рассмотрим остальную часть этой статьи для освоения интерфейса PWM, а в следующей статье мы включим функции ЦАП.
И, кстати, не забудьте добавить модуль PWM ASF в проект, прежде чем пытаться использовать функциональность PWM ASF. Процедура добавления модуля ASF обсуждается в разделе «Шаг за шагом» в разделе «Введение в разработку проекта» с помощью Atmel SAM4S Xplained Pro.
Подключение сигнала к выходу
Микроконтроллер на плате SAM4S поддерживает четыре отдельных канала PWM; каждый канал имеет дополнительные выходы, поэтому все вместе мы имеем до восьми сигналов ШИМ. Руководство пользователя SAM4S Xplained Pro сообщает нам, что два из этих сигналов включены в стандартную разводку заголовка расширения:

В этом проекте нам не нужны дополнительные сигналы, поэтому мы будем использовать только вывод 7. Если вы используете плату расширения PROTO1, этот вывод удобно обозначается как «PWM +»; если нет, вы можете легко найти вывод номер 7 в заголовке EXT1.


Если мы посмотрим на распиновку для EXT1, мы увидим, что контакт 7 дает нам положительный (т. Е. Не инвертированный) сигнал от PWM-канала 0, а вывод порта, который управляет этим сигналом, - PA23:

Итак, как мы можем сообщить микроконтроллеру об управлении сигналом PWM на выводе PA23 «hljs»> # define PWM_DAC IOPORT_CREATE_PIN (PIOA, 23)
Макрос IOPORT_CREATE_PIN позволяет нам присоединить имя «PWM_DAC» к выводу 23 в параллельном контроллере ввода / вывода A. Теперь нам нужно настроить вывод PWM_DAC так, чтобы он использовался для периферийной функции, а не как универсальный ввод-вывод, и, кроме того, нам нужно настроить его для правильной периферийной линии. Каждый вывод может быть подключен до четырех периферийных сигналов; они упоминаются как периферийные A, B, C и D. Таблица 39-2 (стр. 955) в серии данных SAM4S сообщает нам, какой из четырех мы нуждаемся:

Теперь мы можем правильно сформулировать вызов pio_configure_pin ():
pio_configure_pin(PWM_DAC, PIO_TYPE_PIO_PERIPH_B);
Часы PWM
Следующее, что нам нужно сделать, это настроить часы, которые будут управлять оборудованием PWM. Модуль PWM поддерживает два тактовых сигнала, полученных из программируемых разделителей (называемых A и B), но нам нужен только один, поэтому мы отключим часы B. Часы PWM получаются из периферийных часов микроконтроллера. Нам не нужно обсуждать детали оборудования синхронизации, поскольку ASF обрабатывает низкоуровневую конфигурацию для нас; если вам интересно, вы можете обратиться к стр. 957 в техническом паспорте серии SAM4S.
Первым шагом в процессе настройки часов является включение периферийных часов для оборудования ШИМ:
pmc_enable_periph_clk(ID_PWM);
Теперь мы используем структуру «pwm_clock_t» для установки тактовой частоты; эта структура определяется в заголовочном файле «pwm.h» следующим образом:
/** Input parameters when initializing PWM */ typedef struct { /** Frequency of clock A in Hz (set 0 to turn it off) */ uint32_t ul_clka; /** Frequency of clock B in Hz (set 0 to turn it off) */ uint32_t ul_clkb; /** Frequency of master clock in Hz */ uint32_t ul_mck; } pwm_clock_t;
Вот пример конфигурации:
pwm_clock_t PWMDAC_clock_config = {.ul_clka = 1000000,.ul_clkb = 0,.ul_mck = sysclk_get_cpu_hz() };
Здесь мы установили часы А на 1 МГц; часы B отключены. Мы поставляем основную тактовую частоту, делая вызов sysclk_get_cpu_hz (). Чтобы применить эту конфигурацию, мы используем функцию pwm_init ():
pwm_init(PWM, &PWMDAC_clock_config);
Параметры ШИМ
Мы приближаемся - нам просто нужно настроить канал PWM, а затем включить канал. ASF делает конфигурацию PWM довольно удобной: структура типа «pwm_channel_t» дает нам доступ к различным опциям, а затем мы передаем адрес этой структуры функции pwm_channel_init (). Сначала я дам вам код, затем мы обсудим детали.
pwm_channel_instance.channel = PWM_CHANNEL_0; pwm_channel_instance.ul_prescaler = PWM_CMR_CPRE_CLKA; pwm_channel_instance.polarity = PWM_HIGH; pwm_channel_instance.alignment = PWM_ALIGN_LEFT; pwm_channel_instance.ul_period = 20; pwm_channel_instance.ul_duty = 5;
- pwm_channel_instance.channel: Мы используем канал 0.
- pwm_channel_instance.ul_prescaler: нам нужно выбрать источник синхронизации; PWM_CMR_CPRE_CLKA соответствует часам A.
- pwm_channel_instance.polarity: если для этого параметра установлено значение PWM_HIGH, значение «ul_duty» определяет ширину части сигнала с высоким уровнем логики (другими словами, логическое значение - активное состояние); если он установлен в PWM_LOW, значение «ul_duty» определяет ширину логически-низкой части сигнала.
- pwm_channel_instance.alignment: подробности о выровненном по левому краю режиме и выровненном по центру режиме см. на страницах 960-961 в техническом описании серии SAM4S. В общем, вы хотите выровненный по левому краю режим; выровненный по центру режим полезен, когда вам нужны две неперекрывающиеся формы PWM. Наиболее очевидное различие между этими настройками заключается в том, что переход от выровненного по левому краю режима к выровненному по центру режиму приведет к увеличению периода ШИМ и длительности импульса активного состояния в 2 раза.
- pwm_channel_instance.ul_period: Документация ASF описывает этого члена структуры как «значение периода цикла», и это столько же информации, сколько вы легко найдете в отношении того, что делать с ul_period. Вот описание, которое действительно полезно: ul_period определяет продолжительность цикла PWM в единицах тактовых импульсов. В этом примере мы выбрали часы A в качестве источника синхронизации для нашего канала PWM, и мы сконфигурировали часы A для частоты 1 МГц. Таким образом, единица для ul_period составляет 1 мкс тактов. Приведенный выше примерный код имеет pwm_channel_instance.ul_period = 20, что означает, что период ШИМ составляет 20 × 1 мкс = 20 мкс.
- pwm_channel_instance.ul_duty: не позволяйте идентификатору участника обмануть вас: это не определяет рабочий цикл. Рабочий цикл - это длительность импульса активного состояния, деленная на период, обычно выражаемая в процентах. Напротив, ul_duty - это длительность импульса, снова в единицах тактовых импульсов. В приведенном выше примере мы имеем pwm_channel_instance.ul_duty = 5; таким образом, ширина импульса активного состояния будет составлять 5 × 1 мкс = 5 мкс, что соответствует рабочему циклу (5 мкс) / (20 мкс) = 25%.
- Теперь мы применяем конфигурацию с вызовом pwm_channel_init (), после чего мы готовы включить канал с pwm_channel_enable ().
Результаты
Давайте посмотрим на некоторые измерения oscope для различных конфигураций PWM. Мы начнем с конфигурации, указанной в приведенных выше отрывках кода: источник синхронизации = 1 МГц, полярность = PWM_HIGH, выравнивание = PWM_ALIGN_LEFT, ul_period = 20, ul_duty = 5. Обратите внимание, что соответствующие временные характеристики отображаются с правой стороны захват области.

Если мы сохраним все одинаково, но переключимся на полярность = PWM_LOW, мы получим следующее:

Если мы вернемся к PWM_HIGH, то измените на alignment = PWM_ALIGN_CENTER, мы увидим следующее:

Следующий сигнал возвращается влево-выровненный режим, и я увеличил ul_duty до 10:

И здесь я увеличил ul_period до 30:

И, наконец, вот форма волны, если я сохраню все то же самое (ul_duty = 10, ul_period = 30), но увеличьте тактовую частоту А до 10 МГц.

Вы можете использовать следующую ссылку для загрузки исходных файлов и файлов проекта, а весь код «main.c» указан после ссылки. В следующей статье мы будем использовать наш новый опыт PWM для изучения цифрового и аналогового преобразования PWM.
Файлы источника и проекта
#include#define PWM_DAC IOPORT_CREATE_PIN(PIOA, 23) pwm_channel_t pwm_channel_instance; int main (void) { //clock configuration and initialization sysclk_init(); /*Disable the watchdog timer and configure/initialize port pins connected to various components incorporated into the SAM4S Xplained development platform, eg, the NAND flash, the OLED interface, the LEDs, the SW0 pushbutton.*/ board_init(); //connect peripheral B to pin A23 pio_configure_pin(PWM_DAC, PIO_TYPE_PIO_PERIPH_B); //enable the peripheral clock for the PWM hardware pmc_enable_periph_clk(ID_PWM); //disable the channel until it is properly configured pwm_channel_disable(PWM, PWM_CHANNEL_0); //PWM clock configuration pwm_clock_t PWMDAC_clock_config = {.ul_clka = 1000000,.ul_clkb = 0,.ul_mck = sysclk_get_cpu_hz() }; //apply the clock configuration pwm_init(PWM, &PWMDAC_clock_config); //see the article for details pwm_channel_instance.channel = PWM_CHANNEL_0; pwm_channel_instance.ul_prescaler = PWM_CMR_CPRE_CLKA; pwm_channel_instance.polarity = PWM_HIGH; pwm_channel_instance.alignment = PWM_ALIGN_LEFT; pwm_channel_instance.ul_period = 20; pwm_channel_instance.ul_duty = 5; //apply the channel configuration pwm_channel_init(PWM, &pwm_channel_instance); //configuration is complete, so enable the channel pwm_channel_enable(PWM, PWM_CHANNEL_0); while(1); }
Следующая статья в серии: PWM цифро-аналоговое преобразование с SAM4S Xplained Pro
Попробуйте этот проект сами! Получить спецификацию.