Выход AnalogRead() колеблется, даже если контакт заземлен
Я использую Arduino Micro для считывания данных с 5 датчиков гибкости и отображения соответствующих углов на последовательном мониторе. В настоящее время у меня довольно много проблем с колеблющимися значениями, которые я получаю от AnalogRead(). Кажется, не имеет значения, подключен ли контакт к датчику изгиба или просто заземлен - выходной сигнал сильно колеблется.
Изначально все читалось и выводилось нормально, но я хотел иметь точную частоту дискретизации 100 Гц и попытался немного поиграть с прерываниями по таймеру. И вот тогда началось это колебательное поведение. Я вернулся к своему исходному коду, который просто использует некоторую задержку () и упростил чтение только с двух контактов, но, похоже, не может избавиться от колебаний.
Я думаю, что, возможно, я что-то напутал с ADC при попытке реализовать прерывания, но я не знаю, как это проверить или исправить. Пожалуйста, помогите мне понять, как это исправить!
Это необработанные выходные данные 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);
}
@ForestApple, 👍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
- Как прочитать значение АЦП без общего заземления? (Возможно или нет!)
- Arduino непрерывно считывает значение АЦП с помощью прерывания
- Шумный analogRead
- Расширенная настройка АЦП на Due (SAM3X8E) для повышения точности
- Arduino Micro + Max4466 — Шум на A0
- Использование INT2/3 на Arduino Micro (Atmega32u4)
- Как использовать прерывание АЦП на синей таблетке STM32
- Ardunio Mega/ATmega2560: использование порта F или K как для аналоговых входов, так и для цифровых выходов.
Мне кажется, что на первом графике изображены два перемежающихся канала., @Edgar Bonet