На аппаратном уровне базовая процедура устранения неполадок должна учитывать следующие сегменты поведения физического ключа (или коммутатора):
Клавиша сидит тихо -> палец касается клавиши и начинает нажимать вниз -> клавиша достигает нижней части хода, и палец удерживает ее там -> палец начинает отпускать клавишу, а пружина толкает клавишу обратно вверх -> палец отпускает клавишу, и клавиша немного вибрирует, пока успокаивается
Все эти этапы включают в себя 2 металлических скребка, трения и столкновения друг с другом, колебания напряжения вверх и вниз от 0 до максимума в течение миллисекунд, поэтому на каждом этапе возникает электрический шум:
(1) Шум во время прикосновения к клавише, вызванный проблемами окружающей среды, такими как влажность, вибрация, изменения температуры и т. Д., Вызывающими изменения напряжения на контактах клавиши
(2) Шум, вызванный нажатием клавиши
(3) Шум при удерживании клавиши
(4) Шум при отпускании ключа
(5) Шум при вибрации клавиши после отпускания
Вот алгоритм, по которому мы в основном предполагаем, что человек нажимает клавишу:
прочитать состояние клавиши, которая может быть «может быть нажата», «определенно нажата», «определенно не нажата», «может быть не нажата» (мы никогда не уверены)
Цикл, пока клавиша «может быть» нажата (при работе с аппаратными средствами это выборка напряжения больше некоторого порогового значения), пока не будет «определенно не нажата» (ниже порогового напряжения)
(это инициализация, ожидание шума, остановка, определение «может быть» и «определенно нет» зависит от конкретного приложения)
цикл, пока клавиша «определенно не» нажата, пока клавиша «не может быть» нажата
когда клавиша «может быть» нажата, начать цикл и выборку состояния клавиши и отслеживать, как долго клавиша «может быть» нажата
- если клавиша возвращается в состояние «возможно, нет» или «определенно нет» в течение определенного периода времени, перезапустите процедуру
- в определенное время (число миллисекунд), которое вы выбрали (обычно путем экспериментирования с различными значениями), вы решаете, что значение выборки больше не вызвано шумом, а, скорее всего, вызвано тем, что ключ фактически удерживается человеком пальцем и вы вернете значение «нажата»
while(keyvalue = maybepressed){
//loop - wait for transition to notpressed
sample keyvalue here;
maybe require it to be "notpressed" a number of times before you assume
it's really notpressed;
}
while(keyvalue = notpressed){
//loop - wait for transition to maybepressed
sample keyvalue
again, maybe require a "maybepressed" value a number of times before you
transition
}
while(keyvalue=maybepressed){
presstime+=1;
if presstime>required_presstime return pressed_affirmative
}
}
return pressed_negative