kolisnichenko_r
Sep 14 2007, 05:41
Вручили мне АЦП AD7705 - измеряй напряжение на фоне 50Гц. Есть у меня контроллер PIC16F877.
Кто работал с таким АЦП, стоит на него тратить время? Буду рад узнать Ваше мнение. Может какие поучительные факты...
AD7705 старенький уже по нынешним временам, есть много гораздо более интересных. Смотрите у AD на сайте, закладывать 7705 в новую разработку нет смысла. Хотя если задача разовая, то можно и на нем сделать.
kolisnichenko_r
Sep 14 2007, 10:17
Цитата(slog @ Sep 14 2007, 13:01)

AD7705 старенький уже по нынешним временам, есть много гораздо более интересных. Смотрите у AD на сайте, закладывать 7705 в новую разработку нет смысла. Хотя если задача разовая, то можно и на нем сделать.
Как в работе AD7705, послушный. Нет подводных камней? Алгоритм работы как в описании?
По моим сведениям все в них нормально, работают. Сам на них когда-то разрабатывал. С AD7705 наверно миллионы изделий выпущены. Даташит надо внимательно читать. Но с новыми s-d ADC приятнее работать.
По форуму поиском поищи, их тут не раз обсуждали.
kolisnichenko_r
Sep 14 2007, 11:18
Цитата(slog @ Sep 14 2007, 14:06)

По моим сведениям все в них нормально, работают. Сам на них когда-то разрабатывал. С AD7705 наверно миллионы изделий выпущены. Даташит надо внимательно читать. Но с новыми s-d ADC приятнее работать.
По форуму поиском поищи, их тут не раз обсуждали.
есть еще такой фактор как цена. Очень важный, как мне обяснили
Если цена важна, то 7705 не лучший вариант, со встроенной опорой дешевле будет. И вообще, AD дешевизной не отличается, по цене есть гораздо более выгодные варианты у других производителей.
kolisnichenko_r
Sep 14 2007, 16:45
Цитата(slog @ Sep 14 2007, 19:05)

