Проблемы с мультиплексором 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);
}
@Victor Casado, 👍-1
Обсуждение3 ответа
Внимательно изучите библиотеку, которую вы используете для чтения POT. Большинству HW и / или SW потребуется много показаний и усилителей. усреднить их, чтобы устранить случайность и повысить точность аппаратного обеспечения АЦП. Возможно, ваша установка настолько шумная, что ПО компенсирует это, усредняя еще больше показаний. Снимаю шляпу перед разработчиком ПО, предусмотрительно адаптировавшим код к более шумным ситуациям. Если это правда, и вы считаете, что слишком много автоматизации, помните, что вы используете платформу Arduino, где библиотеки разработаны так, чтобы упростить работу за счет абстрагирования (скрытия) деталей оборудования.
для чтения горшка я использую стандартную функцию AnalogRead(), не могли бы вы дать мне больше информации о том, что вы говорите, пожалуйста, интересно проанализировать, @Victor Casado
Помните, что библиотеки переписываются для каждого отдельного процессора. Какой исходный код вы смотрите, зависит от процессора. Смысл библиотек в том, чтобы абстрагировать различия каждого процессора, чтобы код Arduino не менялся или не сильно менялся при переносе на разные платформы (процессоры)., @st2000
Некоторые вещи выглядят странно:
Зачем делать это каждый раз? Вам нужно настроить их только один раз в 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. Обратите внимание, что ВОО Инструкция может использоваться для переключения одного бита в порту.
Вы можете изменить beginT и endT
// тестовое подчиненное устройство SPI n=1
SPI.beginTransaction(1, SPISettings(30000000, MSBFIRST, SPI_MODE2));
SPI.transfer(00001111);
SPI.endTransaction(1);
- Как использовать SPI на Arduino?
- Путаница между SPI и I2C для SSD1306 OLED
- Неправильная документация для выводов Mega2560 SPI?
- Взаимодействие с датчиком SSI?
- Ответ нескольких ведомых устройств (Arduino Mega 2560) через SPI
- SPI с преобразователем уровня на другом конце соединения
- Проблема с выводом MISO в SPI
- Можно ли прочитать несколько кнопок с помощью CD74HC4067?
Вы должны удалить мультиплексор из цепи, чтобы увидеть, не является ли он виновником. (Полагаю, что нет.) Я бы попробовал подключить 1 потенциометр напрямую к контакту аналогового входа и посмотреть, медленно ли регистрируются результаты., @Duncan C
Кстати, почему вы каждый раз выдаете команды SPI для выбора определенного банка, хотя в своем тесте вы каждый раз читаете один и тот же банк?, @Duncan C
@DuncanC без MUX читается правильно; Потому что вы должны выбрать, какой канал MUX вы хотите прочитать через SPI. И теперь я читаю только один, потому что я хочу прочитать только один банк, чтобы проверить, правильно ли он работает, и когда он у меня работает правильно, я добавлю остальные 31., @Victor Casado
Потенциометры какого номинала (Ом) вы используете?, @Gerben
@Гербен 10кОм, @Victor Casado
Используете ли вы линейные конические горшки? Или аудио/логарифмические потенциометры?, @CrossRoads
@CrossRoads линейный, @Victor Casado