Перейти к содержанию
    

Внутренняя Калибровка AD7792

Добрый день!

 

Борюсь с чипом АЦП AD7792. Точнее сразу с двумя, они у меня подключены на один SPI канал процессора и выбираются поочерёдно подачей нуля на CS входы чипов.

АЦП используются для измерения сопротивления RTD элементов (PT100 и PT1000).

Для теста подключил резистор 1000 Ом 1% на вход первой АЦП, и затем на вход второй АЦП, и снимаю показания. Одна стабильно выдаёт 13022-13023 дискрет, вторая - 13083-13084. Разница 61 дискрет - это много

Затем брал другой резистор того же номинала и точности - показания отличаются в пределах точности резистора, и получаем ту же разницу в 61 дискрет между первой и второй АЦП.

При подключении резистора 500 Ом поочерёдно, разность между каналами становится 30..31 дискрет, при нулевом сопротивлении оба АЦП выдают нули. Мультипликативная погрешность(отличие между АЦП) на лицо.

 

Исходные условия:

- схема подключения термоэлемента - трёхпроводная, взята из даташита.

- External reference mode, референтный резистор Rref 4.99 КОм, 0.1%.

- Для обоих чипов применён один и тот же программный код.

 

Начал искать.

Поменял местами Rref, перепаяв их, всё тоже самое, один в один. Я думаю что хардварным проблемам больше негде быть и вероятно, что-то не так либо с самими АЦП, либо с их настройками.

 

Начал копатья с калибровками. На мой взгляд внутренние калибровки (internal calibrations) могут решить проблему, но тут непонятки с ней.

1. После калибровки значения регистров OFFSET и FULL SCALE (калибровочной пары)не меняются (в них установлены значения по умолчанию - 0x8000 и 0x5555 соответственно).

2. Калибровка никак не влияет на результаты измерений.

3. Мне не понятно что физически означают цифры в калибровочной паре. В даташите читаем, что из результата АЦП, вычитается значание OFFSET и помножается на FULL SCALE. То есть

 

ADC_out = (-OFFSET +ADC_raw ) * FULL_SCALE.

 

В моём случае мы получаем:

 

ADC_out = (-0x8000+13023)*0x5555. Бред какой-та... братья, кто разобрался с калибровкой - нужна ваша помощь!!!

 

4. Вопрос-утверждение. Int калибровку полезно проводить периодически, раз в 5 мин например, с целью компенсировать возможное изменение температуры самой AD7792. Я прав?

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. После калибровки значения регистров OFFSET и FULL SCALE (калибровочной пары)не меняются (в них установлены значения по умолчанию - 0x8000 и 0x5555 соответственно).

2. Калибровка никак не влияет на результаты измерений.

3. Мне не понятно что физически означают цифры в калибровочной паре. В даташите читаем, что из результата АЦП, вычитается значание OFFSET и помножается на FULL SCALE. То есть

 

ADC_out = (-OFFSET +ADC_raw ) * FULL_SCALE.

 

В моём случае мы получаем:

 

ADC_out = (-0x8000+13023)*0x5555. Бред какой-та... братья, кто разобрался с калибровкой - нужна ваша помощь!!!

 

4. Вопрос-утверждение. Int калибровку полезно проводить периодически, раз в 5 мин например, с целью компенсировать возможное изменение температуры самой AD7792. Я прав?

4. Это от вкуса зависит...

3.То, из чего вычитается смещение Вы не видите - оно внутри, а Вам выдается уже скорректированное значение.

2. Вы уверены, что с командами не напутали?

1. См. 2

Поищите по форуму. Это уже обсуждалось. Может быть для другого АЦП, но все должно совпадать по сути.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Во-первых, лучше откажитесь от 3-проводного подключения.

 

Если всё же настаиваете, то перейдите на 3-стадийное дифференциальное измерение, т.е. внутренний опорник, 3 диффвхода, 3 измерения и однозначно с включённым входным буфером.

 

Внутренний опорник будет при этом не доступен, но он и не нужен — входную цепь можно подключить к любому локально стабильному источнику.

 

Её должны последовательно составлять RTD, эталон и два резистора, сверху/снизу, т.е. нормирующих сигналы в допустимый диапазон уровней в этом режиме АЦП.

 

Ещё раз повторю, что 4-проводное соединение выгоднее, потому что число деталей такое же, но входов надо 2, и измерений тоже 2, т.е. меньше.

 

И ещё раз — никаких встроенных источников тока, не верьте им.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Борюсь с чипом АЦП AD7792.

Да я за AD7792 глаз вырву! :twak: они хорошие, Вы просто неправильно их готовите.

Схема из даташита для трехпроводки порочная по определению (источники тока не могут абсолютно совпадать), не нужно вам два источника тока. достаточно один.

 

делайте следующее:

 

Iout1 & AIN1+ -> L1

AIN1- & AIN2+ -> L2

AIN2- & AIN3+ -> L3

AIN3- -> GND

 

Между AIN3+ и AIN3- ставите эталонный резистор. Можно этот AIN3 объявить REF (если в пределах допуска для Vref), а можно и по внутреннему опорнику работать с тремя измерениями, неважно. Вся точность определяется только эталонным резистором.

 

Смысл измерения: все измеряете в долях опорного резистора, так как ток один и тот же. Падение на проводах получаете математически, делаете перевычисление ручками.

 

Да, измерений два или даже три для одного результата, но зато все предсказуемо и под контролем.

 

В-общем похоже на схему в даташите (только без Iout2), но принцип работы схемы другой, все считается ручками

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ruslan1, Благодарю за совет , сегодня переделаю схему и скорректирую софт для проверки. Я подозревал что это из за несбалансированности источников тока, все таки +-0,5% это много... по результатам отпишусь.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

 

Калибровка второго канала АЦП (Измерение RTD на втором канале у меня) соответственно калибрую только его.

Значения калибровочных регистров читаю сразу после окончания калибровок. У меня всегда читается 0x8000 и 0x5555

 

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

// Interal Zero and Full-scale calibration

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

void internal__calibration(BYTE Ch)

{

WORD* Zr;

WORD* Fs;

 

if (Ch==1) // Set CS pin of AD9972

{ADC_CS2 = 1; ADC_CS1 = 0; Zr = &Zero_reg1; Fs = &Full_Sc1;} // First ADC is enabled

else

{ADC_CS2 = 0; ADC_CS1 = 1; Zr = &Zero_reg2; Fs = &Full_Sc2;} // Second ADC is enabled

 

// set IO register

Spi2_Write(0x28); // Write to COMMUNICATIONS register for select IO register writing

Spi2_Write(0x02); // Write to IO register. Current Source Value = 210uA,

// Current Source IEXC1 connected to Pin IOUT1, Current Source IEXC2 connected to Pin IOUT2.

 

//set CONFIG register. Here, select ADC channel for calibration

Spi2_Write(0x10); // Write to COMMUNICATIONS register for select CONFIG register writing

Spi2_Write(0x11); // Write high byte to CONFIG register

Spi2_Write(0x81); // Write low byte to CONFIG register. Channel AIN2(+) – AIN2(–),

// Internal Reference Selected, unbuffered mode, Gain 1, Bias voltage connected to AIN2(-)

 

// Zero internal calibration

Spi2_Write(0x08); // Write to COMMUNICATIONS register for select MODE register writing

Spi2_Write(0x80); // Write high byte to MODE register. Set Zero calibration start bit

Spi2_Write(0x0F); // Write low byte to MODE register. Set update rate 4 Hz

while(DOUT == 1); // wait while calibration performing

 

// get OFFSET register value

Spi2_Write(0x70); // Write to COMMUNICATIONS register for select OFFSET register reading

buf1 = Spi2_Read(buffer); // Reading high byte to OFFSET register

buf2 = Spi2_Read(buffer); // Reading low byte to OFFSET register

*Zr = (WORD) ((WORD) (buf1<<8) | (WORD) (buf2)); // OFFSET register value

 

//Full-scale internal calibration

Spi2_Write(0x08); // Write to COMMUNICATIONS register for select MODE register writing

Spi2_Write(0xA0); // Write high byte to MODE register. Set Zero calibration start bit

Spi2_Write(0x0F); // Write low byte to MODE register. Set update rate 4 Hz

while(DOUT == 1); // wait while calibration performing

 

// get FULL SCALE register value

Spi2_Write(0x78); // Write to COMMUNICATIONS register for select FULL SCALE register reading

buf1 = Spi2_Read(buffer); // Reading high byte to FULL SCALE register

buf2 = Spi2_Read(buffer); // Reading low byte to FULL SCALE register

*Fs = (WORD) ((WORD) (buf1<<8) | (WORD) (buf2)); // FULL SCALE register value

 

ADC_CS1 = 1; ADC_CS2 = 1; // Disable both CSs

}

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ruslan1, Благодарю за совет , сегодня переделаю схему и скорректирую софт для проверки. Я подозревал что это из за несбалансированности источников тока, все таки +-0,5% это много... по результатам отпишусь.

