Hallo,
ich habe ein Programm geschrieben das den Inkremantalgeber STEC12E08 von
Alps auslesen soll. Es verwendet eine Array als Statemachine.
Der es funktioniert teilweise. Der Zähler "ink_count" wird hochgezählt
aber er schwankt immer um Plus Minus 1 ohne das ich was mache selbst
wenn der Geber nicht angeschlossen ist.
Hier ist der Code den ich mir ausgedacht habe:
// Inkremantalgeber Auswertung (Reichelt: ALPS STEC12E08)
#define bit7 7
#define bit6 6
#define bit5 5
#define bit4 4
#define bit3 3
#define bit2 2
#define bit1 1
#define bit0 0
int inkPin50 = 50;
int inkPin51 = 51;
volatile int ink_count = 0;
char state =6 ;
char oldState=6;
// Anfangszustand
// State-Machine Automatentabelle
// der Ist-State (Zustand) steht in der [Klammer] hinter machine
// die Zustände in die vom Ist-State gesprungen werden kann
// stehen hinter der Klammer.
char machine[7][4] = {
{ 0, 0, 1, 2 }, // Ist-State 0
{ 0, 1, 1, 3 }, // Ist-State 1
{ 0, 2, 2, 5 }, // Ist-State 2
{ 1, 3, 3, 4 }, // Ist-State 3
{ 2, 2, 2, 2 }, // Ist-State 4
{ 3, 3, 3, 3 }, // Ist-State 5
{ 0, 1, 2, 3 }, // Ist-State 6
};
void setup(){
pinMode(inkPin50, INPUT); // konfiguriert Pin als
Input
pinMode(inkPin51, INPUT); // konfiguriert Pin als
Input
digitalWrite(inkPin50, HIGH); // schaltet internen Pull Up
Widerstand ein
digitalWrite(inkPin51, HIGH); // schaltet internen Pull Up
Widerstand ein
Serial.begin(9600); // Serielle Schnittstelle
konfigurieren
}
void loop(){
inkrementalgeber();
if (state!=oldState)
{
// Serial.println("\nInk_Counter =");
Serial.println(ink_count);
}
}
int inkrementalgeber(){
// inkPin51 wird nach links geschoben und mit inkPin50 oder verknüpft
// so das inkPin51 bit 1 und inkPin50 bit 0 der Variable den nächsten
// State bestimmen
int condition = (digitalRead(inkPin51) << bit1) | (digitalRead
(inkPin50) << bit0); condition ist
// Der Aktuelle State und die Condition bestimmen den nächsten State
state = machine[state][condition];
// Der ink_counter wird im State 4 um eins erhöht
if(state == 4) ink_count++;
// Der ink_counter wird im State 5 um eins erniedrigt
if(state == 5) ink_count--;
}
Ich hab meinen Fehler gefunden, jetzt funktioniert es.
char machine[7][4] = {
{ 0, 1, 2, 0 }, // Ist-State 0
{ 0, 1, 1, 3 }, // Ist-State 1
{ 0, 2, 2, 5 }, // Ist-State 2
{ 3, 1, 4, 3 }, // Ist-State 3
{ 2, 2, 2, 2 }, // Ist-State 4
{ 3, 3, 3, 3 }, // Ist-State 5
{ 0, 1, 2, 3 }, // Ist-State 6
};
ich hatte bei den neuen States einen Fehler gemacht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.