Перейти к содержанию
    

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

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

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

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

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

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

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

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

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

Изменено пользователем АндрейЦ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, АндрейЦ сказал:

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

Добрый день!

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

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

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Изменено пользователем АндрейЦ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

4 часа назад, АндрейЦ сказал:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

 

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

 

Изменено пользователем АндрейЦ

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

54 минуты назад, АндрейЦ сказал:
1 час назад, Plain сказал:

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

Это работает

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

13 minutes ago, Plain said:

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

15 hours ago, АндрейЦ said:

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

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

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

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

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

 

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

14 minutes ago, Tolyaha said:

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

Сюда

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 hour ago, Tolyaha said:

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

Сюда

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

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

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

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

           4009
           4010
           4009
           4009
           4009
           4016
           4016
           4015
           4015
           4015
           4016

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

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

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

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

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...