Перейти к содержанию
    

Помогите драйверами.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

AD7792 это 16 бит (24бит у 7793).

Тут же вопросик по интерфейсу. Подскажите пожалуста так ли делать инициализацию(reset)?: После включения подаем на ~CS "0", а потом на DIN "1", и после этого 32 такта на клок? И в каких случаях он (reset) вообще нужен? Как сообщить(какую команду) МС о начале преобразования? Заранее спасибо за ответы!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Datashit читать пробовал? Я думаю там есть все ответы на твои вопросы. Готовый драйвер вряд ли найдешь, да там несколько строк на Си. Я тоже собрался использовать AD7792 только до драйвера доберусь на следующей неделе, не раньше.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использовал AD7793 + ТСП100 + ATmega64 для измерения температуры. Поскольку без ОС, обошелся несколькими функциями на Си. Всё стандартно, глюков не наблюдалось.

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Может есть кто мог бы про инициализацию AD7792/93 расказать?

SergeiCh если рботали поделитесь пожалуйста инфой. Неужели для одиночного преобразования достаточно послать 0х58 и забрать данные?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У 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;
}

 

Удачи!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Использовал AD7793 + ТСП100 + ATmega64 для измерения температуры. Поскольку без ОС, обошелся несколькими функциями на Си. Всё стандартно, глюков не наблюдалось.

 

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

Совершенно согласен.

Вообще не понимаю, зачем брать 16-битный АЦП и считать равными генераторы тока, которые могут разойтись на 5%. :)

Я несколько иначе сделал входную схему:

 

--- 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 имеет неслабый входной ток, но зато малый дрейф этого тока. У меня например все равно есть калибровка после монтажа, так что я эту величину учитываю. В принципе, можно наверное и дрейф тока учесть (термометр-то внутри есть), но это уже чересчур. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вообще не понимаю, зачем брать 16-битный АЦП и считать равными генераторы тока, которые могут разойтись на 5%. :)

 

И не 5%, а ±0.5% typ Matching between IEXC1 and IEXC2; VOUT = 0V

А 5% это Initial Tolerance at 25°C, что вообщем-то не влияет на результат измерения.

А зачем 3-х проводная схема подключения RTD, если найти кабель с двумя витыми парами внутри никаких проблем нет, тот же UTP-5.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И не 5%, а ±0.5% typ Matching between IEXC1 and IEXC2; VOUT = 0V

А 5% это Initial Tolerance at 25°C, что вообщем-то не влияет на результат измерения.

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

 

А зачем 3-х проводная схема подключения RTD, если найти кабель с двумя витыми парами внутри никаких проблем нет, тот же UTP-5.

Все зависит от количества и расстояния. Если у тебя будет около 400 RTD на расстояниях до пары сотен метров, проводку к которым провели и эксплуатируют не второй десяток лет - то твоя точка зрения может и поменяться. :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вот и я начал мучать эту AD7792. Естественно измерить сопротивление 100 Омного резистора (по 3х проводной схеме из документации) не вышло. Микросхема выдает 0x0 :(

Для проверки, попробовал прочитать CONFIGURATION REGISTER. получилось 0x0710, как и должно быть после сброса. (после сброса это и читалось!)

 

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

 

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

 

Инициализацию провожу следующим образом:

 //Сброс
Посылаю: 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В, но осцилографа нету. При одиночных преобразованиях источники тока в паузах отключаются :(

попробую запустить непрерывное.... также на измеряемом сопротивлении и на опорном 0В (по мультиметру).

.....

Кажется я забыл заземлить вывод "ref-" :(

ОНО! Это ж нужн было, при перерисовке схемы забыть заземление :(

Теперь все работает. Полученное значение с АЦП отличается от расчетного менее, чем на 0,9% (это с учетом погрешности китайских мультиметров и без самокалибровки микросхемы).

 

Спасибо за внимание. Вопрос закрыт :)

Изменено пользователем Сергей К

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Но вот вопрос с измерением температуры кристалла остался. Как пересчитать код в температуру?

 

2. Есть ли хитрости, при работе с одиночным преобразованием? Если я ее делаю, (т.е. запускаю преобразование и затем, через 1 сек, считываю результат, то он всегда 0х0000). При непрерывном преобразовании все в порядке.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Но вот вопрос с измерением температуры кристалла остался. Как пересчитать код в температуру?

В разделе SPECIFICATIONS

TEMPERATURE SENSOR Sensitivity 0.81 mV/°C typ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо. Но эту цифру я видел, но зато теперь нашел, что Vref=1.17В :)

Насколько я понял, получается следующее:

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 (после прогрева пальцем) :(

Изменено пользователем Сергей К

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

бЛИН, заложил 7793 и уже начал раскаиваться. Пока не удается получить работу в режиме одиночного преобразования. То, что написано в доках не работает. Фактически, вы не можете, запустив однократное преобразование, прочитать результат, выждав время с запасом на преобразование, вы получите 0. Что происходит фактически: после окончания однократного преобразования есть маленькое временное окно, в течении которого надо успеть прочитать результат преобразования, если постоянно смотреть регистр статуса, то это удается, если не смотреть, то скорее всего, получите 0. Если посмотреть состояние регистра статуса в режиме однократного преобразования, то видно, что там продолжаются какие-то процессы уходящие в бесконечность. Видно в автомате который ацп управляет что то недоработано и он пока сырой и скорее всего таким и останется до снятия кристалла.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...