Продукти

Как да филтрираме шум от аналогови сензори?

Как да филтрираме шум от аналогови сензори?
14 ноември 2025

Аналоговите сензори често дават нестабилни стойности заради електрически шум, смущения от захранването или дълги кабели. За да получим точни и надеждни данни, трябва да приложим добри методи за филтриране – както хардуерни, така и софтуерни. В тази тема ще разгледаме най-практичните начини, които можеш да използваш веднага в проектите си.

 

1. Какво представлява шумът в аналоговите сензори?

Шумът е нежелана промяна в измервания сигнал. Може да се прояви като:

  • леки колебания около вярната стойност;

  • резки "пикове";

  • нестабилно отчитане при стоящ сензор.

Основните причини:

  • смущения от мотори, релета, импулсни захранвания;

  • лошо екраниране;

  • дълги и евтини кабели;

  • неподходящи резистори или лошо свързване;

  • нисък ADC резолюционен сигнал.

 

2. Хардуерни методи за филтриране: 

Това са най-надеждните решения, защото премахват шума още преди да достигне до Arduino.

 

2.1. Кондензатор между сигнала и масата

Най-простият филтър – low-pass филтър.

Препоръка:
Постави кондензатор 100 nF или 1 µF между аналоговия пин и GND.

Как работи:
Кондензаторът „заглажда“ бързите промени и оставя само плавните.

 

2.2. RC филтър (резистор + кондензатор)

По-ефективен от само кондензатор.

Пример:

  • 1 kΩ резистор на сигнала

  • 100 nF кондензатор към GND след резистора

Това образува low-pass филтър, който намалява високочестотния шум.

 

2.3. Екранирани кабели

При дълги кабели към сензорите – използвай екраниран проводник и свържи екрана към GND само от едната страна.

 

2.4. Стабилно захранване

Шумно захранване = шумен сигнал.


Използвай:

  • по-големи кондензатори на захранването (100 µF + 100 nF)

  • отделни стабилизатори за чувствителни модули

 

 

3. Софтуерни методи за филтриране:

Когато хардуерно не може да се премахне целият шум, се добавя софтуерна обработка.

3.1. Усредняване на няколко измервания (Averaging)

Най-лесният и често най-ефективният метод.

 

int readSensor() {
  long sum = 0;                    // сума от всички измервания
  const int samples = 20;          // броя измервания
 
  for(int i = 0; i < samples; i++) {
    sum += analogRead(A0);         // чете сензора
    delay(2);                      // малка пауза за стабилност
  }
 
  return sum / samples;            // връща усреднена стойност
}

 

3.2. Подвижно усредняване (Moving Average Filter)

Подходящо при постоянни измервания.

 

const int N = 10;               // колко последни стойности да се пазят
int buffer[N];                  // масив за стойностите
int indexPos = 0;               // текуща позиция
long total = 0;                 // сбор на всички стойности
 
int filteredRead(int newValue) {
  total -= buffer[indexPos];    // махаме старата стойност от сбора
  buffer[indexPos] = newValue;  // добавяме новата стойност
  total += newValue;            // добавяме към сбора
 
  indexPos = (indexPos + 1) % N; // въртим позицията като кръг
 
  return total / N;             // връщаме филтрираната стойност
}

 

3.3. Медианен филтър

Взима средната стойност след сортиране – много добър срещу "пикове".

 

int medianFilter() {
  int values[9];
 
  for (int i = 0; i < 9; i++) {
    values[i] = analogRead(A0);   // чете 9 стойности
    delay(2);
  }
 
  // сортиране (bubble sort)
  for(int i = 0; i < 9; i++){
    for(int j = i+1; j < 9; j++){
      if(values[j] < values[i]) {
        int tmp = values[i];
        values[i] = values[j];
        values[j] = tmp;
      }
    }
  }
 
  return values[4];              // връща средната стойност
}

 

3.4. Експоненциално изглаждане (Exponential Moving Average – EMA)

Плавно изглаждане с бърза реакция.

 

float filteredValue = 0;          // последна филтрирана стойност
float alpha = 0.1;                // коефициент на изглаждане (0.1 – 0.3 е ок)
 
float EMA(int raw) {
  filteredValue = alpha * raw + (1 - alpha) * filteredValue;
  return filteredValue;
}

 

4. Най-добри комбинации за проекти с Arduino

Най-практичното решение в реални условия е комбинация:

Препоръчителна комбинация:

  1. Кондензатор 100 nF между сигнала и GND;

  2. RC филтър (1 kΩ + 100 nF);

  3. Усреднено софтуерно четене (20–50 измервания);

  4. ЕМА или медианен филтър при много шумни сензори.

Така получаваш много стабилен сигнал без забавяне.

 

5. Заключение: 

Филтрирането на шум от аналогови сензори е задължителна част при работа с Arduino. С правилната комбинация от хардуерни и софтуерни методи можеш да постигнеш много стабилни и точни стойности, дори в шумна среда.