|
发表于 2023-9-15 23:33:17
|
显示全部楼层
参考之前看到的一个旋转编码器的驱动, 挺有意思
用两个普通GPIO, 每次读2bit, 把上次的2bit左移两位, 拼成4bit
那么如果转了, 只能是0001, 0111, 1110, 1000, 或者是0010, 1011, 1101, 0100这8种情况.
如果是0000, 0101, 1010, 1111, 说明没转, 如果是0011, 1100, 0110, 1001, 说明读取间隔太慢, 漏读了一次.
然后把读编码器的函数做成回调, 下面的g.read_f, 这样用哪些GPIO读取可以任意搭配, 方便连线.
判断正转或反转的操作也做成回调, 下面的g.action_f.
old_state数组是各个编码器的旧状态.
只要读得过来, 想读几个都行.
- for(int i = 0; i < ZRE_NUM; i++) {
- unsigned char state = ((g.old_state[i] << 2) | g.read_f(i)) & 0xf; // 只需要4bit
- switch(state) {
- case 0x1:
- case 0x7:
- case 0xe:
- case 0x8:
- g.action_f(i, ZRE_CW); // 顺时针
- break;
- case 0x2:
- case 0xb:
- case 0xd:
- case 0x4:
- g.action_f(i, ZRE_CCW); // 逆时针
- break;
- }
- g.old_state[i] = state; // 保存状态供下次使用
- }
复制代码 |
|