前言
目前随着电动汽车的发展,电机控制器的开发需求越来越普遍,目前市场上主流的电机控制器采用了英飞凌TC2xx芯片来实现,英飞凌系列芯片提供了一套完整的旋变软解码的实现方案供我们来使用,但针对初学者或转行过来的同学来说感觉还是很陌生,其实芯片给我们做了大部分工作,我们只需要配置相关的底层DSADC模块,就能够实现电机角度的获取和实现。
一 时间戳概念介绍
旋变软解码的激励信号为9.765K的固定频率信号,固通过DSADC模块采集到的SIN和COS原值为固定的102.40us产生一组原始值,而电机控制器的开关控制频率一般在2K-20K之间变化,做过电机的同学都知道,在计算三相电流和角度时,需要采集一组三相电流和角度来进行FOC计算,其中一组值的采集就好比拍照一样,把某一时刻的电流和角度记录下来,显然,旋变软解码的固有特性102.40us采集到一组值和电流采集肯定不同步,为了使三相电流和角度进行同步,则引进了时间戳的概念,通过采集到的时间戳动态对角度进行补偿,如下图:
通过上图可知,在Tx时刻进行FOC计算时,在当前时刻获取到DSADC的结果为Sin(T0)和Cos(T0),显然在Tx时刻拿T0时刻的值不够准确,应该拿Tx时刻的Sin和Cos值,但Tx时刻无SIN和COS值,所以无法直接使用SIN和COS值,但这里我们可以采集到Tx时刻的时间戳,我们想办法把此时刻的时间戳获取到即可,下面讨论如何获取时间戳的方案。
二 时间戳获取方案
针对TC27x系列的Tricore芯片来说,目前有两种方案,下面就这两种方案分别进行阐述。
1、通过DSADC内部时间戳机制实现
一般,我们在设计电机底层驱动时,正常会设计一个PWM的参考通道,一般采用ATOM组的第一个通道来完成PWM参考通道设计,参考通道的设计目的是为了同步三相全桥6路PWM的周期使用,同时会利用参考通道PWM的上桥中心点或下桥中心点来触发三相电流ADC采样,如下图所示:
如图圆圈1所示,是参考PWM通道的周期开始的上升沿(也可以称为下桥的中心点位置)触发三相电流ADC采样,或者在圆圈2的位置,是参考PWM通道周期的下降沿(也可以称为上桥的中心点位置)触发三相电流ADC采样。基于以上触发三相电流采样的位置来说,可以在上升沿位置或下降沿位置,对应触发DSADC的边沿选择和ADC触发的位置相同即可。在触发时刻获取的SIN和COS值原始值、时间戳。那么如何具体实现呢?如何拿到DSADC是SIN和COS原始值和时间戳呢?
通过DSADC芯片手册介绍,可以配置DSADC的原始值SIN\COS以及时间戳的触发源,当触发源触发后,会将最新DSADC转换完成的SIN和COS值、时间戳保存到寄存器中。
其中SIN值和COS保存的寄存器为:
DSADC_TSTMPx.B.RESULT
时间戳值会保存到寄存器为:
DSADC_TSTMPx.B.NVALCNT
DSADC_TSTMPx.B.CFMDCNT
NVALCNT数据手册里解释如下:
在DSADC内部做整型时的计数器,在开始或完成时开始向上计数,当触发源触发后,会把当前时刻的计数保存下来。
CFMDCNT寄存器解释如下:
DSADC内部的CIC滤波器向下计数的一个计数器,表明内部再触发源触发时刻计数的位置,注意再应用这个寄存器时需要注意初始值,初始值减去当前值表明从上一次结果到触发源触发时刻的计数。
其实,如上面描述,还是很晦涩难懂,白话可以理解为再触发源触发时刻,DSADC锁存了DSADC内部积分也好滤波也好的时间位置计数器的值,我们通过这个值反算出从上一时刻结果输出到当前触发时刻的时间差值,时间差值计算方法为:
t = NVALCNT*a + (b-CFMDCNT)*c
其中a、c为常数,b为设置的初始值。
以上方法,可以通过在10K的开关控制频率下进行验证,10K开关频率方便观测时间戳数据,正常情况下,在102.40us下会来两次100us的触发源,SIN和COS值相隔一定周期后会出现不变化的情况,同时时间戳一个是最小值(接近0us),一个是最大值接近102.40us,如果有VX1000设备的同学,可以很好观察并验证时间戳是否准确。当然,这种方案的精度不是特别高(相对比第二种方案),对于电机控制来说精度目前还可以,如果测试下来发现精度未达到系统要求,我们可以考虑第二种方案,采用TIM捕获的方式来完成时间戳的获取。
2、通过触发TIM模块来实现时间戳机制实现
采样TIM硬件触发的方案先看一下下面的草图:
DSADC模块会102.40us给出一个转换结果,例如图中的圆圈3的点,然后假设在圆圈1点处触发ADC采集三相电流,同时在圆圈1点时拿圆圈3的SIN和COS值,那么时间戳我们实际上需要拿到T1时刻的时间减去T3的时间即可,如果开一个DSADC结果中断,在中断里记录时间,同时在PWM的上升沿也就是圆圈1出进入中断后记录一个时间,然后两个时间相减就可以得到了时间戳,但是,采用中断的方法时间偏差较大,对于一个系统来说,触发中断到响应中断都需要us级别,在中断里做显然行不通,那么就采用在DSADC结果时刻硬件触发TIM1模块来锁存GPR0,同时在PWM参考通道的上升沿时硬件触发TIM2的GPR0来锁存,进入ADC中断处理时,把两个锁存的TICK相减,即可得到时间戳的值,以上原理很简单粗暴,采用硬件触发的方式来完成,采用软件进入中断方案不可取,未验证过或未测试过的同学可以测试验证一下。
以上原理简单,但实现起来比较麻烦,有需要的同学可自行验证,实现自己的时间戳开发方案。
三 时间戳的验证方法
不论采用哪种方法,我们需要对我们获得到的时间戳进行验证,本章主要描述验证测试方法。
先看一下面框图:
其中,T1、T2、T3是DSADC转换结果时刻,Tp1点、Tp2点是触发ADC采集时刻,其中T1、
T2是我们采集到的时间戳,如何验证
T1、
T2获取到的时间戳是正确呢?
假设PWM的开关频率为10K,周期为100us根据上图可知:
102.40 - T1 =
T (1)
100-T2 =
T (2)
通过公式(1)(2)推导出:
T2 -
T1 = 102.40 -100 = 2.4us
如上计算公式可知,在10K开关频率下,最新时刻的时间戳和上一时刻的时间戳差值为固定值,为2.4us,在10k开关频率下,还会出现一种特殊情况,如下:
对于这种特殊情况,我们可以看出,在一个DSADC更新周期之间,会出现两次控制,即获取到的SIN和COS值没有变化,都是T1时刻的原始值,而时间戳则为100us,因为,第一次的时间戳的时间为Tp1-T1,第二次的时间戳为Tp2-T1,则两次的时间戳差值为Tp2-Tp1,即是PWM周期的时间。
通过以上分析原理,我们通过代码建立一个缓存大的buffer来把时间戳的差值记录下来,最好在10K的开关频率下来验证,时间戳的差值间隔48个点会出现差值为100us,正常时为2.4us,如果你们的时间戳验证下来不是上面的数值,需要重新验证你们的时间戳开发方案。这里注意一下,如果采用了第二种方法实现的话,时间戳的差值会有几个tick偏差,这个对系统控制不会造成影响。
四 结论
以上我们介绍了时间戳的概念,同时我们也介绍了时间戳的获取方案,获取到时间戳后,我们也介绍了如何进行时间戳的验证方法,希望本篇文章对您理解DSADC的时间戳有一定的帮助,水平有限,文章内容有欠佳的地方,望批评指正。
后续,有时间整理一下TX3XX的时间戳的实现方案,3系相对2系,时间戳获取的方法更简单了,3系的DSADC模块自带了一个时间戳的计数器,实现的方案和此文章的第一个方案类似,但更高效更灵活了,有感兴趣的朋友可以加微信,微信号为博客名称,多交流多学习。
时间戳是我们做电机底层控制开发过程种重要的一环,但其他模块也比较重要,就是三相电流采样的实现以及中心对称的PWM的发波实现方法等等,最近我们在研究一个PWM进行两次中断进行FOC运算,提高控制频率,降低开关频率,相信此方案对系统会有很大程度提升。