1. 项目概述与核心价值
在电机控制、数字电源或者任何需要精确功率调节的嵌入式系统里,PWM(脉冲宽度调制)模块的稳定性和可靠性是项目成败的基石。我们常常把目光聚焦在PWM的输出波形质量上,比如死区时间、对齐方式,但一个同样关键却容易被忽视的环节是输入信号的可靠性。无论是用于测速的编码器反馈、用于同步的外部触发信号,还是用于故障保护的外部关断信号,这些输入一旦受到噪声干扰,轻则导致控制环路震荡,重则直接引发系统故障。NXP的MC56F81xxxL系列DSC(数字信号控制器)内置的增强型灵活PWM模块,其强大之处不仅在于丰富的输出模式,更在于它提供了高度可配置的输入捕获滤波机制。
今天,我们就来深入“解剖”eFlexPWM模块中与输入滤波和全局控制相关的几个关键寄存器。很多手册只是罗列了寄存器位域,但实际配置时,FILT_PER(滤波周期)和FILT_CNT(滤波计数)这两个值到底怎么设?设大了延迟受不了,设小了又滤不掉噪声。PHASEDLY(相位延迟)寄存器在构建多相、交错并联的电源拓扑时如何精确同步多个PWM子模块?OUTEN(输出使能)和MASK(输出掩码)寄存器在动态管理PWM输出时有何区别?这些实战中的“魔鬼细节”,恰恰是区分普通代码和工业级可靠代码的关键。
这篇文章,我将结合自己多年在变频器和伺服驱动器开发中“踩过的坑”,带你从寄存器手册的枯燥描述里,提炼出可直接落地的配置逻辑、参数计算方法和避坑指南。无论你是正在调试一台无刷电机驱动器,还是设计一个多相Buck-Boost电源,理解这些寄存器的“脾气”,都能让你的系统在面对复杂电磁环境时,多一份从容。
2. 核心寄存器功能解析与设计逻辑
MC56F81xxxL的eFlexPWM模块结构复杂,功能强大。为了高效管理,其寄存器被清晰地划分为全局控制寄存器和子模块专用寄存器。我们本次聚焦的,正是那些影响多个子模块或负责关键安全、同步功能的全局寄存器。理解它们的设计逻辑,是进行正确配置的前提。
2.1 输入捕获滤波寄存器簇:噪声的“守门员”
输入捕获滤波是确保信号完整性的第一道防线。eFlexPWM为A、B、X三个捕获通道分别提供了独立的滤波寄存器:SMxCAPTFILTA,SMxCAPTFILTB,SMxCAPTFILTX。它们的结构完全一致,核心就控制两个参数:滤波采样周期和连续一致采样次数。
滤波的工作原理,可以想象成一个“投票表决”机制。假设CAPTA_FILT_PER设置为4(即4个IPBus时钟周期采样一次),CAPTA_FILT_CNT设置为2(代表需要2+3=5次连续一致的采样)。当输入引脚上发生一个真实的电平跳变时,滤波器并不会立即报告这个跳变。它会启动一个定时器,每4个时钟周期对引脚电平采样一次。只有当连续5次采样结果都显示为新的电平(比如从0变成了1),滤波器才“认定”这是一个有效的跳变,并通知内部的捕获逻辑。在这个过程中,任何一个短暂的噪声毛刺(其持续时间小于FILT_PER)最多只能污染一次采样结果,由于无法满足连续5次一致的条件,就会被有效滤除。
关键设计权衡:抗噪性与实时性。手册中明确给出了滤波引入的延迟公式:Latency = (FILT_CNT + 4) × FILT_PER × T_ipbus。这个公式怎么来的?FILT_CNT+3是所需的一致采样次数,那+1是哪里来的?这多出来的一个周期,通常包含了滤波器的初始状态同步或结果锁存时间。这是一个非常重要的经验点:你在计算系统响应时间时,必须把这个滤波延迟考虑进去。例如,如果你的IPBus时钟是60MHz(周期约16.67ns),设置FILT_PER=8,FILT_CNT=1(即4次一致),那么延迟 = (1+4)816.67ns ≈ 667ns。对于高速电机控制环(电流环频率10kHz以上,周期100us),667ns的延迟通常可以接受;但如果这个信号用于逐周期限流保护,你就需要仔细评估这个延迟是否在安全裕度内。
注意:手册中特别强调了一个易错操作。当需要将
FILT_PER从一个非零值改为另一个非零值时,必须先将其写为0,等待至少一个IPBus时钟周期后,再写入新值。这是因为滤波器内部可能有样本缓冲区,直接更改可能导致不可预测的滤波行为。安全的操作顺序是:FILT_PER = 0; (可选:插入NOP或短暂延时); FILT_PER = new_value;。
2.2 输出使能与掩码寄存器:输出的“遥控器”与“急停按钮”
OUTEN和MASK寄存器都用于控制PWM输出,但它们的应用场景和生效机制有本质区别,混淆两者是常见的错误来源。
OUTEN寄存器是输出使能。你可以把它想象成PWM通道的“电源开关”。当PWMA_EN、PWMB_EN或PWMX_EN的对应位被清零时,相应的输出引脚会被彻底禁用,其状态由引脚复用控制器的其他设置决定(通常为高阻态)。这个操作是“静态”的,通常用于初始化阶段关闭未使用的PWM通道以降低功耗,或者在模式切换时(如从PWM输出模式切换到输入捕获模式)必须禁用输出。手册明确指出,当某个引脚被用作输入捕获时,其对应的OUTEN位必须设为0。
MASK寄存器则完全不同,它是输出掩码。我更愿意称它为“软件急停”或“动态静音”。当MASKA、MASKB或MASKX的对应位被置1时,对应的PWM输出会在极性控制之前被强制拉低(或拉高,取决于极性设置,但通常是强制为无效态)。关键在于,这个操作是“动态”的,可以在PWM波形运行过程中实时生效,用于实现快速保护、动态调制或特定序列控制。例如,在过流故障发生时,你可以通过置位MASK寄存器位,在几个时钟周期内封锁所有PWM输出,这比通过修改比较值来关闭输出要快得多、可靠得多。
双缓冲与立即更新:MASK寄存器是双缓冲的。通常,你对MASKA等位的写入,只是更新了缓冲区,真正的生效需要等待该子模块内部发生一个FORCE_OUT事件(例如计数器重载)。为了满足快速响应的需求,寄存器提供了UPDATE_MASK位。当你同时设置MASKA位和对应的UPDATE_MASK位时,掩码操作会立即在下一个时钟边沿生效,无需等待FORCE_OUT。这在实现高速故障响应时至关重要。
2.3 相位延迟寄存器:多相交错的“节拍器”
在交错并联Boost、多相VRM(电压调节模块)或特定电机驱动拓扑中,我们需要多个PWM通道以固定的相位差运行。PHASEDLY寄存器正是为此而生。它允许子模块1、2、3的计数器相对于子模块0(主模块)的同步信号,延迟特定的PWM时钟周期数再开始运行。
配置要点:
- 主从设置:只有子模块1、2、3有
PHASEDLY寄存器。子模块0作为时间基准。 - 同步源选择:必须将子模块的
CTRL2[INIT_SEL]设置为10b,选择主同步信号(来自子模块0)作为其计数器的初始化源。 - 延迟值:
PHASEDLY是一个16位无符号整数,单位为PWM时钟周期。例如,PWM时钟为100MHz,若要实现子模块1滞后子模块0 1us,则PHASEDLY = 1us / 10ns = 100。 - 双缓冲与加载:和许多关键寄存器一样,
PHASEDLY也是双缓冲的。写入后,需要设置主控制寄存器MCTRL[LDOK]对应位,并在下一个PWM周期开始时(或设置CTRL[LDMOD]立即)生效。一个重要的限制:PHASEDLY的值绝对不能大于子模块0定���的PWM周期值,否则行为未定义。
实战场景:假设设计一个三相逆变器,使用中心对齐PWM,载波频率10kHz(周期100us)。我们希望三路PWM互差120度。由于是中心对齐,半个周期是180度。因此,相位差120度对应的时间差为(120/180) * (100us/2) ≈ 33.33us。如果PWM时钟为60MHz(周期16.67ns),则延迟计数值为33.33us / 16.67ns ≈ 2000。我们将子模块0的INIT和VAL1设置为对应100us周期的值,然后将子模块1的PHASEDLY设为2000,子模块2的PHASEDLY设为4000,即可实现三路PWM互差120度。
3. 寄存器配置实操与参数计算
理解了原理,我们进入实战环节。我将以一段典型的初始化代码为例,展示如何配置这些寄存器,并详细解释每一个参数的计算过程和配置顺序。
3.1 输入滤波寄存器配置实战
假设我们的系统IPBus时钟(通常也是外设总线时钟)为f_ipbus = 60 MHz,对应的时钟周期T_ipbus = 16.67 ns。我们需要配置子模块0的PWMA输入捕获滤波,以滤除宽度小于100ns的噪声毛刺,同时要求滤波引入的延迟不超过1us。
步骤1:确定滤波采样周期噪声毛刺宽度 < 100ns。为了确保一个毛刺最多只影响一个采样点,采样周期必须大于噪声周期。我们取2倍余量,设定T_sample > 200ns。FILT_PER的单位是IPBus时钟周期数,因此:FILT_PER = ceil(T_sample / T_ipbus) = ceil(200ns / 16.67ns) = ceil(12) = 12所以设置CAPTA_FILT_PER = 12。此时实际采样周期T_sample_actual = 12 * 16.67ns ≈ 200ns。
步骤2:确定滤波计数与评估延迟我们希望错误采样的概率极低。假设单次采样因噪声而出错的概率为P_error_sample。经过N次连续一致采样确认后,错误识别跳变的概率为P_error_transition = (P_error_sample)^N。FILT_CNT字段值K对应的采样次数N = K + 3。 若要求P_error_transition < 10^-6,且估计P_error_sample = 0.1,则需0.1^N < 10^-6,解得N > 6。因此K > 3。我们选择K = 4,即CAPTA_FILT_CNT = 4,此时N = 7次连续一致采样。 计算延迟:Latency = (K + 4) * FILT_PER * T_ipbus = (4+4)*12*16.67ns ≈ 1.6us。 这个延迟超过了1us的要求。我们需要调整。
步骤3:权衡调整延迟超标。为了满足<1us的延迟,我们只能放松滤波要求。尝试减小FILT_PER或FILT_CNT。 方案A:减小FILT_PER。设FILT_PER = 8,T_sample_actual = 133ns(仍大于100ns噪声)。延迟Latency = (4+4)*8*16.67ns ≈ 1.07us,仍然略超。 方案B:减小FILT_CNT。设FILT_CNT = 3(N=6),FILT_PER=12。延迟Latency = (3+4)*12*16.67ns ≈ 1.4us,反而更差。 方案C:同时减小。设FILT_CNT = 2(N=5),FILT_PER = 8。延迟Latency = (2+4)*8*16.67ns = 800ns。满足延迟要求。此时错误识别概率P_error_transition = 0.1^5 = 10^-5。评估这个风险是否可接受。如果不可接受,可能需要从硬件上加强信号完整性,降低P_error_sample。
最终决策:假设经过评估,10^-5的错误概率可以接受,且硬件上已做充分滤波(如RC滤波)。我们采用方案C。 配置代码如下:
// 先禁用滤波,确保干净地更改配置 PWM->SM[0].CAPTFILTA = 0x0000; // 将FILT_PER写为0,清空滤波器 // 写入新的滤波参数:FILT_CNT=2 (放在bit10-8), FILT_PER=8 (放在bit7-0) // 即:0000 0010 0000 1000 = 0x0208 PWM->SM[0].CAPTFILTA = (2 << 8) | 8;实操心得:在系统初始化阶段配置滤波参数通常很安全。但如果需要在运行时动态调整(例如根据电机转速切换滤波强度),务必遵循“先写0,再写新值”的顺序,并确保在更改期间捕获功能不被使用,或者做好信号中断的预案。
3.2 相位延迟与主从同步配置
配置子模块1相对于子模块0有20us的相位延迟。已知PWM时钟源预分频后为f_pwmclk = 100 MHz,T_pwmclk = 10 ns。子模块0的PWM周期设置为5000个计数(对应50us)。
步骤1:计算延迟计数值PHASEDLY = 延迟时间 / T_pwmclk = 20us / 10ns = 2000。 检查是否小于子模块0的周期值5000,满足条件。
步骤2:配置流程
// 1. 配置子模块0为Master,并设置其周期。假设使用LOAD模式,立即更新。 PWM->SM[0].CTRL2 |= PWM_CTRL2_CLK_SEL(0) | ... ; // 选择时钟等 PWM->SM[0].INIT = 0; // 计数器初值 PWM->SM[0].VAL1 = 5000; // 计数器重载值,决定周期 PWM->SM[0].CTRL |= PWM_CTRL_LDMOD_MASK; // 设置为立即加载模式 // 2. 配置子模块1为Slave,使用Master Sync作为初始化源 PWM->SM[1].CTRL2 |= PWM_CTRL2_INIT_SEL(2); // 10b, 选择主同步信号 // 3. 配置子模块1的相位延迟寄存器(双缓冲) PWM->SM[1].PHASEDLY = 2000; // 4. 通过MCTRL寄存器加载所有缓冲区的值到子模块1 // 首先,确保MCTRL[LDOK]位未设置(通常为0)。然后设置LDOK位。 // 同时加载子模块0和1的配置(虽然子模块0是立即加载,但同步设置LDOK是好习惯) PWM->MCTRL |= PWM_MCTRL_LDOK(0x3); // 同时设置子模块0和子模块1的LDOK位 (bit0和bit1) // 如果CTRL[LDMOD]=0,则新值将在下一个PWM周期开始时生效。 // 如果CTRL[LDMOD]=1,则新值立即生效。 // 5. 清除LDOK位(可手动或等待自动清除) PWM->MCTRL |= PWM_MCTRL_CLDOK(0x3); // 手动清除子模块0和1的LDOK位 // 或者,等待自动清除(在下一个重载事件后)3.3 输出使能、掩码与软件控制输出联合应用
场景:系统启动时,先使能PWM输出但保持掩码状态(输出强制为低),待所有外设(如栅极驱动器、ADC)初始化并自检完成后,再解除掩码,输出正常PWM。同时,在故障处理函数中,需要能通过软件直接控制某对互补输出为固定状态。
// 初始化阶段 // 1. 使能所有需要的PWM输出通道(打开“电源开关”) PWM->OUTEN = PWM_OUTEN_PWMA_EN(0xF) | // 使能所有子模块的PWMA输出 PWM_OUTEN_PWMB_EN(0xF) | // 使能所有子模块的PWMB输出 PWM_OUTEN_PWMX_EN(0x0); // 本例不使用PWMX // 2. 但同时,设置MASK寄存器,将所有输出掩码(按下“急停”) // 注意:MASK是双缓冲的,我们同时设置UPDATE_MASK使其立即生效。 PWM->MASK = PWM_MASK_MASKA(0xF) | // 掩码所有PWMA PWM_MASK_MASKB(0xF) | // 掩码所有PWMB PWM_MASK_MASKX(0x0) | // 不掩码PWMX PWM_MASK_UPDATE_MASK(0xF); // 关键!使掩码立即对所有子模块生效 // 此时,尽管OUTEN已使能,但输出被MASK强制拉低,引脚实际无PWM波形。 // 系统准备就绪后,解除掩码 PWM->MASK = PWM_MASK_MASKA(0x0) | // 解除所有PWMA掩码 PWM_MASK_MASKB(0x0) | // 解除所有PWMB掩码 PWM_MASK_UPDATE_MASK(0xF); // 立即更新 // 现在,正常的PWM波形开始输出。 // 故障处理或特定序列控制 // 假设我们需要在故障时,将子模块0的互补对(PWM23)强制输出固定状态(如都拉低)。 // 方法一:通过MASK寄存器(快速,但只能输出低电平) // PWM->MASK |= PWM_MASK_MASKA(1) | PWM_MASK_MASKB(1) | PWM_MASK_UPDATE_MASK(1); // 方法二:通过软件控制输出(SWCOUT)和源选择(DTSRCSEL),可以输出高或低 // 2.1 配置DTSRCSEL,让子模块0的PWM23信号源来自SWCOUT[SM0OUT23] PWM->DTSRCSEL = (PWM->DTSRCSEL & ~PWM_DTSRCSEL_SM0SEL23_MASK) | PWM_DTSRCSEL_SM0SEL23(2); // 10b, 选择SWCOUT // 2.2 通过SWCOUT控制输出电平 PWM->SWCOUT &= ~PWM_SWCOUT_SM0OUT23_MASK; // 写0,输出低电平 // PWM->SWCOUT |= PWM_SWCOUT_SM0OUT23_MASK; // 写1,输出高电平 // 注意:SWCOUT也是双缓冲,其生效需要FORCE_OUT事件或配合UPDATE_MASK类似的机制(但SWCOUT没有立即更新位)。 // 通常,设置好DTSRCSEL后,对SWCOUT的写入需要等待一个PWM周期同步事件(如FORCE_OUT)才能生效。 // 在紧急故障处理时,更推荐使用MASK方式,因为UPDATE_MASK可以使其立即生效。4. 高级功能与故障安全机制
eFlexPWM模块的健壮性不仅体现在灵活的控制上,更体现在其内置的故障安全机制。FCTRL和FSTS寄存器构成了一个可配置的硬件保护网络。
4.1 故障控制寄存器配置策略
FCTRL寄存器允许你对每个故障输入进行精细化的行为配置,主要包括三个维度:有效电平、清除模式和安全模式。
有效电平:FLVL位决定了故障引脚的有效逻辑电平。这在硬件设计时就必须确定。例如,通常故障信号在正常时为高电平,故障发生时被外部电路拉低,那么FLVL就应该设置为0(低电平有效)。
清除模式:FAUTO位决定了故障恢复是自动还是手动。
- 自动清除:当故障引脚上的实际信号消失(
FFPIN清零)后,在下一个半周期或全周期边界(由FHALF/FFULL决定),PWM输出会自动恢复。这种模式响应快,适用于短暂的、可自恢复的干扰。 - 手动清除:即使故障引脚信号消失,PWM输出也保持禁用,直到软件主动清除
FFLAG标志位。这种模式更安全,确保软件在确认系统状态正常后,才能重新使能输出。适用于严重的、需要系统级诊断的故障。
安全模式:FSAFE位在手动清除模式下进一步控制安全行为。
- 普通模式:只要
FFLAG被清除,PWM输出就可以恢复,即使FFPIN可能因为滤波延迟仍显示有故障(实际引脚已恢复)。这存在一定风险。 - 安全模式:PWM输出恢复需要同时满足两个条件:1)
FFLAG被软件清除;2) 故障引脚的实际信号已消失(FFPIN为0)。这提供了双重保障,是更高安全等级应用的首选。
配置示例:假设故障输入0连接硬件过流保护,低电平有效,我们希望任何过流触发后必须由软件干预才能恢复。
// 配置故障输入0 // FCTRL0对应故障输入3-0,我们配置输入0。 // FLVL[15:12]对应故障3-0,设置bit12为0(低有效)。 // FAUTO[11:8]对应故障3-0,设置bit8为0(手动清除)。 // FSAFE[7:4]对应故障3-0,设置bit4为1(安全模式)。 uint16_t fctrl0_val = 0; fctrl0_val |= (0 << 12); // FLVL0 = 0: Active low fctrl0_val |= (0 << 8); // FAUTO0 = 0: Manual clear fctrl0_val |= (1 << 4); // FSAFE0 = 1: Safe mode // 假设故障1也类似配置... PWM->FCTRL0 = fctrl0_val;4.2 主控制寄存器与写保护
MCTRL和MCTRL2是模块的“大脑”。MCTRL中的RUN位控制每个子模块的时钟,在初始化序列中,通常最后才置位RUN位。LDOK和CLDOK用于管理双缓冲寄存器的加载,前面已经详细说明。
MCTRL2寄存器有两个关键功能:
- 写保护:
WRPROT位可以锁定OUTEN、MASK、DTSRCSEL、FCTRL等关键寄存器,防止软件跑飞意外修改它们。在系统初始化完成后,特别是安全关键型应用中,建议使能写保护。一旦锁定,只有芯片复位才能解除。 - PLL监控:
MONPLL位用于在启用分数延迟功能时,监控芯片PLL状态。如果PLL失锁,分数延迟模块会被自动禁用,防止其输出异常。如果你的应用使用了高分辨率PWM(通过FRCTRL寄存器启用),强烈建议开启此功能。
初始化顺序建议:
- 配置所有子模块的
CTRL、INIT、VALx、FRACVALx等参数。 - 配置全局寄存器:
OUTEN、MASK、DTSRCSEL、FCTRL、PHASEDLY等。 - 设置
MCTRL[LDOK],加载所有双缓冲配置。 - 设置
MCTRL[RUN]位,启动PWM计数器。 - (可选)设置
MCTRL2[WRPROT],启用写保护。
5. 常见问题排查与调试技巧
即使理解了所有寄存器,调试过程中依然会遇到各种问题。下面是我总结的一些典型问题及其排查思路。
5.1 输入捕获无反应或数据错误
- 现象:配置了输入捕获,但标志位不置位,或者捕获值明显不合理。
- 排查清单:
- 引脚复用检查:确认GPIO是否已正确配置为PWM输入捕获功能,而非普通GPIO或其他外设。
- 输入滤波过强:检查
CAPTFILT寄存器。如果FILT_PER或FILT_CNT设置过大,可能导致信号跳变被滤除或延迟过长,看起来像没捕获到。尝试将FILT_PER设为0(禁用滤波)进行测试。 - 输入极性错误:检查对应子模块的
CTRL1寄存器中的CAPTENAx、CAPTENBx等位,确认捕获边沿(上升沿、下降沿、双边沿)设置是否正确。 - 计数器模式不匹配:输入捕获依赖于PWM计数器运行。确认该子模块的
MCTRL[RUN]位已置1,且计数器正在计数。 - 寄存器访问时机:捕获值寄存器
CVALx是只读的,但读取时需注意,它可能在捕获事件发生时被更新。确保在捕获中断标志置位后再去读取。
5.2 PWM输出异常(无输出、常高、常低)
- 现象:PWM引脚没有波形输出,或者一直为高/低电平。
- 排查清单:
- 输出使能:首先检查
OUTEN寄存器对应位是否已使能。这是最容易被忽略的一步。 - 输出掩码:检查
MASK寄存器对应位是否被意外置1。MASK的优先级很高,会强制输出为低。 - 故障状态:检查
FSTS寄存器中的故障标志FFLAG和故障引脚状态FFPIN。如果有故障被触发,并且配置为手动清除,PWM输出会被强制禁用,直到你清除FFLAG。 - 死区生成器:如果使用了互补输出模式,检查死区时间
DTCNT0/1是否设置得过大,导致正负脉冲都被“吞掉”而没有输出。 - 软件控制覆盖:检查
DTSRCSEL寄存器,确认PWM信号源是否被意外切换到了SWCOUT或外部引脚EXTx。如果是,则需要检查SWCOUT的值或外部引脚信号。 - 极性设置:检查
OUTCTRL或MCTRL[IPOL]寄存器中的极性设置。可能波形是反的,在示波器上看起来像常高/常低(因为占空比极大或极小)。
- 输出使能:首先检查
5.3 多相PWM不同步或相位错误
- 现象:多个子模块的PWM波形没有按照设定的相位差运行。
- 排查清单:
- 主从关系:确认只有子模块0配置为“Master”(通常
CTRL2[RELOAD_SEL]选择自身同步源),子模块1/2/3的CTRL2[INIT_SEL]必须设置为10b,选择主同步信号。 - PHASEDLY加载:确认
PHASEDLY值写入后,是否设置了MCTRL[LDOK]位使其生效。同时检查CTRL[LDMOD]位,理解是立即加载还是下一个周期加载。 - 周期值一致性:确保所有子模块的计数器模值(由
INIT和VAL1决定)是相同的,否则“相位差”的概念会错乱。 - 同步信号:可以使用示波器或逻辑分析仪抓取子模块间的同步信号,验证主模块是否确实产生了同步脉冲,以及从模块是否收到了该脉冲。
- 主从关系:确认只有子模块0配置为“Master”(通常
5.4 故障保护功能不生效
- 现象:故障引脚触发,但PWM输出没有被关闭。
- 排查清单:
- 故障映射:故障输入到具体PWM输出的关闭映射,是由
DISMAP寄存器控制的。必须确认你希望关闭的输出通道,在对应的DISMAP寄存器中已被映射到该故障输入。 - 故障滤波:故障输入也有滤波选项(在
FFILT寄存器)。如果滤波设置过强,短暂的故障脉冲可能无法通过滤波,导致保护不动作。调试初期,建议先禁用故障滤波。 - 清除模式:如果配置为手动清除(
FAUTO=0),故障发生后需要软件清��FFLAG。但在清除之前,输出应该已经被禁用。如果输出未被禁用,回到第1步检查DISMAP。 - 输出极性:故障保护动作是强制输出为“安全状态”。这个安全状态取决于
POL(极性)寄存器的设置。例如,对于高边驱动,安全状态可能是低电平(关闭)。请确认POL寄存器的设置符合你的硬件安全逻辑。
- 故障映射:故障输入到具体PWM输出的关闭映射,是由
调试利器:寄存器快照与信号测量。当遇到复杂问题时,不要盲目尝试。首先,在出问题的时刻,通过调试器将所有PWM相关寄存器的值 dump 出来,与你的预期配置进行对比。其次,一定要用示波器同时测量关键信号:PWM输出、故障输入引脚、同步信号。寄存器反映的是软件意图,示波器反映的是硬件现实,两者结合才能快速定位问题根源。