TIM-编码器—STM32
EncoderInterface 编码器接口
编码器接口可接收增量(正交) 编码器的信号,根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减,从而指示编码器的位置、旋转方向和旋转速度
每个高级定时器和通用定时器都拥有1个编码器接口两个输入引脚借用了输入捕获的通道1和通道2
方波的频率就代表了速度.
第一步,RCC开启时钟,开启GPIO和定时器的时钟
第二步,配置GPIO,这里需要把PA6和PA7配置成输入模式
第三步,配置时基单元,这里预分频器我们一般选择不分频;自动重装,一般给最大65535,只需要个CNT执行计数就行了
第四步,配置输入捕获单元;不过这里输入捕获单元只有滤波器和极性这两个参数有用
第五步,配置编码器接口模式
最后,调用TIM_Cmd,启动定时器
#include "stm32f10x.h" // Device header
void Encorde_Init(void)
{
//第一步开启时钟,初始化RCC,选择TIM2
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
//第二步
//设置输出PWM的GPIO端口
//使能GPIOA的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
//GPIOA模式初始化
GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IPU;//上拉输入
GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7;
GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStruct);
//第三步配置时基单元
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;//时钟分频系数 1分频
TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;//计数的模式 向上计数
//频率为1KHz,占空比为50%的PWM波形
//计数器溢出频率:CK CNT_OV = CKCNT /(ARR + 1)= CK PSC /(PSC + 1)/(ARR +1)
//配置定时为1s,则CK CNT_OV=1;CKCNT=72MHz=72000000;
TIM_TimeBaseInitStruct.TIM_Period = 65536 - 1;//周期,ARR自动重装器的值 范围0~65536 设置为最大值,防止溢出
TIM_TimeBaseInitStruct.TIM_Prescaler = 1 - 1;//PSC预分频器的值 范围0~65536 不分频
TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0; //重复计数器的值 高级计数器才有
TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
//第四步,配置输入捕获单元。包括滤波器、极性、直连通道还是交又通道、分频器这些参数
TIM_ICInitTypeDef TIM_ICInitStruct;
//为了防业结构体中出现不确定值可能会造成的问题;用Structlnit给结构体赋一个初始值
TIM_ICStructInit(&TIM_ICInitStruct);
TIM_ICInitStruct.TIM_Channel = TIM_Channel_1;//选择通道 选择TIM3的通道1
TIM_ICInitStruct.TIM_ICFilter = 0xF;//用来配置输入捕获的滤波器。数越大滤波效果越好
// TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿触发 上升沿参数代表的是高低电平极性不反转
TIM_ICInit(TIM3,&TIM_ICInitStruct);
//不需要重新定义新的结构体了
TIM_ICInitStruct.TIM_Channel = TIM_Channel_2;//选择通道 选择TIM3的通道2
TIM_ICInitStruct.TIM_ICFilter = 0xF;//用来配置输入捕获的滤波器。数越大滤波效果越好
// TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising;//上升沿触发 上升沿参数代表的是高低电平极性不反转
TIM_ICInit(TIM3,&TIM_ICInitStruct);
//第五步,配置编码器接口模式
//Encoder函数位于ICInit函数的下面
TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
//调用TIM_Cmd,启动定时器
TIM_Cmd(TIM3,ENABLE);
}
//想用这个编码器来测速的话;就可以在固定的闸门时间;读一次CNT,然后把CNT清零
int16_t Encorde_Get(void)
{
int16_t Temp;
Temp = TIM_GetCounter(TIM3);//读一次CNT
TIM_SetCounter(TIM3,0);//把CNT清零
return Temp;
}
#ifndef _ENCORDE_H
#define _ENCORDE_H
void Encorde_Init(void);
int16_t Encorde_Get(void);
#endif