Если цена важна, то 7705 не лучший вариант, со встроенной опорой дешевле будет. И вообще, AD дешевизной не отличается, по цене есть гораздо более выгодные варианты у других производителей.
А поконкретнее, парочку названий микросхем, я в этом новичек,что говорят то и делаю.
kolisnichenko_r
Sep 15 2007, 09:05
по цене хароша AD7788/AD7789 но корпус очень маленький, с нашим производством soic трудно паять
kolisnichenko_r
Sep 17 2007, 11:45
В АЦП есть внутренний буфер, как он влияет на погрешность измерения?
Включить или не включить его вот вопрос...
Алгоритм инициализации:
1) Запись в комуникационный регистр(COMMUNICATIONS REGISTER)
0b00100000
7->0
6-4->010 регистр синхронизации
3->0 запись
2->0 вкл. АЦП
1-0-> выбор канала АЦП AIN1
2) Запись в регистр синхронизации (CLOCK REGISTER)
0b00010100
7-5->0
4->1 ?
3-2->01 кварц 2,4576Мгц
00->00 фильтр 50Гц
3) Запись в комуникационный регистр(COMMUNICATIONS REGISTER)
0b00010000
6-4->001 регистр (SETUP REGISTER)
4) Запись в регистр (SETUP REGISTER)
0b01000110
7-6->01 режим работы самокалибровки
5-3->000 коэф. усиления 1 (пока)
2->1 униполярная работа ?
1->1 включить внутренний буфер ?
0->0 запуск
5) while(DRDY){;} //ждем
6) Запись в комуникационный регистр(COMMUNICATIONS REGISTER)
0b00111000
6-4->011 регистр данных(DATA REGISTER)
3->1 чтение
7) Чтение (пока не знаю как)
Может кто работал, подскажет что не так
Буфер включать, без него входное сопротивление s-d преобразователя маленькое и зависит от частоты.
Проверить свои умозаключения можно с помощью on-line программы
..http://www.analog.com/Analog_Root/static/techSupport/designTools/interactiveTools/adc/codegen/ad77056.html
Готовый пример для пиков ad7705.c есть в компиляторе CCS.
И еще, лучше использовать корпус SOIC, меньше наводок
kolisnichenko_r
Sep 18 2007, 06:01
[quote name='upc2' date='Sep 18 2007, 07:31' post='295678']
Проверить свои умозаключения можно с помощью on-line программы
..http://www.analog.com/Analog_Root/static/techSupport/designTools/interactiveTools/adc/codegen/ad77056.html
Пробовал, интересная
Готовый пример для пиков ad7705.c есть в компиляторе CCS.
Скачать знаете где ?
Прочитать результат не получается...
О чтении по SPI пишут: "SPI слейв сам ничего передавать не может.
"передача" просиходит попутно при обмене,
т.е. мастер передает и синхронно принимает "
как это?
Сам файл вам вероятно не сильно поможет.Нужен и компилятор.
kolisnichenko_r
Sep 18 2007, 06:30
С передачей разобрался - на осцилографе видно пачки импульсов с контроллера, можно даже перевести картинку в код, а вот прочитать результат пока не удается
Раз вы так настойчивы , прикрепил рабочий проект.Может пригодится.
АЦП работает с тензодатчиками и токовой петлей Внешний вид в моей фотогагерее.
kolisnichenko_r
Sep 18 2007, 08:23
void send_byte_spi(unsigned char byte_data)
//posilka byte SPI
{INTCON=0x00;//
SSPEN=1;//vkl. SPI
Delaymks(1);
SSPBUF=byte_data;
while(!STAT_BF);
Delaymks(1);
}
void read_2byte(unsigned char spi_data)//priem 2 byte( SPI)
{ CS=0;
SSPBUF = spi_data; // Send the read instruction
while (!STAT_BF); // wait for ssp to finish
spi_data = SSPBUF; // SPIDummy
CS=1;
CS=0;
SSPBUF = 0x00; // SPIDummy tx to initiate bus cycle
while (!STAT_BF); // wait for ssp to finish
H_byte_AD7705=SSPBUF;
SSPBUF = 0x00; // SPIDummy tx to initiate bus cycle
while (!STAT_BF); // wait for ssp to finish
L_byte_AD7705=SSPBUF;
CS=1;
SSPEN=0;//vikl. SPI
}
CS=0;//RD5
//инициализация АЦП
send_byte_spi(0b00100000);
send_byte_spi(0b00010100);
send_byte_spi(0b00010000);
send_byte_spi(0b01000110);
while(DRDY){;}//
read_2byte(0b00111000);//priem 2 byte(SPI)
CS=1;//RD5
Зависает на строчке while(DRDY){;}//
постоянно висит лог.1
Вроде все правильно.Попробуйте сначала сделать инициализацию
Clock $0C Setup $44 и отключите буфер.
kolisnichenko_r
Sep 18 2007, 13:33
Цитата(upc2 @ Sep 18 2007, 12:29)

