[i] Подключение модулятора MDR5103FI к MDR1206FI. Работа блока ADCUI с внешним сигма-дельта модулятором
Микросхема MDR5103FI представляет из себя изолированный сигма-дельта модулятор АЦП: она преобразует падение напряжения на шунте (резистор малого сопротивления) в однобитный цифровой поток и передаёт его через барьер гальванической развязки. Собственного цифрового фильтра у микросхемы нет, поэтому децимацию потока должен выполнять микроконтроллер. В MDR1206FI для этого есть блок ADCUI с фильтрами SINC3, рассчитанными на совместную работу с рассматриваемой микросхемой модулятора.
В статье рассматривается подключение демонстрационного модуля MDR5103FI к отладочной плате MDR1206FI и настройка блока ADCUI на приём данных с внешнего модулятора. Материал распространяется также на микросхемы MDR5103AFI и MDR5103BFI - они отличаются только шкалой входного напряжения.
В статье будут рассмотрены следующие вопросы:
- Основные сведения о микросхеме MDR5103FI и модуле на её основе.
- Схема соединения плат MDR5103FI и MDR1206FI.
- Расчёт тактирования и настройка блока ADCUI с использованием библиотеки SPL.
- Чтение отсчётов в массив и проверка тракта с помощью генератора сигналов.
Основные сведения о микросхеме MDR5103FI и модуле на её основе
Микросхема MDR5103FI содержит сигма-дельта модулятор второго порядка с однобитным квантователем, источник опорного напряжения 1,22 В и изолированный преобразователь питания. Для работы требуется единственный источник 3,3 В со стороны микроконтроллера (питание для высоковольтной части формируется самой микросхемой, что является её преимуществом). Нулевому дифференциальному напряжению на входах IN/nIN соответствует коэффициент заполнения сигнала DOUT около 50 %, границам шкалы - около 11 и 89 %. При выходе за шкалу более чем на 10 % поток вырождается в постоянные "0" или "1".В таблице 1 представлены ключевые параметры микросхемы при организации подключения к микроконтроллеру.
Таблица 1 - Параметры MDR5103FI, существенные при подключении к микроконтроллеру
| Параметр | Значение |
| Напряжение питания (вывод VDD) | от 3,0 до 3,6 В |
| Тактовая частота на входе CLKIN | от 0,9 до 1,1 МГц |
| Коэффициент заполнения сигнала CLKIN | от 45 до 55 % |
| Выходное напряжение высокого уровня на DOUT | не менее 2,4 В |
| Входное дифференциальное напряжение (MDR5103FI / AFI / BFI) | ±25 / ±50 / ±100 мВ |
Здесь лишь отметим, что микроконтроллер MDR1206FI в соответствии с предельно-допустимыми параметрами при питании Ucc = 3.3 В по входу корректно считает сигналы, поступающие с вывода DOUT микросхемы модулятора.
Перейдем к рассмотрению модуля на базе микросхемы MDR5103FI и основных узлов платы для организации совместной работы с микроконтроллером.
Общий вид платы представлен на рисунке 1.
Рисунок 1 - Общий вид платы на базе MDR5103FI
Цифровые сигналы выведены на разъём XP1 (таблица 2). На плате контакт 4 (VDD) расположен сверху, контакт 1 (DOUT) - снизу. Для отладки предусмотрены контрольные точки KT1 (ISOGND), KT4 (VDD), KT5 и KT7 (GND).
Таблица 2 - Назначение контактов разъёма XP1
| Контакт | Цепь | Назначение |
| 1 | DOUT | Однобитный поток данных модулятора |
| 2 | GND | Шина "Общий" |
| 3 | CLK | Вход тактового сигнала модулятора |
| 4 | VDD | Питание 3.3 В |
Схема соединения плат
Блок ADCUI использует внешние сигма-дельта модуляторы вместо внутренних АЦП при настройке выводов порта D в альтернативные функции (таблица 3). Отдельных бит разрешения этого режима нет. Вывод PD14 - общий для всех каналов, с него снимается тактовая частота АЦП. В статье используется канал тока I0, то есть поток принимается выводом PD10.Таблица 3 - Выводы порта D для работы с внешними модуляторами
| Вывод | Альтернативная функция | Назначение |
| PD0 - PD2 | SD_V0_EXT - SD_V2_EXT | Данные в SINC3 каналов напряжения V0 - V2 |
| PD10 - PD13 | SD_I0_EXT - SD_I3_EXT | Данные в SINC3 каналов тока I0 - I3 |
| PD14 | CLK_SD_EXT | Выход синхросигнала для внешних модуляторов |
Соединение выполняется четырьмя проводниками (проводники следует брать как можно короче), как показано на рисунке 2.
Рисунок 2 - Подключение модуля MDR5103FI к отладочной плате MDR1206FI
Расчёт тактирования
Цифровые фильтры ADCUI микроконтроллера MDR1206FI рассчитаны на тактирование блока от HSE 8,192 МГц. Тактовая частота АЦП получается делением HSE на 2, 4 или 8 (поле CLC_ADC_CFG регистра ADCUI_CLKPHASE1), а частота выдачи отсчётов - делением тактовой частоты АЦП на коэффициент передискретизации OSR (поле OSR_CONF регистра ADCUI_CTRL1). Здесь важно отметить, что в примере используется HSE с частотой 8 МГц (такой кварцевый резонатор установлен на плату), поэтому полем CLC_ADC_CFG выбирается деление на 8, чтобы получить частоту тактирования 1 МГц, при этом коэффициент передискретизации OSR будет равен 256, что даст частоту дискретизации ~3906 Гц - значения OSR 512 и 1024 для частоты 1 МГц запрещены документацией на MDR1206FI.Настройка с использованием библиотеки SPL
Все выкладки приведены для библиотеки SPL для MDR32VF0xI.Блок ADCUI тактируется от отдельного домена ADCUI_CLK, источник которого выбирается полем ADCUI_C1_SEL, а делитель - полем ADCUI_C3_SEL регистра ADC_CLOCK.
Фрагмент кода 1 - Настройка тактирования блока ADCUI от HSE (в примере 8 МГц)
#include "MDR32VF0xI_rst_clk.h"
#include "MDR32VF0xI_port.h"
#include "MDR32VF0xI_adcui.h"
// Тактирование: HSE 8 МГц -> блок ADCUI без делителей
RST_CLK_HSE_Config(RST_CLK_HSE_ON);
while (RST_CLK_HSE_GetStatus() != SUCCESS) { }
RST_CLK_PCLKCmd(RST_CLK_PCLK_PORTD | RST_CLK_PCLK_ADCUI, ENABLE);
RST_CLK_ADCUI_ClkDeInit();
RST_CLK_HSE_C1_SetPrescaler(RST_CLK_HSE_PRESCALER_DIV_1);
RST_CLK_ADCUI_ClkSelection(RST_CLK_ADCUI_CLK_SRC_HSE_C1_CLK);
RST_CLK_ADCUI_SetPrescaler(RST_CLK_ADCUI_PRESCALER_DIV_1);
RST_CLK_ADCUI_ClkCmd(ENABLE); Далее настроим выводы порта D. Вывод PD14 работает на выход (синхросигнал), PD10 - на вход (поток данных), оба в альтернативной функции.Фрагмент кода 2 - Настройка выводов PD10 и PD14
PORT_InitTypeDef PORT;
PORT_StructInit(&PORT);
PORT.PORT_Mode = PORT_MODE_DIGITAL;
PORT.PORT_Function = PORT_FUNCTION_ALTERNATIVE;
PORT.PORT_Pin = PORT_PIN_14; // CLK_SD_EXT, выход
PORT.PORT_Direction = PORT_DIRECTION_OUTPUT;
PORT.PORT_Power = PORT_POWER_INCREASED_UPTO_4mA;
PORT_Init(MDR_PORTD, &PORT);
PORT.PORT_Pin = PORT_PIN_10; // SD_I0_EXT, вход
PORT.PORT_Direction = PORT_DIRECTION_INPUT;
PORT.PORT_Power = PORT_POWER_NOMINAL_UPTO_2mA;
PORT_Init(MDR_PORTD, &PORT);
Осталось настроить сам блок ADCUI и включить канал тока I0.
Фрагмент кода 3 - Настройка блока ADCUI на работу с внешним модуляторомADCUI_InitTypeDef ADCUI;
ADCUI_FxUnit_InitTypeDef ADCUI_UNIT;
// ADCUI: 24 бита, 1 МГц, OSR 256
ADCUI_DeInit();
ADCUI_StructInit(&ADCUI);
ADCUI.ADCUI_DataResol = ADCUI_DATA_RESOL_24BIT;
ADCUI.ADCUI_VRefConfig = ADCUI_REFERENCE_VOLTAGE_INTERNAL;
ADCUI.ADCUI_ClockFrequency = ADCUI_CLK_FREQUENCY_1MHz;
ADCUI.ADCUI_Divider = ADCUI_OVERSAMPLING_DIV_256;
ADCUI_Init(&ADCUI);
ADCUI_Fx_StructInit(&ADCUI_UNIT);
ADCUI_UNIT.ADCUI_Fx_IntegratorEnable = ADCUI_INT_DISABLE; // используется шунт, интегратор не нужен
ADCUI_UNIT.ADCUI_Fx_SourceIDAT = ADCUI_Fx_IDAT_I; // в FIFO отсчёты тока
ADCUI_UNIT.ADCUI_Fx_ISelectDataFilter = ADCUI_FxISEL_AFTER_HPF; // для сохранения постоянной составляющей
ADCUI_Fx_Init(ADCUI_F0_UNIT, &ADCUI_UNIT);
ADCUI_ChopperConfig(ADCUI_CH_F0_I0, DISABLE); // с внешним модулятором чоппер выключен
ADCUI_ResetDigital(ENABLE);
ADCUI_ResetDigital(DISABLE);
ADCUI_ChannelConfig(ADCUI_CH_F0_I0, ENABLE);
Чтение результатов преобразования
Отсчёты канала I0 поступают в буфер FIFO глубиной восемь отсчётов (регистр ADCUI_F0I0DAT) в дополнительном коде. Для наглядности будем складывать их в массив Samples, который затем можно просмотреть в отладчике.Фрагмент кода 4 - Чтение отсчётов канала I0 в массив
#define WINDOW_SIZE 128
//Массив отсчётов
volatile int32_t Samples[WINDOW_SIZE];
// Чтение одного отсчёта: ждём данные, расширяем 24 бита до 32 со знаком
static int32_t ReadSample(void)
{
while (ADCUI_GetFlagStatus(ADCUI_F0_UNIT, ADCUI_Fx_IF_EMP) == SET) {
}
return ((int32_t)(ADCUI_GetResult(ADCUI_CH_F0_I0) << 8)) >> 8;
}
// Первые отсчёты - переходный процесс фильтра SINC3, поэтому отбрасываем
for (i = 0; i < 64; i++) {
(void)ReadSample();
}
// Заполняем массив подряд идущими отсчетами
while(1) {
for (i = 0; i < WINDOW_SIZE; i++) {
Samples[i] = ReadSample();
}
}
Фрагменты 1 - 4 в совокупности образуют законченную программу - проект целиком доступен для загрузки в разделе "Файлы для скачивания" после статьи.
При отладке после накопления массив Samples содержит 128 подряд идущих отсчётов (около 33 мс при 3906 Гц), то есть больше одного периода сигнала 50 Гц. Значения знаковые: отрицательные части синуса отображаются как отрицательные числа.
При разомкнутых клеммах X1 и X2 коэффициент заполнения DOUT составляет около 50 %, а значения в Samples колеблются около нуля.
Проверка тракта с помощью генератора сигналов
Для проверки цепочки из модулятора и блока ADCUI микроконтроллера достаточно любого генератора сигналов, в том числе встроенного в осциллограф. Рассмотрим синус 50 Гц размахом 10 В п-п (амплитуда 5 В), режим нагрузки генератора - High Z.
Сигнал подаётся на клемму X1, общий провод генератора на X2. Отдельного общего вывода у измерительной части нет: X2 соединена с цепью ISOGND, а вход nIN привязан к ней внутри модуля, так что это штатное однополярное включение. Шунт 0,01 Ом нагружен на выход генератора 50 Ом, поэтому напряжение на шунте в 5000 раз меньше напряжения генератора (Uвых * 0,01 / 50). Полную шкалу ±25 мВ таким способом получить нельзя (потребовались бы амплитуда 125 В), но для проверки тракта достаточно малой её части.
Итого фактическая амплитуда синусоиды на шунте составляет 1 мВ (4% шкалы). Оценочная амплитуда для сигнала 50 Гц, 10 В п-п и HSE = 8 МГц должна быть ориентировочно ±260000 (выход SINC3 нормирован на диапазон коэффициента заполнения 0 - 100%, а шкала модулятора 11 и 89%. Шкала модулятора, фактически, сужает диапазон цифровых кодов до ориентировочно 6.5 миллионов (вместо 8388608), где 4% шкалы и составляют ±260000).
Помним, что частота выдачи отсчётов ~3906 Гц, период сигнала 50 Гц, поэтому на один период приходится 3906 / 50 ≈ 78 отсчётов
На рисунке 3 представлены значения массива Samples для рассматриваемого сигнала. Теоретический расчет совпадает с фактическим. Отсюда делаем вывод, что микросхема функционирует штатно.
Рисунок 3 - Значения массива Samples для сигнала 50 Гц Сохранить статью в PDF