|
Информационный портал технической поддержки Центра проектирования интегральных микросхем |
Микросхема MDR5103FI представляет из себя изолированный сигма-дельта модулятор АЦП: она преобразует падение напряжения на шунте (резистор малого сопротивления) в однобитный цифровой поток и передаёт его через барьер гальванической развязки. Собственного цифрового фильтра у микросхемы нет, поэтому децимацию потока должен выполнять микроконтроллер. В MDR1206FI для этого есть блок ADCUI с фильтрами SINC3, рассчитанными на совместную работу с рассматриваемой микросхемой модулятора.
В статье рассматривается подключение демонстрационного модуля MDR5103FI к отладочной плате MDR1206FI и настройка блока ADCUI на приём данных с внешнего модулятора. Материал распространяется также на микросхемы MDR5103AFI и MDR5103BFI - они отличаются только шкалой входного напряжения.
В статье будут рассмотрены следующие вопросы:
| Параметр | Значение |
| Напряжение питания (вывод VDD) | от 3,0 до 3,6 В |
| Тактовая частота на входе CLKIN | от 0,9 до 1,1 МГц |
| Коэффициент заполнения сигнала CLKIN | от 45 до 55 % |
| Выходное напряжение высокого уровня на DOUT | не менее 2,4 В |
| Входное дифференциальное напряжение (MDR5103FI / AFI / BFI) | ±25 / ±50 / ±100 мВ |

| Контакт | Цепь | Назначение |
| 1 | DOUT | Однобитный поток данных модулятора |
| 2 | GND | Шина "Общий" |
| 3 | CLK | Вход тактового сигнала модулятора |
| 4 | VDD | Питание 3.3 В |
| Вывод | Альтернативная функция | Назначение |
| 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 | Выход синхросигнала для внешних модуляторов |

Блок 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 - на вход (поток данных), оба в альтернативной функции.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);
Фрагмент кода 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 Гц
| Сайт: | https://support.milandr.ru |
| E-mail: | support@milandr.ru |
| Телефон: | +7 495 221-13-55 |