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

Halfback

Участник
  • Постов

    424
  • Зарегистрирован

  • Посещение

Репутация

0 Обычный

Информация о Halfback

  • Звание
    Местный
    Местный

Контакты

  • Сайт
    Array
  • ICQ
    Array

Посетители профиля

4 222 просмотра профиля
  1. Вот так спасибо. Привел CPHA (2 EDGE) и CPOL (High) в соответствие и всё заработало как надо. Ура!
  2. AD779X_Reset(); -> это выплевывание из МК в АЦП 4 раза 0xFF AD779X_HWDetect(); -> это выплевывание из МК в АЦП 0x60 и потом 0x00, где АЦП должен выплюнуть байт с идентификатором.
  3. Хорошо. ВОт осциллограммы SPI Соответствуют коду rrr=AD779X_HWDetect(); rrr=AD779X_HWDetect(); Другими словами первая строчка работает, ответ есть. Вторая не работает, ответ всегда 0. Вот это осциллорамма SCK и SDO Вот это осциллорамма SCK и CS Вот это более подробная осциллорамма SCK и SDO когда данные с АЦП выплевываются. ВОт осциллограммы SPI Соответствуют коду rrr=AD779X_HWDetect(); AD779X_Reset(); rrr=AD779X_HWDetect(); Первая и третья строчка работает если между ними ставить сброс. Осциллорамма SCK и SDO Осциллорамма SCK и CS
  4. Изначально либу на гитхабе писал не индус, я её во многом переработал. Если топик надо перенести в другое место - я не против. Просто в этом же разделе было обсуждение АЦП 7792 но на дркгкю тему, вот и решил разместить тут же.
  5. Всем доброго времени суток! Ситуация такая: подаю питание на АЦП, выдаю софтовый сброс с чипселектом 32 единицы, читаю ID - всё нормально, возвращает 0x4A (с маской 0xF интересно что это именно А) а далее всё, кранты. Допустим читаю это же регистр или другие регистры - возвращает в основном нули. Если перед каждым чтением регистра выдавать софтовый сброс то всё хорошо, все регистры по умолчанию читаются в соответствии с даташитом. Вопрос - что я не так делаю? Т.е. вот так работает, rrr = 0x4A: volatile unsigned short rrr; AD779X_Reset(); HAL_Delay(1); rrr=AD779X_HWDetect(); AD779X_Reset(); HAL_Delay(1); rrr=AD779X_HWDetect(); вот так не работает volatile unsigned short rrr; rrr=AD779X_HWDetect(); HAL_Delay(1); rrr=AD779X_HWDetect(); unsigned char AD779X_HWDetect() { unsigned char result; ADCDevice.CSControl(cssEnable); ADCDevice.TxByte(AD779X_RDR_ID); /* send cmd: read ID register */ m_adc_model = ADCDevice.RxByte(); /* get ID */ ADCDevice.CSControl(cssDisable); return (m_adc_model); } ВТорой день туплю, не понимаю почему так происходит. Что АЦП не нравиться? Почему сброса требует? На осциллографе вроде всё нормально. Когда не работает, SDO АЦП действительно не отвечает.
  6. Спасибо, совет хороший, но в моем случае не применим т.к. в структуре ADCDevice будут поля которые могут меняться.
  7. Вы даже не удосужились понять суть моего вопроса и начали давать "ценные" советы как по SPI работать с АЦП. А если бы это был не АЦП а другое устройство? И не SPI ? Суть вопроса данного топика от этого не поменялась бы никак. Надеюсь понятно пояснил.
  8. В общем всем спасибо за потраченное время. А ларчик то открывался просто. Ведь было же в "ADC.h" объявлено extern tADС_Device ADCDevice; это значит что в main.c можно написать так tAD779X_Device ADCDevice = { .TxByte = SPI_TxByte, .RxByte = SPI_RxByte }; и причем тут потуги на тему как надо работать с АЦП, что необходимость DMA (хотя кто сказал что это какой-нибудь STM32 а не AVR/PIC) и т.д. и т.п.??? совершенно непонятно зачем некоторые товарищи пытались уводить тело вопроса в сторону.
  9. в АЦП есть регистры для конфигурации усиления входа, смещений и т.п. На счет разрядности обращения к АЦП - к сути вопроса это отношения не имеет. при обращении ADCDevice.TxByte(0xA0) реально должна вызываться SPI_TxByte(0xA0) в "ADC.h" объявлен тип tADC_TxByte как указатель на функцию, принимающая в качестве аргумента unsigned char и ничего не возвращающая. Но вот меня клинит на том, где правильно написать что tADC_TxByte = SPI_RxByte;
  10. всем доброго времени суток. с проектом непонятки следующие: 1. Есть АЦП. В него отправляют байты по SPI и также получают. В соответствующем для АЦП h-файле есть записи typedef void (* tADC_TxByte)(unsigned char Data); typedef unsigned char (* tADC_RxByte)(void); typedef struct { tADC_TxByte TxByte; tADC_RxByte RxByte; } tADC_Device; extern tADС_Device ADCDevice; 2. Есть для микроконтроллера файлы SPI.c и SPI.h где определены соответствующие функции для работы с SPI void SPI_TxByte(unsigned char Data); unsigned char SPI_RxByte(void); Так вопрос вот в чем - как правильно привязать обращения типа data[0] = ADCDevice.RxByte() к SPI_RxByte(void); и соответственно ADCDevice.TxByte(0xA0) к SPI_TxByte(0xA0); ??? Есть ли способ увязать не корректируя файлы "ADC.c" и "ADC.h"? Например создать файлик "ext_SPI.h" и правильно его инклудить. Прошу ногами сильно не пинать. Наверное это предновогодний ступор.
  11. потенциал мерить нужно относительно электрода сравнения. Рассматривается AgCl Например в стеклянной или пластиковой емкости с соленой/пресной водой, где рядом погружен электрод сравнения, надо штырем из нержавейки ткнуться в цинковую пластину, расположенную на дне. И померить разность потенциалов с точностью до 1мВ. На первом рисунке, электрод подключается к неинвертирующему входу ОУ. На сколько я понял там нужно применить что-то вроде коаксиала и оплетку коаксиала подключить ко выводу 2 ОУ, центральную жилу к 3 ноге ОУ. Предполагается, для того чтобы эта система работала, в жидкости с электродом оплетка д.б. оголена? Или как это работает? На второй картинке (FIGURE 3) мне не известный электрод сравнения, у которого судя по рисунку 2 вывода. Я ориентируюсь на электрод сравнения ЭСр-10111, у которого 1 вывод.
  12. мысль понятная, только вот я PH не мерю, у которой есть зависимость от температуры жижи. Мне нужна только разность потенциалов между электродами. Кстати, если только к одному электроду подключить Vref через 10 МОм то по идее в соленой и пресной воде потенциалы относительно Vref должны выровняться. И тогда потенциал с электродов спокойно можно подавать на гигаомные/тераомные входы буфера на ОУ, питание которого привязано к общему Vref. Расстояние между электродами всегда постоянно. Что скажете?
  13. если выбирать между наводками и искажением напряжения (разности потенциалов между электродами) то выбираю бороться с наводками, например между инструментальником и АПЦ поставить ФНЧ с постоянной времени сотни миллисекунд. балансировка "нуля" вольтметра планируется при старте девайса, переключением цепей электродов в цепь КЗ. Да и 3-й электрод очень не хотелось бы внедрять хотя бы с конструктивной точки зрения.
  14. технически не понятно. На электрод сравнения предлагается подавать Vref ? Или Vref опускать в воду считай третьим электродом, рядом с двумя другими электродами?
×
×
  • Создать...