EC11数字电位器使用方法,利用定时器的编码(Encoder)模式
·
EC11数字电位器使用方法,利用定时器的编码(Encoder)模式
1. 硬件连接
PB6 ------> TIM4_CH1 EC11_A_Pin
PB7 ------> TIM4_CH2 EC11_B_Pin
2.定时器配置
(1)寄存器配置
分频(PSC): 5
自动装载值是30,扭动电位器旋钮,往上加到30后又从0开始。
输入滤波是4。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yI2N2TH5-1617332095652)(E:\记录\EC11\TIM4.png)]](https://i-blog.csdnimg.cn/blog_migrate/af7a0a51c08fcb072ef98e1ba5efb332.png)
(2)开中断
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O7I8Nr6k-1617332095658)(E:\记录\EC11\开中断.png)]](https://i-blog.csdnimg.cn/blog_migrate/28154eac002acf9484dc85620cc134bd.png)
(3)引脚的标签
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2BKZEsPX-1617332295283)(E:\记录\EC11\生成.png)]](https://i-blog.csdnimg.cn/blog_migrate/9141f930a799e0b0eaa1a2f9075ae384.png)
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两个寄存器的数值相同,都是正转时增加,反转时递减。
更多推荐



所有评论(0)