Выход AnalogRead() колеблется, даже если контакт заземлен

Я использую Arduino Micro для считывания данных с 5 датчиков гибкости и отображения соответствующих углов на последовательном мониторе. В настоящее время у меня довольно много проблем с колеблющимися значениями, которые я получаю от AnalogRead(). Кажется, не имеет значения, подключен ли контакт к датчику изгиба или просто заземлен - выходной сигнал сильно колеблется.

Изначально все читалось и выводилось нормально, но я хотел иметь точную частоту дискретизации 100 Гц и попытался немного поиграть с прерываниями по таймеру. И вот тогда началось это колебательное поведение. Я вернулся к своему исходному коду, который просто использует некоторую задержку () и упростил чтение только с двух контактов, но, похоже, не может избавиться от колебаний.

Я думаю, что, возможно, я что-то напутал с ADC при попытке реализовать прерывания, но я не знаю, как это проверить или исправить. Пожалуйста, помогите мне понять, как это исправить!

Это необработанные выходные данные AnalogRead. Падение значений происходит, когда я сгибаю датчик гибкости:

Это необработанные выходные данные AnalogRead. Падение значений происходит, когда я сгибаю датчик гибкости

А это результирующий рассчитанный угол. Также колеблется:

И это результирующий рассчитанный угол. Также колеблется.

Это код, который я использовал для чтения контактов:

int fin;
const int input[5] = {A0,A1,A2,A3,A4}; // аналоговые контакты

int flex[5]; // чтение аналогового сигнала
float flexV; 
float flexR[5]; // сопротивление на резисторе 47к
int angle[5]; // углы соединения

const float VCC = 4.98; // Измеренное напряжение линии Arduino 5V
// Измеренное сопротивление резисторов 47k R1-R5
const float R[5] = {45900.0,45900.0,45900.0,45900.0,45900.0}; 

// Калибровочные значения сопротивления, измеренные во время прямой фазы и фазы изгиба 90 градусов
const float R_STRAIGHT[5] = {37651.0,37651.0,37651.0,37651.0,37651.0};
const float R_BEND[5] = {71783.0,71783.0,71783.0,71783.0,71783.0};

void setup() {

}

void loop() {

  for(fin = 0; fin <= 4; fin++) {
   flex[fin] = analogRead(input[fin]);
   flexV = flex[fin]*VCC/1023.0;
   flexR[fin] = R[fin] * (VCC/flexV - 1.0);
   angle[fin] = map(flexR[fin],R_STRAIGHT[fin],R_BEND[fin],0,90.0);
   delay(1);   
    }
    Serial.print(angle[0]);
    Serial.print(" ");
    Serial.print(angle[1]);
    Serial.print(" ");
    Serial.print(angle[2]);
    Serial.print(" ");
    Serial.print(angle[3]);
    Serial.print(" ");
    Serial.print(angle[4]);
    Serial.print(" ");
    Serial.println(millis());
    delay(6);   
}

, 👍1

Обсуждение

Мне кажется, что на первом графике изображены два перемежающихся канала., @Edgar Bonet


1 ответ


1

В вашем цикле настройки ничего нет. Вам нужно настроить все входы как входы.

setup() должна выглядеть следующим образом:

void setup() 
 {
   Serial.begin(9600);
   for (int i = 0; i < 5; i++);
    {
      pinMode(input[i], INPUT);
    }
 }

Код циклически перебирает "ввод" вашего массива, устанавливая все контакты в качестве входов. Попробуйте это.

,

Насколько я помню, pinmode не имеет значения для AnalogRead, так как pinMode(pin, INPUT) установит пин как цифровой вход. analogRead() настроит вывод для использования АЦП, который не имеет ничего общего с цифровым вводом. Это часто делается только для удобства чтения, чтобы читатель сразу видел, какие контакты являются входами, а какие выходами., @chrisl

Gpios вводятся по умолчанию, @Sim Son

Я думаю, что контакты должны быть введены по умолчанию? Во всяком случае, я пробовал это. Без изменений. Я думаю, что я как-то испортил АЦП, понятия не имею, как его проверить..., @ForestApple

Вы можете легко протестировать АЦП, подключив его к источнику переменного тока. Вы должны видеть 1023 при 5В и 0 при 0В. Если у вас нет переменного источника питания, используйте потенциометр 10K, с левой стороной, подключенной к 5 В, средним контактом с контактом ADC и правым контактом с GND. Поворот ручки даст тот же результат. Вы также можете использовать мультиметр, чтобы убедиться, что датчики изгиба работают правильно., @HavocRC

Пробовал это. Я получаю хорошие 1023 при 5 В, но что-то между 220 и 800 при 0 В ..., @ForestApple

Хм, мне кажется, проблема с заземлением. Как вы питаете Arduino?, @HavocRC