Особенности программирования изолированных АЦП MAX14001-MAX14002

MAX14001/MAX14002изолированные одноканальные АЦП, предназначенные для создания универсальных дискретных входов или измерительных схем с широким диапазоном входных напряжений. Для настройки параметров АЦП используется SPI-интерфейс. Предлагаем пример кода на языке C, в котором реализованы функции настройки, мониторинга и диагностики.

MAX14001 и MAX14002 – 10-битные аналого-цифровые преобразователи (АЦП) с гальванически развязанным SPI-интерфейсом с рейтингом изоляции 3,75 кВ. Дополнительными особенностями этих АЦП являются программируемые компаратор, источник тока для очистки контактов реле и источник тока смещения. Питание всех гальванически развязанных частей схемы производится от встроенного изолированного DC/DC-преобразователя, который устраняет необходимость во внешнем источнике питания. Все это делает MAX14001 и MAX14002 идеальным выбором при создании универсальных дискретных входов с индивидуальной гальванической развязкой и широким диапазоном входных напряжений. Рассмотрим особенности программирования MAX14001 и MAX14002. Предлагаемый код написан на языке C и может быть легко адаптирован для большинства микроконтроллеров общего назначения. Подробную информацию о выводах, режимах работы и регистрах управления можно получить в документации на MAX14001/MAX14002.

MAX14001/MAX14002 SPI

Для управления MAX14001/MAX14002 используются SPI-команды длиной 16 бит. Структура команд предоставлена в таблице 1. Встроенный SPI-контроллер MAX14001/MAX14002 имеет некоторые особенности по сравнению с традиционными SPI-контроллерами обычных микроконтроллеров или ПЛИС. О них необходимо знать при написании кода. В частности, передача команды начинается с посылки данных младшим битом вперед (LSB) (то есть с D[0]), далее следует бит чтения/записи, а потом посылается адрес – также младшим битом вперед. Как правило, микроконтроллеры или FPGA посылают команду в обратном порядке, то есть сначала передается адрес, а лишь затем данные старшим битом вперед (MSB). Поэтому микроконтроллер должен перевернуть данные перед отправкой в MAX14001/MAX14002. Другое важное отличие заключается в значениях бита записи/чтения W/R. Для MAX14001/MAX14002 при чтении W/R=0, а при записи W/R=1.

Таблица 1. Структура SPI-команд MAX14001/MAX14002

Данные Бит W/R Адрес
10-битные D[9:0] (начиная с D[0]) Чтение = 0, запись = 1 5-битный A[4:0] (начиная с A[0])

Полную информацию о циклах чтения и записи по SPI, а также карту регистров, таблицу инструкций и рекомендуемую блок-схему инициализации можно найти в документации на MAX14001/MAX14002.

На рисунке 1 показаны основные функциональные блоки MAX14001/MAX14002. Среди них можно выделить четыре наиболее значимых:

Рис. 1. Функциональная схема MAX14001

Рис. 1. Функциональная схема MAX14001

  • АЦП последовательного приближения со встроенным источником опорного напряжения (ИОН). Основная функция АЦП заключается в преобразовании аналоговых данных в цифровую форму. Получаемые значения могут быть считаны по SPI или использоваться для сигнализации о превышении заданных уровней напряжения. В последнем случае применяется встроенный цифровой компаратор;
  • SPI-интерфейс используется для доступа ко всем регистрам и аппаратным флагам COUT и FAULT;
  • μPower DC/DC – встроенный изолированный DC/DC-преобразователь, который обеспечивает питание гальванически развязанных блоков MAX14001 и MAX14002. Выходное напряжение преобразователя также поступает на вывод VDDF;
  • GATE, IFET, ISET – выводы, используемые для управления внешним полевым транзистором и пусковым током.

Отдельные функции MAX14001/MAX14002 могут использоваться или не использоваться в зависимости от требований конечного приложения

Примеры использования MAX14001/MAX14002

Универсальный программируемый дискретный вход с широким диапазоном входных напряжений и системой очистки контактов реле

