Большинство микроконтроллеров STM32 (MCU) снабжено внутренним 12-разрядным ЦАП (Digital-to-Analog Converter, DAC), который может работать на скорости до 1 Msps (мегасемплов в секунду). В некоторых приложениях было бы полезно получить от DAC возможность работы на более высоких скоростях. В этой статье (перевод апноута AN4566 [1]) рассматриваются вопросы повышения производительности с помощью применения внешнего операционного усилителя (ОУ). Пример реализации рассматривает генерацию синусоидального сигнала с частотой выборок 5 Msps. Описание применимо к микроконтроллерам серий STM32F0, STM32F1, STM32F2, STM32F3, STM32F4, STM32F7, STM32G0, STM32G4, STM32H7, STM32L0, STM32L1, STM32L4, STM32L4+, STM32L5.
DAC STM32 может быть смоделирован как управляемый цифровыми данными источник напряжения с определенным выходным сопротивлением, как показано на рис. 1. Выходное сопротивление DAC постоянное, оно не зависит от входного цифрового сигнала.
Рис. 1. Эквивалентная схема DAC.
Примечание: обычно VREF+ равно напряжению питания +3.3V, а VREF- соединяется в землей GND (равно 0V).
Когда выходной буфер DAC отключен, DACINT и DACOUT соединены через резистор Rb, поэтому выходное сопротивление DAC равно Ra + Rb (Rb = Ra), и RDAC = 2 * Ra (при отключенном буфере ключи S1 и S2 разомкнуты).
Когда буфер разрешен, ОУ конфигурируется как инвертирующий усилитель с коэффициентом усиления Av = -1, и выходное сопротивление почти равно нулю благодаря петле обратной связи.
Примечание: по умолчанию выходной буфер разрешен. Он отключается, если установить в лог. 1 бит BOFF1 (для канала 1) и BOFF2 (для канала 1). Оба этих бита находятся в регистре управления DAC_CR (подробнее см. [2]).
Скоростные параметры DAC. Когда на выходе DAC разрешен буфер, быстродействие преобразования определяется производительностью этого буфера. Время установки выходного напряжения DAC можно узнать через параметр Tsettling или Update rate даташита на используемый STM32.
Когда выходной буфер запрещен, скорость нарастания выходного сигнала зависит просто от постоянной времени RC, определяемой выходным сопротивлением DAC RDAC (которое равно 2*Ra) и емкостью, которой нагружена ножка выхода DACOUT.
Например, STM32F407 определяет выходное сопротивление при выключенном буфере максимальным значением 15 кОм. Если принять за паразитную емкость типовое значение 10 пФ (это включает паразитную емкость копуса и кристалла STM32F407 на ножке DACOUT), то для получения ±1 LSB конечного значения (переход от самого малого кода к самому большому коду) мы получим:
1 1 - ---- = 1 - eT/(CR) 2N
Вычислим T:
T = CR · N · ln 2 = 0.693 CR · N = 1.8 мкс
Следовательно, в этой конфигурации время преобразования не может быть меньше 1.8 мкс (что эквивалентно частоте 555 кГц).
Этот анализ не включает какой-либо эффект скорости переключения самого DAC и влияение его переходного процесса. При высокоскоростном преобразовании эти факторы игнорировать нельзя, они снижают производительность ЦАП.
[Реализация на внешнем ОУ]
Как упоминалось выше, время преобразования на выходе DAC определяется встроенным выходным буфером, когда он разрешен. Когда буфер запрещен, выходное сопротивление и емкость DACOUT (Cp) будут определять время преобразования.
Существует конфигурация, в которой можно игнорировать емкость DACOUT. При использовании внешнего ОУ в режиме инверсии в цепи DACOUT будет фиксированным, и равным постоянному напряжению на выходе делителя R2R3, как показано на рис. 2.
Рис. 2. DAC с внешним операционным усилителем (ОУ).
Примечание *: такое поведение схемы обеспечивается операционным усилителем в присутствии обратной связи (R1).
В конфигурации по схеме рис. 2 влияние константы RC незначительное, основное ограничение по производительности определяется только скоростью внешнего ОУ (усилением в полосе пропускания и скоростью нарастания напряжения на выходе) и скоростью обновления цифровых данных DAC. Однако эта схема имеет некоторые недостатки. Резистор обратной связи R1 должен быть равен RDAC кристалла STM32 (должен быть точно подобран), иначе получится ошибка усиления DAC.
Внутренние встроенные резисторы кристалла обычно имеют широкий разброс по своему абсолютному значению, и значительные изменения в зависимости от температуры, поэтому необходимо откалибровать ошибку усиления (это обсуждается далее в секции "Калибровка усиления по выходу").
Также можно использовать внешний ОУ в режиме повторитель напряжения (включение в виде не инвертирующего буфера). Это незначительно повысит выходную полосу частот и скорость изменения напряжения на выходе, однако выходное сопротивление RDAC и паразитная емкость DACOUT будут формировать RC-фильтр, ограничивающий скорость преобразования. Но для режима повторителя напряжения ОУ не требуется калибровка усиления.
Скорость обновления цифровых данных. Данные STM32 DAC должны записываться в регистр хранения DHR (существует несколько разных регистров DHR: DHR12Rx, DHR12Lx, DHR8Rx, предназначенные для разных выравниваний и разрядности. Подробнее см. [2]), которые затем переносятся в выходной регистр DAC (DOR1 или DOR2, в зависимости от канала DAC, см. [2]) для осуществления преобразования.
Обычно данные для преобразования сохраняются в RAM, и программа CPU с нужной частотой перемещает эти данные из RAM в DAC.
При использовании DMA [3,4] общая производительность всей системы повышается, потому что ядро CPU освобождается от действий по копированию данных из памяти в DAC (этим занимается аппаратура DMA). В результате процессорное время CPU высвобождается для выполнения других операций.
Запуск преобразования может происходить программно, внешними триггерами или по сигналу (триггеру) таймера (событие обновления TIM6 или TIM7). Для высоких скоростей преобразования рекомендуется использовать триггер таймера в комбинации с DMA.
Скорость передачи из памяти в DAC ограничивается несколькими факторами, среди которых:
• Тактовая частота APB или AHB (т. е. тактовая частота DAC). • Время цикла транзакции DMA по перемещению данных из памяти в (включает задержку передачи от AHB до моста APB). • Работой самого механизма триггера.
Для примера, когда DAC микроконтроллера STM32F407x работает на шине APB1:
• 3 такта после триггера, в течение которых данные DHR перемещаются в регистр DOR. • В то же самое время генерируется запрос DMA от DAC. • Передача DMA занимает как минимум 1 такт шины APB.
Таким образом, требуется 4 такта шины APB для обновления данных DOR. На максимальной частоте APB1 42 МГц (для ST32F407x) получается максимальная скорость обновления 10.5 Msps для выходного регистра DAC, когда для обновления используется триггер таймера и DMA. Минимальный цикл передачи данных DMA для DAC не одинаковый для всех моделей микроконтроллеров STM32, потому что у них могут отличаться как тактовые частоты, так и конфигурации шины.
Режим двойной скорости DMA. Некоторые преобразователи DAC микроконтроллеров STM32 поддерживают режим двойной скорости DMA (DMA double data mode). Когда контроллер DMA используется в нормальном режиме (Normal mode), запрос DMA передает данные только порциями по 8 или 12 бит (байт или полуслово). Благодаря тому, что микроконтроллеры STM32 внутри имеют 32-битную шину данных, режим DMA double data передает два полуслова на одну операцию (две 12-битные порции данных, что дает снижение загрузки шины по сравнению с нормальным режимом.
В таблице 2 показаны максимальные частоты выборок для разных моделей MCU STM32.
Таблица 2. Максимальные частоты преобразования для разных STM32(1).
MCU |
Max скорость шины, МГц |
Max частота дискр. DAC, Msps |
STM32F0 серия |
48 |
4.8 |
STM32F100xx |
24 |
2.4 |
STM32F101xx STM32F103xx STM32F105xx STM32F107xx |
36 |
4.5 |
STM32F2 серия |
30 |
7.5 |
STM32F3 серия |
36 |
4.5 |
STM32F40x STM32F41x |
42 |
10.5 |
STM32F42x |
45 |
11.25 |
STM32F7 серия |
54 |
13.5 |
STM32G0 серия |
64 |
8.0 |
STM32G4 серия |
150 |
16.67 30(2) |
STM32H7 серия |
100 |
18.18 |
STM32L0 серия |
32 |
4.0 |
STM32L1 серия |
32 |
3.2 |
STM32L4 серия |
80 |
10 |
STM32L4+ серия |
120 |
12 |
STM32L5 |
110 |
11 |
Примечания:
(1) Значения, показанные в таблице 2, были получены в лабораторных условиях на стенде, когда шина STM32 не была нагружена другими операциями. Поэтому в реальных приложениям может понадобиться ввести некоторое ограничение по скорости, чтобы оставить запас полосы пропускания шины для других нужд. (2) Режим DMA double data.
Как можно увидеть, при использовании внешнего ОУ можно значительно повысить скорость преобразования, и получить скорость намного большую, чем заявленные 1 Msps (см. описание примера далее).
[Пример использования ОУ для повышения быстродействия DAC]
При выборе операционного усилителя следует учитывать следующие параметры.
• Скорость нарастания уровня на выходе (Slew Rate). • Полоса пропускания по усилению (gain bandwidth, GBW). • Усиление при отсутствии обратной связи. • Диапазон напряжения питания. • Параметры изменения выходного напряжения. • Диапазон синфазного напряжения на входе. • Минимальное стабильное усиление.
В случае перехода от самого малого до самого большого кода на частоте выборок 5 Msps и опорном напряжении VREF 3.3V, у операционного усилителя должна быть slew rate больше чем 3.3 · 5 · 106 = 16.5 V/мкс.
Если STM32 DAC работает на 3.3V, можно использовать напряжение питания 3.3V для ОУ (также можно использовать и другие напряжения питания, 3.3V здесь выбрано только в качестве примера).
Рекомендуется иметь по крайней мере двукратный запас по усилению в полосе пропускания по сравнению с частотой выборок DAC. Например, если частота выборок 5 Msps, то GBW должна быть шире 10 МГц.
Чтобы обеспечить хорошую линейность DAC, усиление ОУ при разомкнутой петле обратной связи должно быть больше 60 dB.
Если нужно получить выходное напряжение близким к напряжению питания, то диапазон изменения выходного напряжения ОУ желательно выбрать rail to rail. Иначе, если напряжение преобразования приблизится к напряжению питания или к уровню земли, произойдет насыщение усилителя, и в результате выходной сигнал будет искажен.
Даже когда инверсный вход ОУ зафиксирован на уровне опорного напряжения, необходимо проверить диапазон допустимого синфазного напряжения, чтобы он перекрывал с запасом уровень опорного напряжения.
Используемое усиление ОУ порядка -1, поэтому он при таком усилении должен быть стабилен.
С учетом всех перечисленных выше критериев подойдут операционные усилители LMH6645/LMH6646/LMH6647 компании Texas Instruments:
• slew rate: 22 V/мкс; • gain band width: 55 МГц; • усиление при отсутствии обратной связи: 87 dB; • диапазон напряжения питания: 2.5V .. 12 V; • диапазон синфазного напряжения по входу на 0.3V превышает уровни шин питания; • диапазон изменения выходного напряжения 20 mV ниже уровней питания; • стабильность усиления, начиная с +1.
Для этого примера используется STM32F407, запитанный от напряжения 3.3V.
Подготовка шаблона синусоиды. Как было описано в апноуте AN3126 [3], данные для шаблона синусоиды должны быть подготовлены по формуле:
2Pi 0xFFF + 1 ySineDigital(x) = (sin(x · -----) + 1) · (-----------) ns 2
Цифровые входные данные преобразуются в выходные напряжения линейно в диапазоне от 0 до VREF+. Аналоговое напряжение на выходе каждого канала DAC определяется следующим образом:
DOR DACOutput = VREF · ------------------------- DAC_MaxDigitalValue + 1
Вычислить форму синусоидального аналогового сигнала можно по формуле:
ySineDigital(x) ySineAnalog(x) = 3.3V · -------------- 0xFFF + 1
Таблица заранее подготовленной формы сигнала может быть сохранена в память и передана в DAC через DMA [3,4]. Передача каждой выборки в DAC запускается тем же самым таймером, который запускает DAC.
Установка частоты синусоидального сигнала. Чтобы установить частоту синусообразного сигнала на выходе, необходимо соответствующим образом установить частоту таймера, генерирующего сигнал триггера. Частота генерируемого синусообразного сигнала определяется по формуле:
fSinewave = fTimerTRGO / nS
Если частота триггера TIMx_TRGO равна 5 МГц (nS = 25), то частота синусоидального сигнала на выходе DAC получится 200 кГц.
Чтобы получить точную частоту на выходе, необходимо подстроить тактовую частоту системы вместе с частотой обновления таймера, чтобы таймер генерировал сигнал триггера точно на частоте 5 МГц.
В системе STM32F407 некоторые таймеры могут работать на удвоенной тактовой частоте шины APB1 [5], в этом случае разрешающая способность получается в 2 раза выше, чем при работе на частоте APB1. Однако DAC получает сигнал триггера на частоте APB1, так что разрешающая способность DAC не может быть лучше, чем тактовая частота APB1.
Например, если таймер запрограммирован на обновление через каждые 25 периодов тактов, работая на удвоенной частоте APB1 (что соответствует 12.5 периодам тактов APB1), то DAC будет срабатывать от триггера то после 12 тактов, то после 13 тактов, по очереди. Это приведет к дрожанию периода частоты выборки.
В нашем примере используются следующие настройки тактов:
• Источник тактов системы = PLL (частота HSE, вырабатываемая от внешнего кварца) • SYSCLK (Гц) = 160000000 • HCLK (Гц) = 160000000 • AHB прескалер = 1 • APB1 прескалер = 4 • APB2 прескалер = 2 • Частота HSE (Гц) = 8000000 • PLL_M = 8 • PLL_N = 320 • PLL_P = 2 • PLL_Q = 7
Для генерации сигнала триггера используется таймер TIM6.
С этой конфигурацией 80 МГц будет частота таймера, получается 5 МГц частота триггера. Прескалер должен быть установлен на 1 (PSC = 0) и счетчик должен считать до 16 (CNT = 15).
Калибровка смещения. Использование внешнего ОУ введет дополнительные смещения, сред них смещение как самого ОУ, так и смещение, которое поступает от цепочки внешнего резистора VREF.
Для выполнения калибровки необходимо соединить выход ОУ с одним из доступных каналов АЦП (ADC) микроконтроллера STM32. Процедура калибровки следующая (см. таблицу 3):
1. Установите в регистре DOR блока DAC значение 2047. 2. Измерьте уровень на выходе ОУ с помощью ADC. 3. Установите DAC DOR по результату последнего измерения ADC (в этом случае 2065). 4. Сравните результат с ADC (в этом случае 2048, что составит для смещение 1 младший разряд).
Таблица 3. Пример измерения и компенсации смещения DAC.
DAC DOR |
Результат преобразования ADC |
2047 |
2065 |
2065 |
2048 |
Калибровка усиления по выходу. Как уже упоминалось, усиление по выходу зависит от выходного сопротивления DAC и резистора обратной связи на внешнем ОУ.
Калибровка усиления должна быть выполнена во время инициализации чипа, и каждый раз при значительном изменении температуры (например, при изменении больше чем на 10 °C). Изменение температуры можно определять по встроенному в чип STM32 датчику температуры.
Для выполнения калибровки соедините выход ОУ с одним из доступных каналов ADC микроконтроллера STM32. Для калибровки усиления используйте следующий метод (см. таблицу 4):
1. Установите в регистре DOR DAC значение 1023. 2. Измерьте уровень на выходе ОУ с помощью ADC. 3. Установите в регистре DOR DAC значение 3071. 4. Измерьте уровень на выходе ОУ с помощью ADC.
Таблица 4. Пример измерения и компенсации усиления по выходу DAC.
DAC DOR |
Результат преобразования ADC |
1023 |
3135 |
3071 |
983 |
По этим измерениям можно вычислить усиление, для нашего примера оно равно 1.0508, согласно формуле (3135 - 983) / 2048.
Этот результат можно использовать для формулы YSineDigital(x), показанной выше в секции "Подготовка шаблона синусоиды". Рекомендуется иметь некоторый запас (например 100 mV) для каждого из уровней - для напряжения питания и для земли GND. Цифровой код должен меняться меньше чем на 200 mV от напряжения питания, и использовать для этого соответствующий коэффициент калибровки.
3.1 2Pi 0xFFF + 1 ySineDigital(x) = -------------- · (sin(x · -----) + 1) · (-----------) + 18 3.3 · 1.0508 ns 2
По этой формуле может быть сгенерирована таблица 5.
Таблица 5. Пример цифровых значений выборок (шаблон синусоиды).
Выборка |
Цифровое значение выборки YSineDigital(x) |
0 |
2066 |
1 |
2521 |
2 |
2948 |
3 |
3319 |
4 |
3612 |
5 |
3807 |
6 |
3893 |
7 |
3864 |
8 |
3723 |
9 |
3477 |
10 |
3142 |
11 |
2740 |
12 |
2295 |
13 |
1837 |
14 |
1392 |
15 |
990 |
16 |
655 |
17 |
409 |
18 |
268 |
19 |
239 |
20 |
325 |
21 |
520 |
22 |
813 |
23 |
1184 |
24 |
1611 |
Примечание: выходной сигнал инвертирован по отношению к цифровому коду, потому что используется ОУ в режиме инвертирующего усилителя.
[Пример аппаратной реализации]
Реальная схема доработки показана на рис. 3, значения её компонентов перечислены в таблице 6. R1 выбран по типовому значению выходного сопротивления DAC, равному 12.5 кОм (для других типов MCU STM32 см. их параметры в даташите). C1 добавлен во избежание перегрузки выходного сигнала.
Рис. 3. Принципиальная схема доработки DAC.
Таблица 6. Значения компонентов.
R1 |
12 кОм |
R2 |
10 кОм |
R3 |
C1 |
5 пФ |
C2 |
100 нФ |
C3 |
Показанный пример реализации был выполнен на плате STM32F4Discovery. Выход STM32F407 DAC1 находится на ножке порта PA4, который в свою очередь соединен с аудиокодеком CS43L22 на плате (ножка 40 LRCK микросхемы U7), и через резистор R44 100 кОм соединен с GND. Чтобы устранить это, необходимо выпаять резистор R48 (0 Ом).
На рис. 4. показан сигнал на выходе DAC, а на рис. 5 показан его спектральный анализ FFT.
Рис. 4. Выходной сигнал.
Диапазон изменения выходного сигнала не равен 3.1V от пика до пика, так как моменты выборок дискретизации не совпадают с пиком синусоидального сигнала.
Рис. 5. Результат анализа спектра сигнала на выходе.
Вторая и третья гармоники находятся по уровню приближены к шуму. Дополнительные замечания:
• При использовании высокой частоты дискретизации можно уменьшить порядок антиалиасингового фильтра. • С использованием встроенного ADC можно калибровать усиление и ошибку смещения по выходу.
[Ссылки]
1. AN4566 Extending the DAC performance of STM32 microcontrollers site:st.com. 2. STM32F4xx: цифро-аналоговый преобразователь (ЦАП). 3. AN3126: формирование аудиосигнала с помощью DAC STM32. 4. STM32: использование контроллера DMA. 5. STM32: тактирование таймеров от APB1 и APB2. |