TI TMS570/AM2x N2HET HWAG模块实战:从寄存器配置到电机控制应用

1. 项目概述:从寄存器手册到工程实践

如果你正在开发基于德州仪器(TI)TMS570/AM2x系列微控制器的电机控制、发动机管理或任何需要高精度角度与转速测量的嵌入式系统,那么N2HET模块及其HWAG(硬件角度发生器)组件绝对是你绕不开的核心。初次接触TI那动辄上千页的技术参考手册(TRM),尤其是看到像SPNU607A文档中第21章那样密密麻麻的寄存器位域描述和指令编码表格时,很容易让人望而生畏。这些手册是权威的“字典”,但距离一个工程师能“开箱即用”的实践指南,中间还隔着一条名为“经验”的鸿沟。

我花了相当长的时间,在多个汽车电控单元(ECU)和伺服驱动项目中与N2HET/HWAG打交道,从最初的照着手册配置却无法工作,到后来能游刃有余地利用它实现微秒级精度的曲轴位置解码和永磁同步电机(PMSM)的转子初始位置检测。这个过程让我深刻体会到,理解HWAG的关键不在于死记硬背每一个寄存器地址,而在于构建一个清晰的“信号流”心智模型:外部齿盘信号如何进入、经过哪些硬件逻辑处理、如何转化为角度值和中断事件、以及软件如何高效地响应。

本文将基于SPNU607A手册中关于HWAG寄存器和指令集的核心内容,但不会简单复述手册。我会以一个资深嵌入式工程师的视角,拆解HWAG从硬件连接到软件响应的完整链路,重点分享那些手册里语焉不详、但在实际调试中至关重要的“为什么”和“怎么办”。例如,为什么配置了HWAGCR2.STRT位后模块没反应?HWAACNT寄存器读出来的值为什么在跳变?如何利用ACMPACNT指令构建一个无刷直流电机(BLDC)的换相逻辑?我们将深入这些细节。

本文适合有一定嵌入式开发基础(熟悉C语言、了解外设基本概念)的工程师,无论是正在评估N2HET用于新项目,还是正在调试现有系统中的角度测量问题,都能从中找到可直接参考的配置步骤、避坑指南和设计思路。我们的目标是把那份冰冷的寄存器手册,变成你手中热气腾腾的开发利器。

2. HWAG模块核心架构与工作流解析

在直接动手配置寄存器之前,我们必须先在大脑中搭建起HWAG的硬件逻辑框架。把它想象成一个专为处理周期性脉冲序列(如发动机曲轴上的60-2齿盘)而设计的“专用协处理器”。它的核心任务不是简单的边沿计数,而是实现与物理角度严格同步的、高分辨率的时间基准

2.1 信号处理链路:从引脚到角度值

HWAG的完整信号处理链路可以概括为以下几个核心阶段,理解这个流程是正确配置所有寄存器的前提:

  1. 信号输入与选择:外部齿盘传感器(通常是磁电或霍尔式)产生的正弦或方波信号,连接到MCU的某个N2HET引脚(HET[0]到HET[31])。HWAPINSEL寄存器的PINSEL字段(位[4:0])就像是一个多路选择器,决定HWAG监听哪个引脚。这是整个链路的起点,配置错误会导致HWAG“耳聋”。

  2. 数字滤波与边沿检测:输入信号可能带有毛刺。HWAGCR2.FIL位用于使能数字滤波器,其滤波窗口由HWAFILHWAFIL2寄存器设定。滤波后的信号送入边沿检测器,HWAGCR2.TED位决定是检测上升沿还是下降沿作为有效“齿”事件。这一步确保了信号的纯净度和事件定义的准确性。

  3. 齿周期测量与“齿”计数:每检测到一个有效边沿,HWAG内部的硬件计数器就会捕获从上一个边沿到当前边沿所经过的时钟周期数,这个值被存入HWAPCNT(当前齿周期)寄存器,同时上一个周期值被转移到HWAPCNT1。另一个计数器对齿进行累加,当前计数值保存在HWATHVL寄存器中。HWATHNB寄存器则预设了齿盘的总齿数(例如,对于60-2齿盘,应设置为57,因为实际物理齿是58个,但编号从0开始)。

  4. 角度值生成与同步:这是HWAG的精华所在。它并非简单地对齿计数,而是在每个齿周期内,进行高分辨率的插值。HWASTWD(步宽)寄存器定义了将一个齿周期细分成多少份(4到131072份)。HWAACNT(角度值)寄存器则实时输出当前的角度值,其计算公式为:当前角度 = 当前齿号(HWATHVL) × 步宽(HWASTWD) + 在当前齿周期内的细分进度。这个进度由硬件根据HWAPCNT的流逝自动计算。HWAANGI寄存器则反映了每个最小分辨率时钟(tick)对应的角度增量。

  5. 事件判断与中断触发:HWAG持续监控上述过程,判断特定条件是否满足,例如:角度值HWAACNT到达预设的零位(奇齿)、当前齿周期异常(过长或过短)、角度计数器溢出等。一旦条件成立,就会在HWAFLG寄存器中置位相应的标志位。如果该中断在HWAENASET寄存器中被使能,则会向CPU发出中断请求。

