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

 
 
> Помогите разобраться с АЦП ADS1216, Глючит, не хочет инициализироваться
Dimk
сообщение Feb 1 2012, 06:15
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 31-01-12
Пользователь №: 69 989



Связь с МК PIC18F4320 по SPI. Добился чтения и записи регистров АЦП. НУжна помощь в стартовой инициализации..калибровке..
Go to the top of the page
 
+Quote Post
2 страниц V   1 2 >  
Start new topic
Ответов (1 - 14)
GetSmart
сообщение Feb 1 2012, 07:19
Сообщение #2


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Стартовая инициализация и есть прописывание всех 16-ти (или 10-ти первых) регистров. Для калибровки нужно просто отправить команду как указано в даташите (проще, чем читать/писать регистры). Важно!! Не убирать ~CS до передачи последнего бита любой посылки с паузой хотя бы в пару таких же бит, иначе последний байт может не прописаться.

Чтобы стартануть синхронно с чем-то нужно передать команду DSYNC, а за ней любую другую, например RREG (без чтения регистров вообще для большей скорости). Далее АЦП будет работать в безостановочном режиме, периодически выдавая ~DRDY. Если стоит фильтр Sinc3, то корректные данные появятся через 3 (идеально чистые данные через 4, если канал сменился) строба DRDY. При каждом сигнале ~DRDY нужно давать команду RDATA на чтение 24 бит данных (хз обязательно или нет, но у меня так делается).

После команды DSYNC возможен досрочный строб ~DRDY в течение 1 мс после команды. Его нужно пропускать не засчитывая в те 3.

Сообщение отредактировал GetSmart - Feb 1 2012, 12:31


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Dimk
сообщение Feb 1 2012, 07:47
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 31-01-12
Пользователь №: 69 989



Спасибо за ответ. Калибровку смещения и усиления (6 последних регистов) я так и делал, как Вы и сказали, командой самокалибровки SELFCAL. но после проведения калибровки сигнал DRDY так и висит в 1...хотя в даташите пишут что при окончании калибровки должен упасть в 0. Может я что то упустил, непойму.

PS. Даташит написан коряво, обнаружил несколько косяков..в частности про чтении 1 регистра, АЦП выплевывает 2 байта вместо одного, где 1ый байт - мусор..а 2ой - данные читаемого регистра...
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 1 2012, 08:38
Сообщение #4


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Я делал всё согласно даташиту и у меня всё работает так как описано.

Сразу после команды SELFCAL DRDY Установится в 1. Далее, через 7 периодов оцифровки (у меня период = 20 мс (50 гц)) появится 0-строб на DRDY. Всегда (!) при появлении строба DRDY нужно вычитывать RDAT. Далее нужно ничего не делать. Через ещё 7 периодов появится второй строб DRDY. Аппаратно обновятся последние 6 регистров и АЦП начнёт само оцифровывать заданный канал в непрерывном режиме, периодически выдавая строб на DRDY. Главное - установить правильно делитель модулятора (DEC0 & M/DEC1) - регистры 8 и 9.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Dimk
сообщение Feb 1 2012, 09:14
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 31-01-12
Пользователь №: 69 989