Вроде все правильно.Попробуйте сначала сделать инициализацию
Clock $0C Setup $44 и отключите буфер.
Пробовал все тоже.
Зависает на строчке while(DRDY){;}//
постоянно висит лог.1
Если сброс - DRDY в каком состоянии?
В моем случае висит лог.1
Возьму новую миктосхему, соберу схему, начну вновь
Не спешите.
Проверте полярность сигналов тактирования модуля BSSP.
Необходимо чтобы полярность совпадала с документацией на AD7705
DRDY устанавливается в 0 когда в регистре DATA есть данные и сразу сбрасывается при
чтении этого регистра. Об этом сигнализирует и 7 разряд регистра COMM
kolisnichenko_r
Sep 19 2007, 06:48
Настройка SPI:
SSPCON=0b00010010;//CKP=1; FOSC/64
SSPSTAT = 0x00; //CKE=0,SMP=0
SSPEN=1;//vkl.modul SPI
Я не знаю вашу схему подключения к контроллеру.У меня СКР=0 (стоит буфер)
Просмотрите ваш код . Не должно бить ни одного лишнего и недостающего бита.
kolisnichenko_r
Sep 19 2007, 10:09
Соединение с микроконтроллером напрямую
Во время инициализации на выв. DOUT появляются импульсы.
Во время чтения там 0
Тогда ловите 0
while(!DRDY);
и читайте данные
read_2byte(0b00111000);
kolisnichenko_r
Sep 19 2007, 13:18
Первый раз измеряет, корректно. Но чтобы измерить второй раз (виснет при повторном измерении) нужно выключить питание или сбросить контроллер.
Цитата(kolisnichenko_r @ Sep 19 2007, 17:18)

Первый раз измеряет, корректно. Но чтобы измерить второй раз (виснет при повторном измерении) нужно выключить питание или сбросить контроллер.
Поздравляю. Значит живой АЦП.
В документации об этом мало написано, но при каждом измерении надо начинать все сначала-
инициализацию, установки и т.д.
kolisnichenko_r
Sep 20 2007, 08:13
Спасибо за помощь! Заработало!
Ох и помучило меня это...
Он еще может заткнуться , когда на его вход подается напряжение больше чем он
может измерить.Тогда необходимо делать сброс.
Докумннтация рекомендует делать несколько замеров и только после этого оценивать
результат. Первый замер точно должен быть холостым.
Дерзайте дальше.Успехов.
kolisnichenko_r
Sep 20 2007, 10:34
Еще задачка: входы закорочены, результат измерения - 100-160мкВ на всем диапазоне Ку ( от 1 до 128 );
флуктуация результата измерения на всем диапазоне Ку
Может что-то в алгоритме инициализации?
Цитата(kolisnichenko_r @ Sep 20 2007, 14:34)

Еще задачка: входы закорочены, результат измерения - 100-160мкВ на всем диапазоне Ку ( от 1 до 128 );
флуктуация результата измерения на всем диапазоне Ку
Может что-то в алгоритме инициализации?
При закороченных входах должен быть 0. Это проблема DIP-корпуса вставленного в сокет. Лучше
распаянный корпус SOIC. Второе ,стабилизация опорного напряжения.Используйте AD780.Элекромагнитные наводки,заблокируйте входы конденсаторами и многое другое.
Если от этого не избавиться, то следует применять другую калибровку.Точно не помню, помоему
Zero-она примет 100мкв. за 0 Вообщем у этих микросхем много возможностей.
kolisnichenko_r
Sep 20 2007, 13:32
Выключил буфер ноль есть, уменшилась флуктуация.
А говорили что буфер это хорошо
Нет, я вам советовал отключить буфер.Я сейчас не помню почему, но он мне тоже не
понравился.
kolisnichenko_r
Sep 21 2007, 10:44
Буфер лутше включить, без него сильная зависимость входного сопротивления от коэф. усиления.
Есть интересная штуковина:
закороченый вход Ку=1-4 Uвых=150мкВ
Ку=8-128 Uвых=250мкВ
Подаю на вход напряжение до 150мкВ(Ку=1-4) не реагирует на изменение вх. напряжения, после 150мкВ измеряет. Также до 250мкВ(Ку=8-128). Напряжение опоры 2.5В
kolisnichenko_r
Sep 21 2007, 12:26
Цитата(kolisnichenko_r @ Sep 21 2007, 13:44)

