Джойстик считывает ошибочные значения
При нормальной работе значение диапазона АЦП джойстика на моей плате составляет от 0 до 1023 (10 бит). Однако мой график ни для одной из осей не является непрерывным. Скорее всего, существует более одного минимального и максимального значения для обеих осей. Я запускаю этот поток на MSP432P401R, однако код ничем не отличается от Arduino.
int jumpFlag;
int backwardsFlag;
int forwardsFlag;
int selPin = P5_1; //Выберите местоположение цифрового вывода
int xOutPin = A14;
int yOutPin = A13;
void setupPlayerActions() {
pinMode(selPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(selPin),jumpISR,RISING);
//pinMode(xOutPin, ); //Настройка аналогового X-вывода
//pinMode(xOutPin, ); //Настройка аналогового Y-вывода
}
void jumpISR() {
Serial.println("Jump Detected!");
jumpFlag = 1;
}
void loopPlayerActions() {
int x_adc_val, y_adc_val;
int leftThreshold=50,rightThreshold=900;
float x_volt, y_volt;
x_adc_val = analogRead(xOutPin);
y_adc_val = analogRead(yOutPin);
x_volt = ( ( x_adc_val )); /*Convert digital value to voltage */
y_volt = ( ( y_adc_val)); /*Convert digital value to voltage */
if (x_volt < leftThreshold){
Serial.println("Move Backwards");
}
else if (x_volt < rightThreshold){
Serial.println("Move Forwards");
}
Serial.println("X_Voltage = ");
Serial.print(x_volt);
Serial.print("\t");
//Serial.print("Y_Voltage = ");
//Serial.println(y_volt);
delay(100);
//delay(250);
}
График стремится к нулю для всех положительных целых чисел x и y, однако он ненадолго достигает максимума после небольшого значения на осях -x и -y, а затем опускается примерно до ~ 420. Что может быть причиной этого?
@thediyer, 👍0
Обсуждение1 ответ
Лучший ответ:
10-битный АЦП может не иметь 10-битного разрешения для данной выборки. Он может содержать только 5 или 6 бит из-за случайного шума и других факторов. Если вам нужен конкретный номер, обратитесь к спецификациям / рекомендациям производителей микросхем.
Что можно сделать?
- Если время отклика не является проблемой, рассмотрите возможность усреднения показаний АЦП. Обычной практикой кодирования является использование экспоненциальной скользящей средней.
- Подумайте о лучшем АЦП. Во многих случаях выделенный чип АЦП (не интегрированный в процессор) будет иметь лучшие характеристики.
Для более подробного ознакомления с этим приложением NXP (он же: Motorola, Freescale) обсуждается "Как увеличить аналого-цифровой Точность преобразователя в приложении".
- Чтение нескольких аналоговых входных контактов
- Вибрационный геймпад Arduino с силовой обратной связью
- Экспонируйте два устройства HID Joystick с одной платой RP2040 (Waveshare Pi Pico Zero)
- Можно ли использовать Arduino UNO для эмуляции джойстика PS4?
- Библиотека джойстиков Arduino не распознается играми (Steam)
- Как использовать защитный экран USB-хост с различными джойстиками HID
- Переменная скорость разгона для двигателей, управляемых джойстиком
- Подключение джойстика Logitech к Arduino и прерывание цикла while
Re “
если (x_volt < rightThreshold)
”: do you meanif (x_volt >rightThreshold)
?, @Edgar Bonet@EdgarBonet не изменит того факта, что график потенциометра не является линейным, @thediyer
Можете ли вы показать график?, @Sim Son
это может быть проблема реализации analogRead или самого АЦП. например, для AVR рекомендуется немного подождать или выполнить фиктивное считывание между последующими показаниями на одном и том же АЦП., @Juraj