Расширение аналоговых входов для Arduino

adc

Мне нужно, чтобы Arduino считывал около 100 аналоговых входов. Это вообще выполнимо? Если нет, то каков максимальный аналоговый вход, который я могу прочитать в Arduino (максимум нетривиально было бы использовать аналоговые контакты, которые уже есть на плате).

Но могу ли я расширить их? Спасибо!!

, 👍1

Обсуждение

Вы знаете, что для сканирования 100 входных данных потребуется довольно много времени, не так ли? Время означает что-то около 10-20 мс для всего сбора, но в любом случае вы получите низкую частоту дискретизации, @frarugi87

Не могли бы вы подсказать, для чего вам это нужно? 100 аналоговых входов кажутся чрезмерными. Наличие, например, 100 датчиков, вероятно, также приведет к другим проблемам, таким как питание. Возможно, существует более простой способ выполнить то, что вы хотите, без 100 аналоговых входов., @Gerben

Возрождение старой темы и нарушение этикета, но я также ищу решения, и мне было бы интересно увидеть код Фрэнка Маккаллинга (если он все еще рядом)., @Monty

Используйте банк 8-канальных АЦП с интерфейсом SPI. Время дискретизации может быть намного быстрее, чем у внутреннего АЦП. http://ww1.microchip.com/downloads/en/DeviceDoc/21298e.pdf с частотой 2 МГц и 24 часами для чтения и ответа преобразование может быть выполнено за 12 часов. Всего 100 входов можно выполнить всего за несколько мс, если у вас есть хороший код цикла для прохождения через 8 входов на 13 микросхемах., @CrossRoads

о считывании нескольких датчиков температуры всего с помощью 1 контакта arduino используйте DS18B20. Они работают в паралелле., @user72488


3 ответа


6

Есть два способа сделать то, что вы хотите:

  1. Добавьте больше каналов АЦП
  2. Мультиплексируйте существующие каналы АЦП

Микросхемы АЦП SPI или I2C легко доступны в различных разрешениях, скоростях дискретизации и количестве каналов. Они довольно просты для добавления в любой Arduino.

Например, MCP3208 выдаст 8 каналов с 12-разрядным разрешением на SPI, что означает 3 вывода (MOSI/MISO/SCK) + 1 на чип (SS). Таким образом, 1 чип будет состоять из 4 контактов, 2 чипов 5 контактов, 3 чипов 6 контактов и т. Д.

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

Микросхемы I2C может быть сложнее иметь их много, так как на шине I2C есть только ограниченное количество адресов. Кроме того, на многих шинах Arduino I2C также является двумя аналоговыми контактами, которыми вы, возможно, не захотите жертвовать.

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

Третий вариант, который вы, вероятно, не рассматривали, заключается в том, чтобы иметь несколько микроконтроллеров ардуино (или других недорогих микроконтроллеров), каждый из которых выполняет некоторую выборку, а затем реализует какой-либо способ связи между ними (или с одним ведущим устройством). Это имеет дополнительное преимущество, заключающееся в том, что в этом случае можно одновременно пробовать несколько каналов (по одному на микроконтроллер), несколько ускоряя вашу работу.

,

7

Расширяя часть ответа Майенко, вы можете использовать аналоговый мультиплексор, такой как 74HC4051, чтобы превратить один аналоговый порт в 8.

Analog multiplexer

Его двоюродный брат, 74HC4067, будет мультиплексировать 16 портов. Теперь с 6 аналоговыми входами на Arduino Uno у вас может быть 6 x 16 входов = 96. Сигналы управления A/B/C могут быть распараллелены.

Это позволит вам обрабатывать 96 входов всего с 6 дополнительными чипами и довольно простым кодом. У меня есть примеры кода на моей странице о мультиплексоре / демультиплексоре74HC4051.

Для 8 входов код выглядит следующим образом:

// Пример использования мультиплексора/демультиплексора 74HC4051

// Автор: Ник Гэммон
// Дата: 14 марта 2013

const byte sensor = A0;  // где подключен вход/выход мультиплексора

// линии выбора адреса мультиплексора (A/B/C)
const byte addressA = 6; // младший бит
const byte addressB = 5;
const byte addressC = 4; // старший бит

void setup ()
  {
  Serial.begin (115200);
  Serial.println ("Starting multiplexer test ...");
  pinMode (addressA, OUTPUT); 
  pinMode (addressB, OUTPUT); 
  pinMode (addressC, OUTPUT); 
  }  // end of setup

int readSensor (const byte which)
  {
  // выберите правильный канал MUX
  digitalWrite (addressA, (which & 1) ? HIGH : LOW);  // младший бит
  digitalWrite (addressB, (which & 2) ? HIGH : LOW);
  digitalWrite (addressC, (which & 4) ? HIGH : LOW);  // старший бит
  // теперь прочитайте
  return analogRead (sensor);
  }  // end of readSensor

void loop ()
  {
  // show all 8 sensor readings
  for (byte i = 0; i < 7; i++)
    {
    Serial.print ("Sensor ");
    Serial.print (i);
    Serial.print (" reads: ");
    Serial.println (readSensor (i));
    }
  delay (1000);
  }  // end of loop
,

1

Я точно работал с той же проблемой. Мне нужна программа, которая считывает 100 термисторов...Зачем? что ж, иногда тебе это нужно.

Я вроде как уже закончил с этим.

Я попробовал мультиплексор / демультиплексор 74HC4051. Но по какой-то причине я не получил желаемого результата.

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

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

Если вы все еще заинтересованы, я могу выслать вам исходный код для master и slaves. С помощью этого шаблона вы можете подключить до 50 arduino, и мастер будет искать каждый arduino, подключенный к сети, и запрашивать данные.

С уважением

,