STM32——8.旋转编码器计数

旋转编码器计数

  • 旋转编码器:用来测量位置、速度或旋转方向的装置,当其旋转轴旋转时,其输出端可以输出与旋转速度和方向对应的方波信号,读取方波信号的频率和相位信息即可得知旋转轴的速度和方向。

  • 类型:机械触点式/霍尔传感器式/光栅式

------------Encode.h---------------------------------------------------------------
#include "stm32f10x.h"                  // Device header
​
int16_t Encoder_Count;
​
void Encode_Init(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
    
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOB, &GPIO_InitStructure);
    
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource0);
    GPIO_EXTILineConfig(GPIO_PortSourceGPIOB, GPIO_PinSource1);
    
    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line = EXTI_Line0 | EXTI_Line1;
    EXTI_InitStructure.EXTI_LineCmd = ENABLE;
    EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;
    EXTI_Init(&EXTI_InitStructure);
    
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    
    NVIC_InitTypeDef NVIC_InitStructure;
    NVIC_InitStructure.NVIC_IRQChannel = EXTI0_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
    NVIC_Init(&NVIC_InitStructure);
    
    NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
    NVIC_Init(&NVIC_InitStructure);
}
​
void EXTI0_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line0) == SET)
    {
        /*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
        if(GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_1) ==0)
        {
            if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
            {
                Encoder_Count --;
            }
        }   
        EXTI_ClearITPendingBit(EXTI_Line0);
    }
}
​
void EXTI1_IRQHandler(void)
{
    if (EXTI_GetITStatus(EXTI_Line1) == SET)
    {
        /*如果出现数据乱跳的现象,可再次判断引脚电平,以避免抖动*/
        if(GPIO_ReadInputDataBit(GPIOB , GPIO_Pin_0) ==0)
        {
            if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0)
            {
                Encoder_Count ++;
            }
        }   
        EXTI_ClearITPendingBit(EXTI_Line1);
    }
}
​
int16_t Get_Num(void)
{
    int16_t temp;
    temp = Encoder_Count;
    Encoder_Count = 0;
    return temp;
}
​
------------------Encode.h------------------------------------------------------------------
#ifndef __ENCODE_H
#define __ENCODE_H
​
void Encode_Init(void);
void EXTI0_IRQHandler(void);
void EXTI1_IRQHandler(void);
int16_t Get_Num(void);
​
#endif
​
----------------main.c----------------------------------------------------------------------
#include "stm32f10x.h"   
#include "OLED.h"
#include "Encode.h"
​
int16_t Num;
​
int main(void)
{
    OLED_Init();
    Encode_Init();
    OLED_ShowString(1,1,"Encode:");
    while(1)
    {
        Num += Get_Num();
        OLED_ShowSignedNum(2,1,Num,5);
    }
}
        

理解:和红外那个配置差不多,因为都是和中断打交道嘛,上面就注意修改一下端口号。还有这里用到了两个端口,所以有些配置是双方。

你可能感兴趣的:(stm32,单片机,嵌入式硬件)