Jump to content

    

AD7730 + датчик давления 26PCA

DS говорит

When the ADC is configured for bipolar operation, the output

code is offset binary, with a negative full-scale voltage resulting

in a code of 000...000, a zero differential input voltage resulting

in a code of 100...000, and a positive full-scale input voltage

resulting in a code of 111...111.

А далее берёте формулы из указанного раздела DS и считаете калькулятором.

ЗЫ. У меня такого АЦП нет и, тем более, определений величины шкалы

Share this post


Link to post
Share on other sites
А далее берёте формулы из указанного раздела DS и считаете калькулятором.
Я же приводил расчеты по этой формуле. Я хочу разобраться, почему так происходит. Почему перед АЦП сигнал меняется в пределах +/-156мВ относительно +2.5 В?

Вопрос стоит так, - как меняется сигнал на выходе моста : +/-7.8 мВ или +/- 15.6 мВ ? Пока экспериментально получается второе... Хотя априори должно быть первое.

Share this post


Link to post
Share on other sites

Вы сначала четко определитесь - какой у Вас режим АЦП - униполярный или биполярный?А затем честно померяйт е сигнал на входе (не надо крутого осциллографа/вольтметра) АЦП и прикиньте какой должен бывть ожидаемый код. Эти данные можно попытаться соотнести с чтением регистров настроек АЦП

Share this post


Link to post
Share on other sites
Вы сначала четко определитесь - какой у Вас режим АЦП - униполярный или биполярный?
Совершенно очевидно, что биполярный. Иначе и быть не может,- не отображалось бы отрицательные значения. В регистры АЦП пишется все правильно.

 

А затем честно померяйте сигнал на входе (не надо крутого осциллографа/вольтметра) АЦП
Еще раз повторяю, напряжение на входе АЦП, померянное осциллографом и мультиметром составляет +/-156мВ.

 

прикиньте какой должен бывть ожидаемый код.
Затем вывожу на ЖКИ значения в кодах АЦП и постепенно увеличивал GAIN_ADC до тех пор, пока размах сигнала на входе АЦП "вписывался" в диапазон 0x000000 ... 0xFFFFFF без искажения. Это получается при GAIN_ADC = 16. Что соответствует ADC Input range (2.5V Ref) +/-156mV при таком усилении.

Далее для проверки вывожу на ЖКИ это значение АЦП, пересчитанное в Вольты. Получается +/-31.2мВ.

enum { AD7799_1_GAIN, AD7799_2_GAIN, AD7799_4_GAIN, AD7799_8_GAIN,
       AD7799_16_GAIN, AD7799_32_GAIN, AD7799_64_GAIN, AD7799_128_GAIN };

#define Vref          2.51        // 2.5 V
#define GAIN_IA       5.0         // Gain of Instrumental Amplifier 5
#define STEPS_U       16777216.0// Full-Scale 2^24 for unipolar operation
#define STEPS_B       8388608.0 // Full-Scale 2^(24-1) for bipolar operation

#define Vin(adc_value) (((adc_value)-(signed long)STEPS_B)*Vref/GAIN_IA/STEPS_B) 

....................................................
// Maintain multiplexing of input channels
if(++mux > 2)  mux=0; 

ad7799_write_config(1, 0, AD7799_16_GAIN, 1, 1, AD7799_AIN1_CHAN+mux); //burnout, bipolar, gain, ref_det, buf, chan  

.........................................................
Vin(ValueADC.data[0])/(1<<AD7799_16_GAIN);

Т.е. получается, что сигнал на выходе датчика меняется все-таки +/-31.2mV !!!

Или скажите, в чем я не прав.

Share this post


Link to post
Share on other sites

Возвращаясь к вопросу о заниженных в два раза показаниях моего прибора относительно другого.

Я считаю, что одно из двух: либо датчик расчитан на диапазон 2PSI (хотя таких не бывает), либо врет "поверенный" прибор :) Я ошибки в расчетах не вижу.

