STM32霍尔编码器测速:标准库函数实现

        基本原理:霍尔编码器是有霍尔马盘和霍尔元件组成。霍尔马盘是在一定直径的圆板上等分的布置有不同的磁极。霍尔马盘与电动机同轴,电动机旋转时,霍尔元件检测输出若干脉冲信号,为判断转向,一般输出两组存在一定相位差的方波信号。

        使用霍尔编码器测速最主要的还是根据输入捕获计算时间。和正点原子标准例程不同的是,霍尔编码器在上电后的默认电平是高电平,当磁铁经过传感器前端时,会出现一段时间的低电平,也就是霍尔编码器上面的绿灯会有暗变亮,所以我们需要做的就是通过stm32定时器的输入捕获来确定低电平的时间,因此在配置时需要将第一次捕获设置为下降沿捕获。

第一步:配置IO口

       这里选择通用定时器即可,我这里用的是通用定时器3的通道1即PA6。

设置为上拉输入,别的就不用过多阐述了,正点原子的例程设置的是下拉输入,并且使用了GPIO_Setbits(0),这里我没看懂为什么要多加这一句,按理来说这个函数应该只有在输出的时候才会配置。

第二步:定时器的初始化

        TIM_BaseInit()函数,这里的时钟分割设置为TIM_CKD_DIV1即TDTS = Tck_tim,即时器时钟频率 (CK_INT)与数字滤波器 (ETR,TIx)使用的采样频率相等,这里可以随意设置,因为在出现低电平时只会出现一次下降沿,可以不使用滤波器。TIM_CounterMode_Up即向上计数模式,以及接下来的自动重装载值、预分频系数(采用变量在调用时便于更改)。

第三步:定时器通道的配置

配置TIM_ICInit()函数,初始化结构体变量,TIM_Channel即选择通道;TIM_ICFilter=0,即不使用滤波器;TIM_ICPolarity这里设置第一次为下降沿;TIM_ICPrescaler设置为没探测到一个边沿执行一次,TIM_ICSelection_DirectTI通道映射,即输入1映射到通道一。

第四步:配置中断

定时器中断设为定时器3的,并且使能更新中断以及输入捕获中断,最后就是使能定时器。这里的更新中断我认为很有必要解释一下,输入捕获中断应该很好理解,更新中断即当计数器的值等于自动重装载值时就会发生一次,设置这个的目的是为了防止在第一次捕获到下降沿后,到第二次捕获到上升沿中间过了很长时间,以至于计数器发生溢出,这样就不能简单的只将两次CCER寄存器读到的值相减,应该加上中间溢出的时间,那怎样通过硬件来知道是否发生溢出,即更新中断,进入一次更新中断代表计数器的值溢出一次。

第五步:中断服务函数

这里设置了一个8位的变量,第八位标志一次完整捕获,第七位标志是否捕获到低电平,第一位到第6位用来记录计数器溢出的次数;第二个16位变量用来存放输入捕获的值(发生捕获时CCER寄存器的值)。

在这里需要先说明两个函数,TIM_GetStatus()用来检测发生的捕获是否为输入捕获,TIM_ClearITPendingBit()用来清除中断标志位,因为定时器发生中断后中断标志位会被硬件置1,需要用软件清0,否则会一直进入中断服务函数。每进入一次中断服务函数就清楚一次中断标志位。只要发生更新中断就会进入中断服务函数,在未发生输入捕获时,STA的第8位为0,且第二个if语句判断出发生的不是输入捕获中断,变量STA的值不会发生改变(STA第8位的值一直为0,),当第一次发生输入捕获时,会执行第二个if语句,且执行里面的else下的语句,在第一次捕获到下降沿后,将变量的值全部清零,并且将计数器的值设为0(即总的计数器计数次数等于溢出的次数乘以自动装载值加上第二次捕获时检测到的val的值),同时设置第7位,标记已经捕获到一次下降沿,随后将输入捕获极性设置为上升沿捕获,等待下一次输入捕获,在这之后,发生上升沿捕获之前,每进入一次中断服务函数,即代表计数器溢出一次,执行第一个if语句,若执行的时更新中断且已经捕获到低电平,若变量STA的值已经达到最大即时间太长,这里强制给变量val赋最大值,且标志已经捕获到一次完整的下降沿,否则的话STA的值加1。直到捕获到一次高电平时,进入第二个if语句的if语句里面,相应的标志位置1,获取此时CCER寄存器的值,并反转输入捕获极性。

最后:主函数计算

 

 这里只需要不断的获取STA的第8位是否为1,当第8位为1时,将获取的次数乘以65536(自己配置的定时器的自动重装载值),最后加上获取的val的值,因为我这里设置的预分频系数为72,即每计数一次经过1us,在获取到本次低电平的时间后,将变量STA的值设置为0,等待下一次捕获完成。

这就是我对霍尔编码器实验的全部理解,若文中有不正确的地方或者不严谨的地方,还望指正。

 

 

 

物联沃分享整理
物联沃-IOTWORD物联网 » STM32霍尔编码器测速:标准库函数实现

发表评论