MCP3424, как читать каналы параллельно?

9

По этому вопросу

У меня нет опыта работы в области электроники, и это одна из моих первых проблем с общением через I2C и записью в регистр, поэтому, пожалуйста, не принимайте слишком много знаний с моей стороны. Я программирую Arduino.

Отвечая на вопрос о конкретном электронном компоненте / чипе, я предполагаю, что люди не могут экспериментировать / тестировать, чтобы дать мне правильный ответ. Я также ожидаю, что люди даже не будут знать этот компонент. Поэтому я постараюсь добавить много информации в этот вопрос.

Пожалуйста, дайте мне знать, если вам нужна дополнительная информация.

Компонент имеет четыре АЦП

Я использую компонент 4-канальный, MCP3424 ( техническое описание ). Он поставляется в двух упаковках. Я использую MCP3424 E / SL, 4-канальную версию SOIC, а не MCP3422 или MCP3423 2-канальную версию.

Я считаю, что у него есть четыре АЦП. В RS-Online кажется, что версия E / SL имеет 4 АЦП ( прямая связь ), в то время как E / ST имеет только один ( прямая связь ). введите описание изображения здесь

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

Я прав?

Связь через I2C

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

Формат байта конфигурации

введите описание изображения здесь

Интересные из них:

  • третий бит слева, считая от 1: непрерывная выборка
  • бит один и два слева, считая от 1: адрес

Более подробную информацию о байте конфигурации можно найти на странице таблицы данных 18, также изображенной здесь .

Формат результата чтения

Мои примеры будут только с разрешением 18 бит (биты 5 и 6 установлены в 1). Результатом считывания будет четыре байта: первые три, содержащие значение, и четвертый, содержащий байт конфигурации.

Тем не менее, самый левый бит,! RDY, сообщает, является ли значение «новым», т. Е. Является ли это новым показанием с момента последнего считывания. При первом чтении одного результата значение равно 0, а для последующих - 1, пока АЦП не будет готов с новым значением образца.

Как использовать это без выборки параллельно

Я прекрасно знаю, как это сделать. И все примеры, которые я нашел в Интернете, также просты. Просто запишите байт конфигурации в компонент, а затем прочитайте значение обратно.

Как настроить каждый канал для автоматической выборочной выборки и параллельно читать каналы

Псевдокод может быть чем-то вроде

setup():
    start sampling channel 1, 18bit, 0gain, continuously
    start sampling channel 2, 18bit, 0gain, continuously
    start sampling channel 3, 18bit, 4gain, continuously
    start sampling channel 1, 18bit, 2gain, continuously

readADCs():
    // Run every 500ms
    // 18 bit samples take 375ms, so must happen in parallel 
    // to get a new sample for all every 500ms
    read channel 1
    read channel 2
    read channel 3
    read channel 4

Моя лучшая попытка

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

void setup() {

    Wire.write(0b00011100);
    Wire.write(0b01011100);
    Wire.write(0b10011110);
    Wire.write(0b11011101);
}

Тогда как мне читать конкретный канал. Если я просто спрошу у компонента результат, он вернет результат канала в реестре. При вышеописанной настройке я получу показания для канала 4. Но допустим, что я хочу показания из канала 2. В некотором смысле мне просто нужно сказать, что я хочу получить результат для канала 2. Я не хочу попросите его сэмплировать что-нибудь, он должен просто продолжать делать непрерывную выборку, и я просто хочу получить самый последний образец, который он создал во время автоматической выборки.

Ниже моя лучшая догадка

void readADCs() {

    // Channel 1
    // ...

    // Channel 2
    Wire.beginTransmission(104);
    Wire.write(0b01011100); // I hope not to affect, just to select
    Wire.endTransmission();
    Wire.requestFrom(104);
    Wire.read(); // val byte 1
    Wire.read(); // val byte 2
    Wire.read(); // val byte 3
    Wire.read(); // config byte
}

Так что мое лучшее предположение Если я хочу прочитать канал 2, я записываю конфигурационный байт, который в точности совпадает с тем, который я использовал для запуска выборки канала 2.

Однако это не работает. Образец не готов, даже если он имел больше, чем необходимые 375 мс.

Как мне этого добиться?

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

Не могли бы вы дать мне совет о том, как позволить всем АЦП выполнять параллельную выборку, а затем читать с них, не мешая?

Мадс Скьерн
источник
Хорошее начало. Не хватает только ссылки на таблицу данных для MCP3424, которую я добавил.
JRE
MCP3424 поставляется в двух пакетах, а не в версиях, и оба имеют 4 канала. ST это TSSOP, SL это Soic. Существует 2 канала MCP3422, фиксированный адрес, 2 канала MCP3423, настраиваемый адрес и 4 канала MCP3424.
Прохожий
+1 Очень тщательный, хорошо написанный вопрос. К сожалению, этот чип является одним АЦП. Это показано в его техническом описании в «Функциональной блок-схеме». Вы прочитали входные каналы как означающие АЦП. Наличие множества входных каналов позволяет использовать один АЦП для выборки множества различных сигналов (последовательно). АЦП гораздо дороже в изготовлении, чем аналоговый мультиплексор (который выбирает канал), и выборка нескольких сигналов является распространенным требованием. Следовательно, чипы АЦП часто работают таким образом. Энди ака ответил на ваш вопрос, но, возможно, подождите, прежде чем принять, так как вы можете получить больше информации.
gbulmer
Я полагал, что у него было 4 АЦП, потому что RS-Online сказал, что у E / SL было 4, а у E / ST - 1. Я добавил к описанию
Mads Skjern
2
@MadsSkjern игнорировать RS, Microchip и их лист данных является королем. Это ошибка на RS. Ошибки на сайтах дистрибьюторов довольно распространены.
Прохожий

Ответы:

11

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

К сожалению нет. Имеется только один АЦП, и для преобразования более чем одного канала это должно выполняться последовательно путем обращения к внутреннему мультиплексору, таким образом «читая» другой канал. К сожалению, одновременной выборки нет: -

введите описание изображения здесь

Обратите внимание, что входной мультиплексор выбирает ТОЛЬКО один из четырех каналов одновременно. Это довольно распространенный метод, используемый для считывания нескольких каналов, но есть АЦП с одновременной выборкой. Попробуйте взглянуть на линейные технологии, портфолио TI или ADI.

Энди ака
источник
+1, ты победишь меня :-) Возможно, стоит пояснить тот факт, что он довольно часто используется для одного сэмпла АЦП с несколькими каналами, потому что он может сэмплировать разные аналоговые сигналы, что является распространенным случаем.
gbulmer
Кроме того, если требуется низкая частота дискретизации, мультиплексирование / перемежение часто достаточно хорошо
Скотт Сейдман
Потрясающие улучшения, сэр.
gbulmer
@ gbulmer вы слишком добры, сэр!
Энди ака
5

MCP3424 это один АЦП с мультиплексором на переднем конце.

Эта диаграмма из таблицы показывает это довольно четко

MCP3424 Архитектура

Лист данных подтверждает это введением:

4.1 Общий обзор

Устройства MCP3422 / 3/4 представляют собой дифференциальные многоканальные 18-разрядные аналого-цифровые преобразователи Delta-Sigma с последовательным интерфейсом I2C. Устройства содержат мультиплексор выбора входного канала (MUX), программируемый коэффициент усиления усилителя (PGA), ссылку на плате напряжения (2.048V), а внутренний генератор.

Следовательно, вы не можете конвертировать разные каналы действительно одновременно, но вы можете последовательно выбирать каналы с относительно небольшой задержкой между ними.

При использовании устройства необходимо убедиться, что биты адреса I2C стабильны; еще раз, из таблицы:

MCP3423 и MCP3424 имеют два контакта адреса внешнего устройства (Adr1, Adr0). Эти выводы могут быть установлены на высокий логический уровень (или привязан к VDD), низкий (или привязан к VSS) или оставлен плавающим (не подключен ни к чему, или привязан к VDD / 2). Эти комбинации логического уровня используются двумя выводами разрешить восемь возможных адресов. Таблица 5-3 показывает адрес устройства в зависимости от логического состояния контактов выбора адреса. Устройство проверяет логическое состояние контактов Adr0 и Adr1 в следующих событиях:

а. Включение устройства.

б. Общий сброс звонка

(См. Раздел 5.4 «Общий вызов»).

с. General Call Latch

(См. Раздел 5.4 «Общий вызов»).

Устройство проверяет логическое состояние (адресные контакты) во время вышеуказанных событий и фиксирует значения, пока не произойдет новое событие защелки. Во время нормальной работы (после того, как адресные контакты зафиксированы), адресные контакты внутренне отключены от остальной части внутренней цепи.

Рекомендуется выполнить команду «Общий сброс вызова» или «Общая блокировка вызова» один раз после включения устройства. Это будет гарантировать, что устройство считывает адресные контакты в стабильном состоянии, и позволит избежать фиксации битов адреса во время увеличения напряжения питания. Это может привести к неточному определению контактного адреса.

Я бы посоветовал вам следовать этой рекомендации, чтобы убедиться, что вы действительно общаетесь с устройством.

Чтобы прочитать определенный канал, вы должны выбрать канал в регистре конфигурации и начать преобразование. Бит RDY станет низким, когда результат этого преобразования станет доступен в выходном регистре.

Питер Смит
источник