Судите сами. Если значение Vin(ValueADC)/(1<<AD7799_16_GAIN) при максимальном давлении составляет 31.2мВ (это подтверждается выводом на ЖКИ), то при пересчете в дифференциальное давление (нижняя формула) получится 703 мм.вод.ст. , что я и наблюдаю при выводе на ЖКИ. Но при том же давлении другой "проверенный" прибор показывает в два раза больше!

#define SPAN          (0.015687*2)      // Span (V) of Pressure Sensors = 1 psi
#define mm_Hg         51.714        // мм. рт. ст. (@ 0 гр. C)
#define mm_H2O        703.05        // мм вод. ст. (@ 0 гр. C)
#define sPRESSURE(ain_value) ((ain_value)/SPAN*mm_Hg)    // Статическое давление, мм. рт. ст.
#define dPRESSURE(ain_value) ((ain_value)/SPAN*mm_H2O)   // Дифференциальное давление, мм. вод. ст.

Share this post


Link to post
Share on other sites

Читаю и не понимаю. Что-то Вы путаете. Без привязки к конкретному типу АЦП если 24 бит, то максимальное беззнаковое 0xFFFFFF = 16777215. Делим 2.5В на 16 и получаем 2.5/16 = 1.5625E-1 (В)= 156.25 мВ. Это ВСЯ шкала и неоткуда ей становиться больше. Если плюс-минус, то половина шкалы туда, половина сюда - итого +/-78 мВ с копейками. Ваш усилитель имеет Ку = 5 и это относится к дифференциальному напряжению на его входе. Сигнал моста должен быть равен не более 156.25/5 = 3.125E+1 мВ, т.е. +/-1.5625E+1. Формула из DS, которую Вы вывернули в

#define Vin(adc_value) (((adc_value)-(signed long)STEPS_B)*Vref/GAIN_IA/STEPS_B)

при коде равном 0xFFFFFF даёт 5 В, т.е. без оговорки о половине шкалы она не соответствует голому коду - она относится именно к положительной или отрицательной шкале. Т.е. если привести к математике без тех лишних оговорок, то получится

#define Vin(adc_value) (((adc_value)-(signed long)STEPS_B)*Vref/GAIN_IA/STEPS_U)

Share this post


Link to post
Share on other sites
Формула из DS, которую Вы вывернули в ...

при коде равном 0xFFFFFF даёт 5 В

Вы не правы.

При значении 0xFFFFFF получается не 5, а 0.5 . А теперь с этого места идем дальше... И не подгоняйте результат под "сочиненную" формулу.

 

Стр.22 из даташита AD7799:

with a 2.5 V reference, the unipolar ranges are
from (0 mV to 19.53 mV) to (0 V to 2.5 V), and the bipolar
ranges are from ±19.53 mV to ±2.5 V.

 

Формулы для расчета входного напряжения:

DATA OUTPUT CODING
When the ADC is configured for unipolar operation, the output
code is natural (straight) binary with a zero differential input
voltage resulting in a code of 00...00, a midscale voltage resulting
in a code of 100...000, and a full-scale input voltage resulting in
a code of 111...111. The output code for any analog input voltage
can be represented as
Code = (2^N × AIN × GAIN)/VREF
When the ADC is configured for bipolar operation, the output
code is offset binary, with a negative full-scale voltage resulting
in a code of 000...000, a zero differential input voltage resulting
in a code of 100...000, and a positive full-scale input voltage
resulting in a code of 111...111. The output code for any analog
input voltage can be represented as
Code = 2^(N – 1) × [(AIN × GAIN/VREF) + 1]
where:
AIN is the analog input voltage.
N = 16 for the AD7798, and N = 24 for the AD7799.

 

Я разбил ход мыслей на тезисы:

1) АЦП настроен на биполярный режим.