Буфер лутше включить, без него сильная зависимость входного сопротивления от коэф. усиления.
Есть интересная штуковина:
закороченый вход Ку=1-4 Uвых=150мкВ
Ку=8-128 Uвых=250мкВ
Подаю на вход напряжение до 150мкВ(Ку=1-4) не реагирует на изменение вх. напряжения, после 150мкВ измеряет. Также до 250мкВ(Ку=8-128). Напряжение опоры 2.5В
А как измеряет: Щ300 показывает 6мВ
AD7705 измеряет 4мВ(Ку=1-4)
2мВ(Ку=8-128)
Буфер включен.
kolisnichenko_r
Sep 24 2007, 06:39
И все-таки как заставить правильно работать данный представитель АЦП?
Вот алгоритм инициализации, использования:
инициализация:
void init_AD7705(unsigned char Ku)
{RESET=0;//RD7 RESET AD7705
Delayms(5);
RESET=1;//RD7
Delayms(5);
send_byte_spi(0b00100001);// reg.CLC,zapis,vkl.AD7705
send_byte_spi(0b00000100);//CLKDIS=0,ZQ=2.4576МГц,50Гц
send_byte_spi(0b00010001);// reg.SETAP,zapis,vkl.AD7705
send_byte_spi(0b01000100|vizn_ku(Ku));//samo-kalibr.unipol.buf.otkl
INTF=0;//ochistka flaga preriv.RB0
while(!INTF){;}//pereriv.RB0->DRDY
INTF=0;//ochistka flaga preriv.RB0
read_2byte(0b00111001);//priem 2 byte( SPI)
}
измерение:
void ADC_AD7705(unsigned char Ku)
{send_byte_spi(0b00010001);// reg.SETAP,zapis,vkl.AD7705
send_byte_spi(0b00000100|vizn_ku(Ku));//zapusk izm.unipol.buf.otkl
INTF=0;//ochistka flaga pereriv.RB0
while(!INTF){;}//pereriv.RB0->DRDY
INTF=0;//ochistka flaga pereriv.RB0
read_2byte(0b00111001);//priem 2 byte(SPI)
send_byte_spi(0b00010001);// reg.SETAP,zapis,vkl.AD7705
send_byte_spi(0b00000100|vizn_ku(Ku));//zapusk vimir.unipol.buf.otkl
INTF=0;//ochistka flaga pereriv.RB0
while(!INTF){;}//pereriv.RB0->DRDY
INTF=0;//ochistka flaga pereriv.RB0
read_2byte(0b00111001);//priem 2 byte(SPI)
}
в работе:
init_AD7705( Ku);
ADC_AD7705(Ku);
Что же с внутренним буфером? Может в документации на АЦП ошибка-вместо отключеного буфера включений?
Производится измерения както коряво: то одно показывает, то другое...
kolisnichenko_r
Sep 24 2007, 09:12
До 5мВ измерение происходит с точностью 50%
После 5мВ доходит до 0,5%
по всем Ку
Кто - то что-то знает?
Посоветуйте
Если вы не используете прецизионный источник опорного напряжения ,например AD780 и стабильный
источник питания , то не мучайте АЦП.
Большое значение играет монтаж. Существенное значение имеет и кварц.На входе схемы стоит
резистор 7 кОм и конденсатор 7пФ, который электронный ключ подключает к земле.Время заряда
определяется тактовой частотой и схемой коэффициента усиления.Мне кажется кварц 4.9152
предпочтительнее, хотя для цифрового фильтра все наоборот.
Любой внешний резистор включенный последовательно со входом влияет на результат измерения.
Вследствие высокого разрешения необходимо учитывать и шумы АЦП. Кроме всех прочих есть еще и
остаточный шум квантования, не подавленный до конца цифровым фильтром.Про все это написано в
документации.Постарайтесь более полно выполнить требования эксплуатации.
Необходимо делать несколько выборок.Попробуйте делать неболшие задержки при выборках.И лучше , наверно, программно определять коэффициент усиления.
Примерный код на Си.
unsigned int SetGain()
{
unsigned int ADC;
char i ;
for(i=0;i<10;i++)
{
ADC=ReadByte(DATA);
if((ADC < 0xFFFF/2)&&(gain < 7)) gain++;
else if((ADC == 0xFFFF)&&(gain>0)) gain--;
else break;
WriteByte(SETUP,0x44|(gain<<3));
delay(200);
}
gotoxy(5,1);
if(i>=10) cprintf(" Can't set gain !");
// else cprintf(" gain = %d => k = %d ",gain,(1<<gain));
return(ADC);
}
kolisnichenko_r
Sep 25 2007, 07:37
Вот что я прочитал в описании на АЦП, если правильно истолковал:
"In buffered mode, the analog inputs can handle much larger source impedances, but the absolute input voltage range is restricted to between GND + 50 mV and VDD − 1.5 V,"
когда буфер включен, корректные измерения от 50 mV.
когда буфер отключен:
"The on-chip PGA allows the AD7705 to handle an analog input voltage range as low as 10 mV full scale with VREF = 1.25 V."
корректные измерения от 10 mV.
Получается мкВ никак не измерять.
Нужно измерять от 100нВ до 1(2)В, без предварительного усиления(операц. усилит.), с фильтрацией 50Гц. Какие АЦП такое могут сделать?
Вероятно 16-разрядный вам не подойдет.Фирма гарантирует минимальное напряжение с 600 nV.
Посмотрите 24-разрядный АЦП AD7731. Он вроде нацелен на измерение малых напряжений.
kolisnichenko_r
Sep 26 2007, 05:41
Цитата(upc2 @ Sep 26 2007, 07:42)

