реклама на сайте
подробности

 
 
4 страниц V   1 2 3 > »   
Reply to this topicStart new topic
> Внутренняя Калибровка AD7792
bychkov77
сообщение Mar 28 2012, 14:09
Сообщение #1





Группа: Новичок
Сообщений: 6
Регистрация: 28-03-12
Пользователь №: 71 055



Добрый день!

Борюсь с чипом АЦП 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. Я прав?
Go to the top of the page
 
+Quote Post
Tanya
сообщение Mar 28 2012, 16:54
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 8 569
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(bychkov77 @ Mar 28 2012, 18:09) *
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
Поищите по форуму. Это уже обсуждалось. Может быть для другого АЦП, но все должно совпадать по сути.
Go to the top of the page
 
+Quote Post
Plain
сообщение Mar 28 2012, 17:51
Сообщение #3


Гуру
******

Группа: Участник
Сообщений: 5 927
Регистрация: 5-03-09
Из: Москва
Пользователь №: 45 710



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

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

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

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

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

И ещё раз — никаких встроенных источников тока, не верьте им.
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Mar 28 2012, 19:50
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 2 272
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(bychkov77 @ Mar 28 2012, 17:09) *
Борюсь с чипом АЦП AD7792.

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

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

Iout1 & AIN1+ -> L1
AIN1- & AIN2+ -> L2
AIN2- & AIN3+ -> L3
AIN3- -> GND

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

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

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

В-общем похоже на схему в даташите (только без Iout2), но принцип работы схемы другой, все считается ручками
Go to the top of the page
 
+Quote Post
bychkov77
сообщение Mar 29 2012, 05:41
Сообщение #5





Группа: Новичок
Сообщений: 6
Регистрация: 28-03-12
Пользователь №: 71 055



Ruslan1, Благодарю за совет , сегодня переделаю схему и скорректирую софт для проверки. Я подозревал что это из за несбалансированности источников тока, все таки +-0,5% это много... по результатам отпишусь.
Go to the top of the page
 
+Quote Post
bychkov77
сообщение Mar 29 2012, 07:12
Сообщение #6





Группа: Новичок
Сообщений: 6
Регистрация: 28-03-12
Пользователь №: 71 055




Калибровка второго канала АЦП (Измерение 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
}
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Mar 29 2012, 07:33
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 2 272
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(bychkov77 @ Mar 29 2012, 08:41) *
Ruslan1, Благодарю за совет , сегодня переделаю схему и скорректирую софт для проверки. Я подозревал что это из за несбалансированности источников тока, все таки +-0,5% это много... по результатам отпишусь.

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

Кстати, если вдруг у Вас 4х проводка- лучше посмотрите AD7789. Они примерно на 30% дешевле и при этом имеют 24 бита а не 16. Опять же референсное сопротивление, но уже в верхнем плече, оно же задает максимальный ток. на NTC работает отлично, для меди-платины нужно смотреть разрешающую способность.
Go to the top of the page
 
+Quote Post
Xenia
сообщение Mar 29 2012, 08:16
Сообщение #8


Гуру
******

Группа: Модератор FTP
Сообщений: 4 479
Регистрация: 20-02-08
Из: Москва
Пользователь №: 35 237



Цитата(bychkov77 @ Mar 29 2012, 11:12) *
*Zr = (WORD) ((WORD) (buf1<<8) | (WORD) (buf2)); // OFFSET register value
*Fs = (WORD) ((WORD) (buf1<<8) | (WORD) (buf2)); // FULL SCALE register value

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

Суть проблемы объединения двух однобайтовых (BYTE) значений в одно двухбайтное (WORD) только в том, чтобы не потерять значение после сдвига buf1 на 8 позиций влево. Т.к. существует риск, что сдвинутые разряды пропадут, не поместившись в BYTE. Чтобы этого не случилось, buf1 приходится СНАЧАЛА растянуть до WORD, и только потом в этом виде сдвигать - тогда уж точно сдвинутым влево битам найдется место. Вот так:
*Fs = ((WORD)buf1<<8) | buf2;
А у вас buf1 сдвигается влево безо всяких предосторожностей, а то, что потом WORD стоят лесом, уже не поможет, поскольку потерянные разряды не восстановить, преобразуя к более просторной сетке задним числом.
Если у вас эта витиеватая конструция все-таки работает нормально, то скорее всего лишь потому, что buf1 определено у вас не как BYTE, а как WORD (к сожалению, в приведенном вами коде декларация buf1 отсутствует). Но если это так, то и подавно ни один из поставленных вами WORD здесь не нужен.
Go to the top of the page
 
