Всем привет! Подскажите пожалуйста, есть ли методы уменьшения дребезга потенциометра? Самое очевидное - программно сравнивать с предыдущим значением и регистрировать изменение, если оно превысило какой-то порог - это понятно. Но я уперся в максимально допустимый порог для моего проекта. Потенциометр у меня подключен к аналоговому входу. Мне нужно получить значение от 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 клавиатуру. И я заметил, что значения сильнее прыгают в момент нажатия на клавиши. Возможно ли такое поведение из-за наводок? И что в этом случае экранировать? Плату, потенциометры, провода или все сразу? Буду рад любому совету, спасибо за внимание.
Попробуйте перед принятием решения накапливать данные с ацп, а потом усредняеть. Извиняюсь за код, сейчас у меня некоторые проблемы с тегами: int sum=0 цикл от 0 до 15 sum+=аналогриад sum=sum>>4; далее с sum работать как с вашим ValAnalog. Цикл накапливает 16 отсчетов, а потом происходит побитовый сдвиг на 4 бита, это аналог деления на 2^4, т.е. 16.
Для старого атмеловского хлама потенциометр должен быть 10 кОм. НЕ БОЛЬШЕ. Потенциометры шумят, но дребезга в исправном потенциометре никакого нет.
Да, извиняюсь. Я писал конечно не про дребезг, а про шум. Заголовок темы отредактировал. Попробую программно все-таки через усреднение решить. Если не получится, буду пробовать менять на 10К.
Уловить флуктуационный шум с помощью 10-ти битного АЦП? Не смеши. АЦП в AVR сам шумит, что будь здоров.
в данном случае это не тепловой шум потца, а тупо наводки на провода, в основном 50 герц. чем больше номинал потца тем громче наводки (особенно в среднем положении крутилки). конденсатор поможет, лучше 100нф. если потц где-то далеко от платы, то есть смысл до его средней ноги поставить экранированный провод. или просто всю приблуду в экранированный корпус засунуть ну и АЦП тоже не вполне точное, так что 1024 деления вряд ли получится, но 256 вполне
вместе с резистором на 200к получаем фильтр с частотой среза в 8 Гц. Для музыки такое запаздывание очень критично.
возможно. но смотря что делает крутилка - если она например просто регулирует какую-нибудь громкость или типа того - то не особо критично. Но конечно самый лучший вариант - уменьшить номинал потца
В данном случае крутилка отвечает за посыл midi сообщения Control Change, поэтому прямого отношения к звуку она не имеет. К слову сказать, 8Гц для музыки это вообще не критично. Частенько даже срезают и побольше снизу, музыки там никакой нет. Большое спасибо всем за советы, буду пробовать все подряд )
Отлично сработало! Сделал так: Спойлер: Код Код (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, вариант вполне рабочий.
Справедливости ради, минус этого решения в том, что измерение теперь длится больше и в более сложных задачах применяются все выше перечисленные методы и некоторые дополнительные меры по уменьшению шумов.
в музыке срезают обычно снизу, а у нас тут будет сверху - разница принципиальная. но т.к. в нашем случае это не звук, а тупо сигнал положения потенциометра, то произойдет всего лишь замедление реакции напряжения на положение крутилки, какие-то доли секунды тут не критичны