13. Arduino for Production!! How to Receive Stable GPIO PUSH Button Input onthe ARM Microcontroller - Software Debouncing Part 2

13. Arduino für die Produktion!! Wie man stabile GPIO-Taster-Eingaben auf dem ARM-Mikrocontroller empfängt – Software-Debouncing Teil 2

Im ersten Teil habe ich das Konzept des Software-Debouncing erklärt und wie ein mechanischer Taster beim Drücken eine Prellung erzeugt. Wir haben auch etwas Pseudocode geschrieben, um zu erklären, wie der Ablauf im Programm aussehen würde.

Wir werden mit den Variablen beginnen. Der Pseudocode für die Variablen sah so aus:

// Variable für gedrückten Button initialisieren
// Konfidenzlevel für gedrückten Button initialisieren
// Konfidenzlevel für losgelassenen Button initialisieren

Die Verwendung des Schlüsselworts volatile sorgt dafür, dass die Variablen nicht optimiert werden. Wir möchten, dass diese Variablen dynamisch sind, da sie sich ständig ändern werden. Die Verwendung des Variablentyps char liegt daran, dass es der kleinste gängige Typ mit nur 8 Bit ist. Wir werden in diesem Variablentyp nur 0 und 1 speichern. Dieser Variablentyp kann entweder signed oder unsigned sein. Wenn er signed ist, kann er Werte von -128 bis +128 speichern, andernfalls speichert er die unsigned-Werte von 0 bis 255. Alle Variablen werden auf 0 initialisiert.

Der buttonPressedConfidenceLevel wird ein int (Integer) sein, da es eine Variable ist, die die Stichproben von Einsen (hoher digitaler Signalpegel) zählt. Die Stichprobenanzahl kann sehr hoch werden, wenn man sie lässt. Außerdem wird eine weitere Variable eingeführt, um den Konfidenzschwellenwert zu speichern. Es ist wichtig zu erwähnen, dass die Zahl, die Sie für den Konfidenzschwellenwert verwenden, geändert werden sollte, wenn die Prozessorgeschwindigkeit schneller oder langsamer ist. Die Zahl hier sollte wirklich auf einer Variablen basieren, die die Hauptprozessorgeschwindigkeit enthält, und die Konfidenzschwellenwertzahl kann ein Teiler oder Koeffizient davon sein.

// Variable für gedrückten Button initialisieren
volatile char buttonPressed = 0;

// Konfidenzlevel für gedrückten Button initialisieren
volatile int buttonPressedConfidenceLevel = 0;

// Konfidenzlevel für losgelassenen Button initialisieren
volatile int buttonReleasedConfidenceLevel = 0;

// Konfidenzschwellenwert initialisieren
volatile int confidenceThreshold = 200;

In der While-Schleife können wir beginnen, die Bedingungen der Variablen buttonPressed zu ändern. Wenn buttonPressed gleich Null ist, können wir ein paar Aktualisierungen an Variablen hinzufügen: der buttonPressedConfidenceLevel kann inkrementiert werden und umgekehrt, der buttonReleasedConfidenceLevel kann Null sein, da am Eingangs-Pin eine Eins anliegt. Dies muss jedoch in den Else-Codeblock eingefügt werden, wenn das Konfidenzniveau den Schwellenwert nicht erreicht hat. Der Grund dafür ist, dass wir nicht wollen, dass das Konfidenzniveau unnötig inkrementiert wird.

Nur weil wir diese Konfidenzlevel-Variablen aktualisieren, bedeutet das nicht, dass der Button gedrückt ist. Wir können nur feststellen, dass der Button gedrückt ist, wenn das Konfidenzlevel größer wird als der von uns festgelegte Schwellenwert.

Dasselbe Konzept wird auf den Bereich innerhalb der Bedingung buttonPressed == 1 angewendet, nur umgekehrt, da wir das losgelassene und nicht das gedrückte Konfidenzniveau betrachten.