2) Коэффициент усиления АЦП = 16, при этом нет искажения сигнала. Сигнал (в кодах АЦП) меняется почти от 0x000000 до 0xFFFFFF . В спокойном состоянии код равен почти 0x800000.

3) При этом напряжение на входе АЦП (после ИУ) меняется от +2.5В-156мВ до +2.5В+156мВ. Это подтверждается измерением тестером и осциллографом.

4) Значение АЦП по формуле для биполярного режима перевожу значение АЦП в напряжение в Вольтах с учетом коэффициента усиления ИУ = 5 по формуле

#define Vref          2.51        // 2.5 V
#define GAIN_IA       5.0         // Gain of Instrumental Amplifier 5
#define STEPS_U       16777216.0  // Full-Scale 2^24 for unipolar operation
#define STEPS_B       8388608.0   // Full-Scale 2^(24-1) for bipolar operation

#define Vin(adc_value) (((adc_value)-(signed long)STEPS_B)*Vref/GAIN_IA/STEPS_B)  

Vin(ValueADC.data[0])/(1<<AD7799_16_GAIN)

и вывожу полученное значение на ЖКИ. Это значение на ЖКИ меняется от -31мВ до +31мВ. Т.е. при создании давления 1PSI = 703мм.вод.ст. сигнал меняется по модулю 31мВ в зависимости от направления давления.

5) Значение напряжения в Вольтах перевожу в мм.вод.ст. по формуле:

#define SPAN          (0.015687*2)      // Span (V) of Pressure Sensors = 1 psi
#define mm_H2O        703.05        // мм вод. ст. (@ 0 гр. C)
#define dPRESSURE(ain_value) ((ain_value)/SPAN*mm_H2O)   // Динамическое давление, мм. вод. ст.

Это подтверждается выводом на ЖКИ - при создании максимального давления выводится по модулю значение 703 мм.вод.ст.

6) При создании давления аспиратором (компрессором) значения, например 300 (по моему прибору), другой "поверенный" прибор показывает в два раза больше, т.е. 600.

 

А теперь скажите, пожалуйста, в каком месте я не прав? :(

Share this post


Link to post
Share on other sites
Вы не правы.
Похоже дважды не так

вот почему -GAIN_IA не там

#define GAIN 16

и тогда поправленная Ваша формула работает

Vin:=(((adc_value)-STEPS_B)*Vref/(GAIN*STEPS_B))

Только это относится ко входу АЦП

получается +/-156.2

 

Если считать как я предполагал, что шкала не менялась (при установке биполярного режима), то для двуполярного сигнала смещение в половину шкалы просто прибавляется (к формуле для униполярного режима)

Code:=(2^24*AIN*GAIN)/VREF+2^23

Соответственно имеем

Ain:=(Code-2^23)*VREF/(GAIN*2^24)

учитывая Ваши дефайны получаем

#define Vin(((adc_value)-STEPS_B)*Vref/(GAIN*STEPS_U))

 

либо шкала действительно в 2 раза больше и фсё соответствует формуле для биполярного режима

Если верить стр. 22, то так оно и есть - шкала для биполярного в 2 раза больше и формула в DS правильная

и получается Vin:=(((adc_value)-STEPS_B)*Vref/(GAIN*STEPS_B))

 

Я считаю, что одно из двух: либо датчик расчитан на диапазон 2PSI (хотя таких не бывает), либо врет "поверенный" прибор smile.gif Я ошибки в расчетах не вижу.

А что c переключением питания моста? Может, вы складываете отсчёты и забываете поделить пополам?

Share this post


Link to post
Share on other sites
Похоже дважды не так
Что не так? Я указал Вам на ошибку в расчетах (0.5 вместо 5).

 

вот почему -GAIN_IA не там

#define GAIN 16

и тогда поправленная Ваша формула работает

Vin:=(((adc_value)-STEPS_B)*Vref/(GAIN*STEPS_B))

Только это относится ко входу АЦП

получается +/-156.2

Все верно. А теперь если разделить 156.2 на 5 (GAIN_IA), то получим прежние +/-31мВ.

И покажите мне разницу между вычислением Vin:

#define Vin(adc_value) (((adc_value)-(signed long)STEPS_B)*Vref/GAIN_IA/STEPS_B)

с последующим делением на 16 (напомню, что AD7799_16_GAIN = 4):

Vin(ValueADC.data[0])/(1<<AD7799_16_GAIN)

... и Вашим вариантом. Результат тот же.

 

А что c переключением питания моста? Может, вы складываете отсчёты и забываете поделить пополам?
Питание я пока не переключаю. Хотя сейчас как-раз думаю над этим. Уже купил IR4428.

 

PS. Взял измеритель кровяного давления. ..

 

PS2. Сравнение с третьим манометром (кровяного давления) показало, что мои показания действительно занижены в два раза. Так в каком месте мне нужно поделить/умножить на 2 ?

Получается, как у Шарикова:"...взять все и поделить". :)

