Hallo
Also hier ist mal meine selbst geschriebene Drehrichtungsauswertung.
Der Code sollte durch die Kommentare selbsterklärend sein.
Für Tipps und/oder Hinweise bin ich dankbar
Code:
////////////////////Richtungszustände
int d1=0; int d2=0; int d3=0; //Drehgeber 1....3, Vorwärts=1 Rückwärts=0
int encoder1 [4]={0,0,0,0}; //alte und neue Drehgebersignale
int encoder2 [4]={0,0,0,0}; //[0] Spur A neu [1] Spur B neu
int encoder3 [4]={0,0,0,0}; //[2] Spur B alt [3] Spur B alt
////////////////////////////////////////////////////////////////////////////////////////////////
//// MAIN //////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////
void main(void){
Init_Device(); // Initialisierung des Devices
while(TRUE){
d1=drehrichtungsauswertung (encoder1,d1); // Aufruf der Funktion zum auswerten der Drehrichtung
d2=drehrichtungsauswertung (encoder2,d2);
d3=drehrichtungsauswertung (encoder3,d3);
.
.....
........
int drehrichtungsauswertung (int *encoder,int r){
int neu=00;
int alt=00;
encoder[2] = encoder[0]; //Speichern der alten Encoderzustände
encoder[3] = encoder[1];
encoder[0]=A1; //Einlesen der neuen Encoderzustände
encoder[1]=B1;
if (encoder[0]==0 && encoder[1]==0) neu=00; //Wandeln des neuen Zustandes in dez. Zahl
if (encoder[0]==0 && encoder[1]==1) neu=01;
if (encoder[0]==1 && encoder[1]==0) neu=10;
if (encoder[0]==1 && encoder[1]==1) neu=11;
if (encoder[2]==0 && encoder[3]==0) alt=00; //Wandeln des alten Zustandes in dez. Zahl
if (encoder[2]==0 && encoder[3]==1) alt=01;
if (encoder[2]==1 && encoder[3]==0) alt=10;
if (encoder[2]==1 && encoder[3]==1) alt=11;
if (alt!=neu ) //Abfrage ob sich die Zustände des Drehgebers überhaupt geändert haben
{
if (alt==00) { // Welchen "alten" Zustand hatten wir
switch (neu){
case 01 :{ r=1; break;} //Je nach neuem Zustand vor oder rückwärts
case 10: { r=0; break;} } } //Je nach neuem Zustand vor oder rückwärts
if (alt==01) { // Welchen "alten" Zustand hatten wir
switch (neu){
case 11 :{ r=1; break;} //Je nach neuem Zustand vor oder rückwärts
case 00: { r=0; break;} } } //Je nach neuem Zustand vor oder rückwärts
if (alt==10) { // Welchen "alten" Zustand hatten wir
switch (neu){
case 00 :{ r=1; break;} //Je nach neuem Zustand vor oder rückwärts
case 11: { r=0; break;} } } //Je nach neuem Zustand vor oder rückwärts
if (alt==11) { // Welchen "alten" Zustand hatten wir
switch (neu){
case 10 :{ r=1; break;} //Je nach neuem Zustand vor oder rückwärts
case 01: { r=0; break;} } } //Je nach neuem Zustand vor oder rückwärts
//Mögliche Fehler werden nicht abgefragt. Treten diese auf, bleibt die alte Drehrichtung gespeichert
} // Klammer der if (alt!=neu ) Schleife
return r; // Die Drehrichtung wir zurück gegeben (r=1 Vorwärts, r=0 Rückwärts)
} // Ende Funktion "drehrichtungsauswertung"
Lesezeichen