STM32定时器——编码器模式采集EC11旋转编码器

目录

一、EC11旋转编码器介绍

二、定时器编码器模式介绍

三、编码器初始化代码介绍

四、旋转EC11向串口发送数据


一、EC11旋转编码器介绍

EC11旋转编码器广泛用于车载DVD,车载导航,汽车影音上,常被人称为车载编码器。编码器主要用于频率调节高度调节,温度调节及音量调节的参数控制。注意编码器避免储藏于高温潮湿及腐蚀的场所,拆包装后未使用完的剩余产品请在防潮防毒的环境下保存

上图中的A、B端子就是旋转编码器的信号引脚,当我们顺时针和逆时针转动时,A、B端子的闭合先后顺序不一样

顺时针: A端子先闭合先断开

 

 

逆时针:B端子先闭合先断开

 

 

简述一下:因为旋转编码器的AB引脚输出的电平信号存在相位差,如上图所示,我们可以借此分辨出其旋转方向。具体的原理在这里就不细说了,可以参考厂家给的参考手册 密码1234

二、定时器编码器模式介绍

编码器接口模式基本上相当于使用了一个带有方向选择的外部时钟。这意味着计数器只在0到
TIMx_ARR寄存器的自动装载值之间连续计数(根据方向,或是0到ARR计数,或是ARR到0计
数)。所以在开始计数之前必须配置TIMx_ARR;

 

顺时针:可以看到当TI1(也就是A端子)处于上升沿时,参考TI2是低电平,向上计数。

                                TI1(也就是A端子)处于下降沿时,参考TI2是高电平,向上计数。

                                TIMx_ARR的值会加2

 

 逆时针:可以看到当TI1(也就是A端子)处于上升沿时,参考TI2是高电平,向下计数。

                                 TI1(也就是A端子)处于下降沿时,参考TI2是低电平,向下计数。

                                 TIMx_ARR的值会减2

 同理,在TI2计数时也是相同的道理。在TI1和TI2都计数时,在每个跳变沿计数。

 三、编码器初始化代码介绍

我这里选用的时在TI1和TI2上都计数模式。

void MX_TIM1_Init(void)
{

  /* USER CODE BEGIN TIM1_Init 0 */

  /* USER CODE END TIM1_Init 0 */

  TIM_Encoder_InitTypeDef sConfig = {0};

  /* USER CODE BEGIN TIM1_Init 1 */

  /* USER CODE END TIM1_Init 1 */
  htim1.Instance = TIM1;//使用那个定时器
  htim1.Init.Prescaler = 0;//分频值
  htim1.Init.CounterMode = TIM_COUNTERMODE_UP;//计数方式,向上计数
  htim1.Init.Period = 65535;//重载值
  htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2;//时钟分频因子
  htim1.Init.RepetitionCounter = 0;//重复次数
  htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;//自动重装载
	
  sConfig.EncoderMode = TIM_ENCODERMODE_TI12;//工作模式
  sConfig.IC1Polarity = TIM_ICPOLARITY_RISING;//通道捕获方式
  sConfig.IC1Selection = TIM_ICSELECTION_DIRECTTI;//设置通道1连接方式
  sConfig.IC1Prescaler = TIM_ICPSC_DIV1;//分频值
  sConfig.IC1Filter = 0x8;//滤波值

  sConfig.IC2Polarity = TIM_ICPOLARITY_RISING;
  sConfig.IC2Selection = TIM_ICSELECTION_DIRECTTI;
  sConfig.IC2Prescaler = TIM_ICPSC_DIV1;
  sConfig.IC2Filter = 0x8;
  if (HAL_TIM_Encoder_Init(&htim1, &sConfig) != HAL_OK)
  {
    Error_Handler();
  }
	
  
  /* USER CODE BEGIN TIM1_Init 2 */
	__HAL_TIM_CLEAR_FLAG(&htim1,TIM_FLAG_UPDATE);//在初始化时,会让标志位置位,所以要清楚标志位
	HAL_TIM_Encoder_Start_IT(&htim1,TIM_CHANNEL_ALL);
  /* USER CODE END TIM1_Init 2 */

}

四、旋转EC11向串口发送数据 

void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
  if(htim->Instance==TIM1)//判断是否是定时器1
	{
		if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_1)//判断是否是通道1触发
		{
			if(__HAL_TIM_IS_TIM_COUNTING_DOWN(htim))//判断DIR,计数方向向下
			{
				u1_printf("顺时针转动");//串口输出提示信息
				num=((int16_t)HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_1)-1)/4;//根据CNT计数器的值少计数1,所以加一
				u1_printf("%d\r\n",num);
			}
		}
		else if(htim->Channel==HAL_TIM_ACTIVE_CHANNEL_2)
		{
			if(!__HAL_TIM_IS_TIM_COUNTING_DOWN(htim))
			{
				u1_printf("逆时针转动");
				num=((int16_t)HAL_TIM_ReadCapturedValue(htim,TIM_CHANNEL_2)+1)/4;
				u1_printf("%d\r\n",num);
			}
		}
	}
	
}

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值