Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: AD7792+AVR
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
megaalex
Помогите драйверами.
=GM=
Цитата(megaalex @ Mar 24 2007, 12:03) *
Помогите драйверами.

AD7792 вполне можно подключить к АВР, используя аппаратный SPI. Например, для непрерывного чтения посылаете 0х5С, ждёте RDY, посылаете 0х00 три раза, получая взамен 24-битный код из АЦП.
add
Цитата
AD7792 вполне можно подключить к АВР, используя аппаратный SPI. Например, для непрерывного чтения посылаете 0х5С, ждёте RDY, посылаете 0х00 три раза, получая взамен 24-битный код из АЦП.

AD7792 это 16 бит (24бит у 7793).
Тут же вопросик по интерфейсу. Подскажите пожалуста так ли делать инициализацию(reset)?: После включения подаем на ~CS "0", а потом на DIN "1", и после этого 32 такта на клок? И в каких случаях он (reset) вообще нужен? Как сообщить(какую команду) МС о начале преобразования? Заранее спасибо за ответы!
slog
Datashit читать пробовал? Я думаю там есть все ответы на твои вопросы. Готовый драйвер вряд ли найдешь, да там несколько строк на Си. Я тоже собрался использовать AD7792 только до драйвера доберусь на следующей неделе, не раньше.
SergeiCh
Использовал AD7793 + ТСП100 + ATmega64 для измерения температуры. Поскольку без ОС, обошелся несколькими функциями на Си. Всё стандартно, глюков не наблюдалось.

Разве что у AD7793 источники тока согласованы не достаточно (3%), IMHO, чтобы использовать приведенную трехпроводную схему. Вернее, эталонное сопротивление уже можно брать любой точности smile.gif, т.к. ток ч/з него не будет равен удвоенному току ч/з терморезистор.
add
Может есть кто мог бы про инициализацию AD7792/93 расказать?
SergeiCh если рботали поделитесь пожалуйста инфой. Неужели для одиночного преобразования достаточно послать 0х58 и забрать данные?
SergeiCh
У AD7792/3 много регистров, они нормально описаны в дейташите. Сначала АЦП конфигурируется под задачу (какой ИОН, генератор, усиление и т.д.).

Код
void ad7793_init(void)
{
    int8_t i;
    /* Настройка порта */
    DDRSPI |= (_BV(SPISS)|_BV(SPIMO)|_BV(SPISCK));
    spi_ss_clear();
    SPCR = _BV(SPE)|_BV(MSTR)|_BV(CPOL)|_BV(CPHA); /* MSB первый, mode 3,  f/4 */
    for (i = 0; i < 4;i++) spi_rw(0xFF);
    /* настройка АЦП */
    spi_rw(AD_CR_CON_W);
    spi_rw(high(AD_CON));
    spi_rw(low(AD_CON));
    spi_rw(AD_CR_IO_W);
    spi_rw(AD_IO);
    /* Калибровка */
    spi_rw(AD_CR_MD_W);
    spi_rw(high(AD_MR_INT_ZSC));
    spi_rw(low(AD_MR_INT_ZSC));
    _delay_ms(10);
    loop_until_bit_is_clear(PINSPI,PINRDY);
    spi_rw(AD_CR_MD_W);
    spi_rw(high(AD_MR_INT_FSC));
    spi_rw(low(AD_MR_INT_FSC));
    _delay_ms(10);
    loop_until_bit_is_clear(PINSPI,PINRDY);
}


Потом устанавливается режим.

Код
void ad7793_mode_set(uint16_t mode)
{
    spi_rw(AD_CR_MD_W);
    spi_rw(high(mode));
    spi_rw(low(mode));
}


Есть три режима работы (которые также описаны в дейташите), если не ошибаюсь. В одном из них действительно достаточно посылать один байт.

Код
uint32_t ad7793_data_get(void)
{
    uint32_t t = 0;
    loop_until_bit_is_clear(PINSPI,PINRDY);
    spi_rw(AD_CR_DR_R);
    *((uint8_t *)(&t) + 2) = spi_rw(0xFF);
    *((uint8_t *)(&t) + 1) = spi_rw(0xFF);
    *((uint8_t *)(&t)) = spi_rw(0xFF);
    return t;
}


Удачи!
Ruslan1
Цитата(SergeiCh @ Mar 27 2007, 15:16) *
Использовал AD7793 + ТСП100 + ATmega64 для измерения температуры. Поскольку без ОС, обошелся несколькими функциями на Си. Всё стандартно, глюков не наблюдалось.

Разве что у AD7793 источники тока согласованы не достаточно (3%), IMHO, чтобы использовать приведенную трехпроводную схему. Вернее, эталонное сопротивление уже можно брать любой точности smile.gif, т.к. ток ч/з него не будет равен удвоенному току ч/з терморезистор.

