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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.