// Wenn der Button gedrückt ist (IDR - Eingabedatenregister)
if (GPIOB->IDR & GPIO_IDR_1)
{
if (buttonPressed == 0)
{
// sobald die Button-Gedrückt-Konfidenz den Konfidenzschwellenwert überschritten hat
if (buttonPressedConfidenceLevel > confidenceThreshold)
{
// LEDs umschalten

// Die Variable "buttonPressed" auf 1 aktualisieren
buttonPressed = 1;
}
else
{
// Das Konfidenzlevel für "Button gedrückt" erhöhen
buttonPressedConfidenceLevel ++;
buttonReleasedConfidenceLevel = 0;
}
}
}
else
{
if (buttonPressed == 1)
{
// Sobald das Konfidenzniveau für das Loslassen der Taste erreicht wurde
if (buttonReleasedConfidenceLevel > confidenceThreshold)
{
// Die Variable "buttonPressed" auf 0 aktualisieren
buttonPressed = 0;
}
else
{
// Erhöhen des Konfidenzniveaus für den losgelassenen Button
buttonReleasedConfidenceLevel ++;
buttonPressedConfidenceLevel = 0;
}
}
}


Da wir das BSRR-Register verwenden, um den Ein- und Ausschaltzustand des Pins einzustellen, müssen wir eine Bedingung erstellen, um den Ein- oder Ausschaltzustand des Ausgangspins zu speichern und diesen Zustand zur richtigen Zeit zu ändern, anstatt nur die Umschalt-Bit-Operation zu verwenden. Dies ist notwendig, da das Setzen und Zurücksetzen des Pin-Zustands immer eine 1 in das Bit für Setzen und Zurücksetzen setzt und die Bits an verschiedenen Stellen des Registers liegen. Das ODR-Register kann an denselben Bitpositionen gesetzt und zurückgesetzt werden, aber in diesem Beispiel verwenden wir das BSRR, und dies bietet auch eine Alternative zum bitweisen Umschaltoperator (^).

Schauen wir uns an, wie man die LEDs oder den Ausgangspin umschaltet. Zuerst müssen wir eine neue Variable hinzufügen, die den LED-Status (ob sie an oder aus ist) speichert.

// LED-Listenstatus
LEDState = 0;
Nun können wir uns auf den eigentlichen Umschaltcode konzentrieren. Wenn der LED-Status nicht leuchtet (0), ändern Sie den Status auf leuchtend (1) und schalten Sie die LED ein (oder setzen Sie den Pin auf einen hohen Zustand). Andernfalls ändern Sie den Status auf nicht leuchtend (0) und schalten Sie die LED aus (setzen Sie den Ausgangspin zurück).
// LEDs umschalten
if (LEDState == 0)
{
LEDState = 1;
// LED einschalten
GPIOC ->BSRR |= GPIO_BSRR_BS_6;

}
else
{
LEDState = 0;
// LED ausschalten
GPIOC ->BSRR |= GPIO_BSRR_BR_6;

}
Dies kann dem restlichen Programm hinzugefügt werden:

Taste gedrückt (IDR - Eingabedatenregister)
if (GPIOB->IDR & GPIO_IDR_1)
{
if (buttonPressed == 0)
{
// sobald die Button-Gedrückt-Konfidenz den Konfidenzschwellenwert überschritten hat
if (buttonPressedConfidenceLevel > confidenceThreshold)
{

// LEDs umschalten
if (LEDState == 0)
{
LEDState = 1;
// LED einschalten
GPIOC ->BSRR |= GPIO_BSRR_BS_6;

}
else
{
LEDState = 0;
// LED ausschalten
GPIOC ->BSRR |= GPIO_BSRR_BR_6;

}

// Die Variable "buttonPressed" auf 1 aktualisieren
buttonPressed = 1;
}
else
{
// Das Konfidenzlevel für "Button gedrückt" erhöhen
buttonPressedConfidenceLevel ++;
buttonReleasedConfidenceLevel = 0;
}
}
}
else
{
if (buttonPressed == 1)
{
// Sobald das Konfidenzniveau für das Loslassen der Taste erreicht wurde
if (buttonReleasedConfidenceLevel > confidenceThreshold)
{
// Die Variable "buttonPressed" auf 0 aktualisieren
buttonPressed = 0;
}
else
{
// Erhöhen des Konfidenzniveaus für den losgelassenen Button
buttonReleasedConfidenceLevel ++;
buttonPressedConfidenceLevel = 0;
}
}
}


[[TUTORIALMENU(tutorial-arm" frameborder="0" allowfullscreen>
Zurück zum Blog

Hinterlasse einen Kommentar