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