那种音响上用的小型旋转编码器怎么驱动?只要编程思路,和原理,不要原码。

2020-02-05 09:14发布

我昨天鼓捣一晚上怎么就是往左转有加也有减呀?按说该都是加呢。我用手机发的贴子所以程序就不发了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
13条回答
osoon2008
1楼-- · 2020-02-06 02:35
用个示波器fuck一下,一清二楚。
hujiahua
2楼-- · 2020-02-06 03:35
你可以参考一下这个帖子中我在21楼的回复
http://www.ourdev.cn/bbs/bbs_content_all.jsp?bbs_sn=857853

这种编码器的A、B两条线的其中一条线的状态是不稳定的。建议你把A、B两条线互换一下试试。
millwood0
3楼-- · 2020-02-06 09:10
those switches have two pins out: A and B. and their states change depending on the rotation.

so you can look up a table, based on the previous states of A+B and the current states of A+B -> state machine.

when you rotate the switch, A goes 0, 1, 1, 0; and B goes 0, 0, 1, 1;

so if AB is 10 (the 2nd position), and AB was 11 (the 3rd position), you know the switch has moved counterclockwise.

here is the code.

===========code==================
//determine increment / decrement of the encoder
unsigned char encoder_read(PORT_TYPE port, PORT_TYPE pin_a, PORT_TYPE pin_b) {
        const signed char ABs_states[]={0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0};
        static unsigned char encoder_output=0x00;
        static unsigned char ABs=0x00;                                //AB key read out, Previous in the high 2 bits and current in the low two bits;
        unsigned char tmp;

        ABs <<=2;                                                //left 2 bits now contain the previous AB key read-out;
        tmp=IO_GET(port, pin_a | pin_b);                        //read ab pins
        if (tmp & pin_a) ABs |= 0x02;                        //set the 1st bit if A is high now;
        if (tmp & pin_b) ABs |= 0x01;                        //set the 0th bit if B is high;
        ABs &= 0x0f;                                        //only retain ABs' last 4 bits (A_previous, B_previous, A_current, B_current)
        encoder_output += ABs_states[ABs];
        return encoder_output;                        //return the absolute value
        //return ABs_states[ABs];                        //return the relative value (+1 = clockwise, 0, -1 = counterclockwise)
}

========end code============

depending on which "return" statement you use, you can either get the absolute value or the relative value of the switches.
yiminglei
4楼-- · 2020-02-06 11:23
 精彩回答 2  元偷偷看……
lxa0
5楼-- · 2020-02-06 15:23
上图 看看啊~~~~~~~~~~~~~~~~~~~~~~~
wandy2010
6楼-- · 2020-02-06 18:29
回复【4楼】wuyya
基本思路:旋转编码器一般是两组触点,在旋转过程依次 a闭合 ab闭合 b闭合 ab断开,反方向旋转则为 b闭合 ab闭合 a闭合 ab断开,按这个过程来处理即可,注意机械触点要做去抖动处理。
另外一点小经验,不要直接用手捏着转轴来旋转,要套上旋钮的外壳,没有外壳的话,随便找个东西夹住来旋转,比如衣夹。不要问我为什么,我也不知道,只是我第一次写这种程序时,调了好多天都没调通,后来发现用镊子夹住转轴来旋转就ok了。
-----------------------------------------------------------------------

人体干扰?

一周热门 更多>