1. N2HET模块:嵌入式实时控制的精密引擎
在电机控制、数字电源或者任何需要高精度时序与复杂波形生成的嵌入式系统里,CPU直接处理每一个脉冲边沿、每一次捕获事件往往是力不从心的。这不仅会消耗大量计算资源,更会引入难以预测的延迟,破坏系统的实时性。这时,一个强大、智能且可编程的定时器协处理器就成了系统的“第二颗心脏”。德州仪器(TI)的高端定时器(N2HET)模块正是为此而生。它不是简单的计数器,而是一个拥有独立指令集的微型可编程状态机,能够自主执行复杂的时序逻辑,与CPU并行工作。
N2HET的核心价值在于其“可编程性”。开发者通过编写N2HET汇编程序,定义一系列指令,让硬件自动、确定性地处理时间相关任务。这就像为定时器硬件编写了一段微码,让它知道在什么时间点、根据什么条件、去执行什么操作(比如拉高/拉低某个引脚、触发中断、更新比较值等)。今天,我们就深入N2HET指令集的腹地,聚焦四个极具代表性的指令:SCMP(序列比较)、SCNT(步进计数)、SHFT(移位)和WCAP(软件捕获字)。理解它们,你就能驾驭N2HET最核心的波形生成、角度同步、数据通信和精确测量能力。无论你是正在调试无刷电机FOC算法,还是设计高精度脉冲捕获电路,这些指令都是你工具箱里的利器。
2. SCMP指令:复杂脉冲序列的构建师
SCMP,全称Sequence Compare(序列比较),是N2HET中用于生成复杂、多模式脉冲序列的核心指令。它独特地融合了“角度模式”和“时间模式”,特别适合需要与旋转位置(角度)同步的PWM生成,例如在电机控制中生成与转子位置严格对齐的驱动信号。
2.1 指令逻辑与双模式运作机制
SCMP指令的精妙之处在于其双模式切换。它内部维护一个状态位(由控制字段的C13位指示),决定当前处于“角度模式”还是“时间模式”。
- 角度模式 (
C13=0): 在此模式下,SCMP将数据字段(Data)的值与寄存器B(通常装载角度值)进行比较。当匹配发生时,它可以执行一个“动作”,例如设置或清除指定的输出引脚(pin)。这是输出事件发生的依据。匹配后,指令会自动切换到时间模式,并将寄存器A的值(通常装载时间值)加载到立即数据字段,为时间比较做准备。 - 时间模式 (
C13=1): 在此模式下,SCMP使用更新后的立即数据字段值(来自寄存器A)作为新的比较值,与一个自由运行的时间基准(通常与寄存器T或系统时钟相关)进行比较。这个模式不直接产生引脚动作,而是决定角度模式的下一次比较何时可以再次发生。当时间比较条件满足(通常是“时间到”),指令会跳转到一个指定的条件地址(cond_addr),并切换回角度模式,开始新一轮的“角度-时间”循环。
这种“角度事件触发,时间延迟控制”的机制,使得SCMP能够生成占空比和频率都可动态变化的复杂PWM序列,且每个脉冲的边沿都可以与一个角度值精确绑定。
2.2 关键字段深度解析与配置实战
让我们拆解SCMP指令的各个字段,理解如何配置它们来实现具体功能。指令格式包含程序字段(P)、控制字段(C)和数据字段(D)。
程序字段 (P31:P0) 配置要点:
next: 下一条指令地址。无论当前指令执行结果如何(匹配或不匹配),在完成当前操作后,程序计数器都会跳转到此地址。这是维持程序流的基础。reqnum与request: 定义HTU(高端定时器传输单元)请求。reqnum指定请求线(0-7),request定义请求类型(NOREQ无请求,GENREQ生成请求,QUIET静默请求)。例如,在角度匹配时生成一个HTU请求,可以将数据(如当前角度或时间戳)自动传输到系统内存,无需CPU干预。注意:
QUIET请求用于在双缓冲模式下,当缓冲区满时自动切换缓冲区的场景,避免在切换时刻产生不必要的传输。
控制字段 (C31:C0) 配置要点:
cond_addr:条件跳转地址。这是时间模式下的跳转目标。其最低有效位(LSB)有特殊用途:它必须为奇数(1)。因为LSB被硬件用来标识模式(0=角度,1=时间),而条件跳转只在时间模式下生效,所以地址必须是奇数以确保跳转到时间模式的指令。pin与action: 指定受控的N2HET输出引脚及动作(SET拉高,CLEAR拉低)。这是波形输出的直接控制端。en_pin_action: 引脚动作使能。只有此位为ON时,角度匹配时的action才会实际作用于物理引脚。这提供了一个软件开关,允许在不改变核心逻辑的情况下全局启用/禁用输出。restart与control: 这是高级功能的关键。restart: 当设置为ON且ACMP指令设置的X标志为1时,会无条件重启整个序列。它会将立即数据字段设为寄存器A的值,强制跳转到next地址,并将模式切换到时间模式(C13=1)。这在需要外部事件(如过流故障)紧急复位PWM序列时非常有用。control: 当为ON时,引脚输出状态会传递到一个内部的“控制输出”链上,影响后续指令的某些逻辑条件,用于构建更复杂的级联逻辑。
数据字段 (D31:D0) 配置要点:
data: 25位的比较值。在角度模式下,它与寄存器B的值比较;在初始化或重启时,它也可能被载入新的时间值。
2.3 一个完整的PWM生成实例
假设我们需要生成一个与虚拟角度同步的PWM,在角度0x1000时输出上升沿,持续一段时间(对应时间值0x2000)后输出下降沿。
; 假设寄存器B由外部编码器或虚拟角度发生器不断更新 ; 寄存器A预先装载了高电平持续时间对应的计数值 0x2000 ; 指令1:等待角度到达0x1000,并设置引脚 SCMP_ANGLE: SCMP { next = SCMP_TIME ; 执行完跳转到时间模式指令 cond_addr = SCMP_TIME ; 条件地址(必须奇数) pin = HET[1] ; 使用N2HET的第1个引脚 action = SET ; 角度匹配时置高引脚 en_pin_action = ON irq = OFF data = 0x1000 ; 目标角度值 restart = OFF } ; 指令2:时间模式,等待高电平时间到 SCMP_TIME: SCMP { next = SCMP_ANGLE ; 循环回角度模式 cond_addr = SCMP_ANGLE ; 时间到后跳回(注意:此地址实际由硬件根据C13位决定,此处为概念示意) pin = HET[1] ; 同一引脚 action = CLEAR ; 注意:时间模式不执行动作,此action是为下一次角度模式准备的(下降沿) en_pin_action = ON irq = OFF data = ? ; 数据字段在从角度模式切换过来时,已由硬件自动从寄存器A加载为0x2000 restart = OFF }实操心得:在实际编程中,
SCMP_TIME指令的data字段在汇编时通常先写0。因为当从SCMP_ANGLE切换过来时,硬件会自动用寄存器A的值覆盖它。在初始化时,我们需要通过MOV等指令预先将时间值(0x2000)加载到寄存器A。
这个简单的循环就构成了一个占空比可变的PWM。SCMP_ANGLE决定上升沿位置(与角度同步),SCMP_TIME决定脉冲宽度(固定时间或可变时间)。通过改变寄存器B(角度)和寄存器A(时间)的值,就能动态调整PWM。
2.4 常见问题与调试技巧
引脚无输出:
- 检查
en_pin_action位:这是最容易被忽略的配置。即使action配置正确,如果en_pin_action=OFF,引脚也不会动作。 - 确认引脚复用:确保MCU的引脚复用控制寄存器已将该引脚配置为N2HET功能,而非GPIO或其他外设功能。
- 验证角度/时间基准:使用调试器监控寄存器B(角度)和寄存器A(时间)的值是否在按预期更新。SCMP的比较是基于这两个寄存器的。
- 检查
序列不按预期重启:
- 检查
restart和X标志:restart=ON只是使能了重启功能,实际重启需要ACMP指令将X标志置1。确保你的ACMP指令逻辑正确,并在需要时设置了X标志。 - 理解重启行为:重启发生时,会强制跳转到
next地址,并切换到时间模式。这意味着你的next地址处的指令应该是一条处于时间模式的SCMP,或者是一条能处理时间模式逻辑的指令。
- 检查
HTU请求未触发:
- 核对
reqnum与DCP映射:查阅芯片数据手册,确认你使用的reqnum编号与HTU模块中期望的双控制包(DCP)编号是否正确映射。 - 检查HTU配置:N2HET产生请求只是第一步,HTU模块本身(控制包使能、地址、传输计数等)必须正确配置,才能响应请求并启动DMA传输。
- 核对
3. SCNT指令:角度同步时间基准的校准器
在电机控制等需要与旋转机械角度同步的应用中,我们常常遇到一个挑战:外部传感器(如光电编码器、霍尔传感器)产生的信号频率是变化的(转速变化),但控制系统需要一个稳定、等间隔的角度时间基准来进行计算和控制。SCNT指令就是为了解决这个问题而设计的“虚拟定时器”。
3.1 工作原理:从齿槽信号到等角度时钟
想象一个电机转子上有60个齿(60个脉冲/转)。直接使用这个脉冲信号作为时钟,它的周期会随转速变化。SCNT的作用是“倍频”和“内插”。假设我们设置step=32,SCNT就会在每个外部脉冲周期内,产生32个等间隔的“虚拟步进”。这样,我们就将一个物理的、周期不定的脉冲序列,转换成了一个虚拟的、每转拥有固定点数(60齿 * 32步 = 1920点/转)的等角度时钟。
它的工作流程如下:
- 周期测量:前一条指令
APCNT(角度周期计数)会测量上一个外部脉冲的周期值P(n-1),并将其存入寄存器T。 - 步进累加:SCNT指令在每个N2HET程序分辨率(一个指令周期)里,将其数据字段的值增加一个固定的
step(步进宽度,可选8, 16, 32, 64)。 - 周期比较与归零:SCNT将累加后的数据字段值与寄存器T中的周期值
P(n-1)进行比较。当累加值达到或超过周期值时,说明一个外部脉冲周期对应的“虚拟步进”已经完成。此时,SCNT会从累加值中减去周期值(实现归零),并设置Z标志位为1。 - 触发ACNT:下一条指令
ACNT(角度计数)会检查这个Z标志。当Z=1时,ACNT将自己的内部角度计数器加1。这样,ACNT的每一次计数,都对应着转过了一个“虚拟步进”所代表的角度。
关键公式:SCNT输出的虚拟周期 =P(n-1) / K,其中K是步进宽度(step)。ACNT的计数频率 = 外部脉冲频率 * K。
3.2 指令字段解析与齿轮参数计算
SCNT的字段相对集中,主要围绕步进和间隙起始角设置。
程序字段 (P31:P0) 关键位:
step: 步进宽度选择。它直接编码到P5:P4位,并存储在标志位SWF0和SWF1中,供后续的ACNT指令使用。P5 P4 Step Width (K) 含义 0 0 8 每外部脉冲周期分为8步 0 1 16 每外部脉冲周期分为16步 1 0 32 每外部脉冲周期分为32步 1 1 64 每外部脉冲周期分为64步
控制字段 (C31:C0) 关键位:
gapstart:间隙起始角。这是一个25位的值,SCNT执行时会将其写入寄存器A。这个值本身对SCNT操作无影响,它是为ACNT指令准备的。在带有缺齿的齿轮系统中(例如,60-2齿的靶轮,有2个齿缺失用于确定零位),gapstart定义了角度范围内哪个区域是“间隙”(缺齿区域)。在间隙区域内,APCNT会暂停周期测量,避免因信号缺失而产生错误测量。
数据字段 (D31:D0):
data: 25位的计数器值。SCNT操作的核心,用于累加和比较。
gapstart计算实例: 对于一个step=32,实际齿数为58(60-2)的齿轮:gapstart = (stepwidth × (actual teeth on gear - 1)) + 1 = (32 × (58 - 1)) + 1 = (32 × 57) + 1 = 1824 + 1 = 1825 (0x721)这个值告诉ACNT,从角度1825开始进入缺齿区域。
3.3 配置流程与代码示例
配置SCNT通常与APCNT和ACNT指令协同工作,形成一个角度测量链。
; 1. APCNT指令:测量外部脉冲周期,结果存入寄存器T APCNT_INST: APCNT { ... ; 配置输入引脚、触发边沿等 next = SCNT_INST } ; 2. SCNT指令:创建虚拟等角度时钟 SCNT_INST: SCNT { next = ACNT_INST ; 下一步执行ACNT step = 32 ; 步进宽度为32 gapstart = 0x721 ; 根据齿轮计算的间隙起始角 (1825) data = 0 ; 计数器初始化为0 control = ON ; 通常使能控制 } ; 3. ACNT指令:基于SCNT的Z标志进行角度累加 ACNT_INST: ACNT { ... ; 配置角度累加、中断等 next = APCNT_INST ; 循环回APCNT,开始下一轮测量 }3.4 常见陷阱与优化建议
周期值寄存器T为0:SCNT的执行逻辑中有一个判断:
If (register T != 0000000h)。如果寄存器T为0(通常是因为APCNT尚未捕获到有效的第一个周期),SCNT会跳过步进累加和比较逻辑,直接跳转到下一指令。务必确保APCNT在SCNT开始工作前已成功捕获至少一个完整周期。步进宽度K的选择:
- 精度与分辨率权衡:K值越大,角度分辨率越高(每转点数越多),控制可以更精细。但K值过大会导致SCNT数据字段累加过快,在高速旋转时可能在一个N2HET指令周期内就达到甚至超过周期值,导致计算错误或溢出。需要根据最大转速和N2HET时钟频率来估算。
- 经验值:对于常见的电机控制应用(几千到几万RPM),步进宽度选择32或64是常见的平衡点。
间隙起始角计算错误:这是导致角度索引在缺齿区域附近发生跳变的常见原因。务必仔细核对齿轮的实际齿数(包括缺齿),并严格按照公式计算。在调试时,可以在
ACNT指令处设置中断,并打印或观察角度计数值,检查在预期位置是否平稳过渡。
4. SHFT指令:灵活的数据移位与串行通信接口
SHFT指令展现了N2HET模块的另一个强大面:通用数字I/O与位操作。它可以将N2HET引脚配置为串行数据输入或输出线,实现移位寄存器功能,常用于软件模拟SPI、I2C、或自定义串行协议,或者简单地用于读取一组开关状态、驱动LED阵列等。
4.1 移位模式全解:10种选择应对不同场景
smode字段定义���移位的方向和填充行为,是SHFT指令最核心的配置。它由P3:P0四位编码,提供了10种模式。
| smode | P3:P0 | 操作描述 | 典型应用 |
|---|---|---|---|
| OR0 | 0000 | 输出/右移,LSB先出,向MSB移入0 | 经典SPI数据输出(MSB在前时需预处理数据) |
| OL0 | 0001 | 输出/左移,MSB先出,向LSB移入0 | 经典SPI数据输出(LSB在前) |
| OR1 | 0010 | 输出/右移,LSB先出,向MSB移入1 | 输出特定前导位(如1)的序列 |
| OL1 | 0011 | 输出/左移,MSB先出,向LSB移入1 | 输出特定前导位(如1)的序列 |
| ORZ | 0100 | 输出/右移,LSB先出,向MSB移入Z标志位 | 输出带循环进位(Z标志)的数据 |
| OLZ | 0101 | 输出/左移,MSB先出,向LSB移入Z标志位 | 输出带循环进位(Z标志)的数据 |
| IRM | 1000 | 输入/右移,引脚电平移入MSB | 从高位开始读取串行数据 |
| ILL | 1001 | 输入/左移,引脚电平移入LSB | 从低位开始读取串行数据 |
| IRZ | 1010 | 输入/右移,引脚电平移入MSB,LSB移入Z标志 | 读取数据并检查LSB(奇偶校验等) |
| ILZ | 1011 | 输入/左移,引脚电平移入LSB,MSB移入Z标志 | 读取数据并检查MSB(符号位等) |
选择逻辑:
P3位是方向选择:0=输出,1=输入。P2位在输出模式下决定填充位是常数(0/1)还是Z标志;在输入模式下决定是否将移出的位存入Z标志。P1:P0组合决定是左移还是右移,以及MSB/LSB先出。
4.2 移位条件与执行流程详解
cond字段(C6:C5)决定了何时执行移位操作:
00(或0X):无条件移位。每个N2HET指令周期都执行一次移位。适用于由N2HET自身时钟驱动的同步串行通信。10:在HET[0]引脚上升沿移位。这允许使用一个外部时钟引脚来同步数据移位,非常适合模拟标准的同步串行协议。11:在HET[0]引脚下降沿移位。同样用于外部时钟同步,提供时钟极性选择。
执行流程(以输入模式IRM为例):
- 条件检查:每个指令周期,检查
cond条件是否满足(如HET[0]的上升沿)。 - 移位操作:条件满足时,将指定的N2HET引脚(
pin选择)的电平采样值移入数据字段。对于IRM(右移),新采样值进入最高位(MSB),原数据整体右移一位,最低位(LSB)被移出丢弃。 - 寄存器更新:移位后的结果同时更新到数据字段和
reg指定的寄存器(A, B, R, S, T)。 - Z标志更新:对于IRZ/ILZ模式,移出的位会存入Z标志。对于OR0/OL0等模式,如果移位后数据全0或全1,Z标志也会被设置。
- 中断与跳转:如果
irq=ON且Z标志被设置,则触发中断。根据数据字段是否为全0或全1,决定跳转到cond_addr还是next_addr。
4.3 实战:模拟SPI主设备发送数据
假设我们用HET[1]作为SPI时钟(SCLK),HET[2]作为主出从入(MOSI)数据线,需要发送一个8位数据0xAA(10101010b),MSB先出。
; 初始化:将数据0xAA加载到寄存器A,并设置移位计数器(假设用寄存器B做计数器) MOV32 A, 0x0000AA ; 数据放在低8位,高位置0以便观察移位 MOV32 B, 8 ; 需要移位8次 ; 配置HET[0]为输出,用于生成SPI时钟(此处简化,实际需配合其他指令生成时钟边沿) ; 假设已有其他指令(如PWM或CMP)在HET[0]上产生时钟脉冲 ; SHFT指令循环发送 SHFT_LOOP: SHFT { next = CHECK_COUNT cond_addr = SHFT_LOOP ; 条件不满足(非时钟边沿)时跳回自己等待 smode = OL0 ; 输出左移,MSB先出,移入0 cond = RISE ; 在HET[0]上升沿移位(时钟上升沿发送数据) pin = HET[2] ; MOSI数据线 reg = A ; 对寄存器A进行移位 irq = OFF data = ? ; 数据字段由寄存器A映射,此处初始值已通过MOV32设置 control = ON } CHECK_COUNT: ; 一条递减计数并判断的指令(例如,用ACMP判断寄存器B是否为0) ACMP { ... ; 配置比较寄存器B与0 next = SHFT_LOOP ; 不为0则继续循环 cond_addr = SPI_DONE ; 为0则发送完成 } SPI_DONE: ; 发送完成,执行后续操作 ...注意:这是一个高度简化的示例。完整的SPI主模式模拟还需要指令来生成SCLK时钟信号(通常用PWM或带周期切换的CMP指令),以及管理片选信号(CS)。SHFT指令只负责在正确的时钟边沿移出数据位。
4.4 调试要点与性能考量
- 引脚配置冲突:确保用于移位输入/输出的引脚没有被配置为其他功能(如普通GPIO、其他外设)。同时,用于移位条件(
cond)的HET[0]引脚也需要正确配置。 - 移位速率:无条件移位(
cond=UNC)的速率等于N2HET指令的执行速率(由N2HET时钟和程序循环决定)。外部时钟移位(cond=RISE/FALL)的速率受限于外部时钟频率和N2HET检测边沿的能力。确保N2HET的时钟频率远高于外部信号频率,以避免错过边沿。 - 数据宽度:SHFT操作的是25位数据字段。对于超过8位的数据传输,需要妥善处理数据在寄存器和数据字段中的对齐问题。可能需要结合
MOV指令在多个8位字节间传递数据。 - 中断使用:利用
irq和Z标志可以在数据全0、全1或特定位置(通过IRZ/ILZ)时产生中断,用于帧结束判断或错误检测,但要注意中断响应时间对实时性的影响。
5. WCAP与WCAPE指令:高精度时间与事件捕获
在测量脉冲宽度、频率、或事件发生的时间戳时,WCAP(软件捕获字)和WCAPE(软件捕获字及事件计数)指令是N2HET的“示波器”和“计数器”。它们能在指定引脚发生特定边沿事件时,瞬间“冻结”某个寄存器的当前值到数据字段中,这个值通常是代表时间的计数器值。
5.1 WCAP指令:单次时间戳捕获
WCAP专注于捕获时间戳。当指定的捕获条件(event)在选定的引脚上发生时,它将reg指定的寄存器(通常是自由运行的定时器计数器)的当前值捕获到指令的data字段中。
关键字段解析:
event: 定义捕获触发条件。C6 C5 捕获条件 说明 0 0 NOCOND(Always)无条件捕获,每个指令周期都执行。可用于周期性采样。 0 1 FALL引脚下降沿触发捕获。 1 0 RISE引脚上升沿触发捕获。 1 1 BOTH引脚上升沿和下降沿都触发捕获。用于测量脉冲宽度(需两次捕获相减)。 hr_lr与hr_data: 高分辨率(HR)捕获控制。hr_lr = LOW: 使能HR捕获。当捕获发生时,一个7位的HR计数器值会被捕获到hr_data字段。这个HR计数器以更高的频率运行,可以提供比主循环计数器(data字段)更精细的时间分辨率。hr_lr = HIGH: 忽略HR捕获。
重要警告:数据手册特别指出,在N2HET刚启动的第一个循环时钟内,HR计数器可能还未同步,此时捕获的HR值是无效的。应用中应忽略第一次捕获的HR数据,或延迟启动捕获功能。
reg: 选择被捕获的源寄存器。通常选择T寄存器(自由运行计数器)或A/B寄存器(可能被其他指令更新)。
执行流程:
- 监控指定引脚的电平变化。
- 当
event条件满足(或为NOCOND),立即将reg寄存器的值锁存到data字段(及hr_data字段,如果使能)。 - 如果
irq=ON,则置位相应的HETFLG中断标志。 - 根据请求设置,可能产生HTU请求。
- 跳转到
cond_addr(如果发生捕获)或next_addr(如果未发生捕获)。
5.2 WCAPE指令:带事件计数的时间戳捕获
WCAPE在WCAP的基础上增加了一个7位的事件计数器(ec_data)。��次捕获发生时,除了记录时间戳(ts_data),事件计数器还会自动加1。这对于统计在特定时间段内发生了多少次边沿事件(例如计算频率)非常有用,无需CPU频繁介入读取和清零计数器。
字段差异:
ts_data: 对应WCAP的data字段,存储25位时间戳。ec_data: 7位事件计数器,范围0-127。每次捕获触发时自增。计数器溢出后会从0重新开始。
5.3 应用实例:测量PWM输入频率与占空比
要测量一个PWM信号的频率和占空比,我们需要捕获连续两个上升沿的时间间隔(周期)和一个上升沿与紧随其后的下降沿的时间间隔(高电平时间)。
; 假设PWM信号输入到HET[3]引脚 ; 使用寄存器T作为自由运行的时间基准计数器 ; 使用两个WCAP指令分别捕获上升沿和下降沿 ; 指令1:捕获上升沿,将时间戳存入缓冲区1(通过HTU) WCAP_RISE: WCAP { next = WCAP_FALL ; 常态下跳转到下降沿捕获指令 cond_addr = RISE_CAPTURED ; 捕获发生后跳转(用于本地处理) reqnum = 1 ; 使用HTU请求线1传输数据 request = GENREQ ; 生成HTU请求 pin = HET[3] event = RISE ; 上升沿触发 reg = T ; 捕获T寄存器值(时间戳) irq = OFF ; 使用HTU,故关闭本地中断 data = 0 ; 初始值,会被覆盖 hr_lr = LOW ; 使能高分辨率捕获以提高精度 } ; 指令2:捕获下降沿,将时间戳存入缓冲区2 WCAP_FALL: WCAP { next = WCAP_RISE ; 循环 cond_addr = FALL_CAPTURED reqnum = 2 ; 使用不同的HTU请求线 request = GENREQ pin = HET[3] event = FALL ; 下降沿触发 reg = T irq = OFF data = 0 hr_lr = LOW } RISE_CAPTURED: ; 本地处理代码(可选),例如紧急处理或状态设置 ; 通常更推荐让HTU将数据DMA到内存,由CPU处理 JUMP WCAP_FALL ; 处理完后跳转到下降沿捕获指令 FALL_CAPTURED: ; 本地处理代码(可选) JUMP WCAP_RISE ; 循环计算过程(在CPU端,处理HTU传输到内存的数据):
- 设第n个上升沿时间戳为
T_rise[n],第n个下降沿时间戳为T_fall[n]。 - 周期 =
T_rise[n] - T_rise[n-1] - 高电平时间 =
T_fall[n] - T_rise[n] - 占空比 =
高电平时间 / 周期
实操心得:对于高频信号测量,务必确保N2HET的自由运行计数器(寄存器T)的时钟频率足够高,以避免在连续捕获之间发生计数器溢出。例如,如果计数器是24位,时钟为100MHz,则溢出周期约为167ms。测量kHz级别的信号是安全的,但测量极低频信号时需要考虑溢出处理。使用WCAPE可以避免频繁中断,让CPU批量处理数据。
5.4 精度提升与误差避免
- 高分辨率模式:充分利用
hr_lr=LOW模式。主data字段提供粗时间戳(循环时钟分辨率),hr_data提供细时间戳(高频时钟分辨率)。将两者结合可以得到亚循环时钟周期精度的时间测量。 - 首次捕获无效:牢记数据手册的警告,在程序初始化并启动N2HET后,延迟一小段时间(至少一个完整的程序循环)再启用WCAP捕获,或者主动丢弃第一个捕获到的数据。
- HTU与CPU的协同:对于连续、高速的捕获,强烈建议使用HTU请求将数据直接DMA到内存。如果使用CPU中断来读取
data字段,中断延迟可能造成数据覆盖(下一次捕获发生时,CPU还未读走上次的数据)或丢失事件。配置HTU的双缓冲模式可以完美解决这个问题:一个缓冲区被HTU填充时,CPU处理另一个缓冲区。 - 边沿去抖:对于可能存在噪声的输入信号,WCAP会在每个指令周期采样引脚状态。如果输入信号边沿非常缓慢或有毛刺,可能会误触发多次捕获。必要时,需要在外部硬件或软件上增加滤波措施。