Да пожалуйста :) Вроде достаточно много их применял для RTD- проблем не было. Причем руками калибровочные константы в АЦП никогда не трогал, меня калибровка канала в целом интересовала, посему есть калибровочные константы в приборе (многоканалка) и процедура поверки-калибровки для метрологов-ремонтников.

 

Кстати, если вдруг у Вас 4х проводка- лучше посмотрите AD7789. Они примерно на 30% дешевле и при этом имеют 24 бита а не 16. Опять же референсное сопротивление, но уже в верхнем плече, оно же задает максимальный ток. на NTC работает отлично, для меди-платины нужно смотреть разрешающую способность.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

*Zr = (WORD) ((WORD) (buf1<<8) | (WORD) (buf2)); // OFFSET register value

*Fs = (WORD) ((WORD) (buf1<<8) | (WORD) (buf2)); // FULL SCALE register value

А чего это вы так много WORDов насажали, и все не туда, куда надо? :)

 

Суть проблемы объединения двух однобайтовых (BYTE) значений в одно двухбайтное (WORD) только в том, чтобы не потерять значение после сдвига buf1 на 8 позиций влево. Т.к. существует риск, что сдвинутые разряды пропадут, не поместившись в BYTE. Чтобы этого не случилось, buf1 приходится СНАЧАЛА растянуть до WORD, и только потом в этом виде сдвигать - тогда уж точно сдвинутым влево битам найдется место. Вот так:

*Fs = ((WORD)buf1<<8) | buf2;

А у вас buf1 сдвигается влево безо всяких предосторожностей, а то, что потом WORD стоят лесом, уже не поможет, поскольку потерянные разряды не восстановить, преобразуя к более просторной сетке задним числом.

Если у вас эта витиеватая конструция все-таки работает нормально, то скорее всего лишь потому, что buf1 определено у вас не как BYTE, а как WORD (к сожалению, в приведенном вами коде декларация buf1 отсутствует). Но если это так, то и подавно ни один из поставленных вами WORD здесь не нужен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Калибровка второго канала АЦП (Измерение RTD на втором канале у меня) соответственно калибрую только его.

Значения калибровочных регистров читаю сразу после окончания калибровок. У меня всегда читается 0x8000 и 0x5555

Что-то у Вас не так. Попробуйте нагреть немного... Нужно внимательно читать даташит. Или даже между строк. Вот там написано, что это не для любой скорости должно происходить... Подозреваю, что скорость нужно менять заранее....

Хотя... может быть, что для 16 разрядов... Вот для 24-х меняется. У меня.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А чего это вы так много WORDов насажали, и все не туда, куда надо? :)

 

Суть проблемы объединения двух однобайтовых (BYTE) значений в одно двухбайтное (WORD) только в том, чтобы не потерять значение после сдвига buf1 на 8 позиций влево. Т.к. существует риск, что сдвинутые разряды пропадут, не поместившись в BYTE. Чтобы этого не случилось, buf1 приходится СНАЧАЛА растянуть до WORD, и только потом в этом виде сдвигать - тогда уж точно сдвинутым влево битам найдется место. Вот так:

*Fs = ((WORD)buf1<<8) | buf2;

А у вас buf1 сдвигается влево безо всяких предосторожностей, а то, что потом WORD стоят лесом, уже не поможет, поскольку потерянные разряды не восстановить, преобразуя к более просторной сетке задним числом.

Если у вас эта витиеватая конструция все-таки работает нормально, то скорее всего лишь потому, что buf1 определено у вас не как BYTE, а как WORD (к сожалению, в приведенном вами коде декларация buf1 отсутствует). Но если это так, то и подавно ни один из поставленных вами WORD здесь не нужен.

 

да, вы правы, но эту конструкцию мой компилятор проглатывает без вопросов, поэтому и не замарачивался, но спасибо :-)

 

Сделал как посоветовал Ruslan1, разница в показаниях двух АЦП составила 3 дискрета (вместо 60), проверил показания ещё на 2-х таких же АЦП разница в показаниях не превысила 7 дискрет, меня это более чем устраивает, УРА :w00t: !!! Ещё раз большая благодарность, Руслану! Жаль что с внутренней калибровкой не получилось разобраться, ещё потыкаюсь немного и если ни чего не получится оставлю как есть.

 

Что-то у Вас не так. Попробуйте нагреть немного... Нужно внимательно читать даташит. Или даже между строк. Вот там написано, что это не для любой скорости должно происходить... Подозреваю, что скорость нужно менять заранее....

Хотя... может быть, что для 16 разрядов... Вот для 24-х меняется. У меня.

 

 

нагрел феном, точно не знаю на сколько возможно с 25 до 50 градусов, и показания уплыли аж на 20 дискрет, но феном грел всю плату, локально не получилось, Rref тоже грелся, нужно будет это учитывать.

У меня коэфициент усиления 1 и 2 в зависимоти от диапазона измерения "For gains of 1, 2, and 4, an internal full-scale calibration can be performed at any update rate" - это из даташита, Татьяна это я читал, но спасибо :-)

 

P.S. Да ещё, резистор 1000 Ом подсоединенный вместо RTD тоже нагревался со всей платой, по этому не удивительно что показания изменились на 20 дискрет

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот тоже собираюсь измерять RTD и вижу кроме AD7792/93 еще у техаса ADS1247/48 которые выглядят примерно одинаково, на первый взгляд разница только в значениях источников тока (у техаса 50 - 1500мка, у ад 10 - 1000мка), и у техаса про подключаемый буфер ничего не написано. Как думаете - у техаса источники тока более одинаковы чем у ад ?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот тоже собираюсь измерять RTD и вижу кроме AD7792/93 еще у техаса ADS1247/48 которые выглядят примерно одинаково, на первый взгляд разница только в значениях источников тока (у техаса 50 - 1500мка, у ад 10 - 1000мка), и у техаса про подключаемый буфер ничего не написано. Как думаете - у техаса источники тока более одинаковы чем у ад ?

Там только типовые характеристики указаны, то есть как повезет.

А зачем Вам это для RTD? я уже писал как вообще без этих источников тока обойтись. Берете эталонный резистор с известными параметрами и от него пляшете. Надеяться на баланс источников тока- это конкретные грабли себе запланировать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ruslan1 читая ваши рекомендации я понимаю что вы предлагаете не использовать оба источника но оставить один и использовать эталонный резистор.

 

было бы неплохо увидеть это в виде схемы..

 

вот еще одна рекомендация но с использованием AIN3 .. начинается путаница

post-13156-1338298517_thumb.png

post-13156-1338299993_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

было бы неплохо увидеть это в виде схемы..

Автор! Цитируйте нормальным образом - без скриншотов.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ruslan1 читая ваши рекомендации я понимаю что вы предлагаете не использовать оба источника но оставить один и использовать эталонный резистор.

 

было бы неплохо увидеть это в виде схемы..

 

вот еще одна рекомендация но с использованием AIN3 .. начинается путаница

Вот, визуализировал свой же текст в графической форме. первый рисунок для описания принципа, второй для трехпроводки.

post-15025-1338305102_thumb.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...