Вероятно 16-разрядный вам не подойдет.Фирма гарантирует минимальное напряжение с 600 nV.
Посмотрите 24-разрядный АЦП AD7731. Он вроде нацелен на измерение малых напряжений.
Где об этом можно прочитать? Если в описании микросхемы, напишите № страницы.
Перечитал я datasheet AD7705(неоднократно) цифру 600нВ не нашел.
Я имел ввиду это
4. The part features excellent static performance specifications
with 16 bits, no missing codes, ±0.003% accuracy and low
rms noise (<600Ê nV). Endpoint errors and the effects of
temperature drift are eliminated by on-chip calibration options,
which remove zero-scale and full-scale errors.
Минимальная величина шума (практически она много больше).Хотя на нижнем пределе
измерени 0..20 mV можно получить разрешение
20.000 / 65535 = 0.3 (300 nV)
kolisnichenko_r
Sep 26 2007, 07:16
Это разрешение, а 0.003% nonlinearity от конца шкалы, или от измерянного значения?
2,5В*0,003/100%=75мкВ нелинейность; с разрешением 300нВ
При измерении получалось
Щ300 АЦП
150мкВ 38МкВ (Ку=1-128)
<150мкВ 0(Ку=1-128)
С увеличением входного напряжения до 5мВ разрыв уменьшается, после 10мВ в 0.1% входит
Нужно (на краю, со скрипом пройдет) 1мкВ измерять с точностью 0.1%
<<2,5В*0,003/100%=75мкВ нелинейность; с разрешением 300нВ >>
нет ,разрешение в этом случае будет 2.5 / 65535 = 38 ( мкВ. )
дальше я не понял ваши рассуждения
kolisnichenko_r
Sep 26 2007, 08:17
Цитата(upc2 @ Sep 26 2007, 10:48)

