|
AD7792+AVR, Помогите начинающему драйверами на ассемблере |
|
|
|
Mar 24 2007, 15:03
|
Группа: Новичок
Сообщений: 2
Регистрация: 24-03-07
Пользователь №: 26 472

|
Помогите драйверами.
|
|
|
|
|
Mar 26 2007, 09:18
|

Местный
  
Группа: Свой
Сообщений: 345
Регистрация: 10-10-05
Пользователь №: 9 459

|
Цитата AD7792 вполне можно подключить к АВР, используя аппаратный SPI. Например, для непрерывного чтения посылаете 0х5С, ждёте RDY, посылаете 0х00 три раза, получая взамен 24-битный код из АЦП. AD7792 это 16 бит (24бит у 7793). Тут же вопросик по интерфейсу. Подскажите пожалуста так ли делать инициализацию(reset)?: После включения подаем на ~CS "0", а потом на DIN "1", и после этого 32 такта на клок? И в каких случаях он (reset) вообще нужен? Как сообщить(какую команду) МС о начале преобразования? Заранее спасибо за ответы!
--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
|
|
|
|
|
Mar 27 2007, 16:16
|
Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 22-03-07
Из: Novosibirsk
Пользователь №: 26 415

|
Использовал AD7793 + ТСП100 + ATmega64 для измерения температуры. Поскольку без ОС, обошелся несколькими функциями на Си. Всё стандартно, глюков не наблюдалось. Разве что у AD7793 источники тока согласованы не достаточно (3%), IMHO, чтобы использовать приведенную трехпроводную схему. Вернее, эталонное сопротивление уже можно брать любой точности  , т.к. ток ч/з него не будет равен удвоенному току ч/з терморезистор.
|
|
|
|
|
Mar 27 2007, 17:31
|
Частый гость
 
Группа: Участник
Сообщений: 99
Регистрация: 22-03-07
Из: Novosibirsk
Пользователь №: 26 415

|
У 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; } Удачи!
|
|
|
|
|
Apr 5 2007, 10:23
|
Гуру
     
Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025

|
Цитата(SergeiCh @ Mar 27 2007, 15:16)  Использовал 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 имеет неслабый входной ток, но зато малый дрейф этого тока. У меня например все равно есть калибровка после монтажа, так что я эту величину учитываю. В принципе, можно наверное и дрейф тока учесть (термометр-то внутри есть), но это уже чересчур.
|
|
|
|
|
Apr 9 2007, 14:25
|
Знающий
   
Группа: Свой
Сообщений: 961
Регистрация: 28-11-05
Пользователь №: 11 489

|
Цитата(Ruslan1 @ Apr 5 2007, 11:23)  Вообще не понимаю, зачем брать 16-битный АЦП и считать равными генераторы тока, которые могут разойтись на 5%.  И не 5%, а ±0.5% typ Matching between IEXC1 and IEXC2; VOUT = 0V А 5% это Initial Tolerance at 25°C, что вообщем-то не влияет на результат измерения. А зачем 3-х проводная схема подключения RTD, если найти кабель с двумя витыми парами внутри никаких проблем нет, тот же UTP-5.
--------------------
В действительности всё не так, как на самом деле.
|
|
|
|
|
Oct 30 2008, 08:11
|
Участник

Группа: Новичок
Сообщений: 24
Регистрация: 18-09-08
Из: Киев
Пользователь №: 40 317

|
Вот и я начал мучать эту 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% (это с учетом погрешности китайских мультиметров и без самокалибровки микросхемы). Спасибо за внимание. Вопрос закрыт
Сообщение отредактировал Сергей К - Oct 30 2008, 09:01
|
|
|
|
|
Nov 6 2008, 13:19
|
Участник

Группа: Новичок
Сообщений: 24
Регистрация: 18-09-08
Из: Киев
Пользователь №: 40 317

|
1. Но вот вопрос с измерением температуры кристалла остался. Как пересчитать код в температуру?
2. Есть ли хитрости, при работе с одиночным преобразованием? Если я ее делаю, (т.е. запускаю преобразование и затем, через 1 сек, считываю результат, то он всегда 0х0000). При непрерывном преобразовании все в порядке.
|
|
|
|
|
Nov 10 2008, 09:03
|
Участник

Группа: Свой
Сообщений: 55
Регистрация: 6-04-06
Из: Москва, Зеленоград
Пользователь №: 15 863

|
Цитата(Сергей К @ Nov 6 2008, 16:19)  1. Но вот вопрос с измерением температуры кристалла остался. Как пересчитать код в температуру? В разделе SPECIFICATIONS TEMPERATURE SENSOR Sensitivity 0.81 mV/°C typ
|
|
|
|
|
Nov 13 2008, 14:02
|
Участник

Группа: Новичок
Сообщений: 24
Регистрация: 18-09-08
Из: Киев
Пользователь №: 40 317

|
Спасибо. Но эту цифру я видел, но зато теперь нашел, что 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 (после прогрева пальцем)
Сообщение отредактировал Сергей К - Nov 13 2008, 14:34
|
|
|
|
|
Jun 13 2010, 08:21
|

Знающий
   
Группа: Свой
Сообщений: 580
Регистрация: 3-06-08
Пользователь №: 38 041

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