АндрейЦ 0 Posted December 1, 2020 · Report post Всем день добрый, Подскажите как правильно настроить регистры этого АЦП. Проблема в том, что при считывании регистров данных его выход DOUT/RDY всегда поднимается в единицу. Соответственно ничего кроме 0хffffff не считывается. Остальные регистры нормально читаются-пишутся. Сброс пачкой единиц делаю. Внутренний опорник включаю, входы и к внутреннему термодатчику подключал и к земле притягивал. Похоже я просто не понимаю как правильно запустить преобразование. Quote Ответить с цитированием Share this post Link to post Share on other sites
АндрейЦ 0 Posted December 1, 2020 (edited) · Report post Кажется что то таки заработало. Но заработало странно. Измеряем сопротивление резистора. Схема ратиометрическая, опорный резистор 1К. Запитываю током 1ма, усиление 8. Настройки фильтров не трогал. Внешний резистор 82 Ом. Получаем с АЦП гуляющие 0xA7D7. Младший байт не учитываю. Как то таки престранно. Edited December 1, 2020 by АндрейЦ Quote Ответить с цитированием Share this post Link to post Share on other sites
MrBearManul 0 Posted December 2, 2020 · Report post 4 часа назад, АндрейЦ сказал: Получаем с АЦП гуляющие 0xA7D7 Добрый день! Что значит "гуляющие"? Самое очевидное: вы режим SPI (0, 1, 2, 3) правильно выбрали? Выложите, пожалуйста, код иницилазиции своего АЦП, а также код запуска преобразования и вычитывание результата. Quote Ответить с цитированием Share this post Link to post Share on other sites
Plain 0 Posted December 2, 2020 · Report post ...а также схему. Quote Ответить с цитированием Share this post Link to post Share on other sites
АндрейЦ 0 Posted December 2, 2020 (edited) · Report post 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- сидит на земле напрямую. Edited December 2, 2020 by АндрейЦ Quote Ответить с цитированием Share this post Link to post Share on other sites
Plain 0 Posted December 2, 2020 · Report post 4 часа назад, АндрейЦ сказал: REF- сидит на земле напрямую Это не будет работать. Тем более, ещё и буфер включён — с ним требуется отступ от общего на 200 мВ, т.е. и R1 тоже на этот отступ. Quote Ответить с цитированием Share this post Link to post Share on other sites
АндрейЦ 0 Posted December 2, 2020 (edited) · Report post Это работает на достаточно существенном количестве устройств. Работает оно и на этой плате тоже. Мои нынешние ковыряния - попытка решить малыми силами одну допущенную организационную глупость - исчезновение прогриммиста вместе с исходниками. Дабы сильно не вдаваться в офтоп скажу, что R4 - резистор 0805, между площадками которого проведена дорожка. Именно с целью выполнения озвученных условий. Но никто и никогда эту дорожку так и не разрезал и резистор не впаял. Хотя это тоже ещё одна органицационная глупость. Но за хорошую мысль спасибо, буферизацию отключить попробую. Edited December 2, 2020 by АндрейЦ Quote Ответить с цитированием Share this post Link to post Share on other sites
Plain 0 Posted December 2, 2020 · Report post 54 минуты назад, АндрейЦ сказал: 1 час назад, Plain сказал: Это не будет работать Это работает Это слова не мои, а производителя. И без буфера опорного входа такая относительная схема будет вообще показывать погоду в Африке. Quote Ответить с цитированием Share this post Link to post Share on other sites
АндрейЦ 0 Posted December 2, 2020 · Report post 13 minutes ago, Plain said: Это слова не мои, а производителя. И без буфера опорного входа такая относительная схема будет вообще показывать погоду в Африке. Реальность такова, что "эталонная" прошивка, исходников к которой нет, измеряет сопротивление подключенного магазина сопротивлений с точностью до десятых долей ома на уровне 100 ом. Может и с большей, но "снаружи" доступны только десятые. Естественно, с предварительной калибровкой соединительных проводов и мультиплексоров. Большей точности не требуется. В другом приборе, но уже с 3х/4х проводкой измеряется до сотых. Quote Ответить с цитированием Share this post Link to post Share on other sites
Tolyaha 0 Posted December 2, 2020 · Report post 15 hours ago, АндрейЦ said: опорный резистор 1К. Запитываю током 1ма, усиление 8. Настройки фильтров не трогал. Внешний резистор 82 Ом. Получаем с АЦП гуляющие 0xA7D7. Младший байт не учитываю. Как то таки престранно. Там случайно упора в питание не получается? 1к*1ма*8=8 В ??? Режим биполярный? Если усиление 1 выставить и попробовать реакцию на сопротивление резистора? Quote Ответить с цитированием Share this post Link to post Share on other sites
АндрейЦ 0 Posted December 2, 2020 · Report post 14 minutes ago, Tolyaha said: Там случайно упора в питание не получается? 1к*1ма*8=8 В ??? Режим биполярный? Если усиление 1 выставить и попробовать реакцию на сопротивление резистора? Нет, 1К это опора. Измеряемый - 82Ом . Т.е 1К* 1мА = 1В и 82*8*1 = около 0.7 с проводами и причими паразитами. Quote Ответить с цитированием Share this post Link to post Share on other sites
Tolyaha 0 Posted December 2, 2020 · Report post Так если 82 ом закоротить 0 получается? Может вообще не тот канал читаете? Quote Ответить с цитированием Share this post Link to post Share on other sites
Tolyaha 0 Posted December 2, 2020 · Report post 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 Остальное не проверял. Чтобы легче было у аналога есть библиотечка под это АЦП на сайте, чтобы по докам биты не искать. Сюда Quote Ответить с цитированием Share this post Link to post Share on other sites
АндрейЦ 0 Posted December 2, 2020 · Report post 1 hour ago, Tolyaha said: Остальное не проверял. Чтобы легче было у аналога есть библиотечка под это АЦП на сайте, чтобы по докам биты не искать. Сюда ... как же хорошо, что я задал этот вопрос в разделе для начинающих ) В даташите рагистры описаны в порядке от MSB к LSB. В этом же порядке я и шлю их в АЦП. А надо то LSB первым слать. Мда. В общем перепроверю еще раз и поменяю порядок байт в словных посылках. Забавно, что источник тока включился на нужный вход АЦП. Цепочка из резисторов запитана. Это я промерил сразу. Quote Ответить с цитированием Share this post Link to post Share on other sites
АндрейЦ 0 Posted December 2, 2020 · Report post Таки я записывал регистры в правильном порядке. Пересчитал я внимательнее битики в регистрах, поотключал буферизацию, подключил магазин сопротивлений и получил вот такую вот картину: 4009 4010 4009 4009 4009 4016 4016 4015 4015 4015 4016 Это десятичное значение двух регистров данных(без младшего байта) для случая, когда на магазине выставлено 0.00 Ом и 0.01 Ом. А так да, на проводах и внешних мультиплексорах набегает прилично. Двухпроводка, что с неё взять ) Всем принявшим участие большое спасибо. Quote Ответить с цитированием Share this post Link to post Share on other sites