Есть портативный прибор с металлическим корпусом. Корпус соединен с минусом питания. На корпус через диэлектрик наклеена полоска металла, играющая роль сенсорной кнопки. Сверху все закрыто термоусадкой.
Полоса подключена к аналоговому входу контроллера:
Нажмите для просмотра прикрепленного файла
При работе мультиплексор АЦП переключается на вывод с кнопкой и через встроенный в МК pull-up на кнопку подается короткий импульс. Sample&hold емкость в АЦП заряжается до какого-то уровня и этот уровень измеряется.
Кнопка работает:
Нажмите для просмотра прикрепленного файла
Написал простой фильтр: мгновенное значение АЦП сравнивается с усредненным, если больше 20 несколько отсчетов подряд - нажатие регистрируется.
Код
ButtonVoltageRaw = ADC;
ButtonVoltageAcc -= ButtonVoltageAcc >> 6;
ButtonVoltageAcc += ButtonVoltageRaw;
ButtonVoltage = ButtonVoltageAcc >> 6;
if(ButtonVoltage > ButtonVoltageRaw && ButtonVoltage - ButtonVoltageRaw > 20)
{
if(ButtonPressed < 255)
{
ButtonPressed++;
if(ButtonPressed > 2)
ButtonVoltageAcc = ButtonVoltageRaw << 6; //Поймали нажатие
}
}
else if(ButtonVoltage < ButtonVoltageRaw && ButtonVoltageRaw - ButtonVoltage > 20)
{
ButtonVoltageAcc = ButtonVoltageRaw << 6;
}
else
{
ButtonPressed = 0;
}
ButtonVoltageAcc -= ButtonVoltageAcc >> 6;
ButtonVoltageAcc += ButtonVoltageRaw;
ButtonVoltage = ButtonVoltageAcc >> 6;
if(ButtonVoltage > ButtonVoltageRaw && ButtonVoltage - ButtonVoltageRaw > 20)
{
if(ButtonPressed < 255)
{
ButtonPressed++;
if(ButtonPressed > 2)
ButtonVoltageAcc = ButtonVoltageRaw << 6; //Поймали нажатие
}
}
else if(ButtonVoltage < ButtonVoltageRaw && ButtonVoltageRaw - ButtonVoltage > 20)
{
ButtonVoltageAcc = ButtonVoltageRaw << 6;
}
else
{
ButtonPressed = 0;
}
Результат работы фильтра на темной линии:
Нажмите для просмотра прикрепленного файла
В целом, нажатия детектируются уверенно, однако люди нажимать будут по-разному и пальцы у всех разные, вполне вероятно, что с таким отношением сигнал/шум у кого-то кнопка будет работать не очень хорошо.
Есть сомнения, что мой способ фильтрации является в данном случае оптимальным, если кто знает что-то более подходящее, буду признателен за статьи, ссылки, примеры.