Debouncing Joystick Input for Frequency Control on STM32 NUCLEO-F401RE

I’m using the STM32 NUCLEO-F401RE microcontroller and have programmed a speaker to change frequency when the joystick is pushed up or down. However, I’m encountering two issues: 1. The frequency sometimes changes multiple times when the joystick is pressed, suggesting the ISR is being triggered more than once. 2. Although the InterruptIn object is set to trigger on the rising edge, it sometimes also triggers on the falling edge when the joystick returns to neutral. I haven’t implemented debouncing yet, and I’m using a digital joystick connected to pins A2 and A3 without external pull-up/down resistors. Here's the code:
void upISR()
{
if (greenLED.getStatus())
{
myTicker.detach();
frequency += 200;
myTicker.attach(callback(&spkr, &Speaker::toggle), 0.5/frequency);
}
}

int main()
{
InterruptIn up(A2);
InterruptIn down(A3);
InterruptIn fire(D4);

up.rise(&upISR);
down.rise(&downISR);
fire.rise(&toggleISR);

redLED.on();

while (1) {}
}
void upISR()
{
if (greenLED.getStatus())
{
myTicker.detach();
frequency += 200;
myTicker.attach(callback(&spkr, &Speaker::toggle), 0.5/frequency);
}
}

int main()
{
InterruptIn up(A2);
InterruptIn down(A3);
InterruptIn fire(D4);

up.rise(&upISR);
down.rise(&downISR);
fire.rise(&toggleISR);

redLED.on();

while (1) {}
}
Could these issues be due to the lack of debouncing? What’s the best way to handle this, and should I be using external pull-up/down resistors to improve reliability? Any advice would be most appreciated guys 🙏🏽
2 Replies
M M
M M4w ago
I think both issues are cuz of lack of debouncing. You can add a simple delay or a timer in your ISR to ignore rapid signals that occur too close together. Check the time between ISR calls, and only act if a minimum threshold has passed. Also, add external pull-up/down resistors. It can improve signal stability.
Sterling
Sterling4w ago
Okay, thanks for the suggestion @M M .I'll try adding a delay and external resistors to improve stability. I’ll update you on how it goes.🙏🏽
Want results from more Discord servers?
Add your server