Более быстрые циклы квадратурного декодера с кодом Python
Я работаю с BeagleBone Black и использую библиотеку Adafruit IO Python. Написал простую функцию квадратурного декодирования, и она отлично работает, когда двигатель работает на скорости около 1800 об / мин. Но когда двигатель работает на более высоких скоростях, в коде пропускаются некоторые прерывания, и при подсчете энкодера начинают накапливаться ошибки. Ребята, есть ли у вас какие-либо предложения относительно того, как я могу сделать код более эффективным, или есть ли функции, которые могут циклически прерывать прерывания с большей частотой.
Спасибо Кел
Вот код:
# Define encoder count function
def encodercount(term):
global counts
global Encoder_A
global Encoder_A_old
global Encoder_B
global Encoder_B_old
global error
Encoder_A = GPIO.input('P8_7') # stores the value of the encoders at time of interrupt
Encoder_B = GPIO.input('P8_8')
if Encoder_A == Encoder_A_old and Encoder_B == Encoder_B_old:
# this will be an error
error += 1
print 'Error count is %s' %error
elif (Encoder_A == 1 and Encoder_B_old == 0) or (Encoder_A == 0 and Encoder_B_old == 1):
# this will be clockwise rotation
counts += 1
print 'Encoder count is %s' %counts
print 'AB is %s %s' % (Encoder_A, Encoder_B)
elif (Encoder_A == 1 and Encoder_B_old == 1) or (Encoder_A == 0 and Encoder_B_old == 0):
# this will be counter-clockwise rotation
counts -= 1
print 'Encoder count is %s' %counts
print 'AB is %s %s' % (Encoder_A, Encoder_B)
else:
#this will be an error as well
error += 1
print 'Error count is %s' %error
Encoder_A_old = Encoder_A # store the current encoder values as old values to be used as comparison in the next loop
Encoder_B_old = Encoder_B
# Initialize the interrupts - these trigger on the both the rising and falling
GPIO.add_event_detect('P8_7', GPIO.BOTH, callback = encodercount) # Encoder A
GPIO.add_event_detect('P8_8', GPIO.BOTH, callback = encodercount) # Encoder B
# This is the part of the code which runs normally in the background
while True:
time.sleep(1)
1 ответ
Делаем код более эффективным...
def encodercount(term):
global counts
global Encoder_A
global Encoder_A_old
global Encoder_B
global Encoder_B_old
global error
Encoder_A,Encoder_B = GPIO.input('P8_7'),GPIO.input('P8_8')
if ((Encoder_A,Encoder_B_old) == (1,0)) or ((Encoder_A,Encoder_B_old) == (0,1)):
# this will be clockwise rotation
counts += 1
print 'Encoder count is %s\nAB is %s %s' % (counts, Encoder_A, Encoder_B)
elif ((Encoder_A,Encoder_B_old) == (1,1)) or ((Encoder_A,Encoder_B_old) == (0,0)):
# this will be counter-clockwise rotation
counts -= 1
print 'Encoder count is %s\nAB is %s %s' % (counts, Encoder_A, Encoder_B)
else:
#this will be an error
error += 1
print 'Error count is %s' %error
Encoder_A_old,Encoder_B_old = Encoder_A,Encoder_B
# Initialize the interrupts - these trigger on the both the rising and falling
GPIO.add_event_detect('P8_7', GPIO.BOTH, callback = encodercount) # Encoder A
GPIO.add_event_detect('P8_8', GPIO.BOTH, callback = encodercount) # Encoder B
# This is the part of the code which runs normally in the background
while True:
time.sleep(1)
Наибольшая выгода придет от одного звонка print
, Печать на stdout
в целом медленный, и это ограничит производительность вашей программы. Вы должны распечатать только каждый 20-й раз или несколько реже.