Button debounce hardwarematig
33 berichten
• Pagina 1 van 4 • 1, 2, 3, 4
Button debounce hardwarematig
Ik heb een 100nF condensator over een button gezet, is hij dan goed gedebounced?
Bij een encoder werkt het heel goed, maar ik vroeg me af of het met een knop ook goed werkt.
Scheelt programmeerwerk.
Bij een encoder werkt het heel goed, maar ik vroeg me af of het met een knop ook goed werkt.
Scheelt programmeerwerk.
Advertisement
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Button debounce hardwarematig
Nope. Als je er een cap overheen gooit, dan wordt deze opgeladen gedurende 5 x RC. R is de pullup weerstand. Als je internal pullup gebruikt dan is dat rond de 20K. Gebruik je een eigen pullup dan is dat meestal iets van 1K tot 10K. Dus ligt er een beetje aan wat je gebruikt.
bij een internal pullup kom je op 5 * 0.0000001 * 20000 = 10mS. Als je een eigen pullup gebruikt die door de wat kleinere weerstand een betere stabiliteit geeft, zit je op 500nS bij 1K. Dus als de kwaliteit van de schakelaar uitstekend is kom je er mogelijk mee weg. als deze minder is, is het best mogelijk dat je nog een bounce krijgt en dus 2x de knop leest.
Dit verhaal heeft alleen effect in de oplaad tijd van de cap. Als je de knop indrukt dan wordt de cap kortgesloten maar heeft wel een ontlaad tijd. En als je dan een debounce krijgt, dan gaat ie weer laden.
Daarnaast is het een economische dure oplossing. Extra componenten is (hoe klein ook) een extra mogelijke storingsmogelijkheid. Daarnaast lever je PCB ruimte in en heb je extra component kosten. Nu zal dat in de hobbysfeer niet echt een probleem hoeven zijn, maar jouw baas ziet me aankomen als ik hem zou vertellen dat zijn board duurder is geworden omdat ik wat minder code regels hoef te programmeren.
Ik zou het lekker in de software houden. Eventueel maak je een (schijnt er ook al te wezen) een button class die dit allemaal voor je afvangt.
bij een internal pullup kom je op 5 * 0.0000001 * 20000 = 10mS. Als je een eigen pullup gebruikt die door de wat kleinere weerstand een betere stabiliteit geeft, zit je op 500nS bij 1K. Dus als de kwaliteit van de schakelaar uitstekend is kom je er mogelijk mee weg. als deze minder is, is het best mogelijk dat je nog een bounce krijgt en dus 2x de knop leest.
Dit verhaal heeft alleen effect in de oplaad tijd van de cap. Als je de knop indrukt dan wordt de cap kortgesloten maar heeft wel een ontlaad tijd. En als je dan een debounce krijgt, dan gaat ie weer laden.
Daarnaast is het een economische dure oplossing. Extra componenten is (hoe klein ook) een extra mogelijke storingsmogelijkheid. Daarnaast lever je PCB ruimte in en heb je extra component kosten. Nu zal dat in de hobbysfeer niet echt een probleem hoeven zijn, maar jouw baas ziet me aankomen als ik hem zou vertellen dat zijn board duurder is geworden omdat ik wat minder code regels hoef te programmeren.
Ik zou het lekker in de software houden. Eventueel maak je een (schijnt er ook al te wezen) een button class die dit allemaal voor je afvangt.
Re: Button debounce hardwarematig
Oke, ik heb veel moeite een debounce code te vinden voor meerdere knoppen, waar ik goed mee uit de voeten kan, vandaar dat ik zocht naar een hardware oplossing.
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Button debounce hardwarematig
Ik gebruik zelf dit:
toelichting
tabel voor 2 buttons
in de initialisatie
pin wordt straks gevuld in de setup() met data pin
waitForReleased is een vlag die bijhoudt of de pin is losgelaten voordat hij weer als aan gezien kan worden. Dit voorkomt dat men de knop ingedrukt houdt. Bij mij moet je dus eerst de knop losgelaten hebben voordat hij weer reageert.
ACTIVE_BUTTON wordt gebruikt om te bepalen of de knop reageert op pull down of pull up.
in de setup()
Hier worden de pinnen aan de tabel bekend gemaakt
De feitelijke routine
de code geeft een true terug als de knop daadwerkelijk is ingedrukt en false indien niet of dat de knop nog niet is losgelaten van de vorige indrukken van de knop.
Aanroepen voorbeeld
toelichting
tabel voor 2 buttons
in de initialisatie
pin wordt straks gevuld in de setup() met data pin
waitForReleased is een vlag die bijhoudt of de pin is losgelaten voordat hij weer als aan gezien kan worden. Dit voorkomt dat men de knop ingedrukt houdt. Bij mij moet je dus eerst de knop losgelaten hebben voordat hij weer reageert.
ACTIVE_BUTTON wordt gebruikt om te bepalen of de knop reageert op pull down of pull up.
- Code: Alles selecteren
#define ACTIVE_BUTTON LOW /**< determines when button is pressed */
/** data connected to each pin */
struct button {
uint8_t pin; /**< pin number on Arduino connected to button */
boolean waitForReleased; /**< indicates if we have to wait for the button to be released */
};
button buttons[2]; /**< array with button settings */
in de setup()
Hier worden de pinnen aan de tabel bekend gemaakt
- Code: Alles selecteren
//
// setup input buttons
//
buttons[0].pin = BUTTON;
buttons[0].waitForReleased = false;
buttons[1].pin = BUTTONCOLOR;
buttons[1].waitForReleased = false;
De feitelijke routine
de code geeft een true terug als de knop daadwerkelijk is ingedrukt en false indien niet of dat de knop nog niet is losgelaten van de vorige indrukken van de knop.
- Code: Alles selecteren
/**
* @name checkButton (uint8_t dataPin)
* @param dataPin index to button in array
* @returns boolean true=pressed, false=not pressed
* checks if a button is processable or waiting for release. If processable, it checks for the ACTIVE_BUTTON state
*/
boolean checkButton(uint8_t dataPin) {
boolean returnStatus = false; // default button is not pressed
//
// check switch color button
//
if (buttons[dataPin].waitForReleased) {
//
// we are still waiting for the release of the button to be able to process the next
//
if (digitalRead(buttons[dataPin].pin) == !ACTIVE_BUTTON) {
//
// yep button is released
//
buttons[dataPin].waitForReleased = false;
}
} else {
//
// check if the button is pressed
//
if (digitalRead(buttons[dataPin].pin) == ACTIVE_BUTTON) {
//
// wait debounce time
//
delay(DEBOUNCE);
if (digitalRead(buttons[dataPin].pin) == ACTIVE_BUTTON) {
//
// set the return status
//
returnStatus = true;
//
// and do not process this button until it is released
//
buttons[dataPin].waitForReleased = true;
}
}
}
//
// return status to caller
//
return returnStatus;
}
Aanroepen voorbeeld
- Code: Alles selecteren
if (checkButton(demoSwitch)) {
//
// process only if we are in idle mode
//
if (programMode == idle_mode) {
//
// switching to active mode
//
programMode = demo_mode;
//
// set to known state
//
setDemoBackground();
mustUpdate = true;
demoStep = 0;
}
}
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Button debounce hardwarematig
En hoe zou dat nou komen.........ff goed lezen wat er in het voorbeeld staat
Re: Button debounce hardwarematig
nico je maakt het hans niet makkelijk hoor, maar wel terecht denk ik, het is een leerproces.
paul deelen
shooter@home.nl
shooter@home.nl
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Button debounce hardwarematig
Hannes weet hoe mijn programma's eruit zien. Het commentaar geeft aan waarvoor iets is. Dus er mag wel een beetje moeite voor gedaan worden.
Re: Button debounce hardwarematig
Nou Nico, ik begrijp je reactie, maar ik ben volop aan het schilderen en doen in mijn nieuwe woning.
Die vraag kwam ff tussendoor omdat ik het niet wilde vergeten.
Ik ben stikgaar en bekeek de code even gauw voor het slapen gaan.
Er moeite voor doen zit er even niet in, maar ik heb de code op mijn laptop opgeslagen en kom er wel een keer uit.
Ik ben al blij dat er iets staat waar ik straks wat mee kan.
Die vraag kwam ff tussendoor omdat ik het niet wilde vergeten.
Ik ben stikgaar en bekeek de code even gauw voor het slapen gaan.
Er moeite voor doen zit er even niet in, maar ik heb de code op mijn laptop opgeslagen en kom er wel een keer uit.
Ik ben al blij dat er iets staat waar ik straks wat mee kan.
33 berichten
• Pagina 1 van 4 • 1, 2, 3, 4
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 53 gasten