sensor_ua 0 10 сентября, 2008 Опубликовано 10 сентября, 2008 · Жалоба 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 и считаете калькулятором. ЗЫ. У меня такого АЦП нет и, тем более, определений величины шкалы Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 10 сентября, 2008 Опубликовано 10 сентября, 2008 · Жалоба А далее берёте формулы из указанного раздела DS и считаете калькулятором.Я же приводил расчеты по этой формуле. Я хочу разобраться, почему так происходит. Почему перед АЦП сигнал меняется в пределах +/-156мВ относительно +2.5 В? Вопрос стоит так, - как меняется сигнал на выходе моста : +/-7.8 мВ или +/- 15.6 мВ ? Пока экспериментально получается второе... Хотя априори должно быть первое. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sensor_ua 0 10 сентября, 2008 Опубликовано 10 сентября, 2008 · Жалоба Вы сначала четко определитесь - какой у Вас режим АЦП - униполярный или биполярный?А затем честно померяйт е сигнал на входе (не надо крутого осциллографа/вольтметра) АЦП и прикиньте какой должен бывть ожидаемый код. Эти данные можно попытаться соотнести с чтением регистров настроек АЦП Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 11 сентября, 2008 Опубликовано 11 сентября, 2008 · Жалоба Вы сначала четко определитесь - какой у Вас режим АЦП - униполярный или биполярный?Совершенно очевидно, что биполярный. Иначе и быть не может,- не отображалось бы отрицательные значения. В регистры АЦП пишется все правильно. А затем честно померяйте сигнал на входе (не надо крутого осциллографа/вольтметра) АЦПЕще раз повторяю, напряжение на входе АЦП, померянное осциллографом и мультиметром составляет +/-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 !!! Или скажите, в чем я не прав. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 11 сентября, 2008 Опубликовано 11 сентября, 2008 · Жалоба Возвращаясь к вопросу о заниженных в два раза показаниях моего прибора относительно другого. Я считаю, что одно из двух: либо датчик расчитан на диапазон 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) // Дифференциальное давление, мм. вод. ст. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sensor_ua 0 11 сентября, 2008 Опубликовано 11 сентября, 2008 · Жалоба Читаю и не понимаю. Что-то Вы путаете. Без привязки к конкретному типу АЦП если 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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 11 сентября, 2008 Опубликовано 11 сентября, 2008 · Жалоба Формула из 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. А теперь скажите, пожалуйста, в каком месте я не прав? :( Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sensor_ua 0 11 сентября, 2008 Опубликовано 11 сентября, 2008 · Жалоба Вы не правы. Похоже дважды не так вот почему -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 переключением питания моста? Может, вы складываете отсчёты и забываете поделить пополам? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 11 сентября, 2008 Опубликовано 11 сентября, 2008 · Жалоба Похоже дважды не такЧто не так? Я указал Вам на ошибку в расчетах (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 ? Получается, как у Шарикова:"...взять все и поделить". :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sensor_ua 0 11 сентября, 2008 Опубликовано 11 сентября, 2008 · Жалоба Результат тот же. Тот же, только дефайну Vin название другое дать надо было Что не так? Я указал Вам да у меня не так - сначала тупо в формулу всё подставил и не посмотрел на GAIN_IA а потом посчитал неправильно, ну и с английским не сложилось без чтения 22-й страницы;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 11 сентября, 2008 Опубликовано 11 сентября, 2008 · Жалоба Получается, мой прибор будет "правильно" показывать (по крайней мере показания будут совпадать с другим приборами. Хотя не исключено, что третий прибор тоже врет ;)) , если задать коэффициент усиления АЦП = 32, GAIN_IA=5, SPAN = 0.0156, mm_H2O=703. Но ведь при таком усилении будет ограничение сигнала в два раза !!! Это можно увидеть по значению кодов АЦП при создании давления. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sensor_ua 0 11 сентября, 2008 Опубликовано 11 сентября, 2008 · Жалоба Если действительно отличается диапазон, то главное, чтобы Вы его могли оцифровать и оно максимально близко вписывалось в динамический диапазон АЦП. Масштабирование никто не отменял. Погрешность преобразования немного ухудшится, но а сколько надо? Ведь реальный сенсор если имеет основную погрешность, например, 0.1, то при таком неслабом питании чувствительность такая, что при изменении Ку в 2 раза ничего и не заметите - погрешности АЦП будут за 13-м битом шкалы сигнала Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 11 сентября, 2008 Опубликовано 11 сентября, 2008 · Жалоба Провел такой эксперимент. При таких условиях, как описано топиком выше, на ЖКИ вывожу значение АЦП для первого канала и значение динамического давления для второго канала АЦП в мм. вод. ст. Оба датчика отрицательными портами подключены к одной трубке. Включаю аспиратор, и плавно повышаю отрицательное давление. В итоге, все правильно получается: ноль давления - значение 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. Если датчики подключены к одной трубке, то должны ли они показывать одинаковое давление? Или тот, который первый стоит будет показывать больше? У меня так и получается, причем чем выше давление, тем больше разница в показаниях датчиков. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sensor_ua 0 11 сентября, 2008 Опубликовано 11 сентября, 2008 · Жалоба Для начала нужно определиться что же Вы хотите получить и тогда выбирать меры. Если закладываться на начальную точность датчика (смещение и чувствительность/шкала), то нужно решить собираетесь ли Вы компенсировать и то и другое? А то смещение нуля Вы аж подстроечным резистором пытаетесь подстроить, а шкалу ищете. Мы не делаем датчиков без калибровок, и даже не пытались. Погрешность шкалы можно было бы подстроить, например, управляя питанием моста. Мы, имея на борту контроллер, всё делаем полсе оцифровки с помощью поправок различного рода. Основная погрешность сенсора складывается из нескольких составляющих и часть из них опять же может быть математически скомпенсирована. Кроме того при борьбе за малые погрешности выходного значения уже становттся важна, например, погрешность установки сенсора (угол наклона). Итого - на одной оцифровке без калибровок побороть начальный разброс при приличных требованиях к точности, ИМХО, нереально. Да и другие погрешности Вас замучают. Что касается вопросов, то 1) никакой АРУ, кроме как ЦАП по питанию (и то это было аж в одном экперименте) для компенсации некторых видов погрешностей, не делал и делать не собираюсь - динамического диапазона современных АЦП или хватает, или нужны такие стабильные сенсоры в таком узком диапазоне, что без усилителя и использования именно узкого диапазона не обойтись. (На всякий вспомните какие величины у гистерезиса, а он вырпажается в процентах от полной шкалы). А дальше - математика - фильтрация, масштабирование, линеаризация и всякие компенсации. 2) step-up можно подгрузить или выбрать другой способ преобразования, например, трансформатор с пушпульной накачкой и обычный выпрямитель, можно со стабилизатором. Например, раскачать NMP 78253 на каких-нибудь 128 кГц 3) см. выше - проще чуть опустить питание мосту, чтобы сигнал завсегда вписывался в шкалу и ещё и при любой адекватной величине смещения. Остальное отдать контроллеру. Ведь если уж собираетесь потенциометр цифровой ставить, то хранить настройки, управлять им - всё же надо (хотя конечно есть сейчас RDAC-и с nonvolatile памятью) и даже ручным управлением. Кроме того у ADI есть специальные усилители с кучей программируемых (пережиганием встроенных перемычек) параметров типа AD8556 - если уж сильно надо, то лучше так. У нас ВСЕ датчики индивидуально калибруются, при этом электроника не меняется, а сенсоров применяется небольшой, но зоопарк, с разными чувствительностями и прочая Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
alux 0 12 сентября, 2008 Опубликовано 12 сентября, 2008 · Жалоба А то смещение нуля Вы аж подстроечным резистором пытаетесь подстроить, а шкалу ищете.А что не так с резистором? В подборке схем Cypress, которую Вы сами мне предложили, там реализован похожий механизм балансировки моста. По поводу АРУ АЦП... Я имел в виду переключение коэффициента АЦП на больший, если сигнал слишком мал. Точнее наоборот, установить коэффициент усиления АЦП максимальным, а переключать на меньший, когда значение АЦП достигает значений 0x000000 ил 0xFFFFFF, т.е. поддерживать оптимальным для данного диапазона входного сигнала. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться