Проблемы с мультиплексором SPI Arduino

Я хочу использовать 32-канальный мультиплексор ADG731 для считывания 32 потенциометров, я все подключил, и он работает, но работает не так быстро, как хотелось бы.

Проблема в том, что если я поворачиваю потенциометр в диапазоне от 10 до 90 % от оборота, аналоговые показания будут такими медленными, например, если у меня потенциометр на 0, а я поворачиваю его на 50 %, он идет так медленно, пока не достигнет значения 512 (как эффект гистерезиса), НО, если я поверну потенциометр обратно на 0 или до 1023, показания будут такими же быстрыми, как я и ожидал.

Поэтому в резюме он медленно считывает значения, кроме значений краев.

Это мой код (я настроил его для считывания только одного потенциометра на выводе S16, чтобы проверить, как работает ADG731:

#include <SPI.h>

void loadDrain(void);
const int slaveSelectPin = 53;
void setup() {
  pinMode(slaveSelectPin, OUTPUT);
  SPI.begin();
  Serial.begin(9600);
}

void loop() {
  loadDrain();
}

void loadDrain(){
  SPI.beginTransaction(SPISettings(30000000, MSBFIRST, SPI_MODE2));
  digitalWrite(slaveSelectPin, LOW);
  SPI.transfer(00001111);
  digitalWrite(slaveSelectPin, HIGH);
  SPI.endTransaction();
  Serial.println(analogRead(A0) >> 3);
}

, 👍-1

Обсуждение

Вы должны удалить мультиплексор из цепи, чтобы увидеть, не является ли он виновником. (Полагаю, что нет.) Я бы попробовал подключить 1 потенциометр напрямую к контакту аналогового входа и посмотреть, медленно ли регистрируются результаты., @Duncan C

Кстати, почему вы каждый раз выдаете команды SPI для выбора определенного банка, хотя в своем тесте вы каждый раз читаете один и тот же банк?, @Duncan C

@DuncanC без MUX читается правильно; Потому что вы должны выбрать, какой канал MUX вы хотите прочитать через SPI. И теперь я читаю только один, потому что я хочу прочитать только один банк, чтобы проверить, правильно ли он работает, и когда он у меня работает правильно, я добавлю остальные 31., @Victor Casado

Потенциометры какого номинала (Ом) вы используете?, @Gerben

@Гербен 10кОм, @Victor Casado

Используете ли вы линейные конические горшки? Или аудио/логарифмические потенциометры?, @CrossRoads

@CrossRoads линейный, @Victor Casado


3 ответа


1

Внимательно изучите библиотеку, которую вы используете для чтения POT. Большинству HW и / или SW потребуется много показаний и усилителей. усреднить их, чтобы устранить случайность и повысить точность аппаратного обеспечения АЦП. Возможно, ваша установка настолько шумная, что ПО компенсирует это, усредняя еще больше показаний. Снимаю шляпу перед разработчиком ПО, предусмотрительно адаптировавшим код к более шумным ситуациям. Если это правда, и вы считаете, что слишком много автоматизации, помните, что вы используете платформу Arduino, где библиотеки разработаны так, чтобы упростить работу за счет абстрагирования (скрытия) деталей оборудования.

,

для чтения горшка я использую стандартную функцию AnalogRead(), не могли бы вы дать мне больше информации о том, что вы говорите, пожалуйста, интересно проанализировать, @Victor Casado

Помните, что библиотеки переписываются для каждого отдельного процессора. Какой исходный код вы смотрите, зависит от процессора. Смысл библиотек в том, чтобы абстрагировать различия каждого процессора, чтобы код Arduino не менялся или не сильно менялся при переносе на разные платформы (процессоры)., @st2000


0

Некоторые вещи выглядят странно:

Зачем делать это каждый раз? Вам нужно настроить их только один раз в setup():

SPI.beginTransaction(SPISettings(30000000, MSBFIRST, SPI_MODE2));

Большинство 16-мегагерцовых плат Arduino, включая Mega, которую вы используете, не будут работать на 3-мегагерцовой частоте, можно выбрать 8-мегагерцовую, 4-мегагерцовую, 2-мегагерцовую, 1-мегагерцовую и еще 3 или 4 более медленные скорости.

Похоже, чип поддерживает более высокие скорости, 8 МГц должно работать:

fSCLK: макс. 30 МГц Частота цикла SCLK

Поэтому запустите его быстрее, чтобы то же самое вовремя.

Зачем брать 10-битное чтение и уменьшать его до 7?

Serial.println(analogRead(A0) >> 3);

Вы можете ускорить чтение, выполняя 8-битное чтение вместо 10-битного, и использовать более высокую последовательную скорость, до 115 200, для отправки результатов.

Вместо digitalWrite() для управления контактом slaveSelect вы можете использовать прямую манипуляцию с портом для переключения этого контакта. Вы можете записать 1 в порт ввода, чтобы переключить выходной бит. Из таблицы данных Atmega2560:

Переключение контакта

Запись логической единицы в PINxn изменяет значение PORTxn независимо от значения DDRxn. Обратите внимание, что ВОО Инструкция может использоваться для переключения одного бита в порту.

,

0

Вы можете изменить beginT и endT // тестовое подчиненное устройство SPI n=1
SPI.beginTransaction(1, SPISettings(30000000, MSBFIRST, SPI_MODE2)); SPI.transfer(00001111); SPI.endTransaction(1);

,