Théophile R.
Théophile R.

Reputation: 21

Problem handling interruption with Raspberry Pi 4 with a DC Motor

I have some troubles handling interruptions with my Raspberry Pi 4, using Python.

I have a DC motor with an encoder , I would like to make a speed control of this motor. But I have some issues with reading the encoder values with my Raspberry.

Here is the code I run :

import RPi.GPIO as GPIO

GPIO.setmode(GPIO.BCM)
HallA = 5 # GPIO pin for Hall A
HallB = 6 # GPIO pin for Hall B

GPIO.setup(HallA, GPIO.IN) #set up the input
GPIO.setup(HallB, GPIO.IN)

incmot = 0 # set up the counter
        
def encodeur_inc(channel) : #function of the interruption
    B = GPIO.input(HallB) #read the second signal
    global incmot
    if B == 1 :
        incmot = incmot +1
    else :
            incmot = incmot -1

GPIO.add_event_detect(HallA, GPIO.RISING, callback = encodeur_inc) #setting up the interruption

try :
    while True :
        print(incmot)

except :
    GPIO.cleanup()

The problem is that, for the same number of revolutions, I get a different number of pulses each time (from 480 to 650 pulses per revolution, while the manufacturer announces 690). I tried to identify where the problem could come from:

GPIO.output(20, GPIO.HIGH) #at the beginning of the function
GPIO.output(20, GPIO.LOW)  #at the end of the function

So I don't see where the inconsistencies I see could come from. I you have any clue that could help me don't hesitate.

Thanks for your help !

Upvotes: 1

Views: 638

Answers (1)

Théophile R.
Théophile R.

Reputation: 21

Thanks to @quamrana, I understood where the problem came from. When the program was interrupted, the time taken to execute the interrupt was variable and, going clockwise, Hall B could be at 1 or 0, instead of 1 all the time.

To get around this problem, using a D latch allows Python time to execute the interrupt and correctly read whether the engine is moving forward or backward. Hall A is the clock of the latch and Hall B is the data.

Upvotes: 1

Related Questions