樊长虹 杨华升 管文辉
【摘要】利用TMS320F281x DSP的捕获功能,软件实现了多通道传感器信号到达时延测量。在DSP多个事件管理器的周期交替中断中读取捕获值,消除了到达时延测量时可能出现的周期倍差。该测量方法充分了发挥DSP硬件功能组合灵活特性,简化了外围电路的硬件设计。
【关键词】F281x DSP;捕获功能;信号时延测量
1.引言
超声波测距定位、麦克风语音定位等都需要实时而精确地测量不同传感器信号之间到达时延,然后送给DSP进行计算求解。时延精确测量可以分为粗测和精测,粗测通常采用可编程逻辑器件作为计数器来获得时差,精测时通过谱估计方法获得信号相位差,然后对粗测时差数据进行修正。本文在某型超声波定位系统中利用TMS320F28xx DSP的捕获端口直接测量多个超声波传感器信号到达时差,然后对A/D采集的多路波形信号采用FFT相关方法来获得相差。
该方法的粗测和精测均由DSP完成,简化硬件设计。下面主要介绍采用DSP捕获端口直接测量时差的方法。
2.捕获端口时差测量难点
现有的多种DSP(或MCU)都具有多个捕获端口,很多研究者都考虑过采用捕获端口获取各通道触发信号来计算信号到达时差。假设某个定时器周期为P,该定时器同时作为两个捕获端口CAP1和CAP2的时钟。CAP1和CAP2分别连接外部通道Chan1和Chan2。当Chan1和Chan2的触发信号在同一个定时器周期内到达时,分别读取CAP1的捕获寄存器时间值CAP1Counter和CAP2的捕获寄存器时间值CAP2Counter,则CAP2Counter-CAP1Counter即为所测时差。但实际上两路触发信号通常在不同的定时器周期到达,如果仍以CAP2Counter-CAP1Counter作为所测时差,则有可能带来n*p个时钟误差(n为两路触发信号所差的定时器周期数)。可采用定时器周期中断中计数的方法来解决信号到达时差大于一个定时周期的问题:开启定时器的周期中断,设置周期中断次数为TPCounter,在每个周期中断中对TPCounter增1;当Chan1通道触发信号触发CAP1时,在该捕获中断函数中记录当前的TPCounter为TPCounter1,同样Chan2通道触发信号对应的TPCounter为TPCounter2,则两路信号的到达时差为:
(TPCounter2*P+CAP2Counter)-(TPCounter1*P +CAP1Counter)
上述测量方法原理上是可行的,但考虑到DSP的中断处理本质上是串行实现的,必须考虑临界状态的极端情况。由于定时器周期中断处理必须一定的时间,假如当定时器周期中断中读到一个很小的CAP1Counter值,该值小到不足以区分该次触发是当前定时周期内产生的,或者是上个定时器周期内产生的但未及时被读取的。此时如果不能区分,则时差测量时可能会出现一个定时器周期的误差。
下面对TMS320F281x片上资源分析,给出一种可靠的解决方法。
3.解决方法
TMS320F281x具有两组事件管理器A和B。以事件管理器A为例,它具有两个16位定时器Timer1和Timer2,同时具有3个捕获端口CAP1、CAP2和CAP3,以CAP1和CAP2为示例进行分析。Timer1和Timer2都可以分别设置各自的时钟周期数、计数初值,并各自计数满后产生相应的周期中断。当设置Timer1和Timer2的时钟为150MHz而最大周期数为0xFFFF时,每经过约436.9微秒会各自产生一次周期中断。
新方法设置Timer1和Timer2两者的周期中断交替进行,然后在周期中断中对捕获进行查询来测量时差,避免前述可能出现无法正确确定触发信号所到达周期。主要处理流程如下:
1)初始化
设置Timer2和Timer1周期都为0xFFFF,并且Timer2计数器初始值为0x8000,以使Timer2周期中断超前Timer1周期中断半个周期;设置CAP1和CAP2捕获模式。启动Timer1和Timer2,并使能二者周期中断,等待两个通道触发信号到来。
2)Timer2周期中断函数处理
由于Timer2超前Timer1,因此Timer2周期中断函数先被调用。读取CAP1和CAP2的寄存器,判断是否已被触发。若CAP1已被触发,则TPCounter1=TPCounter;若CAP2已被触发,则TPCounter2=TPCounter。
3)Timer1周期中断函数处理
读取CAP1和CAP2的寄存器,判断是否已被触发。如果CAP1已被触发,并且读取的数值不小于0x8000,那么可以确定该触发一定发生在上一个Timer1周期中(因为Timer2已经读取过上个Timer1周期的前半个周期中是否存在触发),则TPCounter1=TPCounter;反之,如果CAP1已被触发,并且读取的数值小于0x8000,可确定该触发一定发生在当前Timer1周期中(因为小于0x8000的CAP1已经被Timer2周期中断函数中读取),则TPCounter1=TPCounter+1。对CAP2同样处理。退出周期中断函数时,TPCounter=TPCounter+1。
4.试验结果
为验证新方法有效性,采用安捷伦3320A信号发生器作为信号源,安捷伦DSO6034混合信号示波器作为时差测量仪器。
4.1 小时差信号测试
测量两路时差小于定时器周期的信号:
1)捕获模式设置:CAP1设为上升沿捕获,CAP2设为下降沿捕获。
2)信号源设置:设置3320A输出信号为周期50KHz占空比50%幅度3V的方波,也即上升沿和下降沿时差为1/(100K)=10us,10.000us对应150MHz晶振的1500个周期。
3)信号输入与测试:3320A输出信号直接送给两路捕获,共测量10000次。9995次测得时差为1500个晶振周期,2次测得时差为1499个晶振周期,3次测得时差为1501个晶振周期,也即最大测量误差为±1个晶振周期。
4.2 跨周期时差信号测试
测试两路时差大于定时器周期的信号:
1)捕获模式设置:CAP1设为上升沿捕获,CAP2设为下降沿捕获。
2)信号源设置:设置3320A输出信号为周期500Hz占空比50%幅度3V的方波,也即上升沿和下降沿时差为1/1000=1000us,1000us对应150MHz晶振的150000个周期。
3)信号输入与测试:3320A输出信号直接送给两路捕获,共测量10000次,其中5949次测得时差为150000个晶振周期,其余时差值中最大150002个晶振周期,最小149997晶振周期,没有发送过测量误差为Timer1周期整倍数的情况。测量误差增大是因为F281xDSP板卡本身晶振偏差所引起的。
5.结论
本文利用TMS320F281x DSP两组事件管理器交错周期中断方法,实时读取多路捕获端口的寄存器捕获时间值,无论对小时差或者较大时差均可较精确测量,长期试验表明了该方法精确可靠。
参考文献
[1]TMS320F281x Data Sheet(Rev.F).