Pwm цифро-аналоговое преобразование с sam4s xplained pro

Pwm цифро-аналоговое преобразование с sam4s xplained pro
Pwm цифро-аналоговое преобразование с sam4s xplained pro
Anonim

PWM цифро-аналоговое преобразование с SAM4S Xplained Pro

В этой статье мы будем использовать платформу разработки SAM4S Xplained Pro, чтобы получить практический опыт работы с PWM DAC.

Вспомогательная информация

  • Введение в разработку проекта с помощью Atmel SAM4S Xplained Pro
  • Превратите свою ШИМ в ЦАП
  • Низкочастотный фильтр ШИМ-сигнал в аналоговое напряжение

Требуемое оборудование / программное обеспечение

  • Комплект оценки SAM4S Xplained Pro
  • I / O1 Xplained Pro, или вы можете подключить свой фильтр нижних частот к соответствующим штырькам заголовка
  • Студия Atmel

Предыдущая статья

Модуляция с широтно-импульсной модуляцией с помощью SAM4S Xplained Pro

Штырьки, сигналы и зонды, Oh My

В предыдущей статье мы закрепили наш контроль над оборудованием SAM4S PWM, сгибая его по нашей воле с помощью Atmel Software Framework (ASF). Теперь мы готовы сделать аппаратное обеспечение PWM полезным, а именно, сгенерировать программируемое аналоговое напряжение с помощью не более чем RC низкочастотного фильтра. Первое, что нам нужно сделать, - это убрать детали с помощью нашей аппаратной настройки. Мы будем использовать измерения осциллографа для наблюдения и анализа сигналов PWM и DAC, поэтому важной частью этой настройки является удобное зондирование соответствующих сигналов.

Если у вас есть плата расширения I / O1, вы можете реплицировать мою аппаратную настройку:

Image
Image

Фильтр нижних частот достигается с помощью RC-фильтра на плате I / O1. Так получилось, что вход в этот RC-фильтр подключен к штырю PWM на микроконтроллере SAM4S, и, кроме того, RC-фильтр дополняется отличным маленьким шелкографическим сюжетом Боде - приятным прикосновением, Atmel. Частота среза составляет приблизительно 2340 Гц.

Плата ввода / вывода не включает отдельные заголовки для входных и выходных сигналов фильтра нижних частот, поэтому нам нужно найти другой способ подключения зондов. 20-контактный EXT-заголовок был бы удобен, если бы соответствующие сигналы были подключены к выводам с нечетным номером, но, как повезло, они имеют как четные номера, так и четные контакты не доступны:

Image
Image

К счастью, один из этих сигналов доступен в другом месте. Выход фильтра нижних частот подключается к контакту PB1, который также доступен с клеммы 9 в ряду сквозных отверстий с надписью «SPARE / ALTERNATE SIGNALS» на плате развития SAM4S. Вот почему на приведенной выше фотографии показан один из зондов, помещенных в запасной / альтернативный номер 9. Нет удобного доступа к входному узлу фильтра нижних частот, поэтому я припаял провод перемычки к выводу 8 в заголовке EXT I / O1, следующим образом:

Image
Image

Единственное раздражение моей установки - это перемычка. Если вам не нравится паять или у вас нет железа, вот альтернатива: вход фильтра нижних частот на плате I / O1 подключен к отрицательному (т.е. инвертированному) выходу из канала ШИМ 1 На плате PROTO1 (показано на приведенной выше фотографии) вы можете легко обнаружить отрицательный вывод из канала PWM 0, потому что он находится прямо на заголовке прототипирования:

Image
Image

Поэтому вместо проверки фактического входа в фильтр нижних частот вы просто проверяете PWM0- на плате PROTO1, а затем модифицируете код, чтобы каналы PWM 0 и 1 были включены и всегда генерировали один и тот же сигнал PWM (тот же источник синхронизации, тот же период, тот же рабочий цикл и т. д.).

Наконец, если у вас нет платы I / O1, вы можете использовать плату PROTO1, макет или какую-то приставку прямого припоя, собранную присяжными, чтобы получить фильтр нижних частот, подключенный к одному из сигналов ШИМ. Если вы используете плату PROTO1, подключите ее к EXT2, чтобы вам не пришлось изменять код (EXT1 и EXT2 имеют разные ШИМ-сигналы - канал 0 для EXT1 и 1-й канал для EXT2). Это схема нижних частот, используемая на плате I / O1:

Image
Image

Точность и пульсация

Вот базовая структура кода для цифро-аналогового преобразования PWM:


#include#define PWM1L_DAC IOPORT_CREATE_PIN(PIOA, 20) #define PWM_CLOCKSOURCE_FREQ 10000000 #define PWM_FREQ 100000 #define PWM_PERIOD_TICKS PWM_CLOCKSOURCE_FREQ/PWM_FREQ #define MEASURED_VHIGH 3 float DAC_voltage = 1; pwm_channel_t PWM1_config; 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 A20 pio_configure_pin(PWM1L_DAC, PIO_TYPE_PIO_PERIPH_B); //enable the peripheral clock for the PWM hardware pmc_enable_periph_clk(ID_PWM); //disable the PWM channel until it is properly configured pwm_channel_disable(PWM, PWM_CHANNEL_1); //PWM clock configuration pwm_clock_t PWMDAC_clock_config = {.ul_clka = PWM_CLOCKSOURCE_FREQ,.ul_clkb = 0,.ul_mck = sysclk_get_cpu_hz() }; //apply the clock configuration pwm_init(PWM, &PWMDAC_clock_config); //select channel 1 PWM1_config.channel = PWM_CHANNEL_1; //select clock A PWM1_config.ul_prescaler = PWM_CMR_CPRE_CLKA; /*The low-pass filter is connected to the inverted output for PWM channel 1, so to get an active-high signal we invert again by setting the polarity to low.*/ PWM1_config.polarity = PWM_LOW; //left-aligned mode PWM1_config.alignment = PWM_ALIGN_LEFT; PWM1_config.ul_period = PWM_PERIOD_TICKS; PWM1_config.ul_duty = (DAC_voltage * MEASURED_VCC) / PWM_PERIOD_TICKS; //apply the channel configuration pwm_channel_init(PWM, &PWM1_config); //configuration is complete, so enable the channel pwm_channel_enable(PWM, PWM_CHANNEL_1); while(1); }

Как вы можете видеть, мы используем директивы препроцессора для определения

  1. частота часов, которые приводят в действие оборудование ШИМ (то есть, часы А),
  2. частота сигнала ШИМ,
  3. период сигнала ШИМ в единицах тактовых импульсов А и
  4. измеренное цифровое напряжение питания.

Затем мы имеем переменную с плавающей запятой, DAC_voltage, для желаемого выходного напряжения. Мы настраиваем частоту PWM, устанавливая PWM1_config.ul_period равным PWM_PERIOD_TICKS. Частота сигнала PWM (PWM_FREQ) не влияет на номинальное выходное напряжение ЦАП, но оно влияет на количество пульсаций - как обсуждалось в Low-Pass Filter, сигнал PWM в аналоговое напряжение, более высокая частота ШИМ приводит к более низкой пульсации, поскольку фильтр нижних частот может более эффективно подавлять компоненты, не относящиеся к DC сигнала. Единственными двумя факторами, которые влияют на номинальное напряжение ЦАП, являются рабочий цикл и амплитуда (т.е. логическое высокое напряжение минус логическое - низкое напряжение) формы ШИМ. Амплитуда вне нашего контроля, поэтому все сводится к циклу заполнения. Мы вычисляем ul_duty (который представляет собой длительность импульса, а не рабочий цикл) следующим образом:


PWM1_config.ul_duty = (DAC_voltage * MEASURED_VCC) / PWM_PERIOD_TICKS;

Этот небольшой расчет просто гарантирует, что отношение ul_duty к ul_period будет таким же, как отношение желаемого напряжения ЦАП к амплитуде ШИМ. Здесь мы предполагаем, что измеренное напряжение питания совпадает с амплитудой, и мы скоро увидим, что это наш доминирующий источник ошибки.

Вот захват области для настроек, показанных выше (частота ШИМ = 100 кГц, DAC_voltage = 1, амплитуда ШИМ = 3, 28 В):

Image
Image

Значительные измерения отображаются с правой стороны. Частота как ожидалось, и рабочий цикл согласуется с теоретическим значением: (1 В) / (3, 28 В) = 0, 305. Основное несоответствие - это амплитуда. Форма ШИМ-волны переключается от примерно 100 мВ до 3 В, а не от 0 В до 3, 28 В. Теперь здесь важная деталь: когда логическое низкое напряжение не равно 0 В, напряжение ЦАП больше не рассчитывается как (ШИМ амплитуда) × (рабочий цикл). Вместо этого нам нужно использовать

(DAC \ voltage = \ left ( left (V_ {HIGH} -V_ {LOW} right) times duty \ cycle \ right) + V_ {LOW} )