2.2 寄存器地图功能分组

面对手册中列出的近20个HWAG寄存器,我们可以按功能将其分组,这样在编程时思路会更清晰:

寄存器组核心寄存器主要功能配置时机
全局控制HWAGCR0,HWAGCR1,HWAGCR2模块复位、启动/停止、边沿选择、滤波使能、判据使能、角度复位模式。初始化阶段配置。
信号输入HWAPINSEL选择输入信号源引脚。初始化阶段配置。
齿盘参数HWATHNB,HWASTWD设定齿盘总齿数(物理齿数-1)和每个齿周期的细分步数(分辨率)。初始化阶段配置,取决于传感器硬件。
实时状态HWAACNT,HWATHVL,HWAPCNT,HWAPCNT1只读或读写寄存器,反映当前角度、齿号、当前/上一齿周期。运行时循环读取或用于计算。
中断管理HWAENASET,HWAENACLR,HWALVLSET,HWALVLCLR,HWAFLG,HWAOFF0,HWAOFF1中断的使能、优先级设置、标志位查询与清除、中断向量偏移获取。初始化使能,中断服务程序(ISR)中查询和清除标志。
滤波与判据HWAFIL,HWAFIL2设置滤波窗口值,用于滤除噪声。HWAGCR2.CRI控制是否使能硬件判据。初始化阶段配置,根据信号质量调整。
角度增量HWAANGI只读,反映每个tick的角度增量,用于监控转速微变。运行时读取,用于高级控制算法。

关键经验:初始化HWAG时,务必遵循一个基本顺序:先停止(STRT=0)、再配置参数、最后启动(STRT=1)。尤其要确保在模块运行(STRT=1)时,不要修改HWATHNBHWASTWD等核心参数寄存器,这会导致角度计算错乱。通常的做法是在HWAGCR0.RESET位拉高释放复位后,配置所有静态参数,最后置位HWAGCR2.STRT

2.3 与N2HET指令集的协同

HWAG是N2HET模块内的一个硬件加速器,而N2HET本身还是一个强大的可编程定时器阵列,拥有自己的一套精简指令集(RISC)。HWAG负责“感知”角度,而N2HET程序(一段存储在专用RAM中的微代码)则负责“决策”和“执行”。它们之间通过标志位(Flag)和全局信号(如NAF_global)通信。

例如,HWAG在检测到新角度(每个tick)时,会生成一个NAF_global(新角度标志)信号。N2HET的ACNT指令可以捕获这个信号,并在此基础上进行角度计数。而ACMP(角度比较)指令,则可以实时将HWAACNT值与一个预设值比较,在匹配时触发输出引脚动作或中断,从而无需CPU干预即可实现基于角度的精准输出,如电机换相或喷油点火。

这种硬件协同极大地减轻了CPU的负担,实现了硬实时控制。CPU只需要在初始化时配置好HWAG和N2HET程序,然后在中断服务程序中处理一些高级事件(如奇齿中断、错误诊断)即可,绝大部分周期性的精确定时任务都由N2HET自治完成。

3. HWAG关键寄存器深度配置与实战技巧

理解了架构,我们就可以深入每个关键寄存器的配置细节了。手册给出了位定义,但没告诉你这些值在实际电路中如何计算,以及配置不当会引发什么诡异现象。

