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

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条回答
天才少年
2019-08-23 20:17
另外再发一个print函数,不需要重定义fputc,fgetc,并且所有的串口都可以写个这个函数,功能与标准c语言里的printf函数一样,应该是一样的吧,反正我还没发现不一样的。

[mw_shl_code=applescript,true]//需要包含的头文件
#include <stdarg.h>

void UART1_printf(char *fmt,...)
{
        va_list ap;
        char string[256];
        va_start(ap, fmt);
        vsprintf(string, fmt, ap);
        UART1_SendString(string);
        va_end(ap);
}[/mw_shl_code]

一周热门 更多>