|
Помогите разобраться с АЦП ADS1216, Глючит, не хочет инициализироваться |
|
|
2 страниц
1 2 >
|
 |
Ответов
(1 - 26)
|
Feb 1 2012, 07:19
|
.
     
Группа: Участник
Сообщений: 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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Feb 1 2012, 07:47
|
Участник

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

|
Спасибо за ответ. Калибровку смещения и усиления (6 последних регистов) я так и делал, как Вы и сказали, командой самокалибровки SELFCAL. но после проведения калибровки сигнал DRDY так и висит в 1...хотя в даташите пишут что при окончании калибровки должен упасть в 0. Может я что то упустил, непойму.
PS. Даташит написан коряво, обнаружил несколько косяков..в частности про чтении 1 регистра, АЦП выплевывает 2 байта вместо одного, где 1ый байт - мусор..а 2ой - данные читаемого регистра...
|
|
|
|
|
Feb 1 2012, 09:14
|
Участник

Группа: Участник
Сообщений: 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
|
|
|
|
|
Feb 1 2012, 09:26
|
Участник

Группа: Участник
Сообщений: 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;
|
|
|
|
|
Feb 1 2012, 09:32
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Всё понятно. ~CS нужно дрыгать перед передачей команды. SELFCAL - команда. Где там дрыг CS ? Если я правильно понимаю, каждая строка WrReg(...) тоже отправляет команду 0x50. И перед ней тоже нужно дрыгать CS. Код delay_ms(500); Cs=1; - это что, пауза в пару бит?  Я точно не уверен, но имхо команда будет принята/активирована только после перехода CS в 1.
Сообщение отредактировал GetSmart - Feb 1 2012, 09:46
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Feb 1 2012, 09:32
|
Участник

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

|
Косяяяяяк!!  спасибо, щас попробую..а про паузу..да я уж не знал что делать, думал времени ему маловато мб на автокалибр
Сообщение отредактировал Dimk - Feb 1 2012, 09:33
|
|
|
|
|
Feb 1 2012, 10:32
|
Участник

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

|
какой Вы кварц использовали для АЦП?
|
|
|
|
|
Feb 1 2012, 11:56
|
Участник

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

|
Все равно не получается. У вас остался фрагмент кода инициализации АЦП..взглянуть бы..
|
|
|
|
|
Feb 1 2012, 12:17
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
У меня на LPC213x Начальное состояние регистров, которые я прописываю Код 0x18,0x00,0x01,0x00,0x00,0x00,0xff,0xff,0x80,0x21 На самом деле прописываются регистры или нет можно выяснить прописыванием регистра DOUT (толи 6 то ли 7) предворительно установив DIR. Я регистры прописываю все разом (10 или 16) за одну команду.
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Feb 1 2012, 12:20
|
Участник

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

|
все перепроверил..регистры пишутся нормально, читаются тоже. Ощущение, что калибровка вообще не работает..из FSR1,2,3 (регистры 14-16) читаются дефолтные значения..
Сообщение отредактировал Dimk - Feb 1 2012, 12:22
|
|
|
|
|
Feb 1 2012, 12:27
|
.
     
Группа: Участник
Сообщений: 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
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Feb 1 2012, 12:30
|
Участник

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

|
Запись работает нормально у меня,пользуюсь встроенной в компилятор библиотекой SPI и SPI ногами МК, АЦП команды понимает..все, кроме автокалибровки))) а что если принудительно записать в регистры калибровки что-нибудь..
А про косяк, благодарю..Сейчас еще перепроверю и погрызу даташит..
Сообщение отредактировал Dimk - Feb 1 2012, 12:33
|
|
|
|
|
Feb 1 2012, 12:34
|
.
     
Группа: Участник
Сообщений: 4 005
Регистрация: 3-05-06
Из: Россия
Пользователь №: 16 753

|
Цитата(Dimk @ Feb 1 2012, 17:30)  Запись работает нормально у меня,пользуюсь встроенной в компилятор библиотекой SPI и SPI ногами МК, АЦП команды понимает..все, кроме автокалибровки))) а что если принудительно записать в регистры калибровки что-нибудь.. Они доступны для записи, без проблем. Я их в определённые моменты и считываю, запоминая, и потом переписываю при смене PGA. На работу АЦП и проблемы с калибровкой запись/чтение этих регистров влиять не должно. Кстати, автокалибровка обновляет 6 регистров и эти значения жёстко привязаны к значению PGA. Канал можно дрыгать без проблем не переделывая калибровку, а PGA если сменить, то без перекалибровки АЦП будет врать. И при смене внутренней/внешней опоры то же.
Сообщение отредактировал GetSmart - Feb 1 2012, 12:42
--------------------
Заблуждаться - Ваше законное право :-)
|
|
|
|
|
Feb 1 2012, 12:41
|
Участник

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

|
ага, это я в даташите тоже видел..мне б сейчас хотябы получить хоть что-нибудь на выходе АЦП..про правильность показаний пока молчу)
|
|
|
|
|
Feb 1 2012, 13:15
|
Участник

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

|
я вот чего тревогу и забил то..DRDY всегда в 1..что бы я не делал. Цитата На всякий случай предлагаю поставить команду DSYNC и следом за ней RREG (без чтения регистров) после перезаписи регистров. щас попробую С DI/O проверил..получил +5 В на всех выходах DIO.пробовал DSYNC посылать и RREG. DRDY все равно в 1. сейчас попробую DSYNC с ноги МК завести и прогнать еще раз.
Сообщение отредактировал Dimk - Feb 1 2012, 12:49
|
|
|
|
|
Feb 2 2012, 14:07
|
Участник

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

|
да. теперь другой вопрос стоит. DRDY падает, все нормально..читаю данные периодически по готовности DRDY, читается одно значение..какието единицы в мл. разрядах..и не меняется это значение..в чем дело, непойму)
|
|
|
|
|
Feb 2 2012, 16:14
|
Участник

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

|
то было давно. я отключил этот темп. датчик, подавал на вход мультиплексора REF( предварительно настроив регистр MUX на нужные мне ноги)..не видит он ничего..
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|