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,等待下一次捕获完成。

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

 

 

 

树莓派通过使用霍尔编码器可以实现电机测速霍尔编码器是一种将角速度或角位移转换为数字脉冲的旋转式传感器。它通过电磁转换将机械位移转化为脉冲信号,并输出A、B两相的方波信号,这两相脉冲信号相位相差90°。通过检测规定时间内的脉冲数和A、B两相脉冲信号的相对位置,可以获取编码器的值和运动方向。 在树莓派上,你可以使用STM32编码器电机配合使用来获取速度信息。你可以根据编码器脉冲值计算出电机的速度,单位为m/s。例如,你可以通过读取定时器2和定时器3的计数值(即编码器脉冲值),然后进行一系列操作,如取反,清零计数值等,最后,根据计算公式0.003092424 * pulse,即可得到实际速度值。 因此,你可以根据这份代码进行树莓派霍尔编码器测速的开发工作。注意,代码中还有其他与电机驱动相关的部分,你可参考上篇文章来获取更多信息。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [STM32机器人控制开发教程No.2 霍尔编码器电机测速以及增量式PID控制(基于HAL库)](https://blog.csdn.net/COONEO/article/details/125909782)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值