По этому вопросу
У меня нет опыта работы в области электроники, и это одна из моих первых проблем с общением через 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 мс.
Как мне этого добиться?
Я старался изо всех сил описывать желаемый результат и то, что я пробовал, но я знаю, что это нелегко читать.
Не могли бы вы дать мне совет о том, как позволить всем АЦП выполнять параллельную выборку, а затем читать с них, не мешая?
Ответы:
К сожалению нет. Имеется только один АЦП, и для преобразования более чем одного канала это должно выполняться последовательно путем обращения к внутреннему мультиплексору, таким образом «читая» другой канал. К сожалению, одновременной выборки нет: -
Обратите внимание, что входной мультиплексор выбирает ТОЛЬКО один из четырех каналов одновременно. Это довольно распространенный метод, используемый для считывания нескольких каналов, но есть АЦП с одновременной выборкой. Попробуйте взглянуть на линейные технологии, портфолио TI или ADI.
источник
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 станет низким, когда результат этого преобразования станет доступен в выходном регистре.
источник