概述
基于F28335的Simulink代码生成系列文章目录
基于F28335的Simulink代码生成(一)——搞懂模型的运行逻辑
基于F28335的Simulink代码生成(二)——EPWM模块同步设置问题
基于F28335的Simulink代码生成(三)——EQEP模块获取光电编码器的速度与角度信息
基于F28335的Simulink代码生成(四)——如何链接可以访问底层文件的外部源文件和头文件
基于F28335的Simulink代码生成(五)——DMA的使用
基于F28335的Simulink代码生成(六)——如何修改变量的存储类型
基于F28335的Simulink代码生成(七)——成果展示
目录
- 基于F28335的Simulink代码生成系列文章目录
- 前言
- 一、28335的EQEP模块
- 二、角度测量
- 三、高速测量
- 四、低速测量
前言
随着对于各种模块的使用越来越深入,逐渐感受到了代码生成的不友好与不完善性。基于一开始的目的,我进行代码生成的目的只是为了解决电机无位置控制中的滤波以及注入的复杂编程才进行的。但是目前代码生成对于底层的链接方式让我感到很不舒服。
OK,接下来开始本节的正文
一、28335的EQEP模块
EQEP模块的正交解码单元对于光电编码器的AB脉冲可以十分方便的测量,只需要在特定情况下去读取计数寄存器即可。
另外EQEP的时钟就是系统时钟,内部主要有两个时钟:捕获时钟和单位事件的时钟。
针对编码器在高速和低速情况下同一种测量方式会存在较大误差的问题。因此边沿捕获单元提供了两种方式进行计算。下图为EQEP模块总体配置。
二、角度测量
角度测量主要是实时读取捕获单元的QPOSCNT寄存器,这个寄存器也就是存放脉冲数的地方,一般我们需要对捕获模块进行4倍频,也就是将AB相的上升沿和下降沿都处理成一个脉冲,从而确定是在当前转速的方向以及加减速。
EQEP中还有个最大脉冲数的寄存器QPOSMAX,这个寄存器的存在是有意义的。虽然我们可以在模块中设置当索引事件来临时将当前脉冲数置0,这样的话,当我们计数时遇到Z信号的脉冲,计数器的值就会归零重新计数。也就是说此时我不论最大脉冲数是多少,但我计数到最大的脉冲数(例如2500线的编码器的话就是10000个脉冲)的时候就会自动归零。但是这个思路有个问题,因为我们的计数器在编码器正转时的确是会一直增加计数并在10000个脉冲时清零并重新计数。但是当我们是反向旋转编码器时,计数是会在当前的计数值上一直减小的,当减小到0时,他并不会复位到最大脉冲数继续减小,而是会直接变成QPOSMAX。这与我们的期望不符,当然可以通过程序改变这种情况,但是为了简单起见,我还是选择在模块中设置好QPOSMAX=2500*4。下图为位置计数器的设置。
三、高速测量
高速测量的思想是在设定的单位时间T内,计算采集到的脉冲数X,即可确定这部分脉冲数所花的时间,对应到转一圈总共的脉冲数就可以算出一圈的速度,也就是我们认知的转速。捕获时钟寄存器和捕获周期寄存器会在CPU读取QPOSCNT寄存器时(或者单位时间事件发生时)将计数得到的锁存到QCTMRLAT和QCPRDLAT,这两个寄存器是捕获的定时时间和周期的锁存寄存器。通过锁存的方式就不会导致由于程序没有实时读取而造成误差的情况。当设定单位时间事件发生时,我们的QPOSCNT寄存器此时也会锁存到一个新的寄存器QPOSLAT,因此只要测量前后两次的QPOSLAT的差值(要考虑过Z信号的情况),再配合单位时间,就可以计算出对应该脉冲数下的转速,从而得到转一圈的速度。
这里要注意的是,一般我们采取的都是单位时间事件到来后,将计数值进行锁存。
单位时间的设置主要根据QUPRD寄存的大小来算:单位时间频率=系统时钟/QUPRD。该部分的配置如下:
针对这部分的代码让我存在过的疑惑是:当单位时间事件来临时,我会需要读取UTO标志位来确定是否已经到来,然后需要对锁存的寄存器进行读取并处理。然后在SImulink中我很难得到标志位的实时状态,另外在处理结束后还要对标志为进行清零操作,十分繁琐。所以我想到了中断的办法,在中断中进行读取和处理更加方便,因为EQEP模块可以设置中断产生的方式,如果只是做高速测量,完全可以设置在单位时间事件到来时才中断,进入中断后直接进行寄存器的读取和处理就可以了。而且所有的标志位中断都会自动清零,并不需要我们手动操作。但是如果还需要考虑其他的中断状态,这种方式,依旧需要读取寄存器的值,进一步在中断里判断:当UTO=1时,进行高速测量和采集。
读取UTO的状态目前我只想到了一种办法,就是定义一个全局变量,在"System out"中,将UTO赋值给该变量,然后在函数中读取该变量的状态即可。但是要注意该变量的读取虽然是放在EQEP的中断里,不过一定要比中断函数对标志位清零的操作要早!!!,不然每次UTO=1时就会马上被重新清零了哦。
高速测量大概就这么多要说的了。
四、低速测量
低速测量实质上也很简单,就是在编码器A相其中一个脉冲的时间中用一个高频脉冲信号去测量,A相的一个脉冲里有多少个高频脉冲信号,这么一个脉冲信号是多少时间了。对应的也就知道转速的时间了。但是低速测量有诸多限制,注入不能有换向产生,不然测出来的肯定不对,另外单位事件发生时,EQEP并没有对应的中断会产生,只能实时读取,当转速过快时,捕获的太快,而程序读取到事件标志位却存在延迟,因此从复杂度和效益上,低速测量的方法都不是很好的选择,目前也还在测试,故不做过多的说明了。
最后
以上就是俏皮身影为你收集整理的基于F28335的Simulink代码生成(三)——EQEP模块获取光电编码器的速度与角度信息基于F28335的Simulink代码生成系列文章目录前言一、28335的EQEP模块二、角度测量三、高速测量四、低速测量的全部内容,希望文章能够帮你解决基于F28335的Simulink代码生成(三)——EQEP模块获取光电编码器的速度与角度信息基于F28335的Simulink代码生成系列文章目录前言一、28335的EQEP模块二、角度测量三、高速测量四、低速测量所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复