<<2,5В*0,003/100%=75мкВ нелинейность; с разрешением 300нВ >>
нет ,разрешение в этом случае будет 2.5 / 65535 = 38 ( мкВ. )
дальше я не понял ваши рассуждения
Показания Щ300| Значения прочитанные из АЦП
150мкВ | 38МкВ (Ку=1-128)
<150мкВ | 0(Ку=1-128)
Что-то похожее на таблицу
(2,5В/128)*0,003/100%=0,585мкВ нелинейность; с разрешением 300нВ
Тоесть можно измерять 1мкВ. В абсолютно безшумной среде.
Пусть у меня есть шумы 10мкВ небыло бы 0, но он индицируется до появления сигнала 150мкВ, после этого идет измерение с разрешением, в зависимости от Ку(2.5В опора)
Где собака зарыта?
Интересное замечание.Получается , что фирма нас дурит. Идеально закоротить входы
невозможно.На входе АЦП должны наводиться микровольты, но я закорачивал входы и виде 0,
т.е. код 0х0000. Значит существует какой-то порог срабатывания? Вы приводите цифру 150 мкВ.
Для рассмотренного диапазона
150 / 0.3 = 500 разрядов.
Много.
kolisnichenko_r
Sep 26 2007, 09:11
Работал с АЦП ADS1110(16бит, Ку1-8) так там 1 отсчет есть 1 отсчет(2,048/(8*65535)=3.9мкВ)
Вот и вручили мне AD7705(16бит, Ку1-128) 1мкВ - должно потянуть, а не тянет.
Какой диапазон работы(входных напряжений) AD7705 в Вашем изделии?
Я так скурпулезно не исследовал АЦП.У меня требования оказались послабее
АЦП нагружен на тензодатчик, поэтому измеряет в одном диапазоне 0..20mV, т.е.
с усилением 128 Измеряемый вес 0...500 кГ. Округление до одного знака после запятой.
Минимальный вес которым поверял-50 гр. Результаты поверки удовлетворили.
Поверка на весах еще лучше прошла. Погрешность весов 1% от взвешиваемой массы.
Весы показали 0.16%. Поэтому особенно к АЦП я не придирался.
Какую калибровку вы используее? Может попробовать другие?
kolisnichenko_r
Sep 26 2007, 12:39
Использую самокалибровку при этом лутшие результаты. Пробовал полную калибровку, там еще выше нижний диапазон
Цитата(upc2 @ Sep 26 2007, 14:57)

Я так скурпулезно не исследовал АЦП.У меня требования оказались послабее
АЦП нагружен на тензодатчик, поэтому измеряет в одном диапазоне 0..20mV, т.е.
с усилением 128 Измеряемый вес 0...500 кГ. Округление до одного знака после запятой.
Минимальный вес которым поверял-50 гр. Результаты поверки удовлетворили.
Поверка на весах еще лучше прошла. Погрешность весов 1% от взвешиваемой массы.
Весы показали 0.16%. Поэтому особенно к АЦП я не придирался.
Какую калибровку вы используее? Может попробовать другие?
Вы утверждаете, что смогли измерять 2мкВ: 500/50е-3=10е4 => 20мВ/10е4=2мкВ
Это правда?
Вероятно да. Минимальная гиря была 50 гр.Я написал результаты удовлетворили.
Мне то и микровольты измерять нечем.Цифровой вольтметр измеряет десятые доли милливольт.
Меня тоже все время интересует один момент.В описании они указывают на 2 предела
измерения 0..20 mV и 0..2.5 (3) В., но никаких переключений нет.Только Gain
Явно низкий предел ориентирован на тензодатчики и подобное. Может что-то в самой
конструкции(схеме) о чем они сильно не рапространяются?
kolisnichenko_r
Sep 27 2007, 05:39
Цитата(upc2 @ Sep 26 2007, 16:21)

Вероятно да. Минимальная гиря была 50 гр.Я написал результаты удовлетворили.
Мне то и микровольты измерять нечем.Цифровой вольтметр измеряет десятые доли милливольт.
Меня тоже все время интересует один момент.В описании они указывают на 2 предела
измерения 0..20 mV и 0..2.5 (3) В., но никаких переключений нет.Только Gain
Явно низкий предел ориентирован на тензодатчики и подобное. Может что-то в самой
конструкции(схеме) о чем они сильно не рапространяются?
Обращался к представителям AD, они порекомендовали 24 битные микросхемы: AD7787, AD7789, AD7791 - не дорогие. Без всяких объяснений об AD7705 - Вам не походит и все...
Еще предложили микроконвертор ADuC847, АЦП, ЦАП и микроконтроллер на одном кристалле.