共享一个万无一失的旋转编码器检测程序

2019-08-23 16:34发布


本程序中针对的传感器具有A和C两个输出,旋转时两个都可以产生中断,只是转向不同时相位不同。程序中使用一个触发中断,在中断里面判断另外一个的电平,开始不管怎么写都会有有一些误判断,我曾经循环判断了100次,只要有一次判断与其他不同的都丢弃,结果还是会有一些误判断,后来加了两个边沿检测,基本可以算是万无一失了,我转了1一个小时都没发现有方向判断错误的。加t1、t2是防止程序死在中断里面,如果慢转丢失判断结果可以适当增大t1、t2。

[mw_shl_code=c,true]//旋转编码器旋转中断
//ROTARY_A、ROTARY_C
void EXTI3_IRQHandler(void)        //中断号9(PC3)
{
        u8 t1 = 50;
        u16 t2 = 1000;
        if ((EXTI->PR) & (1 << 3))
        {
                EXTI->PR = 1 << 3;                //清除LINE3上的中断标志位
                if (!ROTARY_C)
                {
                        Delay_us(10);
                        while ((ROTARY_A == 0) && (t1--))
                        {
                                Delay_ms(1);
                        }
                        Delay_us(10);
                        if (ROTARY_C)
                                UART1_printf("顺时针转 ");
                }
                else
                {
                        Delay_us(10);
                        while ((ROTARY_A == 0) && (t2--))
                        {
                                Delay_ms(1);
                        }
                        Delay_us(10);
                        if (!ROTARY_C)
                                UART1_printf("逆时针转 ");
                }
        }
}
[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
15条回答
TinyBoy
1楼-- · 2019-08-24 09:36
你不用delay看看,不用delay更简单,我应用中用没发现你的这种误判情况。
夜猫煮茶
2楼-- · 2019-08-24 14:42
 精彩回答 2  元偷偷看……
jubaolun
3楼-- · 2019-08-24 15:27
谢谢分享,学习了。
qq942266575
4楼-- · 2019-08-24 18:59
谢谢分享。定时器也有个编码器模式
sangjian
5楼-- · 2019-08-25 00:41
不错正是我所需要的,刚开始用查询的方式,根本就没有效果,试试楼主这个方法,看看行不行
zz12375
6楼-- · 2019-08-25 06:23
mark

一周热门 更多>