+Quote Post
Tanya
сообщение Mar 29 2012, 08:41
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 569
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(bychkov77 @ Mar 29 2012, 11:12) *
Калибровка второго канала АЦП (Измерение RTD на втором канале у меня) соответственно калибрую только его.
Значения калибровочных регистров читаю сразу после окончания калибровок. У меня всегда читается 0x8000 и 0x5555

Что-то у Вас не так. Попробуйте нагреть немного... Нужно внимательно читать даташит. Или даже между строк. Вот там написано, что это не для любой скорости должно происходить... Подозреваю, что скорость нужно менять заранее....
Хотя... может быть, что для 16 разрядов... Вот для 24-х меняется. У меня.
Go to the top of the page
 
+Quote Post
bychkov77
сообщение Mar 29 2012, 12:43
Сообщение #10





Группа: Новичок
Сообщений: 6
Регистрация: 28-03-12
Пользователь №: 71 055



Цитата(Xenia @ Mar 29 2012, 12:16) *
А чего это вы так много WORDов насажали, и все не туда, куда надо? sm.gif

Суть проблемы объединения двух однобайтовых (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.gif !!! Ещё раз большая благодарность, Руслану! Жаль что с внутренней калибровкой не получилось разобраться, ещё потыкаюсь немного и если ни чего не получится оставлю как есть.

Цитата(Tanya @ Mar 29 2012, 12:41) *
Что-то у Вас не так. Попробуйте нагреть немного... Нужно внимательно читать даташит. Или даже между строк. Вот там написано, что это не для любой скорости должно происходить... Подозреваю, что скорость нужно менять заранее....
Хотя... может быть, что для 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 дискрет
Go to the top of the page
 
+Quote Post
saska
сообщение May 29 2012, 09:23
Сообщение #11


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 13-01-06
Пользователь №: 13 156



вот тоже собираюсь измерять RTD и вижу кроме AD7792/93 еще у техаса ADS1247/48 которые выглядят примерно одинаково, на первый взгляд разница только в значениях источников тока (у техаса 50 - 1500мка, у ад 10 - 1000мка), и у техаса про подключаемый буфер ничего не написано. Как думаете - у техаса источники тока более одинаковы чем у ад ?
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение May 29 2012, 12:32
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 2 272
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



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

Там только типовые характеристики указаны, то есть как повезет.
А зачем Вам это для RTD? я уже писал как вообще без этих источников тока обойтись. Берете эталонный резистор с известными параметрами и от него пляшете. Надеяться на баланс источников тока- это конкретные грабли себе запланировать.
Go to the top of the page
 
+Quote Post
saska
сообщение May 29 2012, 14:00
Сообщение #13


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 13-01-06
Пользователь №: 13 156



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

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

вот еще одна рекомендация но с использованием AIN3 .. начинается путаница
Эскизы прикрепленных изображений
Прикрепленное изображение
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
Tanya
сообщение May 29 2012, 14:21
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 569
Регистрация: 6-01-06
Пользователь №: 12 883



Цитата(saska @ May 29 2012, 18:00) *
было бы неплохо увидеть это в виде схемы..

Автор! Цитируйте нормальным образом - без скриншотов.
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение May 29 2012, 15:26
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 2 272
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(saska @ May 29 2012, 17:00) *
Ruslan1 читая ваши рекомендации я понимаю что вы предлагаете не использовать оба источника но оставить один и использовать эталонный резистор.

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

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

Вот, визуализировал свой же текст в графической форме. первый рисунок для описания принципа, второй для трехпроводки.
Прикрепленное изображение
Go to the top of the page
 
+Quote Post

4 страниц V   1 2 3 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 11th December 2017 - 20:54
Рейтинг@Mail.ru


Страница сгенерированна за 0.01356 секунд с 7
ELECTRONIX ©2004-2016