Share this post


Link to post
Share on other sites
Результат тот же.

Тот же, только дефайну Vin название другое дать надо было

 

Что не так? Я указал Вам

да у меня не так - сначала тупо в формулу всё подставил и не посмотрел на GAIN_IA а потом посчитал неправильно, ну и с английским не сложилось без чтения 22-й страницы;)

Share this post


Link to post
Share on other sites

Получается, мой прибор будет "правильно" показывать (по крайней мере показания будут совпадать с другим приборами. Хотя не исключено, что третий прибор тоже врет ;)) , если задать коэффициент усиления АЦП = 32, GAIN_IA=5, SPAN = 0.0156, mm_H2O=703. Но ведь при таком усилении будет ограничение сигнала в два раза !!! Это можно увидеть по значению кодов АЦП при создании давления.

Share this post


Link to post
Share on other sites

Если действительно отличается диапазон, то главное, чтобы Вы его могли оцифровать и оно максимально близко вписывалось в динамический диапазон АЦП. Масштабирование никто не отменял. Погрешность преобразования немного ухудшится, но а сколько надо? Ведь реальный сенсор если имеет основную погрешность, например, 0.1, то при таком неслабом питании чувствительность такая, что при изменении Ку в 2 раза ничего и не заметите - погрешности АЦП будут за 13-м битом шкалы сигнала

Share this post


Link to post
Share on other sites

Провел такой эксперимент. При таких условиях, как описано топиком выше, на ЖКИ вывожу значение АЦП для первого канала и значение динамического давления для второго канала АЦП в мм. вод. ст. Оба датчика отрицательными портами подключены к одной трубке. Включаю аспиратор, и плавно повышаю отрицательное давление. В итоге, все правильно получается: ноль давления - значение 0x800000, плавно повышаю давление до 703 мм.вод.ст. (значение на втором канале) - соответствует значению 0xFFFFFF.

Может мостовой датчик должен так работать: на половину своего диапазона? При усилении АЦП = 16 сигнал меняется почти от 0x800000 до 0xFFFFFF.

 

PS. Есть еще ряд вопросов.

 

1) Как правильно реализовать АРУ АЦП, чтобы максимально точно мерять в режиме малого сигнала..

2) Какие схемотехнические меры можно предпринять для снижения уровня помех по питанию. Пока все собрано на макетной плате с проводками. Осциллограф показал большой уровень шумов по питанию +10В и +5В. На мой взгляд, основной источник шумов вносит Step-Up преобразователь на MAX1523 (схему я выкладывал чуть выше). Улучшит ли ситуацию дроссель L2 600uH (или большего номинала) после преобразователя? Или наоборот, он будет работать как антенна. И увеличить емкости до 1000uF...4700uF. Плату я начал разводить, но нужно окончательно определиться со схемотехническими решениями.