Совершенно согласен.
Вообще не понимаю, зачем брать 16-битный АЦП и считать равными генераторы тока, которые могут разойтись на 5%. smile.gif
Я несколько иначе сделал входную схему:

--- L1------ Iout1,AIN1+
!
!
-----L2---- AIN1-, AIN2+
!
!
Rx
!
!
----L3------ AIN2-, REFIN+
nnnnn !
nnnnn !
nnnnn Re
nnnnn !
nnnnn !
nnnnn ----- REFIN-, GND

L1,L2,L3 - линия связи (трехпроводка)
n- просто чтобы сдвинуто было на экране красиво

В Этом случае Rx = Re *((A2-A1)/65536)
где A1,A2 - соответственно код, измеренный с входов AIN1 и AIN2
Rx - измеряемое сопротивление
Re - эталонное сопротивление

То есть я избавился от влияния разброса токов. Минус применения- нужно два измерения, но для меня это совсем не критично.
Нужно помнить о том, что REFIN имеет неслабый входной ток, но зато малый дрейф этого тока. У меня например все равно есть калибровка после монтажа, так что я эту величину учитываю. В принципе, можно наверное и дрейф тока учесть (термометр-то внутри есть), но это уже чересчур. smile.gif
slog
Цитата(Ruslan1 @ Apr 5 2007, 11:23) *
Вообще не понимаю, зачем брать 16-битный АЦП и считать равными генераторы тока, которые могут разойтись на 5%. smile.gif


И не 5%, а ±0.5% typ Matching between IEXC1 and IEXC2; VOUT = 0V
А 5% это Initial Tolerance at 25°C, что вообщем-то не влияет на результат измерения.
А зачем 3-х проводная схема подключения RTD, если найти кабель с двумя витыми парами внутри никаких проблем нет, тот же UTP-5.
Ruslan1
Цитата(slog @ Apr 9 2007, 14:25) *
И не 5%, а ±0.5% typ Matching between IEXC1 and IEXC2; VOUT = 0V
А 5% это Initial Tolerance at 25°C, что вообщем-то не влияет на результат измерения.

Точно. Ошибся. Но мне и этого много. Более того- никогда не закладываюсь на типичное значение, а максимальное не привели.

Цитата(slog @ Apr 9 2007, 14:25) *
А зачем 3-х проводная схема подключения RTD, если найти кабель с двумя витыми парами внутри никаких проблем нет, тот же UTP-5.

Все зависит от количества и расстояния. Если у тебя будет около 400 RTD на расстояниях до пары сотен метров, проводку к которым провели и эксплуатируют не второй десяток лет - то твоя точка зрения может и поменяться. smile.gif
Сергей К
Вот и я начал мучать эту AD7792. Естественно измерить сопротивление 100 Омного резистора (по 3х проводной схеме из документации) не вышло. Микросхема выдает 0x0 sad.gif
Для проверки, попробовал прочитать CONFIGURATION REGISTER. получилось 0x0710, как и должно быть после сброса. (после сброса это и читалось!)

Только что перенастроил м/с для измерения температуры через внутрений датчик. Получил 0х350С. Положил на нее палец, показания возросли до 0x359A. В документации я не нашел, как это пересчитать в температуру (там указанно, что в этом случае делитель переключается к 1:1 и подключается внутрений источник опорного напряжения - сколько вольт?)

Если предположить, что опорное = половина от питания, то при +23 градусах выходит 0x00ED (если однополярное) или 0x80F6 (если двухполярное). Но и то и то далекое от того, что я получаю sad.gif

Инициализацию провожу следующим образом:
Код
//Сброс
Посылаю: FF FF FF FF
delay_ms(255); //Пауза

//IO REG
SendSPI(0b00101000,8); //28h
SendSPI(0b00000010,8); //02h  

//Config REG
SendSPI(0b00010000,8);  // 10h
SendSPI(0b0001010100010000,16); //1510h
......
//Далее в цикле запускаю одиночное преобразование и считываю результат

//Mode REG
SendSPI(0b00001000,8); //08h
SendSPI(0b0010000000001001,16); //2009h  

//Жду 0,5 сек
delay_ms(255);delay_ms(255);

//Читаю данные
//DATA REG
SendSPI(0b01011000,8); //58h
Val=ReadSPI(16);

За битом RDY не наблюдаю (т.к. пока это конструктивно-отладочно сложно), но вместо 250 мс даю на преобразование 500 мс.

