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

 
 
> Внутренняя Калибровка 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
 
Start new topic
Ответов
bychkov77
сообщение Mar 29 2012, 07:12
Сообщение #2





Группа: Новичок
Сообщений: 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
Xenia
сообщение Mar 29 2012, 08:16
Сообщение #3


Гуру
******

Группа: Модератор 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
bychkov77
сообщение Mar 29 2012, 12:43
Сообщение #4





Группа: Новичок
Сообщений: 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

Сообщений в этой теме
- bychkov77   Внутренняя Калибровка AD7792   Mar 28 2012, 14:09
- - Tanya   Цитата(bychkov77 @ Mar 28 2012, 18:09) 1....   Mar 28 2012, 16:54
- - Plain   Во-первых, лучше откажитесь от 3-проводного подклю...   Mar 28 2012, 17:51
- - Ruslan1   Цитата(bychkov77 @ Mar 28 2012, 17:09) Бо...   Mar 28 2012, 19:50
- - bychkov77   Ruslan1, Благодарю за совет , сегодня переделаю сх...   Mar 29 2012, 05:41
|- - Ruslan1   Цитата(bychkov77 @ Mar 29 2012, 08:41) Ru...   Mar 29 2012, 07:33
|- - Tanya   Цитата(bychkov77 @ Mar 29 2012, 11:12) Ка...   Mar 29 2012, 08:41
- - saska   вот тоже собираюсь измерять RTD и вижу кроме AD779...   May 29 2012, 09:23
|- - Ruslan1   Цитата(saska @ May 29 2012, 12:23) вот то...   May 29 2012, 12:32
- - saska   Ruslan1 читая ваши рекомендации я понимаю что вы п...   May 29 2012, 14:00
|- - Tanya   Цитата(saska @ May 29 2012, 18:00) было б...   May 29 2012, 14:21
|- - Ruslan1   Цитата(saska @ May 29 2012, 17:00) Ruslan...   May 29 2012, 15:26
- - saska   Ruslan1 постараюсь осмыслить, завтра привезу пароч...   May 29 2012, 19:31
|- - Ruslan1   Цитата(saska @ May 29 2012, 22:31) Ruslan...   May 30 2012, 12:23
- - saska   Ruslan1 а напишите пожалуста итоговую формулу для ...   May 31 2012, 08:23
|- - Ruslan1   Цитата(saska @ May 31 2012, 11:23) Ruslan...   May 31 2012, 08:41
- - saska   Ruslan1кажеца, но я не знаю где грань. А что касае...   Jun 1 2012, 12:06
|- - Tanya   Цитата(saska @ Jun 1 2012, 16:06) Ruslan1...   Jun 1 2012, 12:10
|- - Ruslan1   Цитата(saska @ Jun 1 2012, 15:06) Ruslan1...   Jun 1 2012, 15:35
- - saska   закон ома точно не помню но что то о пропорциональ...   Jun 1 2012, 14:31
- - saska   Ruslan1 подскажите где копать.. не могу считать пр...   Jun 5 2012, 14:07
|- - Ruslan1   Что-то Вы жестоко с CS обходитесь, не нужно его во...   Jun 5 2012, 14:59
- - saska   Ruslan1 сделал как сказали - сразу заработало. хот...   Jun 6 2012, 05:06
|- - Tanya   Цитата(saska @ Jun 6 2012, 09:06) Еще воз...   Jun 6 2012, 07:34
|- - Plain   Цитата(saska @ Jun 6 2012, 08:06) вместо ...   Jun 6 2012, 10:22
- - saska   Tanya если внимательно посмотреть ваши посты в тем...   Jun 6 2012, 09:20
|- - Tanya   Цитата(saska @ Jun 6 2012, 13:20) . О общ...   Jun 6 2012, 09:33
- - saska   вот привожу расчет и подтверждение формулы Ruslan1...   Jun 7 2012, 07:00
|- - Plain   Судя по отсутствию в Ваших "формулах" та...   Jun 7 2012, 14:53
- - saska   Plain наверное расшифровать эту фразу ЦитатаСудя п...   Jun 7 2012, 16:39
|- - Ruslan1   Цитата(saska @ Jun 7 2012, 19:39) Я увере...   Jun 7 2012, 17:49
|- - Plain   Цитата(saska @ Jun 7 2012, 19:39) Для под...   Jun 7 2012, 19:31
- - saska   Ruslan1 Plain спасибо за новость и подробное ее о...   Jun 8 2012, 06:36
|- - Ruslan1   Цитата(saska @ Jun 8 2012, 09:36) Ruslan1...   Jun 8 2012, 09:01
|- - Plain   Цитата(saska @ Jun 8 2012, 09:36) не увид...   Jun 8 2012, 09:40
- - saska   Plain читаю псто№3 ЦитатаВнутренний опорник будет...   Jun 8 2012, 10:17
- - saska   Ruslan1 можете рассказать как вы в своем проекте ...   Jun 8 2012, 14:49
- - hpo   А скажите, плз, кто-нибудь занимался добычей правд...   Jul 25 2012, 06:51
- - saska   я просто откалибрвал по китайскому мультиметру с т...   Aug 17 2012, 06:00
- - saska   пусть поздно, но вот сфоткал что получилось - на п...   Jun 19 2014, 11:26
|- - berkl   Цитата(saska @ Jun 19 2014, 15:26) пусть ...   Jun 20 2014, 06:37
- - saska   в описании на микросхему имеется фраза - При смене...   Jun 20 2014, 15:00
|- - berkl   Цитата(saska @ Jun 20 2014, 19:00) в опис...   Jun 25 2014, 05:44
- - Lagman   А 3-х проводную схему подключения применили как пи...   Jun 25 2014, 09:05
|- - berkl   Цитата(Lagman @ Jun 25 2014, 13:05) А 3-х...   Jun 27 2014, 05:33
- - Lagman   У вас 4-х проводная или я не правильно понял? Трех...   Jun 27 2014, 12:31
|- - berkl   Цитата(Lagman @ Jun 27 2014, 16:31) У вас...   Jun 30 2014, 07:04
|- - Xenia   Цитата(berkl @ Jun 30 2014, 11:04) Схема ...   Jun 30 2014, 15:33
|- - berkl   Цитата(Xenia @ Jun 30 2014, 19:33) Где та...   Jun 30 2014, 17:28
|- - Xenia   Цитата(berkl @ Jun 30 2014, 21:28) Смотри...   Jun 30 2014, 20:02
|- - berkl   Цитата(Xenia @ Jul 1 2014, 00:02) Так это...   Jul 1 2014, 06:15
- - yanvasiij   Цитата(Ruslan1 @ May 29 2012, 20:26) Вот,...   Feb 15 2016, 04:38
|- - Ruslan1   Цитата(yanvasiij @ Feb 15 2016, 07:38) ...   Feb 18 2016, 07:44
- - yanvasiij   Цитата(Ruslan1 @ Feb 18 2016, 12:44) Кака...   Feb 19 2016, 12:54


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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 08:29
Рейтинг@Mail.ru


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