Может стоит вместо Step-Up преобразователя использовать "Крону" +9В. Последовательно с источником +3В получится +12В, из которых формируется ИОНы +10В и +5В. Но мне кажется, - это изврат.

3) Как производить установку 0 датчика давления? Правильно ли сделал (см. схему)? Очень трудно добиться точной установки, на мой взгляд, из-за большого шума. Можно ли вместо подстроечного резистора применить цифровой потенциометр на 256 значений. Было бы удобно в режиме калибровки смещения нуля балансировать мост внешними цепями. А остаточное смещение убрать уже в АЦП системной калибровкой смещения нуля.

 

PS2. Если датчики подключены к одной трубке, то должны ли они показывать одинаковое давление? Или тот, который первый стоит будет показывать больше? У меня так и получается, причем чем выше давление, тем больше разница в показаниях датчиков.

Share this post


Link to post
Share on other sites

Для начала нужно определиться что же Вы хотите получить и тогда выбирать меры. Если закладываться на начальную точность датчика (смещение и чувствительность/шкала), то нужно решить собираетесь ли Вы компенсировать и то и другое? А то смещение нуля Вы аж подстроечным резистором пытаетесь подстроить, а шкалу ищете. Мы не делаем датчиков без калибровок, и даже не пытались. Погрешность шкалы можно было бы подстроить, например, управляя питанием моста. Мы, имея на борту контроллер, всё делаем полсе оцифровки с помощью поправок различного рода.

Основная погрешность сенсора складывается из нескольких составляющих и часть из них опять же может быть математически скомпенсирована.

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

Итого - на одной оцифровке без калибровок побороть начальный разброс при приличных требованиях к точности, ИМХО, нереально. Да и другие погрешности Вас замучают.

 

Что касается вопросов, то

1) никакой АРУ, кроме как ЦАП по питанию (и то это было аж в одном экперименте) для компенсации некторых видов погрешностей, не делал и делать не собираюсь - динамического диапазона современных АЦП или хватает, или нужны такие стабильные сенсоры в таком узком диапазоне, что без усилителя и использования именно узкого диапазона не обойтись. (На всякий вспомните какие величины у гистерезиса, а он вырпажается в процентах от полной шкалы). А дальше - математика - фильтрация, масштабирование, линеаризация и всякие компенсации.

2) step-up можно подгрузить или выбрать другой способ преобразования, например, трансформатор с пушпульной накачкой и обычный выпрямитель, можно со стабилизатором. Например, раскачать NMP 78253 на каких-нибудь 128 кГц

3) см. выше - проще чуть опустить питание мосту, чтобы сигнал завсегда вписывался в шкалу и ещё и при любой адекватной величине смещения. Остальное отдать контроллеру. Ведь если уж собираетесь потенциометр цифровой ставить, то хранить настройки, управлять им - всё же надо (хотя конечно есть сейчас RDAC-и с nonvolatile памятью) и даже ручным управлением. Кроме того у ADI есть специальные усилители с кучей программируемых (пережиганием встроенных перемычек) параметров типа AD8556 - если уж сильно надо, то лучше так.

У нас ВСЕ датчики индивидуально калибруются, при этом электроника не меняется, а сенсоров применяется небольшой, но зоопарк, с разными чувствительностями и прочая

Share this post


Link to post
Share on other sites
А то смещение нуля Вы аж подстроечным резистором пытаетесь подстроить, а шкалу ищете.
А что не так с резистором? В подборке схем Cypress, которую Вы сами мне предложили, там реализован похожий механизм балансировки моста.

По поводу АРУ АЦП... Я имел в виду переключение коэффициента АЦП на больший, если сигнал слишком мал. Точнее наоборот, установить коэффициент усиления АЦП максимальным, а переключать на меньший, когда значение АЦП достигает значений 0x000000 ил 0xFFFFFF, т.е. поддерживать оптимальным для данного диапазона входного сигнала.

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