MAX14001/MAX14002 предназначены для создания релейных систем защиты и других аналогичных высоковольтных приложений. Встроенный функционал АЦП позволяет управлять работой внешнего высоковольтного полевого транзистора, который используется для очистки релейных контактов за счет пропускания небольших постоянных или импульсных токов. Типовая схема включения представлена на рисунке 2. В данном случае речь идет о распределенной системе автоматики, в которой MAX14001/MAX14002 контролируют постоянное или переменное напряжение (обычно в диапазоне 24…300 В), коммутируемое высоковольтным реле или выключателем. Встроенный компаратор с программируемыми порогами срабатывания позволяет работать с различными диапазонами напряжения. В рассматриваемом примере на выводе GATE формируется напряжение смещения внешнего высоковольтного транзистора; программируемый ЦАП (IFET) с токовым выходом задает ток смещения, выбираемый с учетом минимизации влияния шумов, возникающих за счет емкостной связи с высоковольтным реле, и управляет пусковым током, который необходим для удаления оксидной пленки с контактов реле.

Рис. 2. Универсальный дискретный вход с широким диапазоном входных напряжений на базе MAX14001

Рис. 2. Универсальный дискретный вход с широким диапазоном входных напряжений на базе MAX14001

В предложенном примере используется только один АЦП MAX14001, однако для создания многоканального решения возможно использование нескольких MAX1400/MAX14002, включенных параллельно. Для реализации данного приложения потребуется весь доступный функционал микросхем MAX1400/MAX14002, поэтому для их настройки необходим доступ ко всем регистрам. Для получения информации по порядку программирования регистров MAX1400/MAX14002 после сброса при включении питания следует обратиться к документации.

Простой в использовании изолированный АЦП

MAX14001 и MAX14002 можно использовать в качестве обычных изолированных АЦП (рисунок 3). При этом ключевую роль играет встроенный изолированный DC/DC-преобразователь, который устраняет необходимость во внешнем источнике питания для вторичной стороны. Конечное устройство оказывается максимально простым. От разработчика потребуется только должным образом сконфигурировать и использовать АЦП:

Рис. 3. MAX14001/MAX14002 – изолированные одноканальные АЦП со встроенным DC/DC-преобразователем

Рис. 3. MAX14001/MAX14002 – изолированные одноканальные АЦП со встроенным DC/DC-преобразователем

  • параметры конфигурации задаются в регистре CFG. Разработчик должен определиться с величиной опорного напряжения и решить, какой ИОН использовать – встроенный или внешний;
  • чтение нефильтрованных данных выполняется из регистра ADC. Чтение отфильтрованных данных выполняется из регистра FADC;
  • установка верхнего и нижнего порогов срабатывания компаратора выполняется записью соответствующих значений в регистры THL и THU;
  • на выводе FAULT формируется сигнал прерывания при возникновении ошибки. Чтобы разрешить или запретить тот или иной источник прерывания, следует установить или сбросить соответствующие биты в регистре FLTEN. Чтобы установить причину возникновения прерывания, необходимо считывать содержимое регистра FAULT;
  • все остальные регистры INRR, INRT, INRP, а также все регистры проверки (“verification” registers) в данном режиме не используются и могут быть проигнорированы.

В приложениях, в которых не используются функции пускового тока или тока смещения, MAX14002 является более экономичным выбором по сравнению MAX14001. В MAX14002 регистры INRR, INRT и INRP доступны только для чтения. Для получения подробной информации о различиях между этими моделями АЦП следует обратиться к документации на MAX14001/MAX14002.

Программный код

В данном разделе приводится пример программного кода, написанного на языке C. Этот код, по сути, является драйвером, позволяющим выполнять конфигурацию, управление и диагностику АЦП MAX14001/MAX14002.

// локальные переменные для хранения значений регистров

UInt16 reg_FLAGS = 0x000;

UInt16 reg_FLTEN = 0x000;

UInt16 reg_THU = 0x000;

UInt16 reg_THL = 0x000;

UInt16 reg_ INRR = 0x000;

UInt16 reg_ INRT = 0x000;

UInt16 reg_ INRP = 0x000;

UInt16 reg_CFG = 0x000;

UInt16 reg_ ENBL = 0x000;

UInt16 reg_WVR = 0x000;

bool fault_pin = false; // используется для хранения информации об ошибке

#region базовые функции настройки MAX14001 и чтения результатов измерения

// инициализация устройства

MAX14001_ Initialize();

// чтение регистров

