编码器模式
编码器是一种在数据处理、通信和机器学习领域中广泛使用的工具,其主要作用是将输入数据转换为另一种格式或表示形式,以便于后续处理、存储或传输。STM32 微控制器具有专门的硬件功能支持编码器模式,通常用于测量电机的旋转位置、速度或运动方向。STM32 的编码器模式依赖于其定时器的输入捕获功能,并支持多种类型的编码器。所以首先我们要先了解stm32的输入捕获功能。
输入捕获
输入捕获 是 STM32 定时器的一项功能,用于测量外部信号的时间特性,例如信号的频率、周期、占空比等。通过输入捕获功能,定时器可以记录外部信号变化时的计数值,为时间相关测量提供硬件支持。STM32 定时器的输入捕获功能通过检测外部信号的上升沿或下降沿,将当前计数器(CNT)值存储到捕获寄存器(如 TIMx_CCR1、TIMx_CCR2 等)中。开发者可以通过读取这些寄存器的值计算时间间隔。
接下来我们就来配置相应的定时器来实现输入捕获并将其设置为编码器模式。
void TIM2_Encoder_Init(u16 arr,u16 psc)
{
RCC->APB1ENR|=1<<0; //TIM2时钟使能
RCC->APB2ENR|=1<<2; //使能PORTA时钟
GPIOA->CRL&=0XFFFFFF00; //PA0、PA1 清除之前设置
GPIOA->CRL|=0X00000044; //PA0、PA1 浮空输入
TIM2->ARR=arr; //设定计数器自动重装值
TIM2->PSC=psc; //预分频器
TIM2->CCMR1 |= 1<<0; //输入模式,IC1FP1映射到TI1上
TIM2->CCMR1 |= 1<<8; //输入模式,IC2FP2映射到TI2上
TIM2->CCER |= 0<<1; //IC1不反向
TIM2->CCER |= 0<<5; //IC2不反向
TIM2->SMCR |= 3<<0; //所用输入均在上升沿或下降沿有效
TIM2->CR1 |= 1<<0; //使能计数器
}
这里可以看到我们将PA0和PA1设置为浮空输入,并且将输入捕获的IC1和IC2映射到TIM2的TI1和TI2上(如果没有这一步定时器无法接收到外部信号。编码器模式将无法正常工作,因为定时器无法捕获 A 相和 B 相信号,也就无法进行增减计数)。这里是一个直流减速电机带的编码器,是一种增量式编码器,不反向的意义在于使其上升沿向上计数,最后一定要使能计数器。
这样就配置好了一个编码器,接着我们就可以通过这个来读取我们所需的数据。
可以写这样一个函数
int TIM2_Encoder_Read(void)
{
int a,b;
a=TIM2->CNT;
delay_ms(10); //检测时间,可调节
b=TIM2->CNT;
return (int)(b-a); //数据类型转换
//记录边沿变化次数(一个栅格被记录4次)
}
此函数作用就是读取固定时间内的编码器变化情况。
注意:这里我是用计数器来直接读取的,所以在这里没有负数。在实际运用中如果产生异常导致编码器反向转动可能会出现计数器溢出的情况。
编码器模式只能设置在定时器的TI1和TI2通道上。