3.1 核心控制寄存器:HWAGCR2 详解与配置

HWAGCR2是HWAG的“大脑”,控制其核心行为。我们逐位分析:

  • STRT (位0) - 启动位:这是最容易出错的地方。该位只有在有效的齿信号边沿到来时,HWAG才会真正开始运行。也就是说,你置位STRT后,HWAACNTHWATHVL可能仍然为0,直到第一个传感器边沿被识别。在调试时,如果发现模块没启动,首先检查传感器信号是否已正确接入HWAPINSEL选择的引脚,并确认TED边沿选择是否正确。
  • FIL (位8) - 输入滤波使能:对于存在严重噪声的环境(如汽车发动机舱),必须使能。滤波值HWAFIL的计算公式通常为:FIL = (期望滤波时间 / N2HET时钟周期) - 1。例如,N2HET时钟VCLK2为100MHz(周期10ns),要滤除宽度小于1μs的毛刺,则FIL = (1μs / 10ns) - 1 = 99HWAFIL2用于奇齿期间的滤波,通常可以设置得比HWAFIL更宽松一些。
  • CRI (位16) - 硬件判据使能:这是一个强大的功能,用于验证齿周期的合理性。当使能后,HWAG会检查当前齿周期(PCNT(n))与上一个齿周期(PCNT(n-1))的关系。如果PCNT(n) > 2 * PCNT(n-1),则会触发“Bad active edge tooth”中断(如果使能)。这能有效滤除因传感器抖动或异物干扰产生的伪齿信号。在发动机启动或转速剧烈变化的瞬态过程,可能需要暂时禁用此功能,以免误判
  • TED (位17) - 齿边沿选择:根据传感器输出波形和电路设计决定。通常,磁电传感器经过迟滞比较器后输出方波,选择上升沿或下降沿均可,但必须与硬件电路匹配。一旦确定,在整个运行过程中不要更改
  • ARST (位24) - 角度复位模式:这是处理奇齿(如60-2齿盘缺齿位置)的关键。当ARST=1时,HWAG在检测到硬件定义的零位(如缺齿后的第一个齿)时,会自动将HWAACNT清零。当ARST=0时,则需要软件在检测到零位中断后,手动向HWAACNT写入0。对于标准的缺齿齿盘,建议设置ARST=1,让硬件自动处理,更可靠

一个典型的HWAGCR2初始化代码片段(以C语言伪代码为例)可能如下所示:

// 假设:使用HET[5]引脚,上升沿有效,使能滤波和判据,自动角度复位 HWAG_REGS->HWAPINSEL = 5U; // 选择HET[5]作为输入 HWAG_REGS->HWAFIL = 99U; // 1us滤波窗口 HWAG_REGS->HWAGCR2 = (uint32_t)(0 | (1U << 24) // ARST = 1: 自动角度复位 | (0U << 17) // TED = 0: 下降沿 (根据实际情况) | (1U << 16) // CRI = 1: 使能判据 | (1U << 8) // FIL = 1: 使能输入滤波 // STRT位稍后启动 );

3.2 角度与齿参数寄存器:HWASTWD, HWATHNB, HWAACNT

这几个寄存器决定了角度测量的范围和分辨率。

  • HWASTWD (步宽寄存器):位[3:0]这个4位字段定义了每个齿周期被细分成多少份。它的值K与细分份数N的关系是:N = 2^(K+2)。例如:

    • K=0->N=4ticks/齿
    • K=1->N=8ticks/齿
    • ...
    • K=14->N=65536ticks/齿
    • K=15->N=131072ticks/齿选择依据:需要的角度分辨率。假设一个60-2齿盘有58个有效齿,则每齿对应机械角度为 360°/58 ≈ 6.2069°。若选择K=10N=4096ticks/齿),则角度分辨率可达 6.2069°/4096 ≈ 0.0015°。这对于高精度电机控制已经足够。但要注意,N越大,HWAACNT寄存器(24位)溢出得越快,需要软件处理溢出中断。
  • HWATHNB (齿数寄存器):这里有个经典坑点:此寄存器设置的是最大齿号,即N-1,其中N是物理齿盘的总齿数(包括缺齿)。对于60-2齿盘,物理齿数为58个(60个位置缺2个),所以HWATHNB应设置为57。如果错误地设置为59或58,HWAG在计数到58或59时会认为齿号溢出,行为将不可预测。

  • HWAACNT (角度值寄存器):这是一个24位的只读寄存器(在某些模式下可写)。它实时反映了当前角度值,计算公式为:HWAACNT = HWATHVL * HWASTWD + 当前齿内tick计数。在ARST=1模式下,它会在零位自动归零,形成一个从0到(HWATHNB+1)*HWASTWD - 1的循环。在软件中读取该寄存器时,建议连续读取两次,如果两次值相同则认为有效,以避免在读取瞬间正好发生更新导致读到错误值

