Устранение шума потенциоментра

Тема в разделе "Arduino & Shields", создана пользователем SEsin, 19 май 2020.

  1. SEsin

    SEsin Нерд

    Всем привет! Подскажите пожалуйста, есть ли методы уменьшения дребезга потенциометра? Самое очевидное - программно сравнивать с предыдущим значением и регистрировать изменение, если оно превысило какой-то порог - это понятно. Но я уперся в максимально допустимый порог для моего проекта.
    Потенциометр у меня подключен к аналоговому входу. Мне нужно получить значение от 0 до 127. Я это делаю так:
    Код (C++):
    Pot[p].ValAnalog = analogRead(Pot[p].analogInPin);
        if (abs(Pot[p].ValAnalog - Pot[p].PrValAnalog) > 8) {

          Pot[p].PrValAnalog = Pot[p].ValAnalog;
         
          // распределяем данные из интервала 0-1023 в интервал 0-127
          Pot[p].ValMIDI = map(Pot[p].ValAnalog, 0, 1023, 0, 127);
     
    При чтении аналогового значения с потенциометра я не могу установить погрешность более 8, потому что тогда у меня некорректно будет производиться перенос на интервал с 0 до 127, будут пропуски.
    По факту после чтения analogRead я получаю значение, которое иногда стоит на месте, а иногда прыгает в пределах от 1 до 10 и происходят ложные срабатывания.
    У меня есть подозрение, что:
    1. Я некорректно выбрал номинал потенциометров. Взял какие были B200K. На первый взгляд все работало нормально, поэтому я не подумал о подвохе. Видел, что обычно используют в районе 10К, влияет ли это на точность?
    2. Контроллер в моем проекте засунут плотно рядом с другими платами в midi клавиатуру. И я заметил, что значения сильнее прыгают в момент нажатия на клавиши. Возможно ли такое поведение из-за наводок? И что в этом случае экранировать? Плату, потенциометры, провода или все сразу?

    Буду рад любому совету, спасибо за внимание.
     
  2. Daniil

    Daniil Гуру

    Попробуйте перед принятием решения накапливать данные с ацп, а потом усредняеть.
    Извиняюсь за код, сейчас у меня некоторые проблемы с тегами:
    int sum=0
    цикл от 0 до 15 sum+=аналогриад
    sum=sum>>4;
    далее с sum работать как с вашим ValAnalog.
    Цикл накапливает 16 отсчетов, а потом происходит побитовый сдвиг на 4 бита, это аналог деления на 2^4, т.е. 16.
     
    Airbus нравится это.
  3. parovoZZ

    parovoZZ Гуру

    Для старого атмеловского хлама потенциометр должен быть 10 кОм. НЕ БОЛЬШЕ. Потенциометры шумят, но дребезга в исправном потенциометре никакого нет.
     
    Airbus нравится это.
  4. SEsin

    SEsin Нерд

    Да, извиняюсь. Я писал конечно не про дребезг, а про шум. Заголовок темы отредактировал. Попробую программно все-таки через усреднение решить. Если не получится, буду пробовать менять на 10К.
     
  5. SEsin

    SEsin Нерд

    Спасибо за совет, попробую этот вариант сегодня.
     
  6. b707

    b707 Гуру

    Конденсатор еще поставьте между средним и нижним пином потенциометра
     
    parovoZZ и Daniil нравится это.
  7. SEsin

    SEsin Нерд

    А какой номинал посоветуете?
     
  8. parovoZZ

    parovoZZ Гуру

    Уловить флуктуационный шум с помощью 10-ти битного АЦП? Не смеши. АЦП в AVR сам шумит, что будь здоров.
     
  9. parovoZZ

    parovoZZ Гуру

    Любую керамику, что есть в наличии. 1нФ хватит с головой.
     
  10. akl

    akl Гуру

    в данном случае это не тепловой шум потца, а тупо наводки на провода, в основном 50 герц. чем больше номинал потца тем громче наводки (особенно в среднем положении крутилки). конденсатор поможет, лучше 100нф. если потц где-то далеко от платы, то есть смысл до его средней ноги поставить экранированный провод. или просто всю приблуду в экранированный корпус засунуть
    ну и АЦП тоже не вполне точное, так что 1024 деления вряд ли получится, но 256 вполне
     
  11. parovoZZ

    parovoZZ Гуру

    вместе с резистором на 200к получаем фильтр с частотой среза в 8 Гц. Для музыки такое запаздывание очень критично.
     
  12. akl

    akl Гуру

    возможно. но смотря что делает крутилка - если она например просто регулирует какую-нибудь громкость или типа того - то не особо критично. Но конечно самый лучший вариант - уменьшить номинал потца
     
  13. SEsin

    SEsin Нерд

    В данном случае крутилка отвечает за посыл midi сообщения Control Change, поэтому прямого отношения к звуку она не имеет. К слову сказать, 8Гц для музыки это вообще не критично. Частенько даже срезают и побольше снизу, музыки там никакой нет.
    Большое спасибо всем за советы, буду пробовать все подряд )
     
  14. SEsin

    SEsin Нерд

    Отлично сработало! Сделал так:
    Код (C++):
    int analogReadStab(byte analogPin) {

      int sum = 0;

      for (int p = 0; p <= 15; p++) {
     
        sum += analogRead(analogPin);
     
      }

      sum = sum>>4;

      return sum;

    }

    Поменял на вызов этой процедуры вместо analogRead. Возможно, это не совсем красиво по отношению к контроллеру и все такое. Но в данном проекте, вообще ни на что не влияет. А учитывая, что проблема решилась, желание менять потенциометры или припаивать конденсаторы быстро отпала. Большое спасибо, Dadiil, вариант вполне рабочий.
     
    Daniil нравится это.
  15. Daniil

    Daniil Гуру

    Справедливости ради, минус этого решения в том, что измерение теперь длится больше и в более сложных задачах применяются все выше перечисленные методы и некоторые дополнительные меры по уменьшению шумов.
     
  16. akl

    akl Гуру

    в музыке срезают обычно снизу, а у нас тут будет сверху - разница принципиальная.
    но т.к. в нашем случае это не звук, а тупо сигнал положения потенциометра, то произойдет всего лишь замедление реакции напряжения на положение крутилки, какие-то доли секунды тут не критичны