Неточные показания напряжения на esp32 в отличие от мультиметра
Я работаю над определением амплитуды сигнала, исходящего от гитарного звукоснимателя. Я использую esp32 и модуль LM386 для усиления сигнала.
Я получаю довольно стабильные показания с помощью мультиметра, но показания на Arduino IDE показывают пики, а также пики приходят, когда никакого сигнала быть не должно.
Вот ссылка для коротких видеороликов как показаний esp32, так и мультиметра:
https://drive.google.com/drive/folders/1gpvkN_sz627jG0TNPpUps82105EB89OF?usp=sharing
Спасибо!
ПРАВКА (Добавление используемого простого кода) :
int ampedVoltagePin = 12;
void setup() {
pinMode(ampedVoltagePin, INPUT);
Serial.begin(9600);
}
void loop() {
Serial.println(analogRead(ampedVoltagePin));
delay(100);
}
ПРАВКА (Добавление диаграммы):
@Alejandro Camus, 👍0
Обсуждение3 ответа
Я вижу несколько проблем с вашей настройкой:
Вы только принимаете измерение каждые 100 мс. Это измерение принимает напряжение в течение очень короткого промежутка времени. Но самая низкая струна на гитаре в стандартном тюнинге имеет 82,41 Гц (E2). Вы измеряете на 10 Гц. Согласно теореме выборки Найквиста–Шеннона, вам нужно измерить, по крайней мере, дважды частоту вашей самой низкой частоты, чтобы измерить. В противном случае ваши измеренные данные не будут иметь никакого реального значения и не будут представлять входную волну. Так что вам нужно измерить, по крайней мере, с 165Hz.
Усилитель может выводить напряжение до своего напряжения питания, то есть 5 В. Вы подключаете выход непосредственно к ESP32, который представляет собой устройство 3,3 В. Это может повредить контакт, который вы используете.
В настоящее время вы пытаетесь измерить сигнал непосредственно. Но вы написали, что хотите иметь амплитуду. В настоящее время вам нужно будет вычислить это в коде (например, взяв минимальное и максимальное значения в диапазоне времени, превышающем один период самой низкой частоты, то есть не менее 12 мс (1/82, 4 Гц)). Мультиметр, скорее всего, сделает это в аппаратном обеспечении с аналоговой электроникой.
Я не уверен, хорошо ли подключать динамик и ESP параллельно. Поскольку динамик-это в основном индуктор, движущийся в магнитном поле, вы можете получить обратное напряжение, вызванное им. Это может быть вредно для экстрасенсорного восприятия. Другие здесь могут знать об этом больше.
Вы подключаете заземление Arduino к заземлению динамика. Но это, скорее всего, не то же самое, что усилители земли. Скорее всего, усилитель управляет динамиком симметрично, так и с отрицательными напряжениями относительно земли динамика. Это может повредить АЦП Arduino. Также неясно, насколько хороша эта земля на самом деле. Этот вывод не предназначен для заземления микроконтроллера. Управление динамиком отличается от измерения напряжения с помощью Arduino, поэтому для этого вам понадобятся разные усилители.
Я не специалист в области аналоговой электроники, но я думаю, что вы могли бы использовать диод, чтобы получить одну полуволну, а затем подать ее в фильтр низких частот. Полученное напряжение является относительно стабильным (в зависимости от частоты среза фильтра) и может быть измерено с помощью ESP. Я уверен, что это даст вам только грубое измерение амплитуды, но достаточно для типичных приложений, таких как визуализация амплитуды. Для действительно точных измерений вам, скорее всего, потребуется использовать более сложную электронику для работы с нелинейностями деталей (особенно диода).
Спасибо, очень хорошие замечания. 1. Вы проводите измерения только каждые 100 мс: Это я исправил, взяв большую выборку и получив среднее значение. 2. Усилитель может выводить напряжение до напряжения питания, поэтому 5 В: Я могу регулировать это с помощью регулятора громкости в модуле LM386 3. Я не уверен, хорошо ли подключать динамик и ESP параллельно: Это единственный способ, который я нашел, чтобы получить показания, которые имеют смысл. Если динамика там нет, я получаю высокие значения, которые ничего не отражают от фактического ввода., @Alejandro Camus
Мне интересно, почему он работает только с подключенным динамиком и как я могу от него избавиться, так как мне действительно не нужен динамик в моей настройке, @Alejandro Camus
Mhh, усилитель, скорее всего, действует как источник тока и будет повышать напряжение до тех пор, пока не будет достигнут необходимый ток или предел. Таким образом, проблема заключается в типе усилителя. С другим усилителем вы сможете отключить динамик. Хотя, как я уже писал, я действительно не эксперт в этой области., @chrisl
@AlejandroCamus Брать пробы и вычислять среднее значение, чтобы найти амплитуду, бессмысленно. Представьте себе один цикл чистой синусоидальной волны. Подумайте о выборке в регулярных точках вдоль этой формы волны. Каков будет средний показатель? Теперь уменьшите амплитуду, но сохраняйте то же смещение и сделайте это снова. Каков будет результат? Вы видите, что среднее значение не имеет никакого отношения к амплитуде - оно дает вам только "смещение постоянного тока" формы сигнала. Вместо этого вам нужно взять много проб и найти максимальные и МИНИМАЛЬНЫЕ значения за этот период. Разница между двумя значениями-это амплитуда., @Majenko
@Majenko На самом деле я думаю, что операция приносит удовлетворительные результаты, потому что он пытается использовать динамик в качестве основы для Arduino. Скорее всего, усилитель выдает симметричную волну вокруг земли динамика. Но АЦП не измеряет отрицательные напряжения, поэтому OP на самом деле измеряет только одну полуволну. Среднее значение все еще не дает реальной амплитуды, но этого все еще может быть достаточно для приложения OPs. По крайней мере, такова моя теория, что происходит., @chrisl
Мне удалось получить точные показания, следуя предложению @chrisl в комментарии.
Вместо того чтобы пытаться получить значения в заданных точках, я теперь усредняю 500 значений, и показания получаются такими, как и ожидалось.
Новый код:
int ampedVoltagePin = 12;
int counter = 0;
int sumOfVoltages = 0;
int sampleSize = 500;
int average;
void setup() {
pinMode(ampedVoltagePin, INPUT);
Serial.begin(9600);
}
void loop() {
sumOfVoltages += analogRead(ampedVoltagePin);
if (counter > sampleSize -2) {
average = sumOfVoltages/sampleSize;
Serial.println(average);
sumOfVoltages = 0;
counter = 0;
}
counter ++;
}
Да, вам действительно нужно сделать выборку со скоростью не менее 2 раз выше самой высокой гармоники, которую вы хотите рассмотреть. Но это не самая большая твоя проблема.
LM386 обычно используется с выходным конденсатором. Спецификации чипа говорят, что он "самобалансирующийся", что означает, что его выход находится на половине напряжения питания, когда нет сигнала, а затем качается вверх и вниз от этого. Индуктивность динамика здесь не проблема, дело в том, что он имеет очень низкое сопротивление постоянному току (обычно 8 Ом), и вы помещаете его через источник постоянного тока 2,5 В (выход LM386). Это не очень хорошо для усилителя, и это ужасно для динамика, так как он находится за пределами своей нормальной центральной рабочей точки.
Поэтому используйте большой электролитический конденсатор между LM386 и динамиком. В паспорте указано 250 uFd, но это не критично. Обратите внимание, что вывод + конденсатора должен быть подключен к выходу LM386. Но вход Arduino должен подключаться к усилителю напрямую, как вы делаете это сейчас, и вы должны вычесть +2,5 В из каждого показания, чтобы получить сигнал переменного тока. Затем вы можете обрабатывать это, как вы хотите, например, принимая абсолютное значение и фильтрацию (усреднение с постоянной времени).
- Аналоговое чтение не работает при использовании WiFi
- Как считывать аналоговое значение на ESP32-CAM с включенным считывателем SD-карт?
- Почему чтение на ESP32 читает max, когда чтение на UNO читается точно?
- Различные серийные значения между Arduino Uno и TTGO ESP32 SX1276
- Как работать с вытащенным высоким входным контактом, когда ему нужно считывать значение с аналогового датчика?
- Датчик влажности SEN0114 низкое максимальное считывание?
- ESP32 чтение аналоговый 2,4 ГГц
- Скопируйте конфигурацию аналогового входа Uno в ESP32
И что произойдет, если вы возьмете среднее значение за более длительное время и покажете это? Потому что это то, что делает мультиметр. Мой мультиметр, кажется, в среднем составляет около 500 мс. Кроме того, вам нужно будет принять минимальное и максимальное значения перед усреднением, чтобы получить амплитуду, так как в противном случае прямое усреднение волны в основном приведет к отмене. Пожалуйста, покажите код и схему подключения вашего проекта., @chrisl
Как ESP32 подключен к выходу усилителя? Что это за сигнал?, @StarCat
@chrisl, я только что добавил диаграмму и код. Теперь я попробую ваше предложение о получении среднего, @Alejandro Camus
@StarCat, я надеюсь, что новая диаграмма поможет с вопросами. В противном случае я постараюсь уточнить подробнее, @Alejandro Camus