UInt16 ADC_value_ new = MAX14001_read(MAX14001_ADC_adr);

UInt16 FADC_value_new = MAX14001_read(MAX14001_FADC_adr);

#endregion

#region команды MAX14001

private void MAX14001_ Initialize()

{

MAX14001_ write(0x0c, 0x294); // разрешить запись в регистры

MAX14001_Reg_ReadAll_Click ( null, null ); // считать все регистры и сохранить результаты в локальных переменных

// Записать значения в соответствующие регистры верификации, чтобы сбросить MV Fault

MAX14001_write (0x10 + MAX14001_FLTEN_adr, reg_FLTEN);

MAX14001_write (0x10 + MAX14001_THU_ adr, reg_THU);

MAX14001_write (0x10 + MAX14001_THL_ adr, reg_THL);

MAX14001_write (0x10 + MAX14001_INRR_ adr, reg _INRR);

MAX14001_write (0x10 + MAX14001_INRT_ adr, reg _INRT);

MAX14001_write (0x10 + MAX14001_INRP_ adr, reg _INRP);

MAX14001_write (0x10 + MAX14001_CFG_ adr, reg_CFG);

MAX14001_write (0x10 + MAX14001_ENBL_ adr, reg _ENBL);

}

private void MAX14001_Reg_ReadAll_ Click( object sender, EventArgs e)

{

reg_FLTEN = 0x3ff & MAX14001_read (MAX14001_FLTEN_adr);

reg_THU = 0x3ff & MAX14001_read (MAX14001_THU_adr);

reg_THL = 0x3ff & MAX14001_read (MAX14001_THL_adr);

reg_ INRR = 0x3ff & MAX14001_read (MAX14001_INRR_adr);

reg_ INRT = 0x3ff & MAX14001_read (MAX14001_INRT_adr);

reg_ INRP = 0x3ff & MAX14001_read (MAX14001_INRP_adr);

reg_CFG = 0x3ff & MAX14001_read (MAX14001_CFG_adr);

reg_ ENBL = 0x3ff & MAX14001_read (MAX14001_ENBL_adr);

reg_WVR = 0x3ff & MAX14001_read (MAX14001_WVR_adr);

}

private void Read_Fault_Register_btn_ Click ( object sender, EventArgs e)

{

// считать значение флагов ошибок, чтобы их сбросить

MAX14001_read (MAX14001_FLAGS_adr);

// считать значение флагов ошибок, чтобы получить актуальные значения

MAX14001_read (MAX14001_FLAGS_adr);

reg_FLAGS = 0x3ff & MAX14001EVAL_USB2PMB_adapter.GPI_ read(1); // считать состояние вывода FAULT

update_FAULT_ LEDs ();

}

private void FullReset_btn_ Click ( object sender, EventArgs e)

{

MAX14001_ write(0x0b, 0x80); // записать бит RSET регистра ACT

MAX14001_Reg_ReadAll_Click( null, null);

}

private void RegisterReset_btn_ Click ( object sender, EventArgs e)

{

MAX14001_ write(0x0b, 0x40); // записать бит SRES регистра ACT

MAX14001_Reg_ReadAll_Click( null, null);

}

private void Trigger_Inrush_Pulse_btn_ Click ( object sender, EventArgs e)

{

// записать значение тока 

MAX14001_ write(0x0b, 0x200); // записать бит INPLS регистра ACT

MAX14001_Reg_ReadAll_Click( null, null);

}

private void FLTen_cb_ CheckedChanged ( object sender, EventArgs e)

{

reg_FLTEN = 0;

if (FLTen_00_ADC_ cb.Checked) reg_FLTEN += 0x02;

if (FLTen_01_INRD_ cb.Checked) reg_FLTEN += 0x04;

if (FLTen_02_SPI_ cb.Checked) reg_FLTEN += 0x08;

if (FLTen_03_COM_ cb.Checked) reg_FLTEN += 0x10;

if (FLTen_04_CRCL_ cb.Checked) reg_FLTEN += 0x20;

if (FLTen_05_CRCF_ cb.Checked) reg_FLTEN += 0x40;

if (FLTen_06_FET_ cb.Checked) reg_FLTEN += 0x80;

if (FLTen_07_MVL_ cb.Checked) reg_FLTEN += 0x100;

MAX14001_ write(MAX14001_FLTEN_adr, reg_FLTEN);

// записать значения в соответствующие регистры верификации

MAX14001_write (0x10 + MAX14001_FLTEN_adr, reg_FLTEN);

MAX14001_Reg_ReadAll_Click( null, null);

}

