F28035 HRCAP 官方文档自学


此处描述的HRCAP模块是Type 0 HRCAP。
HRCAP用一个典型值来测量外部脉冲的宽度几百皮秒内的分辨率。(这里后面讲300ps,前面300后面300,一共误差600ps)

5.1 引入

HRCAP的用途包括:

•电容式触摸应用
脉冲周期的高分辨率周期和占空比测量
•瞬时速度测量
•瞬时频率测量
•跨隔离边界的电压测量
•距离/声纳测量和扫描

HRCAP模块包括以下功能

•非高分辨率或高分辨率模式下的脉冲宽度捕获:
•差异(增量)模式脉冲宽度捕获
•每个边缘的典型高分辨率捕获量约为300 ps
•在下降沿或上升沿中断
•连续模式捕获2深缓冲器中的脉冲宽度
•校准逻辑,可进行高精度高分辨率捕获

5.2 介绍

HRCAP模块除高分辨率校准模块外还包括一个捕获通道,该模块在校准期间内部连接至HRPWM通道。就是说是通过HRPWM来校准HRCAP

每个HRCAP渠道都有以下独立的关键资源:

  • 专用输入捕捉引脚
  • 16位HRCAP时钟(HCCAPCLK),该时钟等于PLL输出频率(与SYSCLKOUT异步)或等于SYSCLKOUT频率(与SYSCLKOUT同步)
  • 两级深度缓冲器中的高分辨率脉冲宽度捕获
  • 利用内部连接至HRPWM输出的高分辨率校准逻辑

HRCAP模块图

通常,HRPWM模块通道A输出的最大数值实例是内部HRCAP校准信号输入。 例如,在具有七个HRPWM实例的设备上,ePWM7A HRPWM输出是内部HRCAP校准信号输入。也就是说最后一个HRPWM是给HRCAP用来校准的

5.3 运作细节

图5-2显示了实现模块的高分辨率,脉宽捕获功能的各种组件。

功能细节图

5.3.1 HRCAP的时钟

尽管HRCAP模块由系统时钟提供时钟,但用于捕获高分辨率脉冲的16位计数器(HCCOUNTER)和边沿检测逻辑由HCCAPCLK提供时钟。 HCCAPCLK必须落在特定于设备的数据手册的“电气”部分指定的频率范围内。 HCCAPCLK可以由系统时钟(SYSCLK)提供时钟,也可以由分频器之前的PLL输出(PLLCLK)提供时钟。 如果HCCAPCLK由PLLCLK馈送(HCCTL [HCCAPCLKSEL] = 1),则HCCAPCLK将与SYSCLK异步。
在这里插入图片描述
在该设备上,时钟分频器是PLLSTS [DIVSEL]位的结果。

这图可能就是说:

  • HCCAPCLK这个时钟是选PLL(更高频)还是选SYSCLKOUT是由HCCTL[HCCAPCLKSEL]的值决定的,1是PLL。
  • 然后SYSCLK2是PLL分频来的,分频是由PLLSTS[DIVSEL]的值决定的。

5.3.2 HRCAP运作模式

