目录
一、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);
}
}
}
}