Когда рекламировалась версия Arduino Uno R4, все дистрибьюторы без колебаний упоминали встроенный операционный усилитель, хотя никакой дополнительной информации о нем не было, ни схем, ни учебников, ничего. Всего несколько месяцев спустя было опубликовано несколько строк кода, и единственным представленным приложением был повторитель напряжения, который совершенно бесполезен.

Что можно сделать с помощью некоторых дополнительных пассивных компонентов, так это фильтр, который усиливает или подавляет определенные частоты аналогового сигнала. Конечно, это можно сделать с помощью кода, но на это может уйти много времени. Аналоговые фильтры работают со скоростью света (почти). На следующей схеме показано, как создать аналоговый полосовой фильтр с помощью встроенного операционного усилителя в Arduino Uno R4.

Инструкции по реализации фильтров можно легко найти в Интернете. Но нужно учитывать, что операционным усилителям часто требуется положительное и отрицательное напряжение питания, которого у нас нет. Поэтому нам нужно подать половину +Vcc на неинвертирующий вход (+), подключенный к A1. Вот почему вы увидите два резистора (одинаковых номиналов) между +Vcc и GND. Выбираем 10 кОм для R1 и 22 кОм для R2. Значения С1 и С2 зависят от того, какие частоты вас интересуют. Выбираем 100 нФ. Чтобы найти точные значения, просто используйте следующую формулу.

Выход операционного усилителя (А3) подключен к контакту А4, откуда отфильтрованный сигнал может быть отправлен на внутренний АЦП.
Для реализации данного проекта вам необходимо скачать и установить библиотеку OPAMP.h, которую можно найти на github.com. Мы использовали приведенный в ней пример «start_opamp.ino» и добавили несколько строк, чтобы протестировать свое оборудование.
#include <OPAMP.h>
void setup () {
long t1 = millis() + 2000;
Serial.begin(230400);
while (!Serial & millis() < t1)
;
Serial.println(__FILE__);
// активируем операционный усилитель (OPAMP), канал по умолчанию 0
// Неинвертирующий вход: аналоговый A1
// Инвертирующий вход: аналоговый A2
// Выход: аналоговый A3
if (!OPAMP.begin(OPAMP_SPEED_HIGHSPEED)) {
Serial.println("Failed to start OPAMP!");
}
bool const isRunning = OPAMP.isRunning(0);
if (isRunning) {
Serial.println("OPAMP running on channel 0!");
} else {
Serial.println("OPAMP channel 0 is not running!");
}
}
void loop() {
const int N = 500;
const int m = 1023;
int a[N], b[N];
long t1 = millis();
for (int i = 0; i < N; i++) {
a[i] = analogRead(A0);
b[i] = analogRead(A4);
}
long t2 = millis();
Serial.print("Zeit =");
Serial.print(t2 - t1);
Serial.println("ms");
for (int i = 0; i < N; i++) {
Serial.print(a[i]);
Serial.print(" ");
Serial.print(m - b[i]);
Serial.println();
}
delay(2000);
}
Наша установка физически выглядит следующим образом.

Для проверки фильтра мы использовали гитарный питч-пайп.

В последовательном плоттере получили следующие результаты.

Здесь выходной сигнал фильтра мал, поскольку не в резонансе. А на следующем изображении он высокий, поскольку наблюдается резонанс.

Время чтения 500 выборок составило 25 миллисекунд, поэтому вы легко сможете вычислить частоты.
© digitrode.ru