旋转编码器(STM32)

基于STM32的旋转编码器(多个中断的使用)


旋转编码器的原理

在这里插入图片描述

正转A相为高,B相为低,反之相反
学习内容如下
#include "stm32f10x.h"                  // Device header
int16_t Encoder_Count;//定义一个带符号的变量

void Encoder_Init(void)
{
    //配置RCC
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
    
    //配置GPIO
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;//使用到PB0和PB1口
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    
    //配置AFIO
    GPIO_EXTILineConfig(RCC_APB2Periph_GPIOB,GPIO_PinSource0);
    GPIO_EXTILineConfig(RCC_APB2Periph_GPIOB,GPIO_PinSource1); //AFIO每个中断是分开的
    
    //配置EXTI
    EXTI_InitTypeDef EXTI_InitStructure;
    EXTI_InitStructure.EXTI_Line=EXTI_Line1|EXTI_Line0;//使用到中断0和中断1
    EXTI_InitStructure.EXTI_LineCmd=ENABLE;
    EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
    EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling; //下降沿触发
    EXTI_Init(&EXTI_InitStructure);
    
    //配置NVIC,这里配置了俩个中断
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//调用一次即可,只能有一个,有多个必须保证相同
    NVIC_InitTypeDef NVIC_InitStructure;//结构体命名一次即可
    NVIC_InitStructure.NVIC_IRQChannel=EXTI0_IRQn;//中断0的配置
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;//抢占优先级为1
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;//响应优先级为1
    
    NVIC_InitStructure.NVIC_IRQChannel=EXTI1_IRQn;//中断1的配置
    NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
    NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=1;
    NVIC_InitStructure.NVIC_IRQChannelSubPriority=2 ;//响应优先级为2,即中断1的优先级略低于中断0的优先级
    NVIC_Init(&NVIC_InitStructure);//NVIC初始化

    
}

int16_t Return_Encoder_Count(void) //返回Encoder_Count的值,如果正转就返回+1,反转就返回-1。方便共主函数操作
{
    int16_t Temp;
    Temp=Encoder_Count;              
    Encoder_Count=0;
    return Temp;
    
}

//中断0函数
void EXTI0_IRQHandler(void)
{
    if(EXTI_GetFlagStatus(EXTI_Line0)==SET)
    {
        EXTI_ClearITPendingBit(EXTI_Line0);//清除中断标志位,以便下一次进入中断
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_0)==1)  //如果正转
        {
            Encoder_Count++;  
        }
        
    }
    
}
//中断1函数
void EXTI1_IRQHandler(void)
{
    if(EXTI_GetFlagStatus(EXTI_Line1)==SET)
    {
        EXTI_ClearITPendingBit(EXTI_Line1);
        if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==1)  //如果反转
        {
            Encoder_Count--;
        }
    }
    
}



定义Number,编码器正转其数值增大,反之减小
#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Encoder.h"
int16_t Number;

int main(void)
{
	OLED_Init();
    Encoder_Init();
	OLED_ShowString(1, 1, "Number:");//可以用该函数显示空行来达到清屏的目的
	while (1)
	{
        Number+=Return_Encoder_Count();
        OLED_ShowNum(1,8,Number,4);
        
		
	}
}

  • 20
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
ESP32旋转编码器是一种用于测量旋转角度的传感器。它可以通过读取编码器的脉冲信号来确定旋转的角度。下面是一个使用ESP32读取旋转编码器的示例代码: ```cpp #include <Arduino.h> // 定义编码器引脚 #define ENCODER_A_PIN 2 #define ENCODER_B_PIN 3 // 定义编码器计数器 volatile long encoderCount = 0; // 中断处理函数 void IRAM_ATTR encoderISR() { // 读取编码器引脚状态 int a = digitalRead(ENCODER_A_PIN); int b = digitalRead(ENCODER_B_PIN); // 根据编码器引脚状态更新计数器 if (a == b) { encoderCount++; } else { encoderCount--; } } void setup() { // 初始化编码器引脚 pinMode(ENCODER_A_PIN, INPUT_PULLUP); pinMode(ENCODER_B_PIN, INPUT_PULLUP); // 将中断处理函数与编码器引脚绑定 attachInterrupt(digitalPinToInterrupt(ENCODER_A_PIN), encoderISR, CHANGE); attachInterrupt(digitalPinToInterrupt(ENCODER_B_PIN), encoderISR, CHANGE); // 启用中断 interrupts(); } void loop() { // 读取编码器计数器的值 long count = encoderCount; // 打印旋转的角度 float angle = count / 7.0 / 238.0 * 2.0 * PI; Serial.print("旋转的角度为: "); Serial.println(angle); delay(100); } ``` 这段代码使用了ESP32的中断功能来读取编码器的脉冲信号,并根据脉冲信号的变化来更新计数器。通过计算计数器的值,可以得到旋转的角度。请注意,你需要将编码器的引脚连接到ESP32的GPIO引脚,并根据实际情况修改代码中的引脚定义。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值