简 介: 通过ESP32 对于KYTB角度编码器进行测试,初步验证了KYTB的基本功能。由于ESP32的端口中断具有最大上限频率,通过实验测量到这个频率大约为26kHz。
关键词
: 角度编码器,KYTB,ESP32
§01 角度编码器
这款角度编码器来自于北京科宇提供的车模上配套的微型编码器。型号:KYTB-1503-1024。
一、基本信息
1、外部接口
根据传感器铭牌标示,其外部引线为 6 跟线,对应的功能定义为:
【表1-1 编码器管脚功能定义】PIN1 | PIN2 | PIN3 | PIN4 | PIN5 | PIN6 |
---|---|---|---|---|---|
GND | 3 ~ 5V | A | B | Z | NC |
2、信号测量
-
测试条件:
-
VCC电压
: +5V
▲ 图1.1.1 A,B电压波形
▲ 图1.1.2 Z,A波形
§02 计数实验
一、实验方案
1、实验平台
使用 ESP32-S模块转接板设计与实现 硬件模块。 根据 MicroPython: Interrupts with ESP32 and ESP8266 | Random Nerd Tutorials 中关于ESP32端口中断介绍,使用ESP32端口中断完成对于KYTB-1503 输出脉冲的计数。
2、连线方案
安装下面表格将传感器连接如ESP32转接模块最右边的三个输出管脚。
【表2-1 连接方案】A | B | C |
---|---|---|
GPIO2 | GPIO16 | GPIO17 |
为了使得输出的信号能够兼容ESP32电平(3.3V),对于角度传感器工作电源设置为3.3V。
▲ 图2.0 实验平台
二、编程实验
1、基本计数实验
(1) 实验Python代码
from machine import Pin,Timer
import time
zcount = 0
acount = 0
bcount = 0
allcount = 0
pina = Pin(2, Pin.IN)
pinb = Pin(16, Pin.IN)
pinz = Pin(17, Pin.IN)
def ISR_abz(pin):
global acount, bcount, zcount, allcount
if pin == pina:
acount += 1
if pin == pinb:
bcount += 1
if pin == pinz:
zcount += 1
allcount += 1
pina.irq(trigger=Pin.IRQ_RISING, handler=ISR_abz)
pinb.irq(trigger=Pin.IRQ_RISING, handler=ISR_abz)
pinz.irq(trigger=Pin.IRQ_RISING, handler=ISR_abz)
while True:
print((acount, bcount, zcount, allcount))
time.sleep_ms(250)
(2) 输出结果
▲ 图2.1 程序输出计数结果
2、角度计数
根据A的上升沿脉冲进行计数,根据B的电平高低判断是递增还是递减。
利用Z脉冲完成清零。
(1) 实现代码
from machine import Pin,Timer
import time
acount = 0
allcount = 0
pina = Pin(2, Pin.IN)
pinb = Pin(16, Pin.IN)
pinz = Pin(17, Pin.IN)
def ISR_abz(pin):
global acount, allcount
if pin == pina:
acount += 1
if pinb.value() == 0:
allcount += 1
else: allcount -= 1
if pin == pinz:
allcount = 0
acount = 0
pina.irq(trigger=Pin.IRQ_RISING, handler=ISR_abz)
pinz.irq(trigger=Pin.IRQ_RISING, handler=ISR_abz)
while True:
print((acount, allcount))
time.sleep_ms(25X)
(2) 输出结果
可以看到输出的 A, ALLCOUNT两个变量,转向一边的时候,它们是相同的递增,当相反旋转的时候,它们是正负取值。
可以验证,计数的范围 0 ~ 1023。
▲ 图2.2 技术模式输出结果
3、脉冲丢失
由于使用了端口中断来获得对应的脉冲个数,如果角度编码器旋转过快,则会出现脉冲丢失情况。
在 ISR中,Z脉冲出现的时候,保持其中的ALLCOUNT变量,可以看到当编码器旋转快的时候, ALLCOUNT的最大值小于1024。 这说明在其中会出现很多的脉冲丢失。
§03 ESP32计数
在前面使用ESP32计数过程中,由于使用了端口中断来对脉冲进行计数,出现了脉冲丢失现象。那么ESP32的端口中断最快能够响应多大频率的计数呢?
一、测试ESP32端口中断最大频率
1、测试方案
使用DG1062数字可编程信号源发生器,输出方波,送入ESP32 GPIO2 引起端口中断。在ESP32中使用定时器产生1秒中的中断,对于GPIO2的计数进行读取。测试在输入信号多大的时候,计数开始有丢失。
(1) 测试Python代码
from machine import Pin,Timer
import time
acount = 0
allcount = 0
pina = Pin(2, Pin.IN)
keepa = 0
time1count = 0
def ISR_abz(pin):
global acount, allcount, keepz
if pin == pina:
acount += 1
pina.irq(trigger=Pin.IRQ_RISING, handler=ISR_abz)
def time_isr(n):
global keepa, acount, time1count
keepa = acount
acount = 0
time1count += 1
tim0 = Timer(0)
tim0.init(period=1000, mode=Timer.PERIODIC, callback=time_isr)
while True:
print((acount, keepa, time1count))
time.sleep_ms(250)
2、测试结果
在输入频率小于15kHz时,输出的数字总是与频率相同。当输入频率大于15kHz的时候,输出数字开始有丢失数字。
(1) MicroPython程序
from machine import Pin,Timer
import time
acount = 0
allcount = 0
pina = Pin(2, Pin.IN)
keepa = 0
time1count = 0
def ISR_abz(pin):
global acount, allcount, keepz
if pin == pina:
acount += 1
pina.irq(trigger=Pin.IRQ_RISING, handler=ISR_abz)
def time_isr(n):
global keepa, acount, time1count
keepa = acount
acount = 0
time1count += 1
tim0 = Timer(0)
tim0.init(period=1000, mode=Timer.PERIODIC, callback=time_isr)
while True:
key = input()
print(keepa)
(2) 测量程序
from headm import *
from tsmodule.tsvisa import *
dg1062open(113)
dg1062freq(1, 10000)
def thonnycmd(cmd):
tspsendwindowkey('Thonny', 's', alt=1, noreturn=1)
tspsendwindowkey('Thonny', '%s
'%cmd, noreturn=1)
def thonnyshs(cmd='', wait=0):
tspsendwindowkey('Thonny', 's', alt=1, noreturn=1)
if len(cmd) > 0:
tspsendwindowkey('Thonny', '%s\r'%cmd, noreturn=1)
if wait > 0:
time.sleep(wait)
tspsendwindowkey('Thonny', 'ac', control=1, noreturn=1)
tspfocuswindow('TEASOFT:1')
return clipboard.paste()
setf = linspace(25000, 27000, 50)
testdim = []
for f in setf:
dg1062freq(1, floor(f))
time.sleep(2)
pastestr = thonnyshs('\r', 0.1).split()
x = float(pastestr[-1])
testdim.append(floor(f) - x)
printff(f, x)
tspsave('measure', setf=setf, out=testdim)
plt.plot(setf, testdim)
plt.xlabel("Frequency(Hz)")
plt.ylabel("Error")
plt.grid(True)
plt.tight_layout()
plt.show()
printf('\a')
(3) 测量结果
▲ 图3.1.1 不同频率下的计数错误
▲ 图3.1.2 不同频率下的计数错误
▲ 图3.1.3 不同频率下的计数错误
可以看到当频率实际超过26kHz的时候,输出的误差会突然增加了。
※ 实验结论 ※
对于来自于科宇的角度编码器进行了初步测试。对于它的接口信号功能进行确认。
利用ESP32的端口中断功能来对于角度传感器的脉冲进行计数。如果脉冲的频率快的话,会出现一定的脉冲丢失现象。
使用DG1062可编程信号源对于ESP32的端口中断最大程序进行测试,当频率超过26kHz时,丢失脉冲的线性会突然增加。
■ 相关文献链接:
● 相关图表链接:
- 表1-1 编码器管脚功能定义
- 图1.1.1 A,B电压波形
- 图1.1.2 Z,A波形
- 表2-1 连接方案
- 图2.0 实验平台
- 图2.1 程序输出计数结果
- 图2.2 技术模式输出结果
- 图3.1.1 不同频率下的计数错误
- 图3.1.2 不同频率下的计数错误
- 图3.1.3 不同频率下的计数错误