private void cb_FAST_mode_ Click ( object sender, EventArgs e)

{

if ( cb_FAST_ mode.Checked) reg_CFG |= 0x02;

else reg_CFG &= 0xfd;

MAX14001_ write(MAX14001_CFG_adr, reg_CFG);

// записать значения в соответствующие регистры верификации

MAX14001_write (0x10 + MAX14001_CFG_ adr, reg_CFG);

MAX14001_Reg_ReadAll_Click( null, null);

}

private void cb_Use_Unfiltered_ADC_IRAW_ Click ( object sender, EventArgs e)

{

if ( cb_Use_Unfiltered_ADC_IRAW.Checked) reg_CFG |= 0x01;

else reg_CFG &= 0xfe;

MAX14001_ write(MAX14001_CFG_adr, reg_CFG);

// записать значения в соответствующие регистры верификации

MAX14001_write (0x10 + MAX14001_CFG_ adr, reg_CFG);

MAX14001_Reg_ReadAll_Click( null, null);

}

private void cb_Enable_Input_Current_ENA_ Click ( object sender, EventArgs e)

{

if ( cb_Enable_Input_Current_ENA.Checked) reg_ENBL |= 0x10;

else reg_ENBL &= 0xef;

MAX14001_ write(MAX14001_ENBL_adr, reg_ENBL);

// записать значения в соответствующие регистры верификации

MAX14001_write (0x10 + MAX14001_ENBL_ adr, reg _ENBL);

MAX14001_Reg_ReadAll_Click( null, null);

}

private void cb_EXRF_ Click ( object sender, EventArgs e)

{

if ( cb_EXRF.Checked) reg_CFG |= 0x20;

else reg_CFG &= 0xdf;

MAX14001_ write(MAX14001_CFG_adr, reg_CFG);

// записать значения в соответствующие регистры верификации

MAX14001_write (0x10 + MAX14001_CFG_ adr, reg _CFG);

MAX14001_Reg_ReadAll_Click( null, null);

}

private void cb_EXTI_ Click ( object sender, EventArgs e)

{

if ( cb_EXTI.Checked) reg_CFG |= 0x10;

else reg_CFG &= 0xef;

MAX14001_ write(MAX14001_CFG_adr, reg_CFG);

// записать значения в соответствующие регистры верификации

MAX14001_write (0x10 + MAX14001_CFG_ adr, reg _CFG);

MAX14001_Reg_ReadAll_Click( null, null);

}

private void cmb_TINR_ SelectionChangeCommitted ( object sender, EventArgs e)

{

reg_INRP = (UInt16) ( reg_INRP & 0x3c3); // set the TINR bits all to 0

reg_INRP = (UInt16) ((UInt 16)( cmb_TINR.SelectedIndex<<2) + reg_INRP);

MAX14001_ write(MAX14001_INRP_adr, reg_INRP);

// записать значения в соответствующие регистры верификации

MAX14001_write (0x10 + MAX14001_INRP_ adr, reg _INRP);

MAX14001_Reg_ReadAll_Click( null, null);

}

private void cmb_IINR_ SelectionChangeCommitted ( object sender, EventArgs e)

{

reg_INRP = (UInt16) ( reg_INRP & 0x03f); // set the IINR bits all to 0

reg_INRP = (UInt16) ((UInt 16)( cmb_IINR.SelectedIndex<<6) + reg_INRP);

MAX14001_ write(MAX14001_INRP_adr, reg_INRP);

// записать значения в соответствующие регистры верификации

MAX14001_write (0x10 + MAX14001_INRP_ adr, reg _INRP);

MAX14001_Reg_ReadAll_Click( null, null);

}

private void cmb_InrLim_ SelectionChangeCommitted ( object sender, EventArgs e)

