微型角度编码器 : KYTB-1503-1024

微型角度编码器 : KYTB-1503-1024

简 介: 通过ESP32 对于KYTB角度编码器进行测试,初步验证了KYTB的基本功能。由于ESP32的端口中断具有最大上限频率,通过实验测量到这个频率大约为26kHz。

关键词 角度编码器KYTBESP32

 

§01 度编码器


  款角度编码器来自于北京科宇提供的车模上配套的微型编码器。型号:KYTB-1503-1024。

一、基本信息

1、外部接口

  根据传感器铭牌标示,其外部引线为 6 跟线,对应的功能定义为:

【表1-1 编码器管脚功能定义】

PIN1 PIN2 PIN3 PIN4 PIN5 PIN6
GND 3 ~ 5V A B Z NC

2、信号测量

测试条件:
VCC电压: +5V

微型角度编码器 : KYTB-1503-1024

▲ 图1.1.1 A,B电压波形

微型角度编码器 : KYTB-1503-1024

▲ 图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。

微型角度编码器 : KYTB-1503-1024

▲ 图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) 输出结果

微型角度编码器 : KYTB-1503-1024

▲ 图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。

微型角度编码器 : KYTB-1503-1024

▲ 图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) 测量结果

微型角度编码器 : KYTB-1503-1024

▲ 图3.1.1 不同频率下的计数错误

微型角度编码器 : KYTB-1503-1024

▲ 图3.1.2 不同频率下的计数错误

微型角度编码器 : KYTB-1503-1024

▲ 图3.1.3 不同频率下的计数错误

  可以看到当频率实际超过26kHz的时候,输出的误差会突然增加了。

 

验结论 ※


  于来自于科宇的角度编码器进行了初步测试。对于它的接口信号功能进行确认。

  利用ESP32的端口中断功能来对于角度传感器的脉冲进行计数。如果脉冲的频率快的话,会出现一定的脉冲丢失现象。

  使用DG1062可编程信号源对于ESP32的端口中断最大程序进行测试,当频率超过26kHz时,丢失脉冲的线性会突然增加。


■ 相关文献链接:

● 相关图表链接:

上一篇:107-ESP32_SDK开发-flash数据存储nvs


下一篇:ESP32开发实例-FreeRTOS-中断服务与任务通知