Также попробовал замерять напряжение на измеряемом сопротивлении и на опорном. Везде 0В, но осцилографа нету. При одиночных преобразованиях источники тока в паузах отключаются sad.gif
попробую запустить непрерывное.... также на измеряемом сопротивлении и на опорном 0В (по мультиметру).
.....
Кажется я забыл заземлить вывод "ref-" sad.gif
ОНО! Это ж нужн было, при перерисовке схемы забыть заземление sad.gif
Теперь все работает. Полученное значение с АЦП отличается от расчетного менее, чем на 0,9% (это с учетом погрешности китайских мультиметров и без самокалибровки микросхемы).

Спасибо за внимание. Вопрос закрыт smile.gif
Сергей К
1. Но вот вопрос с измерением температуры кристалла остался. Как пересчитать код в температуру?

2. Есть ли хитрости, при работе с одиночным преобразованием? Если я ее делаю, (т.е. запускаю преобразование и затем, через 1 сек, считываю результат, то он всегда 0х0000). При непрерывном преобразовании все в порядке.
SeregaB
Цитата(Сергей К @ Nov 6 2008, 16:19) *
1. Но вот вопрос с измерением температуры кристалла остался. Как пересчитать код в температуру?

В разделе SPECIFICATIONS
TEMPERATURE SENSOR Sensitivity 0.81 mV/°C typ
Сергей К
Спасибо. Но эту цифру я видел, но зато теперь нашел, что Vref=1.17В smile.gif
Насколько я понял, получается следующее:
GAIN=1 раз
Vref=1.17 В
AIN=23*0,81*10^-3 В
Code=(2^16 * 23*0,81*10^-3 * 1) / 1.17=1044=0x0414 (для однополярного)
или
Code=2^15 [(23*0,81*10^-3 * 1) / 1.17) +1]=33290=0x820A (для двухполярного)
но это очень далеко от моего 0х350С (примерно +23) и 0x359A (после прогрева пальцем) sad.gif
firstvald
бЛИН, заложил 7793 и уже начал раскаиваться. Пока не удается получить работу в режиме одиночного преобразования. То, что написано в доках не работает. Фактически, вы не можете, запустив однократное преобразование, прочитать результат, выждав время с запасом на преобразование, вы получите 0. Что происходит фактически: после окончания однократного преобразования есть маленькое временное окно, в течении которого надо успеть прочитать результат преобразования, если постоянно смотреть регистр статуса, то это удается, если не смотреть, то скорее всего, получите 0. Если посмотреть состояние регистра статуса в режиме однократного преобразования, то видно, что там продолжаются какие-то процессы уходящие в бесконечность. Видно в автомате который ацп управляет что то недоработано и он пока сырой и скорее всего таким и останется до снятия кристалла.
DVF
Ну, вот, а я в следующей разработке хотел использовать 7793 в двухканальном режиме.
yanvasiij
Люди, столкнулся с такой проблемой на ad7792: при опциях фильтра FS FS2 FS1 FS0, когда в FS0=1 микросхема не выдает результат преобразования (пин DIN не опускается по окончанию преобразования). А, при всех значениях когда FS0=0 работает отлично. Есть идеи?
Lanselot
Всем привет! Хочу использовать этот АЦП для своей задачи: измерить постоянное напряжение в диапазоне от 0 до 50мВ с шагом 0,1 мВ. Вопрос в следуйщем: пойдет ли такой АЦП для реализации задачи, или порекомендуете что-то другое?
Ruslan1
Цитата(yanvasiij @ Oct 15 2013, 16:08) *
Люди, столкнулся с такой проблемой на ad7792: при опциях фильтра FS FS2 FS1 FS0, когда в FS0=1 микросхема не выдает результат преобразования (пин DIN не опускается по окончанию преобразования). А, при всех значениях когда FS0=0 работает отлично. Есть идеи?

В консерватории что-то подправить. АЦП не виноват.
у меня совершенно нормально работает с установками, где все FS в "1":
Код
#define TC_MODE                0b0010000001001111
#define TC_CONFIG            0b0101010010010000
#define TC_IO                        0b00000000
#define TC_MODE_CALIBR_ZS     0b1000000001001111
#define TC_MODE_CALIBR_FS     0b1010000001001111


Цитата(Lanselot @ Oct 24 2013, 20:41) *
Всем привет! Хочу использовать этот АЦП для своей задачи: измерить постоянное напряжение в диапазоне от 0 до 50мВ с шагом 0,1 мВ. Вопрос в следуйщем: пойдет ли такой АЦП для реализации задачи, или порекомендуете что-то другое?

Вы забыли указать нужную Вам частоту выборок и точность измерений.
Если данный АЦП успевает и удовлетворяет, то конечно он такое потянет.
Но Вам также, может быть, подойдет практически любой АЦП, имеющий внутри усилитель и разрядность не меньше чем 9 бит. Может и проще этого чего найдете (дешевле, удобопаяльнее, доставабельнее....)
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.