两种模式:

  • 正常捕获模式:
    HRCAP模块以±1 SYSCLK(其中SYSCLK来自与提供HCCAPCLK的PLL输出时钟相同的时钟源)的正常分辨率捕获脉冲宽度。与高分辨率捕获模式相比,此模式所需的软件开销更少。(没完全明白,猜测正常模式就是用SYSCLK直接来,误差是2 SYSCLK)
    原文:
    where SYSCLK is sourced from the same PLL output clock that sources HCCAPCLK . This mode requires less software overhead than high-resolution capture mode.

  • 高分辨率捕获模式:
    HRCAP模块捕获脉冲宽度,捕获的每个边沿的分辨率通常在±300 ps之内,并且需要使用德州仪器(TI)提供的HCCal校准库。 在这种模式下,连接到HRCAP校准输入的一个HRCAP通道和ePWM模块必须专用于HRCAP校准,并且在校准过程中无法在应用程序上使用。(最后是说校准的过程中这个HRCAP和ePWM都无法使用

5.3.2.1 HRCAP计数器

两种操作模式均使用HCCOUNTER,它将在以下条件下重置为0并再次开始计数HCCAPCLK周期:

  • 软重启SOFTRESET
  • 检测到上升沿
  • 检测到下降沿
  • 设备RESET和重新使能HRCAP时钟

当检测到上升沿时,在计数器重置为0之前,将HCCOUNTER中的值捕获到16位HCCAPCNTRISE0寄存器中
当检测到下降沿时,在计数器之前将HCCOUNTER中的值捕获到16位HCCAPCNTFALL0寄存器中 重置为0。

由于HCCOUNTER在检测到边沿后开始从0开始计数,因此实际的低脉冲宽度和高脉冲宽度(非高分辨率)分别为HCCAPCNTFALL0 + 1和HCCAPCNTRISE0 + 1,其中添加了“ +1” HCCAPCLK周期为“ 0”。 图5说明了这种行为以实现高脉冲宽度捕获.
(看下面的图,就是说HRCAP通道里无论是上升沿还是下降沿都是变化了在计数器的时钟上升沿才检测的到,然后每次检测了之后计数器重0开始数。所以用图上的高脉冲宽度看,检测完之之后时间走了(HCCAPCNTRISE0+1)个计数周期。)
在这里插入图片描述
由于HCCOUNTER在SOFTRESET后立即开始计数,因此应丢弃捕获“ 0”寄存器中的第一个捕获结果。 捕获的值将是自最后一个SOFTRESET或HRCAPCLKEN位置位以来的HCCAPCLK周期数,而不是实际的脉冲宽度测量值。
(就是说第一个检测结果不能用,这个应该是程序里要设计的,因为第一个检测结果是从复位之后开始算的,时间不是整个脉冲宽度,而是从复位到上升/下降沿的时间)

5.3.2.2 HRCAP0 - HRCAP1 寄存器

HRCAP捕获寄存器包括一个2深度FIFO缓冲区,用于存储两个脉冲宽度的数据。
注:FIFO-First In First Out,先进先出的意思

具体解释示例:

  1. 当发生上升沿事件时:将从最后一个下降沿到当前上升沿(低脉冲宽度)的脉冲宽度数据装入HCCAPCNTRISE0。 在下一个上升沿事件时,HCCAPCNTRISE0寄存器中的值被加载到HCCAPCNTRISE1中。
  2. 当发生下降沿事件时:将从最后一个上升沿到当前下降沿(高脉冲宽度)的脉冲宽度数据装入HCCAPCNTFALL0。 对于下降沿事件,HRCAP逻辑会进行操作,以便在下一个上升沿事件时将HCCAPCNTFALL0寄存器的值加载到HCCAPCNTFALL1寄存器中,而不是等待下一个下降沿事件。

注:上升沿和下降沿时间不一样,上升沿事件是会等待下一个上升沿的,下降沿事件是等下一个上升沿!

5.3.2.3 上升沿和下降沿捕获事件

可以在上升沿捕获事件或下降沿捕获事件期间读取HRCAP捕获寄存器。 但是不能在两个事件同时发生时读取。
使用RISE事件读取捕获的寄存器与使用FALL事件读取捕获的寄存器有很多区别,如下图5-5所示。
在这里插入图片描述
5.2.3.3.1 上升沿捕获事件(常用于周期变化的周期读取)

当发生RISE事件时,应用程序代码可以在高分辨率捕获模式下访问两个脉冲宽度(1个周期)和在正常捕获模式下三个脉冲宽度(1.5个周期)的完整有效捕获数据。 HCCAPCNTFALL0在RISE事件上没有可用的有效数据,因为直到当前上升沿事件(尚未发生事件)之后的下降沿事件才捕获该值。

在下一个RISE事件之前,应用程序代码必须读取所有相关的捕获数据并清除RISE事件。 否则,数据将被覆盖并且无效。 因此,RISE事件通常用于捕获周期信号可能会发生明显变化的周期信号的数据。

5.2.3.3.2 下降沿捕获事件(常用于脉冲宽度读取)

发生FALL事件时,应用程序代码可以在高分辨率捕获模式下访问三个脉冲宽度(1.5个周期)的完整有效捕获数据,而在正常捕获模式下访问四个脉冲宽度(2个完整周期)的数据。

直到下一个RISE事件,应用程序代码才读取所有相关寄存器并清除FALL事件。 否则,数据将被覆盖并且无效。 因此,FALL事件通常用于捕获足够短的脉冲宽度,以安全地读取寄存器。

5.2.3.4 普通测量模式

在正常捕获模式下,当发生上升事件(HCIFR [RISE] = 1)或下降事件(HCIFR [FALL] = 1)时,应用程序代码读取HCCAPCNTRISE0 / 1和HCCAPCNTFALL0 / 1寄存器,并且不需要HCCal_HRCAP校准库。 捕获结果的分辨率在±1个SYSCLK周期内将是准确的(其中SYSCLK由产生HCCAPCLK的同一PLLCLK产生。

高脉冲宽度以等于1 + HCCAPCNTFALL0或1 + HCCAPCNTFALL1的HCCAPCLK周期数测量,如图5-6所示。
在这里插入图片描述
低脉冲宽度的HCCAPCLK周期数等于1 + HCCAPCNTRISE0或1 + HCCAPCNTRISE1,如图5-7所示。
在这里插入图片描述
这里都要+1是因为计数器都是从0开始数起,所以计算时间的时候都要+1.

5.3.2.5 高分辨率捕获模式

在高分辨率捕获模式下,应用程序代码利用HCCal HRCAP校准库功能捕获高分辨率脉冲宽度,每个边缘以典型的±300 ps分辨率捕获(带有两个边缘,所测脉冲宽度的分辨率可以变化±600 ps)。 请注意,尽管可以校准HRCAP逻辑本身以捕获高分辨率脉冲宽度,但是如果输入信号上的抖动大于±300 ps,则捕获值也会根据输入信号上的抖动而变化。

为了使用高分辨率捕获模式,必须校准高分辨率捕获逻辑以将HRCAP步长缩放到HCCAPCLK的Q16分数。 内部连接到HRCAP校准输入的一个HRCAP模块和ePWM模块必须仅专用于校准,并且在校准过程中不能在应用中正常使用。

德州仪器(TI)在HCCal HRCAP校准库中提供了校准功能,以在高分辨率捕获模式下使用HRCAP之前执行一次校准,并定期以慢速循环执行此校准,以解决HRCAP步长因电压和温度变化而引起的变化。 该应用程序正在运行。

该库还提供了测量高分辨率高脉冲宽度,低脉冲宽度和周期的功能。 脉冲和周期宽度测量结果以Q16定点格式返回,结果的小数部分代表HCCAPCLK周期的一部分。 (例如,脉冲宽度可能以500.25 HCCAPCLK周期的形式出现)。 图5-8显示了高分辨率脉冲宽度如何作为HRCAP步长和HCCAPCNT寄存器中的值的校准的函数。
在这里插入图片描述
总结一下:

  1. 高分辨率需要用HCCal HRCAP库校准,校准之后周期是300ps,所以检测一个沿有300ps误差,两个有600ps;
  2. 高分辨率的情况下用Q16格式来表示浮点数;
  3. 执行高分辨率捕获要进行校准,并且要定期校准以解决温度电压带来的影响和变化;
  4. 返回的数据是Q16格式的,这样理解就是要乘上2^-16才是真实的数值。

注:Q16格式就是用来表示小数的一种Q格式,用的位数是16位。

5.3.3 HRCAP中断

上升沿捕获(RISE),下降沿捕获(FALL)和HCCOUNTER溢出(OVF)事件可从HRCAP模块产生对PIE的中断

另外,如果在另一个上升沿捕获事件发生时将上升沿捕获标志设置为(HCIFR [RISE]),则上升沿溢出(RISEOVF)中断也会产生对PIE的中断。 HRCAP中断逻辑如下图5-9所示。
在这里插入图片描述
仅当HCCTL寄存器中的相应中断允许位设置为1时,RISE / RISEOVF,FALL和OVF事件才会产生中断。可以通过在HCICLR寄存器中的相应位写入1来清除中断事件。 为了进行测试,可以通过向HCIFRC寄存器中的相应位写入1来强制中断事件。

为了正确操作,不应同时使能RISE和FALL中断。 捕获寄存器应仅在上升沿中断事件期间或仅在下降沿中断事件期间读取,而不应同时在两个中断事件期间读取。 如果使能了RISEOVF中断,则在发生RISE事件后必须始终确认RISE标志,否则将发生上升溢出条件。

总结一下:

  1. HRCAP一共有四类中断分别是:RISE, FALL, OVF(HCCOUNTER计数器溢出), RISEOVF(在RISE的中断标志位为1时发生RISE事件);
  2. 四种中断都需要用HCCTL使能,不使能就没有相应中断发生;
  3. 可以通过对HCICLR使能清除相应的中断位;
  4. 可以通过对HCIFERC使能强制进入响应的中断服务函数;
  5. 如果是使能了RISEOVF中断,那么发生RISE事件之后要注意清除标志位,不然会导致溢出则进入RISEOVF事件。

5.4 寄存器表

完整的HRCAP寄存器设置在表5-1中
在这里插入图片描述

5.4.1 HRCAP Control Register (HCCTL) – EALLOW protected

在这里插入图片描述

5.4.2 HRCAP Interrupt Flag Register (HCIFR)

在这里插入图片描述

5.4.3 HRCAP Interrupt Clear Register (HCICLR)

在这里插入图片描述

5.4.4 HRCAP Interrupt Force Register (HCIFRC)

在这里插入图片描述

5.4.5 HRCAP Counter Register (HCCOUNTER)

在这里插入图片描述

5.4.6 HRCAP Capture Counter On Rising Edge 0 Register (HCCAPCNTRISE0)

在这里插入图片描述

5.4.7 HRCAP Capture Counter On Rising Edge 1 Register (HCCAPCNTRISE1)

在这里插入图片描述

5.4.8 HRCAP Capture Counter On Falling Edge 0 Register (HCCAPCNTFALL0)

在这里插入图片描述

5.4.9 HRCAP Capture Counter On Falling Edge 1 Register (HCCAPCNTFALL1)

在这里插入图片描述

5.5 HRCAP校准库

HRCAP校准(HCCal)逻辑能够以离散的时间步长捕获边沿,从而细分了HCCAPCLK周期。 如前所述,每个步骤的大小约为300 ps(有关设备上典型HRCAP步长的信息,请参见设备特定的数据手册)。HRCAP校准库中的HRCAP_Cal()函数必须定期运行,以确保最佳地应用了时间步长,并且在宽范围的PWM频率,系统时钟频率,电压和温度范围内都保持了边沿捕获精度。HRCAP步长会根据最坏情况下的工艺参数,工作温度和电压而变化。HRCAP步长随电压降低和温度升高而增加,随电压升高和温度降低而减小。

在高分辨率捕获模式下使用HRCAP的应用程序应使用TI提供的HRCAP校准(HCCal)软件HRCAP_Cal()函数。 HRCAP_Cal函数有助于在HRCAP处于高分辨率模式时将HRCAP步长动态缩放至HCCAPCLK周期的一小部分。 为了在HRCAP操作期间有效利用HCCal功能,HRCAP校准逻辑使用内置的自检和诊断功能来针对任何操作条件适当地缩放HRCAP步长。

TI提供了一个C调用库,其中包含一个HRCAP校准功能,该功能利用此硬件并作为HCCAPCLK周期的一部分来正确校准内部HRCAP步骤逻辑。 该库提供了其他高分辨率捕获功能,可基于HCCAPCNT寄存器中的值和校准结果来计算Q16整数+分数HCCAPCLK周期中捕获的脉冲宽度。

这些功能的内容是德州仪器(TI)专有的,不会公开。

当前,有HCCal Type 0库的1个发行版本HCCal_Type0_V1.lib,位于C2000ware软件包的\ libraries \ calibration \ hrcap \目录下。

5.5.1 HRCAP校准库函数

5.5.1.1 HRCAP_Cal ( )

HRCAP_Cal()函数在给定的HRCAP模块上运行校准和自检诊断逻辑,以在内部缩放HCCal步进逻辑,作为HCCAPCLK周期的一部分。

函数声明:

Uint16 HRCAP_Cal(Uint16 HRCAPModule, Uint16 PLLClk, volatile struct EPWM_REGS *ePWMModule);

参数:

参数名解读
HRCAPModuleHRCAP模块号为整数值(即HRCAP1为“ 1”,HRCAP2为“ 2”)。 此HRCAP模块将仅用于校准,不能在功能上用于捕获脉冲宽度。
PLLClk如果为0,则HCCAPCLK由SYSCLK提供时钟,其中SYSCLK是为HRCAP模块提供时钟的系统时钟。 如果为1,则HCCAPCLK由PLLCLK提供时钟,其中PLLCLK频率是为HRCAP模块提供时钟的系统时钟的倍数。
ePWMModule指向用于校准HRCAP的HRPWM模块的EPWM_REGS结构的地址的指针(即,如果HRPWM7A输出连接到HRCAP的内部校准逻辑,则&EPwm7Regs会传递到此参数。用于HRCAP校准的单个ePWM模块是 设备相关的。

返回值:

返回值解释
0如果正在进行HCCal校准,而不会遇到错误。
1如果HCCal错误退出。 用户应检查是否已配置PLL,以使HCCAPCLK频率落在数据手册HRCAP电气部分指定的频率限制内。
2校准完成且没有遇到错误

描述:

  • 此功能驱动HRCAP校准模块逻辑,以将HCCAPCLK周期细分为HRCAP时间步长,该时间步长等于任何给定时间的HCCAPCLK周期的一部分。
  • HRCAP_Cal()仅可用于98 Mhz和120 MHz之间的HCCAPCLK(有关特定于设备的HCCAPCLK频率限制,请参见特定于设备的数据手册的HRCAP电气部分)。
  • 可以在单个仅用于校准的HRCAP模块上随时调用该功能。
  • 校准HRCAP模块不能在功能上用于捕获脉冲宽度。 此功能驱动的校准逻辑使用内部连接到HRCAP输入的单个ePWMxA HRPWM通道输出来运行诊断。 在校准期间,该ePWM模块不能用于应用程序中的常规ePWM功能。 例如,在此设备上,在高分辨率捕获模式下使用HRCAP时,应用程序在校准期间无法在功能上使用ePWM7。

5.1.1.2 LowPulseWidth0 ( )

LowPulseWidth0()函数在HCCAPCLK周期内捕获HCCAPCNTRISE0周围的高分辨率低脉冲宽度。

函数声明:

Uint32 LowPulseWidth0 (Uint16 * ptrHRCAPmodule);

参数:

参数名解读
ptrHRCAPmodule指向HRCAP模块的HRCAP寄存器块的第一个地址的16位指针,用于捕获脉冲。

返回值:

返回值解读
32位定点数HCCAPCNTRISE0周围的32位高分辨率低脉冲宽度,作为HCCAPCLK周期数中的Q16定点值。

解释:

可以对任何未用于校准的HRCAP模块调用此功能,以将HCCAPCNTRISE0和HRCAP校准结果转换为HCCAPCLK周期中的定点Q16整数+分数高分辨率低脉冲宽度。 图5-19显示了在RISE和FALL事件中可以捕获哪些低脉冲宽度。

在这里插入图片描述

5.1.1.3 HighPulseWidth0 and HighPulseWidth1

函数声明:

Uint32 HighPulseWidth0 (Uint16 * ptrHRCAPmodule);
Uint32 HighPulseWidth1 (Uint16 * ptrHRCAPmodule);

在这里插入图片描述

5.1.1.4 PeriodWidthRise0

函数声明:

Uint32 PeriodWidthRise0 (Uint16 * ptrHRCAPmodule)

5.1.1.5 PeriodWidthFall0

函数声明:

Uint32 PeriodWidthFall0 (Uint16 * ptrHRCAPmodule);

在这里插入图片描述

5.5.2 HRCAP校准库软件应用

要在高分辨率模式下使用HRCAP,建议按此处所述使用HRCAP校准功能。

第一步:添加include文件

HCCal_Type0_V1.h文件需要包括如下。 使用HRCAP校准库功能时,此包含文件是必需的。 对于这些设备,C2000ware中的F2803x C / C ++头文件和外围示例软件包中的DSP2803x_Device.hDSP2803x_Examples.h文件是必需的。 对于其他设备系列,应使用头文件中的设备特定等效文件以及这些设备的外围示例软件包。 如果在最终应用程序中使用了定制的头文件,则这些包含文件是可选的。

举例:

#include "DSP2803x_Device.h" // F2803x Headerfile
#include "DSP2803x_Examples.h" // F2803x Examples Headerfile
#include "HCCal_Type0_V1.h"

第二步:寄存器序列声明

声明一个指向HRCAP_REGS结构的指针数组,该结构包括设备上所有可用的HRCAP模块。 位置0包含HRCAP_Cal函数未使用的0值。

举例:

#define NUM_HRCAP 3 // # of HRCAP modules on 2803x + 1
volatile struct HRCAP_REGS *HRCAP[NUM_HRCAP] = {0, &HRCap1Regs, &HRCap2Regs};

第三步:HRCAP预校准

在应用程序代码中以高分辨率模式使用HRCAP之前,应调用HRCAP_Cal()以将HRCAP步长细分细分为HCCAPCLK。
作为高分辨率模式下使用HRCAP之前的一次性预校准的一部分,包括以下内容:

举例:

while (status!= HCCAL_COMPLETE) // While calibration is incomplete
	{
	// Use HRCAP2 to calibrate with:
	// HCCAPCLK = PLLCLK
	// ePWM7A = HRCAP calibration input
	status = HRCAP_Cal(2,HCCAPCLK_PLLCLK, &EPwm7Regs);
	if (status == HCCAL_ERROR)
		{
			ESTOP0; // Error, stop and check HCCAPCLK frequency
		}
	}

第四步:应用过程中校准

当应用程序运行时,器件温度和电源电压均可能发生波动。 为确保为每个HRCAP模块使用最佳HRCAP步长,应作为较慢的背景循环的一部分,定期重新运行HRCAP_Cal函数。 这里显示了一些示例。

举例:

main ()
{
	int status;
	// User code
	// HRCAP 1, is running in high-resolution mode
	// The status variable returns 2 once calibration has been
	// completed by the HCCal Calibration Module running
	// diagnostics.
	status = HRCAP_Cal(2,HCCAPCLK_PLLCLK, &EPwm7Regs);
	// The function returns a 2 if HCCAPCLK is not within the
	// appropriate frequency range.
	if(status==HCCAL_ERROR) {ESTOP0;}
}

第五步:应用中进行脉冲宽度测量

在应用程序运行时,当发生RISE或FALL事件时,可以使用高分辨率脉冲宽度功能测量脉冲和周期宽度,如下所示。

举例:

interrupt void HRCAP1_Isr (void)
{
	EALLOW;
	if (HRCap1Regs.HCIFR.bit.RISEOVF == 1) {
	ESTOP0; // Another rising edge detected
	}
	if (first < 1) {
	first++; // Discard first data (because first interrupt
	// after reset/clk enable measures time from
	// clock start to edge - invalid pulse width)
	} else {
	periodwidth = PeriodWidthRise0((Uint16 *)&HRCap1Regs);
	pulsewidthlow = LowPulseWidth0((Uint16 *)&HRCap1Regs);
	pulsewidthhigh = HighPulseWidth0((Uint16 *)&HRCap1Regs);
	}
	HRCap1Regs.HCICLR.bit.RISE=1;
	HRCap1Regs.HCICLR.bit.INT=1;
	PieCtrlRegs.PIEACK.bit.ACK4=1;
	EDIS;
}
  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值