入手pyb nano很长时间了,也没正经做过什么东西,最近正好有个测量位移的需求,使用OMRON E6A2-CW3C增量式编码器(每圈100个脉冲),在此记录下。
我选用的旋转编码器是OMRON E6A2-CW3C增量式编码器(每圈100个脉冲),总共4根线(两相),一根供电(5-12v),一根GND,一根信号A,一根信号B。选用的测位移滚轮周长为100mm。也就是1个脉冲对应1mm位移。
编码器官方信息:https://www.fa.omron.com.cn/product/item/2344/
由于之前没有使用过这类编码器(其实我完全是个小白,纯属现学现卖),所以上网搜了一下,代码是根据自己对于编码器的工作原理写的,不对之处还请指正。
编码器的A相B相各产生1个方波信号,且相互之间会错开90度,也就是说一个脉冲里有4个参考点,可以根据A和B信号的电平高低相互比较来确认旋转方向。
接线很简单,编码器的供电线接到pyb nano上的VIN,GND接GND,信号A和B随便接2个GPIO,我选择的是Y9和Y10。采用中断的方式读取信号。
代码: 全选
import machine
def callback(t):
'''
Get displacement(delta) measurement by interrupt
'''
global out_a, out_b, delta
a_state = out_a.value() # Read signal A
b_state = out_b.value() # Read signal B
if a_state == b_state: # Compare A & B to get the direction
delta += 0.25 * (100 / 100) # 0.25 muliply circumference (100mm in my case) devided by pulse per rotation (100p/r in my case)
else:
delta -= 0.25 * (100 / 100)
# Signal A & B of the rotary encoder
out_a = machine.Pin('Y9', machine.Pin.IN, machine.Pin.PULL_UP) # pull up the pin
out_b = machine.Pin('Y10', machine.Pin.IN, machine.Pin.PULL_UP)
# Initialize the displacement
delta = 0
# Get displacement reading when sensing a pulse
out_a.irq(trigger=machine.Pin.IRQ_FALLING | machine.Pin.IRQ_RISING, handler=callback)
while True: # Print the displacement
print(delta)