基于GD32f103c8t6旋转编码器消抖

最近项目上用到了旋转编码器,但是抖动很厉害,看了几篇文章后,写出的如下的消抖代码。

旋转编码器引脚分别连接单片机的PA9,PA10引脚,旋转编码器型号为EC12E24204A7

#include "encoder.h"
#include "systick.h"

int16_t encoder_count;

void Encoder_Init(void)
{
	rcu_periph_clock_enable(RCU_GPIOA);//开启GPIOA时钟
	rcu_periph_clock_enable(RCU_AF);//开启AFIO时钟
	//初始化PA9和PA10引脚,配置为上拉输入模式
	gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_9);
	gpio_init(GPIOA, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_10);

	//AFIO外部中断选择引脚配置
	gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA,GPIO_PIN_SOURCE_9);
	gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOA,GPIO_PIN_SOURCE_10);

	//EXTI初始化
	exti_init(EXTI_9,EXTI_INTERRUPT,EXTI_TRIG_BOTH);
	exti_init(EXTI_10,EXTI_INTERRUPT,EXTI_TRIG_BOTH);

	//NVIC初始化
	nvic_priority_group_set(NVIC_PRIGROUP_PRE2_SUB2);
	nvic_irq_enable(EXTI5_9_IRQn,1U,1U);
	nvic_irq_enable(EXTI10_15_IRQn,1U,2U);

	//清除中断标志位
	exti_interrupt_flag_clear(EXTI_9);
	exti_interrupt_flag_clear(EXTI_10);
}

int16_t encoder_get(void)
{
	int16_t temp;
	temp=encoder_count;
	encoder_count=0;
	return temp;
}
enum Direction
{
    JUMP,
    RIGHT,
    LIFT,
};
//定义旋钮转动方向标志位
static uint8_t flag = JUMP;

//PA9外部中断函数
void EXTI5_9_IRQHandler(void)
{
    if(exti_interrupt_flag_get(EXTI_9)==SET)
    {
        if(gpio_input_bit_get(GPIOA,GPIO_PIN_10)==1&& flag == RIGHT) //右转
        {
			encoder_count++; 
            flag = JUMP;
        }
        else if(gpio_input_bit_get(GPIOA,GPIO_PIN_10)==1&& flag == LIFT) //左转
        {
			encoder_count--;
            flag = JUMP;
        }
        
        exti_interrupt_flag_clear(EXTI_9);//清空中断标志位
    }
}
//PA10外部中断函数
void EXTI10_15_IRQHandler(void)
{    
    if(exti_interrupt_flag_get(EXTI_10)==SET)
    {
        if(gpio_input_bit_get(GPIOA,GPIO_PIN_9) == 1) //右转
        {
            flag = RIGHT;
        }
        else if(gpio_input_bit_get(GPIOA,GPIO_PIN_9 )== 0) //左转
        {
            flag = LIFT;
        }
        
       exti_interrupt_flag_clear(EXTI_10);//清空中断标志位
    }
}
#ifndef _ENCODER_H_
#define _ENCODER_H_
#include "gd32f10x.h"

void Encoder_Init(void);
int16_t encoder_get(void);


#endif

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gd32f103c8t6和stm32f103c8t6是两种不同的芯片型号,分别由两家不同的公司生产。 首先,gd32f103c8t6是全志科技推出的一款32位低功耗微控制器芯片,其基于ARM Cortex-M3内核。它在性能、功耗和功能方面与stm32f103c8t6非常相似。gd32f103c8t6提供了高达72 MHz的时钟频率,内置了一系列的外设,例如通用串行总线(USART)、通用同步异步接收传输器(SPI)和通用定时器(TIM),并且具有较低的功耗以满足嵌入式应用的需求。另外,gd32f103c8t6提供了更丰富的Flash存储容量和SRAM容量可供用户使用,使其具备更好的性价比。 而stm32f103c8t6则是意法半导体(STMicroelectronics)公司的一款32位低功耗微控制器芯片,同样基于ARM Cortex-M3内核。它在市场上有较好的知名度,并被广泛应用于各个领域的嵌入式系统。stm32f103c8t6也提供了高达72 MHz的时钟频率,内置了丰富的外设,如UART、SPI和定时器等,以及较低的功耗。它也具备较大的Flash和SRAM容量。 总体而言,gd32f103c8t6和stm32f103c8t6在技术指标上非常接近,功能和性能基本一致。它们的区别主要在于生产厂商和市场认可度。由于全志科技是中国的公司,所以gd32f103c8t6在中国市场有较高的知名度和应用价值,而stm32f103c8t6则因为STMicroelectronics是国际知名公司,在全球范围内更为广泛地被采用。不同芯片所使用的开发工具和支持也会有所不同,需要根据实际需求选择合适的芯片型号。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值