По этому вопросу
У меня нет опыта работы в области электроники, и это одна из моих первых проблем с общением через 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 мс.
Как мне этого добиться?
Я старался изо всех сил описывать желаемый результат и то, что я пробовал, но я знаю, что это нелегко читать.
Не могли бы вы дать мне совет о том, как позволить всем АЦП выполнять параллельную выборку, а затем читать с них, не мешая?