Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите разобраться с АЦП ADS1216
Форум разработчиков электроники ELECTRONIX.ru > Аналоговая и цифровая техника, прикладная электроника > Метрология, датчики, измерительная техника
Dimk
Связь с МК PIC18F4320 по SPI. Добился чтения и записи регистров АЦП. НУжна помощь в стартовой инициализации..калибровке..
GetSmart
Стартовая инициализация и есть прописывание всех 16-ти (или 10-ти первых) регистров. Для калибровки нужно просто отправить команду как указано в даташите (проще, чем читать/писать регистры). Важно!! Не убирать ~CS до передачи последнего бита любой посылки с паузой хотя бы в пару таких же бит, иначе последний байт может не прописаться.

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

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

PS. Даташит написан коряво, обнаружил несколько косяков..в частности про чтении 1 регистра, АЦП выплевывает 2 байта вместо одного, где 1ый байт - мусор..а 2ой - данные читаемого регистра...
GetSmart
Я делал всё согласно даташиту и у меня всё работает так как описано.

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

Попробуйте перед командой калибровки передать команду DSYNC (0xFC)
Dimk
Да, конечно. а Вы делали автокалибровку после записи первых регистров (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;
GetSmart
Всё понятно.
~CS нужно дрыгать перед передачей команды. SELFCAL - команда. Где там дрыг CS ?

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

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

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

Я точно не уверен, но имхо команда будет принята/активирована только после перехода CS в 1.
Dimk
Косяяяяяк!! krapula.gif спасибо, щас попробую..а про паузу..да я уж не знал что делать, думал времени ему маловато мб на автокалибр
Dimk
какой Вы кварц использовали для АЦП?
GetSmart
4,9 mHz
Dimk
Все равно не получается. У вас остался фрагмент кода инициализации АЦП..взглянуть бы..
GetSmart
У меня на LPC213x

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


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

Я регистры прописываю все разом (10 или 16) за одну команду.
Dimk
все перепроверил..регистры пишутся нормально, читаются тоже. Ощущение, что калибровка вообще не работает..из FSR1,2,3 (регистры 14-16) читаются дефолтные значения..
GetSmart
Типичная функция обмена с 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 почти одно и то же. Протокол одинаковый.
Dimk
Запись работает нормально у меня,пользуюсь встроенной в компилятор библиотекой SPI и SPI ногами МК, АЦП команды понимает..все, кроме автокалибровки))) а что если принудительно записать в регистры калибровки что-нибудь..

А про косяк, благодарю..Сейчас еще перепроверю и погрызу даташит..
GetSmart
Цитата(Dimk @ Feb 1 2012, 17:30) *
Запись работает нормально у меня,пользуюсь встроенной в компилятор библиотекой SPI и SPI ногами МК, АЦП команды понимает..все, кроме автокалибровки))) а что если принудительно записать в регистры калибровки что-нибудь..

Они доступны для записи, без проблем. Я их в определённые моменты и считываю, запоминая, и потом переписываю при смене PGA. На работу АЦП и проблемы с калибровкой запись/чтение этих регистров влиять не должно.

Кстати, автокалибровка обновляет 6 регистров и эти значения жёстко привязаны к значению PGA. Канал можно дрыгать без проблем не переделывая калибровку, а PGA если сменить, то без перекалибровки АЦП будет врать. И при смене внутренней/внешней опоры то же.
Dimk
ага, это я в даташите тоже видел..мне б сейчас хотябы получить хоть что-нибудь на выходе АЦП..про правильность показаний пока молчу)
GetSmart
А как на счёт стробов DRDY без калибровки? То есть сразу после записи 16/10 регистров DRDY дёргается?

На всякий случай предлагаю поставить команду DSYNC и следом за ней RREG (без чтения регистров) после перезаписи регистров.
Dimk
я вот чего тревогу и забил то..DRDY всегда в 1..что бы я не делал.

Цитата
На всякий случай предлагаю поставить команду DSYNC и следом за ней RREG (без чтения регистров) после перезаписи регистров.

щас попробую

С DI/O проверил..получил +5 В на всех выходах DIO.пробовал DSYNC посылать и RREG. DRDY все равно в 1. сейчас попробую DSYNC с ноги МК завести и прогнать еще раз.
GetSmart
PWDN и RESET в состоянии лог 1 ?
Кварц точно генерит?

И ещё. DRDY попробуйте читать программно из 9-ого регистра.
Dimk
Еще раз перепроверил схему..оказалось, что я ранее завел DSYNC на ногу МК, но не придал этому значения..после того, как после калибровки сделал сброс DSYNC ногой МК, DRDY упал и пошли байты данных. Я очень рад, спасибо тебе за помощь!!

PS теперь чтение регистров и данных идет без мусора..как описано в даташите..
GetSmart
Цитата(Dimk @ Feb 2 2012, 17:35) *
Еще раз перепроверил схему..оказалось, что я ранее завел DSYNC на ногу МК, но не придал этому значения..

Я так понимаю, ранее на этой ноге проц держал всегда 0 ?
Dimk
да. теперь другой вопрос стоит. DRDY падает, все нормально..читаю данные периодически по готовности DRDY, читается одно значение..какието единицы в мл. разрядах..и не меняется это значение..в чем дело, непойму)
GetSmart
Ну судя по тем значениям регистров там мультиплексор настроен на измерение внутреннего температурного диода. Либо греть чип, либо ставить мультиплексор на внешний вход, на который подавать напругу.
Dimk
то было давно. я отключил этот темп. датчик, подавал на вход мультиплексора REF( предварительно настроив регистр MUX на нужные мне ноги)..не видит он ничего..
Dimk
после тщательной проверки печатной платы выяснилось, что нога REF+ АЦП не пропаялась...вот это косяк, блин. исправили и все заработало. Большое спасибо за оказанную помощь! моя первая тема на форуме и сразу ответ! Отличный форум!!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.