3.3 中断系统寄存器集群:从使能到服务

HWAG的中断系统是典型的“标志-使能”双寄存器模式,理解其工作流程对编写稳定的中断服务程序至关重要。

  1. 中断源与标志 (HWAFLG):当某个事件(如奇齿、周期溢出)发生时,硬件会自动将HWAFLG中对应的位置1。这个动作与中断是否使能无关。你可以通过轮询HWAFLG来查询事件,但这会消耗CPU资源。

  2. 中断使能 (HWAENASET/HWAENACLR):只有当中断标志位INTFLGx为1,并且对应的使能位INTENAx也为1时,HWAG才会向CPU中断控制器发出中断请求。HWAENASET写1置位使能,HWAENACLR写1清除使能。这种Set/Clear寄存器设计避免了“读-改-写”操作,在多任务或临界区内操作更安全。

  3. 中断优先级 (HWALVLSET/HWALVLCLR):可以设置每个中断源为高优先级或低优先级。这影响的是中断控制器层面的排队,对于HWAG本身,它只是将这两个级别的中断请求线分别拉高。

  4. 中断偏移 (HWAOFF0/HWAOFF1):这是非常巧妙的设计。当发生中断时,你可以读取HWAOFF0(高优先级)或HWAOFF1(低优先级)寄存器。读出的值OFFSET直接对应中断源编号(1=溢出周期,2=奇齿未找到...)。读取这个寄存器的操作会自动清除HWAFLG中对应的标志位。这意味着一行代码就能同时完成“识别中断源”和“清除标志”两个动作,极大提高了ISR效率。

一个典型的中断服务程序框架如下:

