查看: 2181|回复: 0
打印 上一主题 下一主题

单片机在音响上的应用(一)旋转编码器的解码

[复制链接]
跳转到指定楼层
沙发
发表于 2016-4-10 20:14:22 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
[size=13.3333px]作者:sword__yang
[size=13.3333px]      【导语】:高端的音响设备目前已经大量采用了先进的控制技术,其中使用单片机(MCU)控制是必不可少的,举凡遥控、显示、电子音量控制等都离不开单片机。本文拟通过几个单片机的应用实例来和大家分享一下自己的DIY心得。(文中所有的程序实例都已经在PIC16F873A单片机上通过实验的检验)。
[size=13.3333px]     本文共有4个部分:
[size=13.3333px]一、旋转编码器的解码
[size=13.3333px]二、电子音量控制
[size=13.3333px]三、荧光显示VFD、按键控制
[size=13.3333px]四、红外遥控解码

[size=13.3333px]音响应用之一:旋转编码器的解码
[size=13.3333px]      旋转编码器(外形参见图II-1.0)在音响中多用于取代普通的滑动电阻电位器作为音量/音调控制的编码输入。它使用寿命长达100万次,比普通电位器长得多,而且不会因为机械磨损造成阻值的偏差,影响声道的平衡。其调节的精度仅仅取决于与MCU配合的音量控制芯片的控制级数,与本身的旋转角度无关,这也是普通电位器无法做到的,因此旋转编码器也大量地用于精密仪器的调节上。
[size=13.3333px]      旋转编码器内部就是两个长寿命开关,可以根据旋转方向产生不同相位信号。电路如图II-1.1所示:当我们顺时针旋转时,开关A的输出信号A signal相位超前;如果我们逆时针旋转时,则是开关B的输出信号B signal相位超前,我们把A/B端分别接到MCU的两个输入端口,并在MCU内设置一个音量计数器;就可以用软件来判别是顺时针旋转还是逆时针旋转,以此判断是增加还是减少音量计数器的值,最后把这个计数值送到相应的电子音量控制芯片就可以实现音量(或者其他需要增量/减量的)控制了。
[size=13.3333px]      由于旋转编码器是随时改变的,我们的软件也要能够跟踪各个瞬时的状态变化,为了判断旋转编码器的相位我们还需要用三个标志位(Bit变量)来记住开关A,B的“瞬时状态”。

[size=13.3333px](原文件名:1.jpg)[size=13.3333px]


[size=13.3333px](原文件名:2.jpg)[size=13.3333px]



[size=13.3333px]      旋转编码器的解码例程如下:
[size=13.3333px]     【说明】: Bit变量定义:状态1:FLG0,ECA 当开关A变高,B变低时,置位(设为1),为即将到来的增量做准备;状态2:FLG0,ECB 当开关A变低,B变高时,置位(设为1),为即将到来的减量做准备;状态3:FLG0,ECV: 当完成一次增加/减少时,置位(设为1),相位变动一次,只做一次增/减量;变量寄存器:VOLUE 用来保存音量变化数值。 16F873A的I/O端口B: VOA:连接到编码器的A端子; VOB:连接到编码器的B端子。
[size=13.3333px];======================================
[size=13.3333px]VOLUME_CONTROL:
[size=13.3333px]      BTFSC   FLG0,ECA                                      ; “状态1”检测:若已经满足了状态1,就去查看开关B是否变高
[size=13.3333px]      GOTO    KE_1E
[size=13.3333px]      BTFSC   FLG0,ECB                                      ; “状态2”检测:若已经满足了状态2,就去查看开关A是否变高
[size=13.3333px]      GOTO    KE_1F
[size=13.3333px]      BTFSS   PORTB,VOA                                   ; “IN A”检测   
[size=13.3333px]      GOTO    KE_1B
[size=13.3333px]KE_1A:
[size=13.3333px]      BTFSC   PORTB,VOB                                  ; “IN B”检测
[size=13.3333px]      GOTO    KE_1D
[size=13.3333px]      BTFSC  FLG0,ECV
[size=13.3333px]      GOTO   KE_EX
[size=13.3333px]      BSF        FLG0,ECA                                      ; 满足“状态1”的设置条件
[size=13.3333px]      GOTO    KE_EX
[size=13.3333px]KE_1B:
[size=13.3333px]      BTFSC   PORTB,VOB
[size=13.3333px]      GOTO    KE_1C
[size=13.3333px]      BCF        FLG0,ECV                                       ; 清除“状态3”
[size=13.3333px]      GOTO     KE_1D
[size=13.3333px]KE_1C:
[size=13.3333px]      BTFSC   FLG0,ECV
[size=13.3333px]      GOTO    KE_EX
[size=13.3333px]      BSF        FLG0,ECB                                       ; 满足“状态2”的设置条件
[size=13.3333px]      GOTO    KE_EX
[size=13.3333px]KE_1D:
[size=13.3333px]       BCF       FLG0,ECA
[size=13.3333px]       BCF       FLG0,ECB
[size=13.3333px]       GOTO    KE_EX
[size=13.3333px]KE_1E:
[size=13.3333px]        BTFSS  PORTB,VOB                                      ; “状态1”下,开关B变高?
[size=13.3333px]        GOTO   KE_EX
[size=13.3333px]INC_VOL:
[size=13.3333px]        BCF       FLG0,ECA                                         ; 是的,完成一次增量, 清除“状态1”
[size=13.3333px]        BCF       FLG0,ECB                                         ; 清除“状态2”
[size=13.3333px]        BSF       FLG0,ECV                                         ; 设置“状态3”
[size=13.3333px]        INCF      VOLUE,F                                           ; 音量寄存器加1
[size=13.3333px]        GOTO   KE_EX
[size=13.3333px]KE_1F:
[size=13.3333px]        BTFSS   PORTB,VOA                                     ; “状态2”下,开关A变高?
[size=13.3333px]        GOTO    KE_EX
[size=13.3333px]DEC_VOL:
[size=13.3333px]        BCF        FLG0,ECA                                        ; 是的,完成一次减量,清除“状态1”
[size=13.3333px]        BCF        FLG0,ECB                                        ; 清除“状态2”
[size=13.3333px]        BSF        FLG0,ECV                                        ; 设置“状态3”
[size=13.3333px]        DECF VOLUE,F                                               ; 音量寄存器减1
[size=13.3333px]KE_EX:
[size=13.3333px]        RETURN
[size=13.3333px];=====================================
[size=13.3333px];开关的瞬时位置比较抽象,大家要对比波形图和软件的状态去加深理解。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入中科因仑

本版积分规则

快速回复 返回顶部 返回列表