定时器2:正交解码器

概述

继续介绍hpm6200evk的定时器,本文介绍拥有解码功能的定时器

正交解码器常工作于电机测速中,电机由定子和转子构成,为了控制的精细,转子往往由NS极交替组成,如下图所示

因此,放置两个传感器在电机内部,随着转子的运动,就会交替产生固定相位差的方波,而对于每个电机来说,转一圈到底生成多少个方波是确定的,这取决于你电机转子的磁场结构,这就是电机测速的基础

关于电机的工作原理,可以参考

https://www.zhihu.com/zvideo/1650108292834775040

工作模式

QEI解码器支持三种工作模式:正交解码,方向模式,上下模式

工作模式由CR[ENCTYP]位决定,可以通过驱动中的函数设置

在方向(PD)模式中,P相输入脉冲,D向输入方向

在上下(UD)模式中,U相脉冲让计数器自增,D相脉冲让计数器自减

在正交模式中,AB相均有脉冲,A相相位领先B相90度,代表电机正转

A相相位滞后B相90度,代表电机反转

正交模式的优势在于,对于同样转速的电机,AB相都有脉冲信号,因此记数的精度比其他两种模式高一倍,因为两路的电平翻转都可以用于记数

其次,正交模式能够有效得抗干扰

在STM32的用户手册中,对这部分功能有详细描述

可以看到,实际上相位计数器的增减取决于在AB相上电平的相对关系,假设B相正常,A相有一个毛刺信号,那无论此时B相是高电平还是低电平,一定是一次向上计数一次向下记数,最终这个毛刺信号对相位计数器的影响就没了

(这个表把TI1当成A相,TI2当成B相,相对电平关系就是A相和B相的相对电平关系)

在Hpm6200evk的用户手册中,对抗干扰的这部分功能并没有进行描述,因此我进行了简单的测试

给AB相一个人为的毛刺信号,如下图所示

信号翻转时打印当前phcnt的值

可以看到,在最后只有B相有信号翻转的时候,记数反复在8和9之间变化,最终变为毛刺信号出现之前的8,说明了该外设具备抗干扰的能力

常用寄存器

PHCNT是AB相位计数器,当AB相接入正交信号后,无论A相还是B相,只要有电平跳变,计数器就会加一,相当于上面的在TI1和TI2上记数

PHMAX,相位溢出计数器,上文说到了,一个电机转一圈产生的脉冲数是由电机的结构决定的,因此假设转一圈有2000个脉冲,那么当相位计数器记数到2000时,也应该清零,因此就不难理解相位溢出寄存器PHMAX的作用了

每当相位计数器达到PHMAX后,则Z相计数器就会加1,Z相计数器就代表了电机转动的圈速,Z相计数器ZCNT也支持Z相的输入,电机如果转一圈就发一个脉冲,那么这个信号就可以用于电机圈速的统计

当PHCFG[ZPHCNTCFG]置1时,正交解码器通过AB相来对ZCNT进行记数,那此时Z相的输入究竟有什么用,文档的描述不是那么容易懂,首先对于Z相校正值PHIDX做一下补充说明

假设PHIDX为0,相位计数器PHCNT从0自增到PHMAX,假设PHMAX为4000,也就是电机转一圈,AB相各有2000个脉冲

当记数收到干扰,导致转了一圈,但发送了4001个脉冲,那么当PHCNT到达4000时,他重置为0,ZCNT+1,而此时Z相的脉冲还没有过来;当PHCNT变为1时,这时候才是真正转了一圈,Z相有一个信号过来,发现PHCNT-PHINDX = 1 < PHMAX/2,那么ZCNT就不会再有变化

而当因为某种原因,导致转了一圈,只收到了3999个脉冲,PHCNT没有溢出,此时来了一个Z相的信号,那么此时PHCNT-PHINDX = 3999 > PHMAX/2, ZCNT就会+1,而当PHCNT=4000的时候,PHCNT重置,ZCNT仍会+1,造成重复记数

因此,如果选用了PHMAX溢出来记圈速,就不要再用Z相信号;如果选用Z相信号,那么就相信Z相信号

测速日志寄存器

简单的来说

在一个周期内,根据AB相高低电平的相对关系,会把一个周期分成4段

有一个定时器以工作时钟频率自增,当从AB相任意一个脉冲出现上升下降沿,就把这个定时器的值保存到日志中,然后再把定时器清0

也就是说,假设电机匀速转动,A,B相在某一时刻均为低电平,然后A相出现上升沿,此时定时器值为2000,则把2000保存到日志寄存器0中,然后定时器变为0

然后B相出现上升沿,此时定时器的值理论上仍然为2000(电机匀速转动,AB相位差90度),保存到日志寄存器1中

把一个周期的记数分成4段,好处就是你可以监控电机加减速的过程,如果电机加速,那么定时器的值应该会越来越小,减速则相反

位置匹配

测速日志寄存器已经能完成电机的测速,相位寄存器的存在其实并不是为了让你用测周法来手动算出电机的速度,而是可以和位置匹配寄存器一起使用,让电机转到特定的角度产生一个中断和DMA请求

譬如说,电机转一圈PHMAX是3600,你希望在转动120度时,做一些事情,你就可以设置位置匹配寄存器为PHCMP为1200;你也可以在电机转速为特定值,或转了多少圈之后,产生这个中断或DMA

具体的规则如下所示

 

数据读取

上诉说的相位寄存器PHCNT,测速日志寄存器SPDCNT,圈数寄存器ZCNT等寄存器,都随外部输入不断变化,就像一个正在被快速修改的数据库

而我们又往往需要在同一时刻读取多个寄存器的数据,读取数据有需要时间,因此,正交解码器也提供快照读的功能;当然,你也可以获取实时的数据

如果你需要使用快照读,那么显然就需要指定快照拍摄的时刻,快照的拍摄时刻可以由软件决定,也可以由硬件决定,具体如下所示

当你选用软件触发时,使用驱动中的函数

qei_load_counter_to_read_registers(QEI_Type *qei_x)

然后读取对应read寄存器中的值即可

当选用硬件触发时,需要先选择用什么信号来触发

然后当对应信号SR寄存器置1时,触发读取事件,之后再用函数读取read寄存器的值即可

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值