EC11代码 旋转编码器

论坛 期权论坛 脚本     
匿名技术用户   2021-4-7 05:38   702   0

一、硬件部分

1、EC11硬件和时序

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

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

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

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

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

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;    错误的
    static char keytemp=0x55;   //根据网友jwdeng1995  反馈指正  非常感谢
    /*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上的中断标志位  
}

本文到此结束。

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

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

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP