STM32学习笔记(17)旋转编码器初解

旋转编码器介绍

旋转编码器(也叫旋钮编码器)是用来测量转速并配合PWM技术可以实现快速调速的装置,光电式旋转编码器通过光电转换,可将输出轴的角位移、角速度等机械量转换成相应的电脉冲以数字量输出(REP)。

这次介绍的是更加适合做些小实验的微型旋转编码器,总共四个引脚(5个引脚的就多了个可确定圈数的z相)。

相关的外形图及原理图

外形图

四个引脚分别为A,B,C,E。其中,A,B是编码信号发送相关引脚,C接地,E为按键相关引脚。
在这里插入图片描述

原理图

在这里插入图片描述
(C,E引脚与外形图不一样,但一般C引脚接地,而E引脚为按键相关引脚)

这里的CLK是指时钟线,DT是指信号信号线(data),DT和CLK都是指输出端,但本质没有什么区别(如果不是请指正),芯片通过比较两者输出信号的差别确定旋转编码器的旋转方向

原理

旋转编码器原理

旋转编码器的内部原理图可视为:
在这里插入图片描述
视灰色部分为高电平,橙黄色部分为低电平,则逆时针旋转时,产生的信号为
在这里插入图片描述
通过分析信号,系统可以确定旋钮的旋转方向

代码配置

在此先说明一下,我用的微型旋转编码器旋转起来是一卡一卡的,并不流畅。然后通过测试发现,每‘卡’一次,Rotary_A,B都是由0变1或是由1变0,但有先后。(上述原理仍适用)

//旋转编码器
u8 XZBMQ_Data=0;//编码值
u8 Flag=9;//设置一个值,初始值不是0/1即可
void XZBMQ_Scan_Drive()
{
 
	if (Rotary_A==Rotary_B)//Rotary_A,B即为旋转编码器的两个输出脚
		{
				Flag=Rotary_A;	
		}
	if(Flag==0)
	{
		if (Rotary_A!=Rotary_B)
		{
			if (Rotary_A==1)
					XZBMQ_Data++;
				else						
					XZBMQ_Data--;
			Flag=9;//变为初始值,防止错误
		}
		
	}		
	if(Flag==1)
	{
		if (Rotary_A!=Rotary_B)
		{
			if (Rotary_B==1)
					XZBMQ_Data++;
				else					
					XZBMQ_Data--;
			Flag=9;
		}
		
	}
}

写在最后:这个是我第一篇自己查资料,自己焊接实验的笔记,所以可能会有些错漏,如果有的话请各位指正,谢谢。

STM32F103C8T6也可以使用TIM模块来读取旋转编码器,步骤如下: 1. 配置GPIO引脚为TIM输入捕获通道。 2. 配置TIM为编码器模式,使用两个输入捕获通道。 3. 在程序中启动TIM计数器。 4. 在捕获中断中读取TIM的CNT寄存器值,即为编码器当前位置。 5. 根据编码器转动方向,增加或减少计数器值。 下面是一个使用TIM2和GPIOA0、GPIOA1读取编码器值的例子代码: ``` #include "stm32f10x.h" void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; /* TIM2 clock enable */ RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); /* GPIOA clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); /* Configure PA0 and PA1 as input floating */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; GPIO_Init(GPIOA, &GPIO_InitStructure); } void TIM_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_ICInitTypeDef TIM_ICInitStructure; /* TIM2 configuration in encoder mode */ TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_Period = 0xFFFF; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_RepetitionCounter = 0; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_EncoderInterfaceConfig(TIM2, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising, TIM_ICPolarity_Rising); TIM_ICStructInit(&TIM_ICInitStructure); TIM_ICInitStructure.TIM_ICFilter = 6; TIM_ICInit(TIM2, &TIM_ICInitStructure); TIM_Cmd(TIM2, ENABLE); } int main(void) { uint16_t encoder_value = 0; GPIO_Configuration(); TIM_Configuration(); while (1) { /* Read encoder value */ encoder_value = TIM_GetCounter(TIM2); /* Process encoder value */ } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值