{

reg_INRP = (UInt16) ( reg_INRP & 0x3fc); // set the DU bits all to 0

reg_INRP = (UInt16) ((UInt 16)( cmb_InrLim.SelectedIndex) + reg_INRP);

MAX14001_ write(MAX14001_INRP_adr, reg_INRP);

// Записать значения в соответствующие регистры верификации

MAX14001_write (0x10 + MAX14001_INRP_ adr, reg _INRP);

MAX14001_Reg_ReadAll_Click( null, null);

}

private void cmb_IBIAS_ SelectionChangeCommitted ( object sender, EventArgs e)

{

reg_CFG = (UInt16) ( reg_CFG & 0x03f); // set the IBIAS bits all to 0

reg_CFG = (UInt16) ((UInt 16)( cmb_IBIAS.SelectedIndex<<6) + reg_CFG);

MAX14001_ write(MAX14001_CFG_adr, reg_CFG);

// записать значения в соответствующие регистры верификации

MAX14001_write (0x10 + MAX14001_CFG_ adr, reg_CFG);

MAX14001_Reg_ReadAll_Click( null, null);

}

private void cb_FiltSet_ SelectionChangeCommitted ( object sender, EventArgs e)

{

reg_CFG = (UInt16) ( reg_CFG & 0x3f3); // set the FT bits all to 0

reg_CFG = (UInt16) ((UInt 16)( cb_FiltSet.SelectedIndex<<2) + reg_CFG);

MAX14001_ write(MAX14001_CFG_adr, reg_CFG);

// записать значения в соответствующие регистры верификации

MAX14001_write (0x10 + MAX14001_CFG_ adr, reg_CFG);

MAX14001_Reg_ReadAll_Click( null, null);

}

#endregion

#region драйвер MAX14001 (SPI-интерфейс)

/// <summary>

/// ниже определены константы команд и регистров

/// SPI-драйвер для MAX14001

/// </summary>

///

// устройство имеет 8 регистров:

/* Регистр_Имя_Направление*/

/*---------------------------------------------*/

/* ADCR/W*/открытая константа

MAX14001_ADC_adr=0x00;

/* Filtered ADCR/W*/ открытая константа

MAX14001_FADC_adr=0x01;

/* Error FlagsR/W*/ открытая константа

MAX14001_FLAGS_adr= 0x02;

/* FAULT EnableR/W*/ открытая константа

MAX14001_FLTEN_adr=0x03;

/* Lower ThresholdR/W*/ открытая константа

MAX14001_THL_adr=0x04;

/* Upper ThresholdR/W*/ открытая константа

MAX14001_THU_adr=0x05;

/* Inrush ResetR/W*/ открытая константа

MAX14001_INRR_adr=0x06;

/* Inrush TriggerR/W*/ открытая константа

MAX14001_INRT_adr=0x07;

/* Inrush PulseR/W*/ открытая константа

MAX14001_INRP_adr=0x08;

/* ConfigurationR/W*/ открытая константа

MAX14001_CFG_adr=0x09;

/* EnableR/W*/ открытая константа

MAX14001_ENBL_adr=0x0a;

/* Write VerificationR/W*/ открытая константа

MAX14001_WVR_adr=0x0c;

// регистры верификации

/* FAULT Enable verificationR/W*/ открытая константа

MAX14001_FLTV_adr=0x13;

/* Lower Threshold verificationR/W*/ открытая константа

MAX14001_THLV_adr=0x14;

/* Upper Threshold verificationR/W*/ открытая константа

MAX14001_THUV_adr=0x15;

/* Inrush Reset verificationR/W*/ открытая константа

MAX14001_INRRV_adr=0x16;

/* Inrush Trigger verificationR/W*/ открытая константа

MAX14001_INRTV_adr=0x17;

/* Inrush Pulse verificationR/W*/ открытая константа

/* Configuration verificationR/W*/ открытая константа

MAX14001_CFGV_adr=0x19;

/* Enable verificationR/W*/ открытая константа

MAX14001_ENBLV_adr=0x1a;

void MAX14001_SPI_CS_ l()

{

MAX14001EVAL_USB2PMB_adapter.SPI_CS0 Enable();

}

void MAX14001_SPI_CS_ h()

{

MAX14001EVAL_USB2PMB_adapter.SPI_CS0 Disable();

}

// максимальная частота SPI - 5 МГц!

//********************************************************************

//*

//* функция: MAX14001_read

//* описание: чтение регистра MAX14001

//*

