реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> AD7792+AVR, Помогите начинающему драйверами на ассемблере
megaalex
сообщение Mar 24 2007, 15:03
Сообщение #1





Группа: Новичок
Сообщений: 2
Регистрация: 24-03-07
Пользователь №: 26 472



Помогите драйверами.
Go to the top of the page
 
+Quote Post
=GM=
сообщение Mar 24 2007, 16:21
Сообщение #2


Ambidexter
*****

Группа: Свой
Сообщений: 1 589
Регистрация: 22-06-06
Из: Oxford, UK
Пользователь №: 18 282



Цитата(megaalex @ Mar 24 2007, 12:03) *
Помогите драйверами.

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


--------------------
Делай сразу хорошо, плохо само получится
Go to the top of the page
 
+Quote Post
add
сообщение Mar 26 2007, 09:18
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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) вообще нужен? Как сообщить(какую команду) МС о начале преобразования? Заранее спасибо за ответы!


--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
Go to the top of the page
 
+Quote Post
slog
сообщение Mar 26 2007, 13:04
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 961
Регистрация: 28-11-05
Пользователь №: 11 489



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


--------------------
В действительности всё не так, как на самом деле.
Go to the top of the page
 
+Quote Post
SergeiCh
сообщение Mar 27 2007, 16:16
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 99
Регистрация: 22-03-07
Из: Novosibirsk
Пользователь №: 26 415



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

Разве что у AD7793 источники тока согласованы не достаточно (3%), IMHO, чтобы использовать приведенную трехпроводную схему. Вернее, эталонное сопротивление уже можно брать любой точности smile.gif, т.к. ток ч/з него не будет равен удвоенному току ч/з терморезистор.
Go to the top of the page
 
+Quote Post
add
сообщение Mar 27 2007, 16:38
Сообщение #6


Местный
***

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



Может есть кто мог бы про инициализацию AD7792/93 расказать?
SergeiCh если рботали поделитесь пожалуйста инфой. Неужели для одиночного преобразования достаточно послать 0х58 и забрать данные?


--------------------
Если задачу можно решить, то не надо тревожиться. А если нельзя решить, то тревожиться бесполезно.
Go to the top of the page
 
+Quote Post
SergeiCh
сообщение Mar 27 2007, 17:31
Сообщение #7


Частый гость
**

Группа: Участник
Сообщений: 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;
}


Удачи!
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Apr 5 2007, 10:23
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(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
Go to the top of the page
 
+Quote Post
slog
сообщение Apr 9 2007, 14:25
Сообщение #9


Знающий
****

Группа: Свой
Сообщений: 961
Регистрация: 28-11-05
Пользователь №: 11 489



Цитата(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.


--------------------
В действительности всё не так, как на самом деле.
Go to the top of the page
 
+Quote Post
Ruslan1
сообщение Apr 10 2007, 07:44
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 2 360
Регистрация: 6-03-06
Из: Кишинев
Пользователь №: 15 025



Цитата(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
Go to the top of the page
 
+Quote Post
Сергей К
сообщение Oct 30 2008, 08:11
Сообщение #11


Участник
*

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



Вот и я начал мучать эту 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

Сообщение отредактировал Сергей К - Oct 30 2008, 09:01
Go to the top of the page
 
+Quote Post
Сергей К
сообщение Nov 6 2008, 13:19
Сообщение #12


Участник
*

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



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

2. Есть ли хитрости, при работе с одиночным преобразованием? Если я ее делаю, (т.е. запускаю преобразование и затем, через 1 сек, считываю результат, то он всегда 0х0000). При непрерывном преобразовании все в порядке.
Go to the top of the page
 
+Quote Post
SeregaB
сообщение Nov 10 2008, 09:03
Сообщение #13


Участник
*

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



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

В разделе SPECIFICATIONS
TEMPERATURE SENSOR Sensitivity 0.81 mV/°C typ
Go to the top of the page
 
+Quote Post
Сергей К
сообщение Nov 13 2008, 14:02
Сообщение #14


Участник
*

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



Спасибо. Но эту цифру я видел, но зато теперь нашел, что 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

Сообщение отредактировал Сергей К - Nov 13 2008, 14:34
Go to the top of the page
 
+Quote Post
firstvald
сообщение Jun 13 2010, 08:21
Сообщение #15


Знающий
****

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



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

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 9th July 2025 - 18:16
Рейтинг@Mail.ru


Страница сгенерированна за 0.0148 секунд с 7
ELECTRONIX ©2004-2016