STMCUBEMX_外部中断_EC11旋转编码器

STMCUBEMX_外部中断_EC11旋转编码器

说明:
1、有按键有滚轮,调节非常方便
2、只需要三个中断引脚就可以,采集旋钮的状态和按键状态
在这里插入图片描述

实际工程应用:
1、工程配置(给旋钮的两个引脚和按键引脚配置三个外部中断)

在这里插入图片描述
在这里插入图片描述
2、代码应用
main.c

int main(void)
{
	HAL_Init();
	SystemClock_Config();
	
	MX_GPIO_Init();
	while(1)
	{
	
	}
}

void HAL_GPIO_EXTI_Callback(unsigned short GPIO_Pin)
{
  if(GPIO_Pin == ENCODER_PIN_A)	//下降沿触发
  {
		if(READ_ENCODER_B == 1)
		{
			encoder_dev.encoderNum++;
			if(encoder_dev.encoderNum > 100) encoder_dev.encoderNum = 100;
			Debug_printf("encoderNum:%d\r\n",encoder_dev.encoderNum);
		}
		else
		{
			if(encoder_dev.encoderNum != 0) encoder_dev.encoderNum--;
			Debug_printf("encoderNum:%d\r\n",encoder_dev.encoderNum);
		}
  }
	if(GPIO_Pin == ENCODER_PIN_B)	//上升沿触发
  {
		if(READ_ENCODER_A == 0)
		{
			if(encoder_dev.encoderNum != 0) encoder_dev.encoderNum--;
			Debug_printf("encoderNum:%d\r\n",encoder_dev.encoderNum);			
		}
		else
		{
			encoder_dev.encoderNum++;
			if(encoder_dev.encoderNum > 100) encoder_dev.encoderNum = 100;
			Debug_printf("encoderNum:%d\r\n",encoder_dev.encoderNum);			
		}
  }
	if(GPIO_Pin == ENCODER_PIN_DOWN)	//上升沿触发
  {
		encoder_dev.encoderDown = !encoder_dev.encoderDown;
		Debug_printf("encoderDown:%d\r\n",encoder_dev.encoderDown);
  }
}

encodeer.c

#include "encoder.h"

encoder_status_t encoder_dev = {0,0};
encoder_status_t encoder_dev_old = {0,0};

void encoder_init(void)
{
	memcpy(&encoder_dev_old,&encoder_dev,sizeof(encoder_dev));
}

void encoder_task(void)
{
	if(memcmp(&encoder_dev,&encoder_dev_old,sizeof(encoder_dev)) != 0)
	{
		if(encoder_dev.encoderDown != encoder_dev_old.encoderDown)
		{
		}
		
		if(encoder_dev.encoderNum != encoder_dev_old.encoderNum)
		{
		}
		memcpy(&encoder_dev_old,&encoder_dev,sizeof(encoder_dev));
		Debug_printf("encoder update\r\n");
	}
}

encodeer.h

#ifndef __ENCODER_H
#define __ENCODER_H
#include "main.h"
#include "log.h"
#include <string.h>

typedef struct encoder_status
{
	unsigned char encoderNum;
	unsigned char encoderDown;
}encoder_status_t;

extern encoder_status_t encoder_dev;

#define ENCODER_PIN_A			GPIO_PIN_1
#define ENCODER_PIN_B			GPIO_PIN_0
#define ENCODER_PIN_DOWN		GPIO_PIN_15

#define READ_ENCODER_A			HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_1)
#define READ_ENCODER_B			HAL_GPIO_ReadPin(GPIOE, GPIO_PIN_0)
#define READ_ENCODER_DOWN		HAL_GPIO_ReadPin(GPIOD, GPIO_PIN_15)

void encoder_init(void);
void encoder_task(void);

#endif


  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
EC11是一种常见的旋转编码器,适用于微控制器的输入设备。STM32是一系列32位ARM Cortex-M微控制器的型号。下面是关于EC11旋转编码器的STM32源码的简要说明。 首先,要使用EC11旋转编码器,我们需要将其连接到STM32微控制器的相应GPIO引脚。这通常涉及到连接旋转编码器的A相、B相和SW(按下旋转编码器)引脚到微控制器的GPIO引脚,并进行所需的外部中断或输入捕获配置。 接下来,我们可以编写STM32源码来读取EC11旋转编码器旋转和按键事件。首先,我们需要设置GPIO引脚的相关配置,如输入模式、中断触发方式等。 然后,我们可以使用STM32的外部中断或输入捕获模块来检测旋转编码器旋转事件。外部中断可以在旋转编码器的A相或B相引脚上触发,并且可以根据A相和B相的相位关系来判断旋转方向。另外,输入捕获模块可以用来测量旋转编码器旋转速度。 此外,我们还可以使用GPIO中断来检测EC11旋转编码器的按键事件。当按下旋转编码器的SW引脚时,相关的GPIO中断会被触发,我们可以在中断处理函数中处理按键事件。 根据具体的需求,我们可以编写处理旋转和按键事件的代码,例如更新显示、调整参数等。这些代码可以根据旋转编码器旋转方向增加或减少数值,或执行其他相关操作。 综上所述,通过合适的GPIO配置和适当的中断处理,我们可以编写STM32源码来实现对EC11旋转编码器的读取和响应。这样,我们就能够利用EC11旋转编码器为STM32微控制器提供旋转和按键输入功能。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值