Про це питання
У мене немає досвіду інженерної роботи з електронікою, і це одне з моїх перших проблем із спілкуванням через I2C та з записом до реєстру, тому, будь ласка, не приймайте занадто багато знань з моєї сторони. Я програмую Arduino.
На запитання про певний електронний компонент / мікросхему, я припускаю, що люди не можуть експериментувати / тестувати, щоб дати мені правильну відповідь. Я також очікую, що люди навіть не знають цього компонента. Тому я спробую додати багато інформації в це питання.
Будь ласка, повідомте мене, якщо вам потрібна додаткова інформація.
Компонент має чотири АЦП
Я використовую 4-канальний компонент MCP3424 ( таблиця даних ). Він поставляється в двох пакетах. Я використовую MCP3424 E / SL, 4-канальну версію SOIC, а не MCP3422 або 2-канальну MCP3423.
Я вважаю, що він має чотири АЦП. У RS-Online схоже, що версія E / SL має 4 АЦП ( пряме посилання ), тоді як E / ST має лише один ( пряме посилання ).
Я припускаю, що це повинно означати, що він може робити вибірку на кількох каналах одночасно. Я не бачу інших причин ставити більше одного АЦП на компонент.
Чи правий я?
Спілкування через I2C
Комунікація відбувається шляхом надсилання одного байта конфігурації, а потім чекання закінчення вибірки та зчитування результату.
Формат конфігураційного байта
Цікавими є:
- біт три зліва, рахуючи від 1: Безперервне відбір проб
- біт один і два зліва, рахуючи від 1: Адреса
Більш детально про байт config можна знайти на сторінці даних 18, також зображеній тут .
Формат результату читання
Мої приклади будуть лише з 18-бітовою роздільною здатністю (біт 5 і 6 встановлено на 1). Результатом зчитування буде чотири байти: перший три містить значення, а четвертий містить байт config.
Однак самий лівий біт, 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
Моя найкраща спроба
Тож я сподіваюся, що наступне встановлює кожен АЦП для вибірки безперервно. Це код Ардуїно.
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, я записую байт config, який точно такий же, як і те, що я використовував для запуску вибіркового каналу 2.
Однак це не працює. Немає готового зразка, навіть якщо він мав більше необхідних 375 мс.
Як я цього досягти?
Я намагався зробити все можливе, описуючи бажаний результат і те, що намагався, але я знаю, що це не просто прочитати.
Не могли б ви дати мені поради, як дозволити паралельно вибірці всіх АЦП, а потім читати з них, не заважаючи?