EC11数字电位器使用方法,利用定时器的编码(Encoder)模式
1. 硬件连接
PB6 ------> TIM4_CH1 EC11_A_Pin
PB7 ------> TIM4_CH2 EC11_B_Pin
2.定时器配置
(1)寄存器配置
分频(PSC): 5
自动装载值是30,扭动电位器旋钮,往上加到30后又从0开始。
输入滤波是4。
(2)开中断
(3)引脚的标签
3. 生成
4. 中断函数
void EC11_Init()
{
// HAL_TIM_Encoder_Start(htim4,TIM_CHANNEL_1);
HAL_TIM_Encoder_Start_IT(&htim4,TIM_CHANNEL_1);
}
void HAL_TIM_IC_CaptureCallback(TIM_HandleTypeDef *htim)
{
if(htim == &htim4)
{
HAL_TIM_StateTypeDef state;
// state = HAL_TIM_Encoder_GetState(&htim4);
state =htim->State;
if(state)
{
EC11_count();
}
}
}
void EC11_count()
{
// EC11_cnt = __HAL_TIM_GET_COMPARE(&htim4,TIM_CHANNEL_1);
EC11_cnt +=1;
// EC11_cnt =1;
}
5.试验
改变分频值(PSC)和自动装载值时,对程序无影响。
如下,是把自动装载值(Counter Period),即ARR寄存器改为20时,扭动旋钮,寄存器CNT和CCR1计数到20时,又从0开始。
正转: CR1和DMAR的值是0x01,CCR1从0增加到20时,又从0开始。
反转: CR1和DMAR的值是0x11,CCR1从20递减到0时,又从20开始。
6.几个库函数
(1)__HAL_TIM_SET_AUTORELOAD 同时设置自动加载寄存器ARR值和初始化库函数。
Instance->ARR
Init.Period
(2) __HAL_TIM_SET_COMPARE 设置捕获值寄存器CCR1的值
(3) __HAL_TIM_GET_COMPARE 取得捕获值寄存器CCR1的值
(4)__HAL_TIM_SET_COUNTER 设置计数器寄存器CNT的值
(5) __HAL_TIM_GET_COUNTER 取得计数器寄存器CNT的值
定时器编码(Encoder)模式下 CCR1和CNT两个寄存器的值时相同的,都是和ARR里面值相同时从0开始,使用时取其中一个都可。
定时器在中心对齐模式或编码器模式下运行时,也可以用库函数__HAL_TIM_IS_TIM_COUNTING_DOWN(HANDLE) 来判断方向,本例中返回值是0正转,1反转。
CCR1和CNT两个寄存器的数值相同,都是正转时增加,反转时递减。