Hoe u een encoderwaarde uitleest, is afhankelijk van het type encoder. De uitleesmethoden voor incrementele en absolute encoders worden hieronder beschreven.
Incrementele encoder
Incrementele encoders leveren twee uitgangssignaalkanalen: Kanaal A en Kanaal B. Dit zijn pulssignalen die 90 elektrische graden ten opzichte van elkaar verschoven zijn. Door de toestandsveranderingen op Kanaal A en Kanaal B te detecteren, kunt u zowel de draairichting als de draaihoek bepalen. Hieronder vindt u de basisstappen voor het uitlezen van een incrementele encoder met een Arduino.
- Sluit Kanaal A en Kanaal B van de encoder aan op interrupt-geschikte pinnen op de Arduino (bijvoorbeeld pin 2 en 3).
- Definieer een globale variabele in de Arduino-code om de encodertelling op te slaan.
- Schrijf een interrupt service routine (ISR) om toestandsveranderingen op Kanaal A en Kanaal B af te handelen. Bepaal in deze routine de draairichting door de huidige toestand van het ene kanaal te vergelijken met de vorige toestand van het andere kanaal, en werk vervolgens de encodertelling dienovereenkomstig bij.
volatile long encoderCount = 0;
int lastB = 0;
void encoderInterrupt() {
int A = digitalRead(2);
int B = digitalRead(3);
// Eenvoudige quadratuurdecodering: vergelijk huidige A met vorige B
if (A == lastB) {
encoderCount++;
} else {
encoderCount--;
}
lastB = B;
}
- Configureer in de
setup()-functie de pinmodi en koppel de interrupts, zodat de ISR wordt geactiveerd telkens wanneer de toestand van Kanaal A of Kanaal B verandert.
void setup() {
pinMode(2, INPUT);
pinMode(3, INPUT);
lastB = digitalRead(3);
attachInterrupt(digitalPinToInterrupt(2), encoderInterrupt, CHANGE);
attachInterrupt(digitalPinToInterrupt(3), encoderInterrupt, CHANGE);
}
- Lees in de hoofd-
loop()de variabeleencoderCountuit om de relatieve positie en draairichting van de motoras te verkrijgen.
Opmerking: Het bovenstaande voorbeeld maakt gebruik van een vereenvoudigde quadratuurdecoderingsmethode. Voor hogesnelheids- of hogeresolutie-encoders kunt u overwegen een volledige quadratuur-toestandsmachine of een speciale encoder-interfacebibliotheek te gebruiken om gemiste tellingen als gevolg van signaalruis of contactdender te voorkomen.
Absolute encoder
Absolute encoders geven een digitaal signaal uit dat de absolute positie van de motoras weergeeft. Het onderstaande voorbeeld is specifiek van toepassing op parallelle-uitgang absolute encoders, waarbij elke bit van de positiewaarde op een aparte datadraad wordt aangeboden.
Opmerking: De meeste industriële absolute encoders maken gebruik van seriële communicatie-interfaces zoals SSI, SPI of RS-485 in plaats van parallelle uitgangen. Deze interfaces vereisen andere uitleesmethoden en in sommige gevallen speciale protocolbibliotheken. Raadpleeg altijd het datasheet van uw encoder voor de juiste interface- en bedradingsgegevens.
- Sluit elke datapin van de encoder aan op een digitale ingangspin op de Arduino.
- Stel in de
setup()-functie elke datapin in op ingangsmodus.
void setup() {
pinMode(dataPin1, INPUT);
pinMode(dataPin2, INPUT);
// ... Aanvullende datapinnen, afhankelijk van het aantal encoderbits
}
- Schrijf een functie om de encoderwaarde uit te lezen. Lees in deze functie de toestand van elke datapin met
digitalRead()en combineer de resultaten tot één geheel getal.
int readEncoder() {
int value = 0;
value |= digitalRead(dataPin1) << 0;
value |= digitalRead(dataPin2) << 1;
// ... Aanvullende datapinnen, afhankelijk van het aantal encoderbits
return value;
}
- Roep in de hoofd-
loop()de functiereadEncoder()aan om de absolute positie van de motoras te verkrijgen.
Opmerking: Deze voorbeelden behandelen basale encodertypen. Encoders in praktijktoepassingen kunnen geavanceerdere verwerking vereisen, zoals het implementeren van signaalontdendering of het gebruik van een speciale encoder-interface-IC. Raadpleeg altijd het datasheet van de encoder om juiste bedrading en signaalverwerking te waarborgen.