【江科大】STM32:旋转编码器接口

Encoder Interface 编码器接口

  1. 编码器接口可接收增量(正交)编码器的信号
  2. 根据编码器旋转产生的正交信号脉冲,自动控制CNT自增或自减
  3. 从而指示编码器的位置、旋转方向和旋转速度 (PWM就是通计时器计次达到测频率的目的,而编码器是带方向的计次)
  • 每个高级定时器和通用定时器都拥有1个编码器接口(外部中断,是软件操作,定时器是硬件。硬件收到限制,比如stm32的高级和通用定时器一共就4个。编码器最多接4个。但是可以通过外部中断,来控制编码器手动自增自减。比如CNT计次,也可以通过中断的方式,实现CNT计次,然后手动把CNT取出来放到变量里)
  • 两个输入引脚借用了输入捕获的通道1和通道2
    在这里插入图片描述
    在这里插入图片描述
    编码器的输入是CH1,CH2.输出相当于是从模式控制器,控制CNT计数的控制速度和计数方向。
    流程:如果出现了边沿信号,并且另外一项为正转,则控制CNT自增。否则控制CNT自减。
    ARR为65535 正转最大值是65535.
    那么反转直接将无符号数据改为有符号对应的 65534就是-1

编码器接口的三种工作模式

在这里插入图片描述
一般情况适用最下面的计数方式,精度最高

正交编码器抗噪声原理

在这里插入图片描述

此图展示了,向上计数,和向下计数,以及抗噪声的原理。
TI1 反相后,需要对TI1取反,才是正确的。
在这里插入图片描述

在这里插入图片描述

通过调整极性就可以改回来,调整引脚,给某一个极性反相都可以恢复到正确状态。
在这里插入图片描述

编码器接口测速:

在这里插入图片描述

Encoder.c

void Encode_Init(void)
{
   
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	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;  //分频
	//TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;  //递增
	TIM_TimeBaseInitStruct.TIM_Period = 65536-1; //ARR
	TIM_TimeBaseInitStruct.TIM_Prescaler = 1-1;    //预分频器,psc 预分频值
	TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);
    
    
	//初始化输入捕获单元
	TIM_ICInitTypeDef TIM_ICInitStruct;
	TIM_ICStructInit(&TIM_ICInitStruct);
	TIM_ICInitStruct.TIM_Channel =  TIM_Channel_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;
	TIM_ICInitStruct.TIM_ICFilter = 0xF;  //采样值越大,滤波的效果越好
	//TIM_ICInitStruct.TIM_ICPolarity = TIM_ICPolarity_Rising; //极性选择    上升沿,这里的上升沿标识的是高低电平不反转,对应的通道给上升沿就是不反向
	TIM_ICInit(TIM3,&TIM_ICInitStruct);
	
	TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI12,TIM_ICPolarity_Rising,TIM_ICPolarity_Rising);
	TIM_Cmd(TIM3,ENABLE);
}


//快速完成负数转换  ,引脚转换就会导致极性发生改变 ,随便一个极性改变,也导致反转
int16_t Encode_Get(void)
{
   
	int16_t Temp;
	Temp = TIM_GetCounter(TIM3);
	TIM_SetCounter(TIM3,0); //将CNT清零 ,读取TIM3时基单元种计数器的值, 然后将计数器清零
	return Temp;
	
	
}

main.c

在这里插入图片描述

//定时中断    通过定时中断
 void TIM2_IRQHandler(void)
 {
   
	 if(TIM_GetITStatus(TIM2,TIM_FLAG_Update)== SET) //当前状态是TIM2的标志位
	 {
   
		 Speed = Encode_Get();  //得到这个计数值
		 TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
	 }
 }

相关推荐

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-25 01:44:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-25 01:44:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-25 01:44:02       87 阅读
  4. Python语言-面向对象

    2024-01-25 01:44:02       96 阅读

热门阅读

  1. GO——recover

    2024-01-25 01:44:02       56 阅读
  2. 解决Milo连接OPU UA报错的两个常见报错

    2024-01-25 01:44:02       59 阅读
  3. 开发安全之:Server-Side Request Forgery

    2024-01-25 01:44:02       48 阅读
  4. 动态规划最后一天(回文串)

    2024-01-25 01:44:02       62 阅读
  5. 【力扣每日一题】力扣2765最长交替子数组

    2024-01-25 01:44:02       72 阅读
  6. python基础——进程

    2024-01-25 01:44:02       61 阅读
  7. WPF关键帧动画

    2024-01-25 01:44:02       63 阅读
  8. 75.实现统一异常处理和封装统一返回结果

    2024-01-25 01:44:02       59 阅读
  9. 2024年阿里云优惠云服务器新版价格整理

    2024-01-25 01:44:02       61 阅读