Джойстик считывает ошибочные значения

joystick

При нормальной работе значение диапазона АЦП джойстика на моей плате составляет от 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. Что может быть причиной этого?

, 👍0

Обсуждение

Re “если (x_volt < rightThreshold)”: do you mean if (x_volt >rightThreshold)?, @Edgar Bonet

@EdgarBonet не изменит того факта, что график потенциометра не является линейным, @thediyer

Можете ли вы показать график?, @Sim Son

это может быть проблема реализации analogRead или самого АЦП. например, для AVR рекомендуется немного подождать или выполнить фиктивное считывание между последующими показаниями на одном и том же АЦП., @Juraj


1 ответ


Лучший ответ:

0

10-битный АЦП может не иметь 10-битного разрешения для данной выборки. Он может содержать только 5 или 6 бит из-за случайного шума и других факторов. Если вам нужен конкретный номер, обратитесь к спецификациям / рекомендациям производителей микросхем.

Что можно сделать?

  • Если время отклика не является проблемой, рассмотрите возможность усреднения показаний АЦП. Обычной практикой кодирования является использование экспоненциальной скользящей средней.
  • Подумайте о лучшем АЦП. Во многих случаях выделенный чип АЦП (не интегрированный в процессор) будет иметь лучшие характеристики.

Для более подробного ознакомления с этим приложением NXP (он же: Motorola, Freescale) обсуждается "Как увеличить аналого-цифровой Точность преобразователя в приложении".

,