美文网首页张国平玩树莓派树莓派玩转树莓派
树莓派基础实验26:旋转编码器实验

树莓派基础实验26:旋转编码器实验

作者: Maker张 | 来源:发表于2020-04-11 21:10 被阅读0次

    一、介绍

       旋转编码器是一种机电装置,可将轴或轴的角位置或运动,转换为模拟或数字代码。旋转编码器通常放置在垂直于轴的一侧。旋转编码器用作检测自动化领域中的角度,速度,长度,位置和加速度的传感器。


    二、组件

    ★Raspberry Pi主板*1

    ★树莓派电源*1

    ★40P软排线*1

    ★旋转编码器传感器模块*1

    ★面包板*1

    ★跳线若干

    三、实验原理

    旋转编码器 旋转编码器 旋转编码器模块原理图

       旋转编码器可通过旋转,计数正方向和反方向转动过程中,输出脉冲的次数。旋转计数不像电位计,这种转动计数是没有限制的。配合旋转编码器上的按键,可以复位到初始状态,即从0开始计数。

      工作原理: 增量编码器是一种将旋转位移,转换成周期性的电信号,再把这个电信号转变成计数脉冲,用脉冲的个数表示位移的大小的旋转式传感器。
      在增量编码器中角位移的转换采用了光电扫描原理。读数系统以,由交替的透光窗口和不透光窗口构成的,径向分度盘(码盘)的旋转,为依据,同时被一个红外光源垂直照射。
      光把码盘的图像投射到接收器表面上,接收器覆盖着一层衍射光栅,它具有和码盘相同的窗口宽度。接收器的工作是感受光盘转动所产生的变化,然后将光变化转换成相应的电变化。再使低电平信号上升到较高电平,并产生没有任何干扰的方形脉冲,这就必须用电子电路来处理。
      读数系统通常采用差分方式,即将两个波形一样但相位差为180°的不同信号进行比较,以便提高输出信号的质量和稳定性。读数是在两个信号的差别基础上形成的,从而消除了干扰。

    工作原理图

      增量编码器给出两相方波,它们的相位差90°,通常称为A通道和B通道。其中一个通道给出与转速相关的信息,与此同时,通过两个通道信号进行顺序对比,得到旋转方向的信息。还有一个特殊信号称为Z或零通道,该通道给出编码器的绝对零位(恢复按钮),此信号是一个方波与A通道方波的中心线重合。

      增量型编码器精度取决于机械和电气两种因素,这些因素有:光栅分度误差、光盘偏心、轴承偏心、电子读数装置引入的误差以及光学部分的不精确性。确定编码器精度的测量单位是电气上的度数,编码器精度决定了编码器产生的脉冲分度。以下用360°电气度数来表示机械轴的转动,而轴的转动必须是一个完整的周期。要知道多少机械角度相当于电气上的360度,可以用下列公式来计算: 电气360 =机械360°/n°脉冲/转。

    A、B换向时信号

      编码器分度误差是以电气角度为单位的,两个连续脉冲波的最大偏移来表示。误差存在于任何编码器中,这是由前述各因素引起的。增量型编码器的最大误差为±25电气角度(在已声明的任何条件下),相当于额定值偏移±7%,至于相位差90°(电气上)的两个通道的最大偏差为±35电气度数相当于额定值偏移±10%左右。

      除了上述传统的编码器外,还有一些是与其它的电气输出信号集成在一起的增量型编码器。与UVW信号集成的增量型编码器就是实例,它通常应用于交流伺服电机的反馈。这些磁极信号一般出现在交流伺服电机中,UVW信号一般是通过模拟磁性原件的功能而设计的。在增量型编码器中,这些UVW信号是用光学方法产生,并以三个方波的形式出现,它们彼此偏移120°。为了便于电机启动,控制电动机用的启动器需要这些正确的信号。这些UVW磁极脉冲可在机械轴旋转中重复许多次,因为它们直接取决于所连接的电机磁极数,并且用于4、6或更多极电机的UVW信号。

      本次实验中,顺时针旋转时,打印的值变大;逆时针旋转,数值减小;按下旋转按钮时,复位到初始状态,即从0开始计数。

    四、实验步骤

      第1步:连接电路。

    树莓派 T型转接板 超声波测距模块
    GPIO0 G17 CLK
    GPIO1 G18 DT
    GPIO2 G27OUT SW
    5V 5V VCC
    GND GND GND
    旋转编码器实验电路图 旋转编码器实验实物接线图

      第2步:编写控制程序。顺时针旋转时,打印的值变大;逆时针旋转,数值减小;按下旋转按钮时,复位到初始状态,即从0开始计数。

    实验打印结果截图
    #!/usr/bin/env python
    import RPi.GPIO as GPIO
    import time
    
    RoAPin = 11    # CLK Pin
    RoBPin = 12    # DT Pin
    BtnPin = 13    # Button Pin
    
    globalCounter = 0
    
    flag = 0
    Last_RoB_Status = 0
    Current_RoB_Status = 0
    
    def setup():
        GPIO.setmode(GPIO.BOARD)       # Numbers GPIOs by physical location
        GPIO.setup(RoAPin, GPIO.IN)    # input mode
        GPIO.setup(RoBPin, GPIO.IN)
        GPIO.setup(BtnPin, GPIO.IN, pull_up_down=GPIO.PUD_UP)
    
    def rotaryDeal():
        global flag
        global Last_RoB_Status
        global Current_RoB_Status
        global globalCounter
        Last_RoB_Status = GPIO.input(RoBPin)  
        while(not GPIO.input(RoAPin)):      #未旋转时,GPIO.input(RoAPin)值为1,旋转时会变为0
            Current_RoB_Status = GPIO.input(RoBPin)  #旋转时的当前值
            flag = 1
        if flag == 1:
            flag = 0
            if (Last_RoB_Status == 1) and (Current_RoB_Status == 0):
                globalCounter = globalCounter + 1  #顺时针旋转,角位移增大
            if (Last_RoB_Status == 0) and (Current_RoB_Status == 1):
                globalCounter = globalCounter - 1  #逆时针旋转,数值减小
    
    def btnISR(channel):
        global globalCounter
        globalCounter = 0
    
    def loop():
        global globalCounter
        tmp = 0 # Rotary Temperary
    
        GPIO.add_event_detect(BtnPin, GPIO.FALLING, callback=btnISR)
        #当按下按钮时,调用回调函数btnISR
        while True:
            rotaryDeal()
            if tmp != globalCounter:
                print 'globalCounter = %d' % globalCounter
                tmp = globalCounter
    
    def destroy():
        GPIO.cleanup()             # Release resource
    
    if __name__ == '__main__':     # Program start from here
        setup()
        try:
            loop()
        except KeyboardInterrupt:  # When 'Ctrl+C' is pressed, the child program destroy() will be  executed.
            destroy()
    
    
    

      

    树莓派套装
    点击购买:
    https://s.click.taobao.com/B1N2Ynv
    扫描二维码购买:
    树莓派套装购买二维码

    相关文章

      网友评论

        本文标题:树莓派基础实验26:旋转编码器实验

        本文链接:https://www.haomeiwen.com/subject/pgdkmhtx.html