EC11代码 旋转编码器

一、硬件部分

1、EC11硬件和时序

硬件不详细叙述,RC滤波一定要加,不然检测不准。

EC11代码 旋转编码器_第1张图片

A为上升沿时,B为高电平。顺时针

A为下升沿时,B为低电平。顺时针

A为上升沿时,B为低电平。逆时针

A为下升沿时,B为高电平。逆时针

EC11代码 旋转编码器_第2张图片

2、单片机接口

使用STM32 PA2(中断口),PA4(普通输入)。

二、软件部分

使用原子STM32F103寄存器模板。

1、GPIO初始化和宏定义

#define B_PORT   PAin(4)
#define A_PORT   PAin(2)

void KEY_Init(void)
{
	RCC->APB2ENR|=1<<2;     //使能PORTA时钟
	GPIOA->CRL&=0XFFF0F0FF;	//PA2,4设置成输入  
	GPIOA->CRL|=0X00080800;
}

2、中断初始化

void EXTIX_Init(void)
{
	KEY_Init();
	Ex_NVIC_Config(GPIO_A,2,FRTIR); //上升沿、下降沿都触发
	MY_NVIC_Init(2,3,EXTI2_IRQn,2);	//抢占2,子优先级3,组2
}

3、中断服务程序

char count=0;

void EXTI2_IRQHandler(void)
{
    /*初始化采样值,防止干扰while值的判断*/
    char keytemp=0x55;

    /*keytemp&0X0F 表示只取末尾四位为有效值*/
    /*0x0F 表示采样四次IO为高电平  表示IO状态稳定在高电平*/
    /*0x00 表示采样四次IO为低电平  表示IO状态稳定在低电平*/
    while(((keytemp&0X0F)!=0x0F)&&((keytemp&0X0F)!=0x00))
    {
        /*间隔1us后采集*/
        delay_us(1);
        /*按键缓存器左移一位*/
        keytemp<<=1;
        /*当脉冲脚为高时 或称为A相*/
        if(A_PORT== 1)
        {
            /*按键缓存器末尾补1*/
            keytemp |= 0x01;
        }
    }
    /*引脚电平稳定状态后判断AB脉冲 判断方向正反 然后加减脉冲*/
    if(A_PORT==1)
    {
        if(B_PORT==1)
        {
            count++;    /*A上升沿时 B为高 顺时针*/
        }
        else
        {
            count--;    /*A上升沿时 B为低 逆时针*/
        }
    }
    else
    {
        if(B_PORT==0)
        {
            count++;    /*A下降沿时 B为低 顺时针*/
        }
        else
        {
            count--;    /*A下降沿时 B为高 逆时针*/
        }        
    }
	EXTI->PR=1<<2;  //清除LINE2上的中断标志位  
}

完整工程代码https://download.csdn.net/download/ZiQingRan/12511680

本文到此结束。

本人比较懒,如果有错误欢迎指正。

欢迎有共同兴趣爱好的人加群交流:QQ群:37244526

你可能感兴趣的:(器件)