fix: add hysteresis to comparator gate logic to prevent noise bouncing.
This commit is contained in:
@ -320,11 +320,33 @@ void loop() {
|
|||||||
if (current_mode == MODE_COMPARATOR) {
|
if (current_mode == MODE_COMPARATOR) {
|
||||||
int c1_lower = comp1_shift - (comp1_size / 2);
|
int c1_lower = comp1_shift - (comp1_size / 2);
|
||||||
int c1_upper = comp1_shift + (comp1_size / 2);
|
int c1_upper = comp1_shift + (comp1_size / 2);
|
||||||
bool gate1 = (cv1_val >= c1_lower && cv1_val <= c1_upper);
|
|
||||||
|
|
||||||
int c2_lower = comp2_shift - (comp2_size / 2);
|
int c2_lower = comp2_shift - (comp2_size / 2);
|
||||||
int c2_upper = comp2_shift + (comp2_size / 2);
|
int c2_upper = comp2_shift + (comp2_size / 2);
|
||||||
bool gate2 = (cv2_val >= c2_lower && cv2_val <= c2_upper);
|
|
||||||
|
const int HYSTERESIS = 4; // Margin to prevent noise bouncing at threshold
|
||||||
|
|
||||||
|
bool gate1 = prev_gate1;
|
||||||
|
if (gate1) {
|
||||||
|
if (cv1_val < c1_lower - HYSTERESIS || cv1_val > c1_upper + HYSTERESIS) {
|
||||||
|
gate1 = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (cv1_val >= c1_lower + HYSTERESIS && cv1_val <= c1_upper - HYSTERESIS) {
|
||||||
|
gate1 = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool gate2 = prev_gate2;
|
||||||
|
if (gate2) {
|
||||||
|
if (cv2_val < c2_lower - HYSTERESIS || cv2_val > c2_upper + HYSTERESIS) {
|
||||||
|
gate2 = false;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (cv2_val >= c2_lower + HYSTERESIS && cv2_val <= c2_upper - HYSTERESIS) {
|
||||||
|
gate2 = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool logic_and = gate1 && gate2;
|
bool logic_and = gate1 && gate2;
|
||||||
bool logic_or = gate1 || gate2;
|
bool logic_or = gate1 || gate2;
|
||||||
|
|||||||
Reference in New Issue
Block a user