Jump to content

    
АндрейЦ

Подскажите по работе с АЦП AD7124

Recommended Posts

Всем день добрый,

Подскажите как правильно настроить регистры этого АЦП.

Проблема в том, что при считывании регистров данных его выход DOUT/RDY всегда поднимается в единицу.

Соответственно ничего кроме 0хffffff не считывается. Остальные регистры нормально читаются-пишутся.

Сброс пачкой единиц делаю. Внутренний опорник включаю, входы и к внутреннему термодатчику подключал и к земле притягивал.

Похоже я просто не понимаю как правильно запустить преобразование.

 

 

 

Share this post


Link to post
Share on other sites

Кажется что то таки заработало.

Но заработало странно.

Измеряем сопротивление резистора. Схема ратиометрическая, опорный резистор 1К.

Запитываю током 1ма, усиление 8. Настройки фильтров не трогал.

Внешний резистор 82 Ом.

Получаем с АЦП гуляющие 0xA7D7.  Младший байт не учитываю.

Как то таки престранно.

Edited by АндрейЦ

Share this post


Link to post
Share on other sites
4 часа назад, АндрейЦ сказал:

Получаем с АЦП гуляющие 0xA7D7

Добрый день!

Что значит "гуляющие"? Самое очевидное: вы режим SPI (0, 1, 2, 3) правильно выбрали?

Выложите, пожалуйста, код иницилазиции своего АЦП, а также код запуска преобразования и вычитывание результата.

 

Share this post


Link to post
Share on other sites
5 hours ago, MrBearManul said:

Добрый день!

Что значит "гуляющие"? Самое очевидное: вы режим SPI (0, 1, 2, 3) правильно выбрали?

Выложите, пожалуйста, код иницилазиции своего АЦП, а также код запуска преобразования и вычитывание результата.
 

Логично, вдруг у меня там один разряд дрожит, а я возмущаюсь. )))

В десятичном виде считывается вот такое вот нечто, слабо зависящее от номинала внешнего резистора:
          44214
          44204
          44211
          44214
          44206
          44205
          44206
          44196

С SPI всё более менее нормально. Да и АЦП только в режиме 3 работает, так что если остальные регистры читаются - пишутся, я надеюсь что настройки

правильные.

Вот основная программа

Spoiler

sbit adc_cs at RD7_bit;
 sbit tr2 at RG3_bit;
 sbit red_led at RE3_bit;


 char i;
 long n;
 int ReadL, ReadH, ReadM;
 char  buffer[15];
 int sensors[74];
 short spi_buffer;
 #include "ad7124.c"
 #include "mux.c"

 void main() {
/////////////////////////////
TRISD.F7 = 0; // AD7124 SS
////////////////////////////
 TRISE.F3 = 0; //RED LED
 ANSELG.F2 = 0;
 ANSELD = 0x00;
///////////////////////////
 TRISG.F3 = 0; //T/R_2
////////////////////////////
TRISB.F0 = 0;  //mux en
TRISB.F1 = 0;  //mux a0
TRISB.F2 = 0;  //mux a1
TRISA.F6 = 0;  //mux a2
TRISC.F5 = 0;  //mux a3
/////////////////////////////
////////////////////////////
ANSELB.F0 = 0;  //mux en
ANSELB.F1 = 0;  //mux a0
ANSELB.F2 = 0;  //mux a1
ANSELA.F6 = 0;  //mux a2
//ANSELC.F5 = 0;  //mux a3
/////////////////////////////
   UART2_Init(9600);
   SPI2_Init_Advanced(_SPI_MASTER_OSC_DIV64, _SPI_DATA_SAMPLE_MIDDLE, _SPI_CLK_IDLE_HIGH, _SPI_LOW_2_HIGH);


   delay_ms(1000);
   tr2 = 1;
   UART2_Write_Text("Hello world!");
   UART2_Write(13);
   UART2_Write(10);
   delay_ms(50);
   tr2 = 0;
   ad7124Reset();
   ad7124Init();
   mux_init();
   while (1) {
 
  get_temp();
  n = ReadM | (ReadH << 8);

  sprintf(buffer, "%15u", n);
   tr2 = 1;
   UART2_Write_Text(buffer);
   UART2_Write(13);
   UART2_Write(10);
   delay_ms(80);
   tr2 = 0;

   red_led = 0;
    delay_ms(20);
   red_led = 1;
    delay_ms(1000);
    LATE.F3 = 1;
   }
}

Вот работа с АЦП
 

Spoiler


///////////////////////////////////////////////////////////
void ad7124Reset(){
short adc_reset;
adc_cs = 0;
for (adc_reset = 0; adc_reset < 15; adc_reset++){
  SPI2_Write(0xff);
 }
adc_cs = 1;
delay_ms(2);
}
//////////////////////////////////////////////////////////
void ad7124Init(){
adc_cs = 0;
SPI2_Write(1);  //adc control register
SPI2_Write(0x00);
SPI2_Write(0xC0);
adc_cs = 1;
delay_ms(2);
/////////////////
adc_cs = 0;
SPI2_Write(9);  //adc channel 0 register
SPI2_Write(0x83);
SPI2_Write(0x17);
adc_cs = 1;
delay_ms(2);
////////////////
adc_cs = 0;
SPI2_Write(0x19);  //conf register 0
SPI2_Write(1);
SPI2_Write(0xE3);
adc_cs = 1;
delay_ms(2);
//////////////
adc_cs = 0;
SPI2_Write(3);  //control 1 register
SPI2_Write(0x00);
SPI2_Write(6);
SPI2_Write(13);
adc_cs = 1;
delay_ms(2);


}
//////////////////////////////////////////////////////////
void ad7124Ident() {
adc_cs = 0;
SPI2_Write(69);
ReadL = SPI2_Read(spi_buffer);
adc_cs = 1;
ReadH = 0x00;
ReadM = 0x00;
}
/////////////////////////////////////////////////////////
void get_temp() {
adc_cs = 0;
SPI2_Write(66);
ReadH = SPI2_Read(spi_buffer);
ReadM = SPI2_Read(spi_buffer);
ReadL = SPI2_Read(spi_buffer);
adc_cs = 1;
}

