1. 项目概述与DPWM核心价值
在数字电源和电机驱动的世界里,PWM(脉宽调制)信号就是控制功率开关管开合的“指挥棒”。传统模拟PWM控制器虽然简单,但其灵活性、精度和抗干扰能力在面对日益复杂的拓扑(如LLC、移相全桥)和严苛的动态响应要求时,常常显得力不从心。这时,像德州仪器UCD31xx系列这样的数字电源控制器就站了出来,而其灵魂之一,就是高度可编程的数字脉宽调制器模块。
DPWM,即数字脉宽调制器,它不再是几个运放和比较器搭起来的固定电路,而是一个完全由寄存器配置的“软件定义”的PWM发生器。你可以把它想象成一个极其精密的数字时钟和一套可编程的逻辑门阵列。它的核心是一个高速计数器,以及一组与之比较的“事件”寄存器。计数器在每个开关周期内从零开始累加,当计数值与“事件1”寄存器匹配时,PWM输出A置高(或置低,取决于配置);当与“事件2”寄存器匹配时,PWM输出A翻转;对于PWM输出B,则由“事件3”和“事件4”控制。通过精确设定这些事件点的值,我们就能生成任意占空比、带死区、甚至相位可调的PWM波形。
UCD31xx的DPWM模块的强大之处,远不止于此。它支持多种工作模式(Normal, Resonant, Multi-Output等),内置高分辨率时钟相位插值,可以实现皮秒级的时间精度;它集成了复杂的故障保护机制(如逐周期限流CBC)、同步机制、自适应采样触发,甚至可以通过内部互连矩阵(IntraMux)实现多个DPWM通道之间信号的灵活路由,以构建交错并联、移相全桥等复杂拓扑。这一切功能的开关、参数和逻辑,都浓缩在几十个寄存器中。因此,吃透这些寄存器,是解锁UCD31xx全部潜力、实现稳定高效数字电源设计的关键一步。本文将深入这些寄存器的每一个关键位域,结合实战配置逻辑和常见陷阱,为你绘制一份详尽的DPWM配置地图。
2. DPWM寄存器全景与核心配置逻辑拆解
UCD31xx的每个DPWM模块都有一套独立的寄存器组,地址从0x000D0000(DPWM0)开始。虽然寄存器数量不少,但我们可以按其功能划分为几个清晰的类别,理解这个分类是高效配置的前提。
2.1 核心控制寄存器组:定义DPWM的“人格”
这是DPWM的“大脑”,决定了其基本行为模式。主要包括DPWMCTRL0、DPWMCTRL1和DPWMCTRL2。DPWMCTRL0定义了最基础的模式和输出特性,例如选择PWM模式(位域PWM_MODE)、输出极性(PWM_A_INV/PWM_B_INV)、是否启用CLA(控制律加速器)计算输入(CLA_EN)以及关键的内部信号互连(PWM_A_INTRA_MUX等)。DPWMCTRL1则包含更多高级和同步功能,如计数器预置使能(PRESET_EN)、同步输出分频(SYNC_OUT_DIV_SEL)、自动模式切换使能(AUTO_MODE_SEL)以及高分辨率逻辑的开关与缩放(HIRES_DIS,HIRES_SCALE)。DPWMCTRL2聚焦于采样触发和同步细节,例如两个采样触发器的使能与模式(SAMPLE_TRIG_1_EN,SAMPLE_TRIG1_MODE)、同步输入分频比(SYNC_IN_DIV_RATIO)等。
实操心得:寄存器配置顺序在初始化DPWM时,切忌胡乱写入。一个稳健的顺序是:先配置
DPWMCTRL2和DPWMCTRL1中涉及时钟、同步、采样的“时序类”参数,再配置DPWMCTRL0中的“模式类”参数,最后再使能PWM输出(PWM_EN)。因为某些模式或互连配置依赖于特定的时钟或同步状态,如果顺序颠倒,可能会在使能瞬间产生不可预期的毛刺或错误波形。
2.2 时序与波形生成寄存器组:描绘PWM的“形状”
这组寄存器直接决定了输出波形的具体时空特征。核心包括:
DPWMPRD(周期寄存器):定义了PWM开关周期的长度,单位是主时钟PCLK的周期。这是所有时间计算的基准。DPWMEV1/EV2/EV3/EV4(事件寄存器):这是DPWM的“画笔”。EV1和EV2共同定义了PWM-A信号的上升沿和下降沿位置(或反之,取决于极性);EV3和EV4同理定义PWM-B。它们的值必须介于0和周期值之间,且需满足EV1 < EV2,EV3 < EV4的逻辑关系,硬件会进行检查,除非你使用CHECK_OVERRIDE(慎用!)。DPWMPHASETRIG(相位触发寄存器):在多输出模式(Multi-Output Mode)下,用于设置多个DPWM通道之间的相位差,实现交错并联,对于降低输入输出纹波电流至关重要。DPWMCYCADJA/B(周期调整寄存器):这是一个16位有符号数,可以对PWM-A/B的输出边沿进行微调,补偿PCB布局或驱动电路带来的微小延时,实现精确的时序对齐。
2.3 中断与状态寄存器组:建立系统“感知”
DPWM需要与CPU(或CLA)交互,报告其状态和异常。DPWMINT寄存器是中断管理的核心,它包含了各类中断(周期中断、模式切换中断)的使能位、标志位和清除位。DPWMFLTSTAT则反映了故障状态。而DPWMOVERFLOW是一个重要的只读状态寄存器,它会告诉你事件值是否设置得超出了周期范围(溢出),这是一个非常关键的调试信息。
2.4 高级功能与辅助寄存器组:实现复杂“战术”
为了应对复杂拓扑,UCD31xx DPWM提供了丰富的辅助寄存器:
DPWMAUTOSWxTHRESH(自动切换阈值寄存器):与AUTO_MODE_SEL配合,实现根据输入条件(如负载电流)在不同配置集(DPWMCTRL0,AUTOCONFIGMID,AUTOCONFIGMAX)间自动切换,常用于LLC谐振变换器在轻载和重载时切换工作模式。DPWMBLKxBEGIN/END(消隐寄存器):在信号嘈杂的时段(如开关管硬开关瞬间)创建一个“盲区”,屏蔽比较器信号,防止误触发逐周期限流保护。DPWMSAMPTRIG1/2(采样触发寄存器):精确控制模数转换器在PWM周期内的哪个时刻进行采样,对于实现平均电流模式控制、峰值电流模式控制或优化采样点以避开噪声至关重要。DPWMFLTCTRL(故障控制寄存器):配置故障响应的“耐心程度”。例如,CBC_MAX_COUNT可以设定需要连续检测到多少次逐周期故障,才触发真正的关断保护,这能有效避免噪声引起的误保护。
理解这个全景图后,我们就能像搭积木一样,根据目标拓扑和性能要求,选取合适的寄存器进行配置。
3. 核心寄存器位域深度解析与配置实战
仅仅知道寄存器列表是不够的,关键是要理解每个关键位域的“脾气”和配置时的“坑”。下面我们挑几个最核心也是最容易出问题的寄存器进行深度剖析。
3.1 DPWMCTRL0:模式与基础输出控制
DPWMCTRL0是定义DPWM基本行为的核心,其位域众多,我们聚焦几个关键点:
PWM_MODE(位 7-4):这是DPWM的“模式选择器”。默认是2(多输出模式)。在**普通模式(0)**下,PWM-A和PWM-B独立工作,是最简单的互补或独立输出。**谐振模式(1)**专为LLC等谐振变换器设计,其占空比计算和事件生成逻辑与普通模式不同。**多输出模式(2)**是默认模式,它允许更复杂的多相控制,EVENT3/4才在此模式下有效控制PWM-B。**三角模式(3)**用于产生中心对称的PWM,常用于某些特定的调制策略。模式选错,后续所有事件寄存器的配置逻辑都会失效。
CLA_EN(位 1):这是一个至关重要的位。当设置为1(默认)时,DPWM的占空比将由CLA(控制律加速器)实时计算并直接提供,DPWMEVx寄存器的值将被CLA的输出覆盖。这意味着你在初始化时写入EV1/EV2的值���能不会生效!如果你打算使用固定的、由软件直接设定的PWM波形(例如用于测试),必须先将CLA_EN位清零,然后再配置事件寄存器。
PWM_A_INTRA_MUX/PWM_B_INTRA_MUX(位 31-28, 27-24):这是UCD31xx的一个高级特性——内部信号交叉矩阵。它允许你将本通道的PWM输出信号,替换为其他通道(如n+1, n+2)的信号,或者替换为内部生成的PWM-C信号、边沿生成器输出等。这在构建移相全桥时极其有用:你可以用一个DPWM通道生成基础波形,然后通过IntraMux分配到多个桥臂,并辅以相位触发寄存器实现移相。配置此功能时,务必确认目标信号源通道已正确配置并运行。
注意事项:高分辨率与边沿生成器的互斥数据手册中明确提到:当使能边沿生成器(通过
DPWMEDGEGEN寄存器)时,必须禁用高分辨率逻辑(HIRES_DIS=1)。这是因为边沿生成器使用了与高分辨率模块相同的硬件资源。如果同时使能,会导致不可预测的行为。这是一个硬件限制,在配置复杂波形生成时必须牢记。
3.2 DPWMCTRL1:同步、保护与高级特性
DPWMCTRL1管理着同步、突发模式、GPIO功能等。
PRESET_EN(位 31)与DPWMCNTPRE:当需要多个DPWM通道严格同步且具有特定相位差时,这个功能是关键。使能PRESET_EN后,在同步信号(内部或外部)到来时,周期计数器不会清零,而是加载DPWMCNTPRE寄存器中的值。通过为不同通道设置不同的DPWMCNTPRE值,就能实现精确的相位偏移。计算相位差时,公式为:相位差(度) = (DPWMCNTPRE / DPWMPRD) * 360°。
SYNC_OUT_DIV_SEL(位 27-24):这个位域控制同步输出脉冲的频率。默认是每个开关周期都输出一个同步脉冲(0000)。在多相交错系统中,如果后级电路(如另一个控制器)只需要每N个周期同步一次以降低干扰,就可以通过此位域设置分频。例如,设置为0010表示每3个周期输出一次同步脉冲。
EVENT_UP_SEL(位 17-16):事件更新模式选择。默认是01,在周期结束时更新。这意味着你在周期中间修改EV1寄存器,新值要到下一个周期才会生效。这种“双缓冲”机制避免了在周期中间更新事件值可能导致的脉冲宽度畸变。在需要动态调整PWM且对波形连续性要求高的场合,理解并正确选择更新时机非常重要。
3.3 DPWMINT中断寄存器:精准的事件响应
中断是CPU与DPWM高效协作的桥梁。DPWMINT寄存器管理着两类主要中断:
周期中断 (PRD_INT_EN,PRD_INT_SCALE):当周期计数器归零时触发。PRD_INT_SCALE是一个分频器,允许你每N个周期才产生一次中断,以降低CPU负载。例如,在电压环计算频率低于开关频率时非常有用。这里有一个大坑:数据手册明确指出,如果DPWM被禁用(PWM_EN=0),在大多数情况下,如果中断使能,它会持续产生周期中断。这是因为计数器可能处于一个不确定状态。因此,在关闭DPWM模块前,最佳实践是先禁用其中断。
模式切换中断 (MODE_SWITCH_INT_EN):当DPWM根据AUTOSWxTHRESH阈值自动在不同配置集间切换时,此中断标志MODE_SWITCH会置位。关键点在于:这个标志位不会自动清除。你必须在中断服务程序中手动写入1到MODE_SWITCH_FLAG_CLR位来清除它,否则该中断会持续触发。
INT位(只读):这是一个总中断标志。当任何已使能的中断源标志位置位时,INT位也会置位,并向中央中断模块发出请求。当中断标志被清除后,INT位自动清零。在调试时,查看INT位可以快速判断中断是否成功触发。
3.4 事件寄存器与周期寄存器:计算与配置示例
理论最终要落到具体的数字上。假设我们的系统主时钟PCLK = 100 MHz(周期10 ns),目标开关频率fsw = 250 kHz。
计算周期值
DPWMPRD: 开关周期Tsw = 1 / 250kHz = 4 us。 每个PCLK周期是10 ns,所以一个开关周期包含的PCLK周期数为:4 us / 10 ns = 400。 因此,DPWMPRD寄存器(低分辨率部分)应设置为400。注意,DPWMPRD是一个18位寄存器(高14位可读写,低4位只读),我们写入的值是400,对应二进制,硬件会自动处理。计算事件值
DPWMEV1/2(以PWM-A占空比50%为例): 目标占空比D = 50%,则高电平时间Ton = Tsw * D = 2 us。 对应的PCLK周期数:2 us / 10 ns = 200。- 如果设置
PWM_A_INV=0(非反相),则上升沿在周期开始(0),下降沿在Ton时刻。因此:EVENT1 = 0(或一个很小的值,考虑到死区)EVENT2 = 200 - 如果设置
PWM_A_INV=1(反相),则下降沿在周期开始,上升沿在Ton时刻。因此:EVENT1 = 200EVENT2 = 0(注意逻辑顺序仍需满足EV1<EV2,此时需配合模式理解,实际中反相通常通过极性控制,事件值仍按非反相设置更直观)
- 如果设置
考虑高分辨率
HIRES_SCALE: 如果使能高分辨率(HIRES_DIS=0),假设HIRES_SCALE=00(16相位),那么时间分辨率将提高到10 ns / 16 = 625 ps。此时,DPWMEV2和DPWMEV4寄存器的低4位(Bits 3:0)就用于设置这1/16个PCLK周期的细调。例如,我们需要将下降沿再精确推迟625 ps,那么除了EVENT2的高14位设为200,其低4位可以设为1。
配置陷阱:事件值溢出检查硬件默认会检查
EVENTx的值是否小于等于DPWMPRD。如果EVENT2设置为500,而DPWMPRD只有400,硬件会认为配置错误,并可能禁止PWM输出(状态见DPWMOVERFLOW寄存器)。除非你确信自己在做什么,并且启用了CHECK_OVERRIDE,否则一定要保证事件值在周期范围内。
4. 高级功能配置:自动模式切换与消隐窗口
对于LLC、移相全桥等复杂拓扑,DPWM的两个高级功能——自动模式切换和消隐窗口——是保证系统稳定高效运行的关键。
4.1 自动模式切换配置实战
自动模式切换允许DPWM根据一个模拟输入(通常是反映负载或输入电压的滤波后信号)在三种预配置的寄存器集之间自动切换。这常用于LLC变换器,使其在轻载时进入突发模式(Burst Mode)以提升效率,在重载时工作在最优谐振点。
配置步骤:
- 配置三个寄存器集:在
DPWMCTRL0、AUTOCONFIGMID、AUTOCONFIGMAX中分别写入对应轻载、中载、重载场景的完整DPWM配置(模式、事件值、死区等)。DPWMCTRL0对应最低负载区间。 - 设置阈值与滞回:配置四个阈值寄存器:
DPWMAUTOSWIHIUPTHRESH: 从MID切换到MAX的上阈值。DPWMAUTOSWIHILOWTHRESH: 从MAX切换回MID的下阈值(滞回)。DPWMAUTOSWILOUPTHRESH: 从CTRL0切换到MID的上阈值。DPWMAUTOSWILOLOWTHRESH: 从MID切换回CTRL0的下阈值。 滞回是为了避免在阈值附近频繁切换导致系统振荡。
- 使能自动切换:将
DPWMCTRL1中的AUTO_MODE_SEL位设置为1。 - 连接滤波输入:确保目标模拟信号(如电流采样经滤波后的值)正确连接到DPWM的自动切换比较器输入(这通常涉及模拟前端AFE和滤波器的配置,超出DPWM本身,但必须连通)。
实操心得:平滑过渡的挑战数据手册警告:“使波形在模式切换边界平滑过渡可能很复杂”。这是因为不同模式下的
EVENTx值、死区时间甚至工作频率可能都不同。一个生硬的切换会导致输出波形出现跳变,引起电压电流��力。一种常见的做法是,在固件中监控接近阈值的情况,当预测即将切换时,提前通过CLA或软件缓慢地将当前配置向目标配置“渐变”,或者在切换瞬间插入一个短暂的“软启动”过程,而不是依赖硬件的瞬间切换。
4.2 消隐窗口配置实战
在开关电源中,功率管(MOSFET)在开通和关断的瞬间,由于米勒效应、二极管反向恢复等原因,会在电流采样信号上产生巨大的电压尖峰(噪声)。如果此时比较器正在工作,会误认为电流超标而触发逐周期保护(CBC),导致脉冲被错误地提前终止。
消隐窗口的作用就是在这些已知的噪声时段,暂时“屏蔽”掉CBC故障信号。UCD31xx为PWM-A和PWM-B各提供了两个可编程的消隐窗口(A和B)。
配置步骤:
- 使能消隐:在
DPWMCTRL0中,将BLANK_A_EN和/或BLANK_B_EN置1。 - 设置窗口边界:为每个使能的消隐窗口配置开始和结束时间点。
DPWMBLKABEG: 窗口A开始时间(相对于周期起点)。DPWMBLKAEND: 窗口A结束时间。DPWMBLKBBEG和DPWMBLKBEND同理。 时间单位是4 ns步长的周期计数器值。例如,如果PCLK=100MHz(10ns),那么每个步长对应2.5个PCLK周期(因为4ns步长是固定的)。假设你想在PWM上升沿后屏蔽200ns,PWM周期为4us。 计算:200 ns / 4 ns = 50个步长。 因此,可以设置DPWMBLKABEG = 0,DPWMBLKAEND = 50。
- 关联到故障源:在故障多路复用器(Fault Mux)配置中,将CBC故障源映射到使用了消隐窗口的DPWM通道和引脚上。
窗口配置技巧:消隐窗口不宜过宽,否则会降低保护响应速度。通常通过示波器观察电流采样波形,测量出噪声尖峰的持续时间,在此基础上增加10-20%的余量作为消隐窗口宽度。对于桥式拓扑(如半桥),上下管的噪声时段不同,可能需要为PWM-A和PWM-B分别配置不同的消隐窗口。
5. 常见问题排查与调试技巧实录
即使理解了所有寄存器,实际调试中依然会遇到各种问题。下面是我在多个项目中总结的一些典型问题及其排查思路。
5.1 问题一:PWM无输出或输出异常
这是最常见的问题。请按照以下清单逐项检查:
| 现象 | 可能原因 | 排查步骤与解决方法 |
|---|---|---|
| 完全无输出 | 1.PWM_EN位未使能。2. CLA_EN=1但CLA未正确运行或输出为0。3. 故障保护被触发且锁存。 | 1. 确认DPWMCTRL0[0] = 1。2. 若使用CLA,检查CLA任务是否启用并计算;或尝试先将 CLA_EN清零,直接配置EVENTx看是否有输出。3. 检查 DPWMFLTSTAT寄存器,查看是否有故障标志置位。检查故障源(如比较器)和故障清除逻辑。 |
| 输出恒定高或恒定低 | 1. 输出极性配置错误(PWM_x_INV)。2. EVENT1和EVENT2值相等或逻辑错误。3. 输出被强制为GPIO模式。 | 1. 检查DPWMCTRL0中的PWM_A_INV和PWM_B_INV位。2. 确认 EVENT1 < EVENT2且EVENT3 < EVENT4。用示波器或寄存器读取验证写入值。3. 检查 DPWMCTRL1中的GPIO_A_EN和GPIO_B_EN位,确保为0(DPWM模式)。 |
| 占空比不正确 | 1.DPWMPRD或EVENTx计算错误。2. 高分辨率配置( HIRES_SCALE)影响未考虑。3. 周期调整寄存器 DPWMCYCADJx有非零值。4. 在CLA使能时,软件仍写 EVENTx寄存器。 | 1. 重新计算时钟频率、周期和事件值。使用PCLK计数器验证实际周期。2. 检查 HIRES_DIS和HIRES_SCALE,确认最终分辨率符合预期。3. 检查 DPWMCYCADJA/B寄存器,确认是否为0或已知的调整值。4. 当 CLA_EN=1时,EVENTx值由CLA动态更新,软件写入无效。 |
| 多相之间不同步 | 1. 同步源未正确配置或连接。 2. PRESET_EN和DPWMCNTPRE配置错误。3. MSYNC_SLAVE_EN未在从通道使能。 | 1. 确认主通道的SYNC_OUT已产生,并从通道的EXT_SYNC_EN已使能且同步源选择正确。2. 检查主从通道的 PRESET_EN配置。从通道的DPWMCNTPRE值应设置为期望的相位偏移量。3. 确保需要同步的从通道 DPWMCTRL0[15] (MSYNC_SLAVE_EN)设置为1。 |
5.2 问题二:中断无法触发或频繁触发
中断不触发:
- 检查总中断使能:确认
DPWMINT寄存器中对应的中断使能位(如PRD_INT_EN)已置1。 - 检查CIM配置:DPWM模块的中断输出连接到中央中断模块(CIM),需要确认在CIM中已将该DPWM中断线映射到CPU可识别的中断号,并使能该中断。
- 检查标志位:在中断服务程序(ISR)中,首先读取
DPWMINT寄存器,查看特定的中断标志位(如PRD)是否置1。如果标志位没置1,说明中断源本身未产生。
中断频繁触发(过于频繁或无法清除):
- 周期中断分频:检查
PRD_INT_SCALE,如果设置为0,每个开关周期都会产生中断,在高频下会压垮CPU。根据控制环路需要合理设置分频。 - 标志位清除方式:对于模式切换中断
MODE_SWITCH,必须向MODE_SWITCH_FLAG_CLR位写1才能清除。对于周期中断,标志位是“strobed”信号,通常读取寄存器或进入ISR后会自动清除,但最好在ISR中读取一下DPWMINT寄存器以确保清除。 - DPWM禁用时的中断:如前所述,在禁用DPWM模块(
PWM_EN=0)前,务必先禁用其中断,否则可能引发持续的中断风暴。
5.3 问题三:故障保护功能异常
保护不动作:
- 故障源映射:确认具体的故障信号(如比较器输出、数字比较器输出)已通过故障多路复用器正确映射到目标DPWM通道的故障输入(Fault A/B/CBC)。
- 消隐窗口干扰:检查是否配置了消隐窗口(
BLANK_A/B_EN),并确认故障发生在消隐窗口之外。不合理的消隐窗口会屏蔽掉真实的故障。 - 故障计数器:检查
DPWMFLTCTRL中的x_MAX_COUNT(如CBC_MAX_COUNT)。如果设置为大于0的值,则需要连续检测到相应次数的故障后,保护才会动作。这用于抗噪声,但可能延迟保护。
误保护(过于敏感):
- 消隐窗口不足:最常见原因。用示波器同时测量PWM驱动波形和电流采样信号,确认噪声尖峰是否超出了消隐窗口的范围。适当增加消隐窗口的结束值。
- 故障计数器为0:如果
CBC_MAX_COUNT等设置为0,则一次故障检测立即触发保护,对噪声极其敏感。可以将其设置为1或2,提供一定的噪声免疫力。 - 比较器阈值或响应时间:检查产生故障信号的模拟比较器或数字比较器的阈值是否合理,其响应速度是否过快,导致开关噪声被误判。
5.4 调试技巧:利用状态寄存器与示波器
- 善用
DPWMOVERFLOW寄存器:当PWM输出异常时,首先读取此寄存器。如果PWM_A_CHECK或PWM_B_CHECK位为1,说明事件值配置有逻辑错误(如EV1 > EV2)或溢出,硬件已禁止输出。OVERFLOW位则指示具体哪个事件值超出了周期范围。 - 软件模拟与验证:在连接真实功率电路前,可以在IDE的寄存器观察窗口和内存窗口中,手动修改关键寄存器(如
EVENT1),观察写入是否成功,并计算预期的占空比变化。也可以利用控制器的GPIO功能,将内部信号(如同步信号、故障标志)引出到测试点,用逻辑分析仪观察。 - 示波器是关键:永远不要只相信代码。用示波器同时测量:
- DPWM物理输出引脚。
- 关键的内部同步信号(如果可用)。
- 电流采样信号与消隐窗口(可以通过另一个DPWM通道生成一个与消隐窗口同宽度的脉冲来辅助观测)。
- 故障信号输入引脚。 将实际波形与基于寄存器配置计算出的理论波形进行对比,是定位问题最直接的方法。例如,测量到的周期与
DPWMPRD计算值不符,很可能是PCLK时钟源配置错误。