//* входные параметры: адрес регистра (константы из заголовочного файла)

//* возвращаемое значение: 8-битное значение

//*

//********************************************************************/

void MAX14001_read ( byte Register)

{

// 5-битный адрес (от MSB к LSB), R/W бит (1 = W/0 = R), 10-битные данные (MSB to LSB)

//1514131211109876543210

//A4A3A2A1A0R/WD9D8D7D6D5D4D3D2D1D0

// создание кадра для передачи по SPI:

UInt16 data_to_send = (UInt16) (( ((UInt16)Register) <<11) & 0xf800 );

// переворот данных младшим битом вперед

data_to_send = reverse_uint16( data_to_send);

MAX14001_SPI_CS_ l();

MAX14001EVAL_USB2PMB_adapter.SPI_W_transaction_16( data_to_send);

MAX14001EVAL_USB2PMB_adapter.SPI_RW_transaction_16(data_to_send);

MAX14001_SPI_CS_ l();

}

//********************************************************************

//*

//* функция: MAX14001_write

//* описание: запись в регистр MAX14001

//*

//* входные параметры: адрес регистра (константы из заголовочного файла)

//* возвращаемое значение: 8-битное значение

//*

//********************************************************************/

void MAX14001_write ( byte Register, UInt16 data)

{

// 5-битный адрес (от MSB к LSB), R/W бит (1 = W/0 = R), 10-битные данные (MSB to LSB)

//1514131211109876543210

//A4A3A2A1A0R/WD9D8D7D6D5D4D3D2D1D0

// создание кадра для передачи по SPI:

UInt16 data_to_send = (UInt16) ( (( ((UInt16)Register) <<11) & 0xf800 ) + data + 1024); // 1024 sets write bit

// переворот данных младшим битом вперед

data_to_send = reverse_uint16( data_to_send);

MAX14001_SPI_CS_ l();

MAX14001EVAL_USB2PMB_adapter.SPI_W_transaction_16 ( data_to_send);

MAX14001_SPI_CS_ l();

}

UInt16 reverse_uint16(UInt16 x)

{

UInt16 y= (UInt16) ((((x >> 0) & 1) << 15) |

(((x >> 1) & 1 ) << 14) |

(((x >> 2) & 1 ) << 13) |

(((x >> 3) & 1 ) << 12) |

(((x >> 4) & 1 ) << 11) |

(((x >> 5) & 1 ) << 10) |

(((x >> 6) & 1 ) << 9) |

(((x >> 7) & 1 ) << 8) |

(((x >> 8) & 1 ) << 7) |

(((x >> 9) & 1 ) << 6) |

(((x >> 10) & 1) < < 5) |

(((x >> 11) & 1) < < 4) |

(((x >> 12) & 1) < < 3) |

(((x >> 13) & 1) < < 2) |

(((x >> 14) & 1) < < 1) |

(((x >> 15) & 1) < < 0));

return y;

}

#endregion

Заключение

В данной статье рассматривается два варианта использования MAX14001 и MAX14002. В первом случае применяется весь функционал АЦП, а во втором – используется ограниченно.

Программный код, предложенный в статье, был протестирован с помощью отладочных наборов MAX14001PMB# и MAX14001EVSYS#, а также соответствующего адаптера USB2PMB2# и Munich GUI. Представленный драйвер, написанный на языке C, является проверенным решением, позволяющим быстро наладить взаимодействие между MAX14001/MAX14002 и популярными микроконтроллерами.

Оригинал статьи

•••

Наши информационные каналы

О компании Maxim Integrated

Компания Maxim Integrated является одним из ведущих разработчиков и производителей широкого спектра аналоговых и цифро-аналоговых интегральных систем. Компания была основана в 1983 году в США, в городе Саннивэйл (Sunnyvale), штат Калифорния, инженером Джеком Гиффордом (Jack Gifford) совместно с группой экспертов по созданию микроэлектронных компонентов. На данный момент штаб-квартира компании располагается в г. Сан-Хосе (San Jose) (США, Калифорния), производственные мощности (7 заводов) и ...читать далее

Товары
Наименование
MAX14001AAP+ (MAX)
MAX14001EVSYS# (MAX)
MAX14002AAP+T (MAX)
MAX14002EVSYS# (MAX)