В том то и дело, что 0 строб на DRDY не появляется после автокалибровки, висит в 1 после калибровки. Не сказал..я включил встроенный темп. датчик ( WrReg(1,0xFF), хотел с него данные почитать для начала.. регистры вот что пишу:

WrReg(0,0x0C);
WrReg(1,0xFF);
WrReg(0x02,0x00);
WrReg(0x03,0x00);
WrReg(0x04,0x00);
WrReg(0x05,0x00);
WrReg(0x06,0x00);
WrReg(0x07,0x00);
WrReg(0x08,0x3b);
WrReg(0x09,0x31); //sinc3 фильтр
WrByte(0xF0); // автокалибровка

Сообщение отредактировал Dimk - Feb 1 2012, 09:19
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 1 2012, 09:17
Сообщение #6


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



~CS-ом дёргаете после каждой команды?

Попробуйте перед командой калибровки передать команду DSYNC (0xFC)

Сообщение отредактировал GetSmart - Feb 1 2012, 09:24


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Dimk
сообщение Feb 1 2012, 09:26
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 31-01-12
Пользователь №: 69 989



Да, конечно. а Вы делали автокалибровку после записи первых регистров (SETUP, MUX) или перед записью первых..?

Cs=1;
delay_ms(1);

// LCDClear();
cs=0;
delay_us(15);
WrReg(0,0x0C);
WrReg(1,0xFF);
WrReg(0x02,0x00);
WrReg(0x03,0x00);
WrReg(0x04,0x00);
WrReg(0x05,0x00);
WrReg(0x06,0x00);
WrReg(0x07,0x00);
WrReg(0x08,0x3b);
WrReg(0x09,0x31); //
//delay_us(10);
WrByte(0xF0); //
delay_ms(500);
Cs=1;
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 1 2012, 09:32
Сообщение #8


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Всё понятно.
~CS нужно дрыгать перед передачей команды. SELFCAL - команда. Где там дрыг CS ?

Если я правильно понимаю, каждая строка WrReg(...) тоже отправляет команду 0x50. И перед ней тоже нужно дрыгать CS.

Код
delay_ms(500);
Cs=1;

- это что, пауза в пару бит? sm.gif

Я точно не уверен, но имхо команда будет принята/активирована только после перехода CS в 1.

Сообщение отредактировал GetSmart - Feb 1 2012, 09:46


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Dimk
сообщение Feb 1 2012, 09:32
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 31-01-12
Пользователь №: 69 989



Косяяяяяк!! krapula.gif спасибо, щас попробую..а про паузу..да я уж не знал что делать, думал времени ему маловато мб на автокалибр

Сообщение отредактировал Dimk - Feb 1 2012, 09:33
Go to the top of the page
 
+Quote Post
Dimk
сообщение Feb 1 2012, 10:32
Сообщение #10


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 31-01-12
Пользователь №: 69 989



какой Вы кварц использовали для АЦП?
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 1 2012, 10:37
Сообщение #11


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



4,9 mHz


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Dimk
сообщение Feb 1 2012, 11:56
Сообщение #12


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 31-01-12
Пользователь №: 69 989



Все равно не получается. У вас остался фрагмент кода инициализации АЦП..взглянуть бы..
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 1 2012, 12:17
Сообщение #13


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



У меня на LPC213x

Начальное состояние регистров, которые я прописываю
Код
0x18,0x00,0x01,0x00,0x00,0x00,0xff,0xff,0x80,0x21


На самом деле прописываются регистры или нет можно выяснить прописыванием регистра DOUT (толи 6 то ли 7) предворительно установив DIR.

Я регистры прописываю все разом (10 или 16) за одну команду.


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post
Dimk
сообщение Feb 1 2012, 12:20
Сообщение #14


Участник
*

Группа: Участник
Сообщений: 16
Регистрация: 31-01-12
Пользователь №: 69 989



все перепроверил..регистры пишутся нормально, читаются тоже. Ощущение, что калибровка вообще не работает..из FSR1,2,3 (регистры 14-16) читаются дефолтные значения..

Сообщение отредактировал Dimk - Feb 1 2012, 12:22
Go to the top of the page
 
+Quote Post
GetSmart
сообщение Feb 1 2012, 12:27
Сообщение #15


.
******

Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753



Типичная функция обмена с ADS1216
Код
static void WRITE_ADS1218(uInt cmd, uInt cnt, const u08 *ptr)
{
    ON_CS_ADS1218;
    txByteSPI(cmd);
    if (cnt)
    { rxtxByteSPI(cnt-1);
      while (cnt--)
        rxtxByteSPI(*ptr++);
    }
    rxtxByteSPI(-1);                        // ожидание конца передачи байта
    WAIT(_16Tosc);
    OFF_CS_ADS1218;
    if (cmd != ads_RREG)  WAIT(_16Tosc); // ads_RREG = холостая команда
}
...
    WRITE_ADS1218(ads_WREG+0, len, &ADS_buf[0]);
    WRITE_ADS1218(ads_DSYNC,0,0);
    READ_ADS1218(ads_RREG+0, len, &ADS_readed[0]);
    if (cmd != ads_RREG)  WRITE_ADS1218(cmd,0,0);     // здесь может быть команда калибровки


Но функции работы с SPI у меня в каком-то смысле нестандартные. rxtxByteSPI - сначала ждёт готовности, потом читает принятый байт из SPDR, потом передаёт новый байт и выходит. Если аргумент -1, то всё то же, но без передачи байта. Так я выжимал максимум быстродействия без пауз между передачей байт.

Цитата(Dimk @ Feb 1 2012, 17:20) *
все перепроверил..регистры пишутся нормально, читаются тоже. Ощущение, что калибровка вообще не работает..из FSR1,2,3 (регистры 14-16) читаются дефолтные значения..

ИМХО косяк в проге или схеме. У меня за время общения с этой штукой были косяки в которых я подозревал чип, но в итоге оказывалось косяки были в другом месте.

ADS1216 и ADS1218 почти одно и то же. Протокол одинаковый.

Сообщение отредактировал GetSmart - Feb 1 2012, 12:58


--------------------
Заблуждаться - Ваше законное право :-)
Go to the top of the page
 
+Quote Post

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

 


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


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