Jump to content

    

Внутренняя Калибровка 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. Я прав?

 

Share this post


Link to post
Share on other sites
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

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

 

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

 

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

 

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

Share this post


Link to post
Share on other sites
Борюсь с чипом АЦП AD7792.

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

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

 

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

 

Iout1 & AIN1+ -> L1

AIN1- & AIN2+ -> L2

AIN2- & AIN3+ -> L3

AIN3- -> GND

 

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

 

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

 

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

 

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

 

Калибровка второго канала АЦП (Измерение 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

}

 

Share this post


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

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

 

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

 

Share this post


Link to post
Share on other sites
*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 здесь не нужен.

Share this post


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

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

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

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

Share this post


Link to post
Share on other sites
А чего это вы так много 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 дискрет

Share this post


Link to post
Share on other sites

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

Share this post


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

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

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

Share this post


Link to post
Share on other sites

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

 

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

 

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

post-13156-1338298517_thumb.png

post-13156-1338299993_thumb.png

Share this post


Link to post
Share on other sites
было бы неплохо увидеть это в виде схемы..

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

Share this post


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

 

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

 

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

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

post-15025-1338305102_thumb.png

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this