void HWA_Isr(void) { uint32_t offset; // 1. 读取偏移寄存器,同时清除标志 offset = HWAG_REGS->HWAOFF0; // 假设只用了高优先级 // 2. 根据偏移值跳转到不同的处理分支 switch(offset) { case 1U: // 溢出周期中断 // 处理周期异常,可能是传感器故障或转速超限 break; case 2U: // 奇齿未找到中断 (ARST=0时,软件未及时清零ACNT) // 严重错误,可能需要系统复位或降级处理 break; case 3U: // 齿中断 (每个齿都触发) // 可以在此进行转速计算、诊断等,但注意不要太耗时 // 因为高速时此中断频率会很高 break; case 4U: // ACNT溢出中断 (角度计数器24位回零) // 处理角度计数器溢出,用于扩展角度范围 break; case 7U: // 间隙标志中断 (进入缺齿区域) // 预判即将到达零位,可提前准备相关控制动作 break; default: // 未知中断,可能是错误 break; } // 3. 必要时,确认清除所有可能残留的标志(某些情况下读HWAOFF可能未清除所有标志) // HWAG_REGS->HWAFLG = 0xFFFFFFFFU; // 谨慎使用,可能清除未处理标志 }

重要提示HWAOFF0/1的读取具有副作用(清标志),因此切忌在非中断上下文或出于调试目的随意读取它,否则会丢失中断事件。调试时,应直接查询HWAFLG寄存器。

4. N2HET指令集在角度控制中的应用实践

N2HET的指令集允许你编写微代码程序,实现不依赖CPU的、确定性的硬实时控制。结合HWAG,我们可以构建强大的角度域控制器。这里重点剖析两个与HWAG紧密相关的指令:ACNTACMP

4.1 ACNT指令:构建角度计数器

ACNT指令并非直接操作HWAG寄存器,而是利用HWAG产生的NAF_global(新角度标志)信号,在N2HET内部维护一个软件角度计数器。它通常用在SCNT(步进计数)指令之后,用于生成与外部齿盘同步的、具有高分辨率的角度时钟。

关键参数解析

  • edge: 必须与之前APCNT指令(用于测量齿周期)设置的边沿一致,且固定使用HET[2]引脚。这是HWAG与N2HET程序之间的硬件信号连接约定。
  • gapend: 定义了“间隙区”的结束角度值。对于60-2齿盘,间隙区就是缺齿部分。ACNT在角度值进入gapstart(由SCNT定义)到gapend区间时,会设置GPF(间隙标志),并可能暂停某些操作。
  • data: 指令数据字段的初始值,通常设为0。

ACNT指令的执行逻辑复杂,它内部会处理加速(ACF)、减速(DCF)标志,以补偿转速变化带来的误差。对于大多数应用,我们不需要微调其内部逻辑,只需确保它前面的SCNT指令正确配置了步宽(SWF0,SWF1),并且gapstart/gapend参数与齿盘匹配即可ACNT指令输出的“角度时钟”可以作为整个N2HET程序的时间基准。

4.2 ACMP指令:实现角度同步输出

ACMP(角度比较)指令是实现无刷电机换相、燃油喷射正时等功能的核心。它持续将HWAACNT的当前值(或更准确地说,是ACNT指令维护的软件角度值)与一个预设的“比较值”进行比较。当旧角度值 < 比较值 ≤ 新角度值条件满足时,即认为发生了一次“角度匹配”。

它的强大之处在于:匹配发生时,可以在同一个N2HET时钟周期内,直接控制一个输出引脚(action参数设置为SETCLEAR)产生跳变,同时还可以触发一个中断(irq=ON)通知CPU,或者触发一个DMA/HTU请求(request=GENREQ)。所有这些操作都由硬件在纳秒级延时内完成,完全不受CPU负载和中断延迟的影响。

一个用于BLDC电机换相的ACMP指令配置示例(在N2HET汇编或图形化配置工具中):

; 假设:电机极对数为4,电角度360度对应机械角度90度。 ; 我们想在电角度30度(机械角度7.5度)时,打开A相上桥臂。 ; 角度分辨率已通过HWASTWD和ACNT设定。 ACMP next=@next_instr, pin=HET[10], action=SET, reg=B, irq=OFF, data=COMPARE_VALUE_30deg

这里的COMPARE_VALUE_30deg需要根据你的角度零位、步宽(HWASTWD)和电气角度偏移来计算。reg=B指定使用B寄存器,这是ACNT指令更新角度值的寄存器。当ACNT更新的角度值B跨过COMPARE_VALUE_30deg时,HET[10]引脚就会被自动置高,从而驱动功率MOSFET打开。

多个ACMP指令可以并行工作,分别设置不同的比较值和不同的输出引脚,从而实现六步换相的全部六次开关动作,全程无需CPU参与。CPU只需要在初始化和处理故障时介入。

4.3 指令集与HWAG的协同编程模式

一个典型的基于HWAG和N2HET指令集的电机控制程序流如下:

  1. CPU初始化

    • 配置系统时钟,使能N2HET模块时钟。
    • 配置HWAG所有寄存器(引脚、滤波、齿数、步宽、中断)。
    • 编写N2HET程序(包含SCNT,ACNT, 多个ACMP等指令),并加载到N2HET程序RAM。
    • 配置N2HET的引脚功能为输出。
    • 使能HWAG和N2HET。
  2. HWAG自治运行

    • HWAG持续捕获传感器信号,更新HWAACNT,HWATHVL
    • 在缺齿位置触发中断,CPU在ISR中可进行同步校正或故障诊断。
  3. N2HET程序自治运行

    • ACNT指令跟随HWAG的NAF_global,生成高分辨率角度时钟。
    • 多个ACMP指令将角度时钟与预设换相点比较,直接驱动6个PWM输出引脚。
    • 整个过程形成一个由角度事件驱动的硬实时闭环,CPU占用率极低。
  4. CPU后台任务

    • 响应HWAG的周期溢出、错误中断,进行系统健康监控。
    • 根据转速、扭矩命令,动态计算并更新ACMP指令中的比较值(即改变换相提前角),实现高级控制算法。

这种架构将最苛刻的定时任务从CPU卸载到专用硬件,保证了即使在CPU忙于通信、诊断等任务时,电机换相的时刻精度也丝毫不受影响。

5. 典型应用场景配置与调试问题实录

理论最终要服务于实践。下面我将以最常见的“60-2齿盘转速与角度测量”和“BLDC电机六步换相”为例,给出具体的配置步骤和参数计算。

5.1 场景一:发动机曲轴60-2齿盘测量

目标:测量发动机转速和实时曲轴角度。

硬件连接:曲轴传感器信号接入MCU的HET[5]引脚。

配置步骤

  1. 计算基本参数

    • 物理齿数N_physical = 58(60-2)
    • HWATHNB = 58 - 1 = 57(0x39)
    • 期望角度分辨率:0.1度曲轴角(CA)。
    • 每齿对应角度:360° / 58 ≈ 6.2069° CA。
    • 所需每齿细分步数:6.2069° / 0.1° ≈ 62。选择最接近的2的幂次方值:64 (K=4, 因为2^(4+2)=64)。
    • HWASTWD = 4(对应K=4)。
    • 总步数(一圈):58 * 64 = 3712。小于HWAACNT的24位最大值(16,777,215),无溢出风险。
  2. 初始化HWAG

    // 1. 确保模块未运行且处于复位状态 (可选,上电默认) HWAG_REGS->HWAGCR0 = 0U; // 确保RESET=0 HWAG_REGS->HWAGCR2 &= ~(1U << 0); // 确保STRT=0 // 2. 配置静态参数 HWAG_REGS->HWAPINSEL = 5U; // 信号来自HET[5] HWAG_REGS->HWATHNB = 57U; // 60-2齿盘 HWAG_REGS->HWASTWD = 4U; // 每齿64步 HWAG_REGS->HWAFIL = 49U; // 假设VCLK2=100MHz,滤波时间约0.5us // 3. 配置控制寄存器 HWAG_REGS->HWAGCR2 = (uint32_t)(0 | (1U << 24) // ARST=1: 自动在缺齿后清零ACNT | (0U << 17) // TED=0: 下降沿有效 (根据信号调整) | (1U << 16) // CRI=1: 使能齿周期判据 | (1U << 8) // FIL=1: 使能滤波 ); // 4. 配置中断 HWAG_REGS->HWAENASET = (1U << 2); // 使能“Singularity not found”中断(奇齿中断) HWAG_REGS->HWALVLSET = (1U << 2); // 设为高优先级 // 5. 启动HWAG HWAG_REGS->HWAGCR0 = 1U; // 释放复位 RESET=1 // 等待至少几个时钟周期 HWAG_REGS->HWAGCR2 |= (1U << 0); // 启动 STRT=1
  3. 软件读取与计算

    • 转速计算:在“齿中断”(每个齿都触发)或定时器中,读取HWAPCNT(当前齿周期)。该值是以VCLK2时钟为单位的计数。转速RPM = (60 * VCLK2_Freq) / (Teeth_Num * PCNT)。例如,VCLK2=100MHz,PCNT=50000,则RPM ≈ (60 * 100e6) / (58 * 50000) ≈ 2069 RPM注意:手册提到PCNT在读取时可能已变化,建议连续读取两次或使用捕获寄存器。
    • 角度获取:直接读取HWAACNT。曲轴角度Angle = (HWAACNT * 360) / (HWATHNB+1)/HWASTWD。由于ARST=1HWAACNT会在每圈归零。

5.2 场景二:基于HWAG的BLDC电机六步换相

目标:利用HWAG提供的实时角度,通过N2HET指令直接产生6路PWM换相信号。

步骤

  1. 硬件连接:电机霍尔传感器或编码器A/B信号(经过处理后)接入HWAG输入引脚(如HET[5])。6路PWM输出使用N2HET的其他引脚(如HET[10]到HET[15])。

  2. HWAG配置:同上例,用于获取高分辨率转子机械角度。假设电机极对数为P,则电角度 = 机械角度 * P。

  3. N2HET程序设计(概念性汇编):

    ; 初始化段 SCNT ... hr_lr=HIGH ... ; 设置步宽,与HWASTWD匹配 ACNT edge=RISING gapend=GAP_END_VAL data=0 ; 初始化角度计数器,跟随HWAG ; 主循环 - 6个ACMP指令实现换相 ACMP pin=HET[10] action=SET reg=B data=ANGLE_30 ; U相上桥臂开启点 ACMP pin=HET[10] action=CLEAR reg=B data=ANGLE_210 ; U相上桥臂关闭点 ACMP pin=HET[11] action=SET reg=B data=ANGLE_150 ; V相上桥臂开启点 ACMP pin=HET[11] action=CLEAR reg=B data=ANGLE_330 ; ... ACMP pin=HET[12] action=SET reg=B data=ANGLE_270 ; W相上桥臂开启点 ACMP pin=HET[12] action=CLEAR reg=B data=ANGLE_90 ; ... ; 下桥臂通常采用互补PWM,可通过其他指令或PWM模块生成 BR ... ; 跳回循环开始

    ANGLE_30等值需要根据零点偏移和电角度换算为ACNT的计数值。例如,若步宽为64,电角度30度对应的计数值为(30 / 360) * (64 * 58) ≈ 309(取整)。

  4. CPU角色:初始化后,CPU只需在每次电气循环(通过HWAG奇齿中断感知)更新换相角(data字段),以实现提前角控制。真正的换相动作完全由N2HET硬件在微秒级精度内完成。

5.3 常见调试问题与排查技巧

  1. 问题:HWAG启动后,HWAACNTHWATHVL始终为0。

    • 排查
      • 确认HWAGCR2.STRT已置1。
      • 使用示波器或逻辑分析仪,检查HWAPINSEL所选引脚是否有信号?信号幅值、频率是否符合要求?
      • 检查HWAGCR2.TED边沿选择是否与信号实际跳变方向一致。
      • 检查HWAGCR2.FIL滤波是否设置过严,导致有效边沿被滤除?尝试暂时禁用滤波(FIL=0)。
      • 检查HWAGCR2.CRI判据是否过于严格,在启动低速时误判?尝试暂时禁用判据(CRI=0)。
  2. 问题:HWAACNT值不连续或在特定位置跳变。

    • 排查
      • 检查HWATHNB设置是否正确(应为物理齿数-1)。
      • 检查ARST模式。如果ARST=0,需要在奇齿中断中手动清零HWAACNT,否则它会一直累加溢出。
      • 检查传感器信号在缺齿区域的质量,是否存在毛刺导致多计数或漏计数?调整HWAFILHWAFIL2
      • 确认HWASTWD值在运行中未被意外修改。
  3. 问题:N2HET的ACMP指令没有在预期角度触发输出。

    • 排查
      • 首先确认HWAG本身工作正常,HWAACNT在连续变化。
      • 确认ACNT指令是否正确配置并执行,其reg(通常是B)寄存器是否在更新。
      • 检查ACMP指令中的data(比较值)计算是否正确,是否考虑了角度偏移。
      • 检查ACMP指令的pin选择是否正确,该引脚是否已配置为N2HET输出功能。
      • 使用N2HET的调试工具(如TI的HET IDE)单步仿真N2HET程序,查看寄存器值和程序流。
  4. 问题:中断频繁触发,或预期的中断不触发。

    • 排查
      • 检查HWAENASET寄存器,确认所需中断源已使能。
      • 在中断服务程序(ISR)中,首先读取HWAOFF0/1来清除标志,并保存该偏移值。处理完后再根据偏移值分支。
      • 避免在ISR中进行耗时操作,防止丢失后续中断。
      • 检查中断优先级配置,确保高优先级中断不会长时间阻塞低优先级中断。
      • 使用HWAFLG寄存器轮询,辅助判断是中断未产生还是ISR未正确响应。

终极调试建议:如果条件允许,一定要用逻辑分析仪同时抓取传感器原始信号HWAG输入引脚信号(可能已滤波)以及N2HET输出引脚信号。将抓取的数据与HWAACNTHWATHVL的软件日志在时间轴上对齐,任何异常都无处遁形。这种“信号-硬件-软件”联合调试方法是解决复杂定时器问题的利器。

通过将HWAG的硬件自动化和N2HET指令集的灵活编程相结合,我们能够在复杂的实时控制系统中实现极高精度和可靠性的角度与时间管理。掌握它需要耐心和实践,但一旦打通,它将成为一个极其可靠和强大的工具,成为你嵌入式控制项目中的坚实基石。