Измеряемый резистор подключен между цепью RIN1 и RET. RIN1 это 13 входной канал, туда же вдувается 1 миллиампер тока.

 

Уточнение. Опорный резистор R1. Параллельно ему нарисованная батарея из десятка резисторов не установлена.

Резистор R4 замкнут. REF- сидит на земле напрямую.

 

Снимок.JPG

Edited by АндрейЦ

Share this post


Link to post
Share on other sites
4 часа назад, АндрейЦ сказал:

REF- сидит на земле напрямую

Это не будет работать. Тем более, ещё и буфер включён — с ним требуется отступ от общего на 200 мВ, т.е. и R1 тоже на этот отступ.

Share this post


Link to post
Share on other sites

Это работает на достаточно существенном количестве устройств. Работает оно и на этой плате тоже.

Мои нынешние ковыряния - попытка решить малыми силами одну допущенную организационную глупость - исчезновение прогриммиста вместе с исходниками.

Дабы сильно не вдаваться в офтоп скажу, что R4 - резистор 0805, между площадками которого проведена дорожка.

Именно с целью выполнения озвученных условий. Но никто и никогда эту дорожку так и не разрезал и резистор не впаял.

Хотя это тоже ещё одна органицационная глупость.

 

Но за хорошую мысль спасибо, буферизацию отключить попробую.

 

Edited by АндрейЦ

Share this post


Link to post
Share on other sites
54 минуты назад, АндрейЦ сказал:
1 час назад, Plain сказал:

Это не будет работать

Это работает

Это слова не мои, а производителя. И без буфера опорного входа такая относительная схема будет вообще показывать погоду в Африке.

Share this post


Link to post
Share on other sites
13 minutes ago, Plain said:

Это слова не мои, а производителя. И без буфера опорного входа такая относительная схема будет вообще показывать погоду в Африке.

Реальность такова, что "эталонная" прошивка, исходников к которой нет, измеряет сопротивление подключенного магазина сопротивлений с точностью до десятых

долей ома на уровне 100 ом. Может и с большей, но "снаружи" доступны только десятые. Естественно, с предварительной калибровкой соединительных проводов и мультиплексоров. Большей точности не требуется.

В другом приборе, но уже с 3х/4х проводкой измеряется до сотых.

Share this post


Link to post
Share on other sites
15 hours ago, АндрейЦ said:

опорный резистор 1К.

Запитываю током 1ма, усиление 8. Настройки фильтров не трогал.

Внешний резистор 82 Ом.

Получаем с АЦП гуляющие 0xA7D7.  Младший байт не учитываю.

Как то таки престранно.

 

Там случайно упора в питание не получается? 1к*1ма*8=8 В ??? Режим биполярный?

Если усиление 1 выставить и попробовать реакцию на сопротивление резистора? 

Share this post


Link to post
Share on other sites
14 minutes ago, Tolyaha said:

Там случайно упора в питание не получается? 1к*1ма*8=8 В ??? Режим биполярный?

Если усиление 1 выставить и попробовать реакцию на сопротивление резистора? 

Нет, 1К это опора. Измеряемый - 82Ом .

Т.е 1К* 1мА = 1В и 82*8*1 = около 0.7  с проводами и причими паразитами.

Share this post


Link to post
Share on other sites
7 hours ago, АндрейЦ said:

/////////////////
adc_cs = 0;
SPI2_Write(9);  //adc channel 0 register
SPI2_Write(0x83);
SPI2_Write(0x17);
adc_cs = 1;
delay_ms(2);

Я правильно понял? в регистр CHANNEL_0 пишется 0x8317? что соответствует коммутатору АЦП:

AINM=10111=(IOVDD − DGND)/6−; AINP= 11000=(ALDO − AVSS)/6+

надо AINM=00111 = AIN7; AINP= 01101 = AIN13

 

Остальное не проверял. Чтобы легче было у аналога есть библиотечка под это АЦП на сайте, чтобы по докам биты не искать.

Сюда

Share this post


Link to post
Share on other sites
1 hour ago, Tolyaha said:

Остальное не проверял. Чтобы легче было у аналога есть библиотечка под это АЦП на сайте, чтобы по докам биты не искать.

Сюда

... как же хорошо, что я задал этот вопрос в разделе для начинающих )

В даташите рагистры описаны в порядке от MSB к LSB. В этом же порядке я и шлю их в АЦП.

А надо то LSB первым слать. Мда. В общем перепроверю еще раз и поменяю порядок байт в словных посылках.

Забавно, что источник тока включился на нужный вход АЦП. Цепочка из резисторов запитана. Это я промерил сразу.

 

 

Share this post


Link to post
Share on other sites

Таки я записывал регистры в правильном порядке.

Пересчитал я внимательнее битики в регистрах, поотключал буферизацию, подключил магазин сопротивлений

и получил вот такую вот картину:

           4009
           4010
           4009
           4009
           4009
           4016
           4016
           4015
           4015
           4015
           4016

Это десятичное значение двух регистров данных(без младшего байта)

для случая, когда на магазине выставлено 0.00 Ом и 0.01 Ом. А так да, на проводах и внешних мультиплексорах набегает прилично.

Двухпроводка, что с неё взять )

Всем принявшим участие большое спасибо.

 

 

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.