STM32
直播中

胖子的逆袭

12年用户 1116经验值
私信 关注
[问答]

如何去使用stm32的Encoder编码器呢

如何去使用STM32的Encoder编码器呢?
使用stm32cubeMx配置Encoder的过程是怎样的?

回帖(1)

杨云

2021-10-19 14:26:32
  stm32 的Encoder 使用
  增量式编码器在实际应用中还是很常见。
  stm32的定时器带的也有编码器模式。
  所用的编码器是有ABZ三相,其中ab相是用来计数,z相输出零点信号。
  AB相根据旋转的方向不同,输出的波形如下图所示:
  
  从图上可以看出来,cw方向A相会超前B相90度左右,相反CCW方向,B相会超前A相90度左右。不过方向判断stm32自己是可以完成的。下面是使用stm32cubeMx配置的过程。
  环境
  软件:stm32cubemx mdk 芯片型号:stm32F407IGH6 使用的是定时器2
  步骤
  1 首先打开timer2的encoder模式:
  
  2 下面才是重点,配置具体定时器的参数:
  选择的encoderMode是 **TI1和TI2模式。这种模式下,AB两相的上升沿和下降沿都会计数,所以计数值是实际值的4倍,需要做分频。**也就是第一个参数,分频值设为3,实际上是3+1=4分频。
  还有个地方需要解释一下,我刚开始的时候就是把这里的设置没搞清楚,看Polarity参数设置的是Rising Edge。这个参数的意思是在检测到上升沿的时候就触发encoder捕获AB相的值,而并不是这里设置的是上升沿就只检测AB相的上升沿,下降沿还是同样会计数的。
  Input Filter滤波值是从1-15,看情况设定,是用来滤除一些杂波的。
  
  3 生成代码
  这样基本就配置好了,生成mdk工程。
  然后就是添加应用代码了。
  在初始化中添加打开定时器的encoder模式:
  HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
  然后定期调用下面这一句函数就可以获取到encoder编码器的计数值:
  enc1 = (uint32_t)(__HAL_TIM_GET_COUNTER(&htim2));
  //获取定时器的值
  开始瞅瞅测出的速度吧~
举报

更多回帖

发帖
×
20
完善资料,
赚取积分