Таким образом, ожидаемое напряжение ЦАП в текущих условиях

(ЦАП \ напряжение = \ левое ( left (3 \ V-100 \ mV \ right) times30.5 \% \ right) +100 \ mV = 985 \ mV )

И это почти то, что область вычисляется как среднее значение напряжения ЦАП. Поэтому имейте в виду, что вы не можете просто умножить «CH1 Vamp» области на «CH1 + Dut», чтобы определить ожидаемое выходное напряжение; вам нужно взять результат этого умножения и добавить его к фактическому логическому низковольтному сигналу ШИМ-сигнала. В любом случае мы имеем погрешность ~ 20 мВ в среднем напряжении ЦАП, возникающем в результате несоответствия между предполагаемыми значениями логического высокого и низкого напряжения и реальными значениями логического высокого и низкого напряжения. Что касается пульсации, мы смотрим примерно на 150 мВ от пика к вершине. (Сфера охвата имеет проблемы с этим измерением из-за шумов, которые происходят одновременно с логическими переходами в форме ШИМ. Это результат перекрестных помех между двумя каналами видимости, они фактически не присутствуют в сигнале ЦАП.) С 150 мВ пульсации и 20 мВ ошибки, мой общий вывод до сих пор заключается в том, что у нас есть ЦАП; это не впечатляет, но если такая производительность подходит для вашего приложения, она дешевле и проще, чем внешний ЦАП.

Ниже приведены области охвата для DAC_voltage = 0, 5, 1, 5 и 2, 5:

Image
Image
Image
Image
Image
Image

улучшения

Что мы можем сделать, чтобы сделать этот PWM DAC немного менее посредственным «hljs»> # define MEASURED_VHIGH 3 #define MEASURED_VLOW 0.1.,, PWM1_config.ul_duty = ((DAC_voltage - MEASURED_VLOW) / (MEASURED_VHIGH - MEASURED_VLOW)) * PWM_PERIOD_TICKS;

И вот результаты с DAC_voltage = 1.

Image
Image

Эй, ошибка равна нулю! Успех! О, подождите, вот результаты для DAC_voltage = 0.5 и DAC_voltage = 2.5.

Image
Image
Image
Image

Вздох. Таким образом, даже изменения в рабочем цикле ШИМ могут привести к достаточному изменению высоких и низких напряжений, чтобы вызвать значительную ошибку. Это поднимает идею более сложной схемы, в которой расчет использует разные высокие и низкие напряжения в зависимости от рабочего цикла, но я бы использовал внешний ЦАП, прежде чем я посвятил этому много времени.

По крайней мере, мы знаем, что мы можем улучшить пульсацию. Давайте увеличим частоту источника синхронизации ШИМ до 120 МГц и частоту ШИМ до 10 МГц. Здесь представлены захваты области для DAC_voltage = 1. Зонд PWM отключен для второго захвата, так что мы можем видеть, как выглядит форма сигнала ЦАП без перекрестных помех (хотя, по-видимому, в сигнал ЦАП все еще существует некоторая шумовая связь).

Image
Image
Image
Image

Более высокая частота уменьшает пульсацию до незначительных уровней, но высокое и низкое напряжения изменились достаточно, чтобы ввести большое количество ошибок (напомним, что ошибка была равна нулю, когда мы использовали более низкую частоту с DAC_voltage = 1).

Вывод

Вы можете использовать следующую ссылку для загрузки исходных файлов и файлов проекта:

Файлы источника и проекта

Мы видели, что ЦМР PWM страдают от серьезных ограничений. В дополнение к описанной выше ошибке и пульсации, а также длительному времени установления, рассмотренному в фильтре нижних частот, PWM-сигнал в аналоговое напряжение, доступное разрешение уменьшается по мере увеличения частоты ШИМ, хотя PWM использует 16-разрядный счетчик, более высокие частоты уменьшают используемая ширина этого счетчика, поскольку и период, и ширина импульса определяются регистрами, которые сравниваются с одним и тем же счетчиком. Например, если счетчик PWM сбрасывается на 100, потому что он должен генерировать период 100 мкс с тактовой частотой 1 МГц, регистр рабочего цикла не может превышать 100, что приводит к разрешению менее 7 бит (потому что 2 7 = 128). Суть: если вы можете терпеть ограничения, PWM DAC - это простое недорогое решение, но в большинстве случаев вам лучше работать с обычным ЦАП, будь то внешним или интегрированным в микроконтроллер.

Попробуйте этот проект сами! Получить спецификацию.