C2000 HRPWM原理与实战:高频数字电源的皮秒级PWM精度解决方案
1. 项目概述:为什么我们需要HRPWM?
在数字电源设计的圈子里,最近几年大家讨论最多的话题,除了氮化镓(GaN)和碳化硅(SiC)这些新器件,就是如何把开关频率“怼”上去。我手头经手的几个项目,从服务器电源到车载OBC,开关频率从传统的100kHz左右,一路飙升到500kHz、750kHz,甚至开始挑战1MHz的门槛。频率上去了,好处显而易见:磁性元件的体积可以做得更小,滤波电容的容值要求也能降低,整机的功率密度自然就提上来了。但问题也随之而来,而且是个很“硬核”的问题——PWM的调节精度不够用了。
想象一下,你的系统时钟周期(TBCLK)是10ns(对应100MHz的EPWM时钟),在1MHz的开关频率下,一个PWM周期是1000ns。如果你用传统的计数器比较方式,PWM分辨率大约是1000ns / 10ns = 100个步长,也就是大概7比特(2^7=128)的水平。这意味着你调节占空比的最小步进是1%。对于追求极致效率的LLC谐振变换器或者高精度电压调整模块(VRM)来说,1%的占空比调节精度可能意味着输出电压有几毫伏到几十毫伏的纹波,或者轻载时的效率损失。这显然无法满足高性能数字电源的需求。
这时候,德州仪器(TI)C2000系列微控制器里的高精度PWM(HRPWM)模块就成了“救命稻草”。它并不是什么全新的外设,而是在原有强大的ePWM模块基础上,通过一种叫做微边沿定位(MEP)的技术,把时间控制精度从纳秒(ns)级提升到了皮秒(ps)级。简单说,它能把一个普通的计数器时钟周期再“劈”成好多份,从而实现超高精度的边沿位置控制。这篇文章,我就结合自己用C2000做多个高频电源项目的实战经验,把HRPWM从工作原理、配置步骤到那些容易踩坑的注意事项,掰开揉碎了讲清楚。无论你是刚开始接触C2000,还是已经在高频电源设计中遇到了精度瓶颈,希望这些“干货”能帮你把项目做得更稳。
2. HRPWM核心原理:微边沿定位(MEP)技术深度拆解
2.1 MEP到底是如何工作的?
官方文档会把MEP描述为“在常规PWM时钟边沿之间进行插值”。这个说法很准确,但有点抽象。我用一个更形象的比喻来解释:把传统的PWM模块想象成一个刻度尺,最小刻度是1厘米(一个TBCLK周期)。HRPWM在这把尺子的每个1厘米的间隔里,又嵌入了一把更精密的游标卡尺,这把游标卡尺的最小刻度是0.015厘米(150ps)。你要定位一个1.245厘米的位置,传统PWM只能找到1厘米(CMPA=10)或者2厘米,剩下的0.245厘米就丢掉了。而HRPWM会先用传统PWM找到1厘米的刻度(设置CMPA寄存器),然后再用内部的游标卡尺(MEP逻辑)去精细地定位那剩下的0.245厘米(通过CMPAHR寄存器设置)。
这个过程的核心是一个叫做“斜率补偿”或“MEP校准”的模块(在软件里体现为SFO库函数)。因为芯片在制造过程中,内部模拟电路的延迟会有细微差异,且受温度、电压影响,所以“游标卡尺”的刻度(MEP步长)并不是绝对精准的150ps。SFO(Scale Factor Optimizer)库的作用,就是在运行时动态地测量和校准每个HRPWM通道实际的MEP步长,并计算出一个“缩放因子”(MEP_ScaleFactor)。你在设置高精度边沿时,给出的皮秒(ps)值,芯片内部会利用这个缩放因子自动换算成需要多少个MEP步长。
计算实例(结合F28004x): 假设你的系统设计如下:
- CPU主频(SYSCLK):200MHz
- EPWM时钟(TBCLK):等于SYSCLK,即200MHz,周期 = 5 ns。
- 目标开关频率:500kHz,则三角载波周期 = 2 us。
- 在Up-Down计数模式下,周期寄存器值 TBPRD = (TBCLK频率) / (2 * 开关频率) = 200e6 / (2 * 500e3) = 200。
- 现在你需要一个10.15%的占空比。
- 首先计算目标高电平时间:10.15% * 2 us = 203 ns。
- 传统PWM部分:203 ns / 5 ns = 40.6个TBCLK周期。取整部分为40,对应CMPA = 40(贡献200 ns)。
- 剩余高精度部分:203 ns - 200 ns = 3 ns = 3000 ps。
- 假设当前MEP步长经SFO校准后为152 ps(一个典型值,非精确150ps)。
- 所需MEP步数 = 3000 ps / 152 ps ≈ 19.74,取整为20步。
- 因此,你需要设置CMPA = 40, CMPAHR = 20。
这个例子清晰地展示了HRPWM如何通过两级控制(粗调CMPA + 微调CMPAHR)来实现远超传统计数器分辨率的时间控制。
2.2 关键寄存器精讲与配置逻辑
HRPWM引入了几组新的影子寄存器,名字都带“HR”后缀。很多工程师刚开始会困惑它们和原有寄存器的关系,这里必须彻底厘清:
CMPAHR / CMPBHR:这是最常用的。至关重要的一点是:CMPAHR只影响PWMxA输出通道的边沿,CMPBHR只影响PWMxB输出通道的边沿。它们与CMPA/CMPB的值在硬件上是独立并行使用的,没有数学上的相加关系,而是时间上的叠加关系。软件上,我们计算的是最终的总时间,然后拆分成CMPA和CMPAHR两部分。
TBPHSHR, TBPRDHR, DBREDHR, DBFEDHR:这些分别用于相位、周期、死区上升沿延迟、死区下降沿延迟的高精度控制。它们的生效有严格的条件限制,后面在注意事项里会详细说。
配置逻辑:HRPWM模块位于动作限定(AQ)模块之后。这意味着,AQ模块根据CMPA/CMPB等传统寄存器产生一个“粗调”的边沿事件,然后HRPWM模块拿到这个事件,再根据CMPAHR/CMPBHR的值对其进行“微调”延时,最终输出超高精度的PWM边沿。这个架构保证了HRPWM不会干扰到AQ模块的正常比较和动作逻辑。
一个极易出错的点:通道间影响。假设你只配置了PWMxA为高精度模式(设置了CMPAHR),而PWMxB是通过死区模块从PWMxA反相而来。你的意图是PWMxA高精度,PWMxB普通精度。但结果你会发现,PWMxB的边沿也可能出现细微的偏移(通常是±1个TBCLK周期)。这是因为死区模块的输入是经过HRPWM微调后的PWMxA信号。为了解决这个问题,如果你需要两个通道都精确,即使PWMxB是由PWMxA通过死区生成,你也必须将CMPBHR设置为与CMPAHR相同的值。这样,硬件内部逻辑才能正确处理。
3. 工程实战:从零构建HRPWM驱动代码
纸上得来终觉浅,绝知此事要躬行。下面我以TI的F28004x芯片为例,手把手带你过一遍用DriverLib库配置HRPWM的流程,并指出关键代码的用意。
3.1 工程初始化与SFO校准
// Step 1: 包含必要的头文件和链接SFO库 #include “driverlib.h” #include “sfo_v8.h” // HRPWM校准库的头文件 // 在工程属性中,需要添加SFO库文件(例如:sfov8_fpu32.lib) // Step 2: 声明全局变量 uint16_t sfo_status = SFO_INCOMPLETE; int32_t mep_scale_factor = 0; // 存放SFO计算出的缩放因子 // 定义一个方便的ePWM基址数组,索引1对应EPWM1 volatile uint32_t epwm_base[] = {0, EPWM1_BASE, EPWM2_BASE}; // Step 3: 初始化系统时钟和ePWM1时钟 void InitSysCtrl(void) { // 假设配置系统时钟为200MHz,EPWM时钟(TBCLK)也为200MHz SysCtl_setClock(200000000); // 启用EPWM1模块时钟 SysCtl_enablePeripheral(SYSCTL_PERIPH_CLK_EPWM1); } // Step 4: 校准MEP缩放因子 —— 这是HRPWM能工作的前提! void HRPWM_InitScaleFactor(void) { // 调用SFO()函数进行校准。这是一个阻塞式过程,需要循环等待完成。 // SFO()函数会测量芯片内部HRPWM模块的实际特性,并更新mep_scale_factor sfo_status = SFO(); while(sfo_status == SFO_INCOMPLETE) { sfo_status = SFO(); // 需要持续调用,直到完成 // 此处可以添加超时机制,避免死循环 } if(sfo_status == SFO_ERROR) { // 错误处理:通常意味着校准失败,MEP步数超出硬件限制(>255) // 这可能由于TBCLK频率过高或要求的精度超出范围导致 HandleError(); // 用户自定义的错误处理函数 } // 校准成功后,mep_scale_factor变量中即包含了有效的缩放因子。 // 后续所有HRPWM_setCounterCompareValue等DriverLib函数内部会自动使用这个因子。 }关键解读与心得:
SFO()函数必须在HRPWM通道使能PWM输出之前调用。通常放在系统时钟初始化之后,ePWM模块详细配置之前。SFO()的执行需要一定时间(几十到上百微秒),且必须是连续、阻塞式的调用,直到返回SFO_COMPLETE。不能只调用一次就认为完成了。- 这个缩放因子是全局性的,校准一次后,应用于芯片上所有HRPWM通道。无需为每个通道单独校准。
- 如果系统时钟或温度发生剧烈变化,理论上需要重新校准。但在大多数工业电源应用中,一旦启动后环境稳定,无需重复校准。
3.2 配置ePWM模块并启用HRPWM
void InitEPwm1HRPWM(void) { // 1. 时基模块配置 EPWM_setTimeBasePeriod(EPWM1_BASE, 200); // 设置TBPRD = 200,对应500kHz开关频率(Up-Down模式) EPWM_setPhaseShift(EPWM1_BASE, 0); EPWM_setTimeBaseCounter(EPWM1_BASE, 0); EPWM_setTimeBaseCounterMode(EPWM1_BASE, EPWM_COUNTER_MODE_UP_DOWN); // 必须为Up-Down模式! EPWM_setClockPrescaler(EPWM1_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1); // TBCLK = SYSCLK // 2. 比较器模块配置 // 先设置传统的比较器值CMPA和CMPB(粗调部分) EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_A, 40); // 对应200ns EPWM_setCounterCompareValue(EPWM1_BASE, EPWM_COUNTER_COMPARE_B, 160); // 另一个比较点示例 // 3. 动作限定器(AQ)配置 - 产生基础的PWM波形 EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); // 配置B输出为互补带死区模式,这里先配置基础动作 EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); EPWM_setActionQualifierAction(EPWM1_BASE, EPWM_AQ_OUTPUT_B, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); // 4. 死区模块配置 EPWM_enableDeadBand(EPWM1_BASE); // 使能死区 EPWM_setDeadBandDelayMode(EPWM1_BASE, EPWM_DB_RED, EPWM_DB_FED); // 双边沿延迟 EPWM_setDeadBandDelayPolarity(EPWM1_BASE, EPWM_DB_POLARITY_ACTIVE_HIGH, EPWM_DB_POLARITY_ACTIVE_HIGH); EPWM_setRisingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMA); // 死区源为PWMxA EPWM_setFallingEdgeDeadBandDelayInput(EPWM1_BASE, EPWM_DB_INPUT_EPWMA); // 设置传统死区时间(粗调),假设需要20ns死区 EPWM_setDeadBandCounterClock(EPWM1_BASE, EPWM_DB_COUNTER_CLOCK_FULL_CYCLE); EPWM_setRisingEdgeDelayCount(EPWM1_BASE, 4); // 4 * 5ns = 20ns EPWM_setFallingEdgeDelayCount(EPWM1_BASE, 4); // 4 * 5ns = 20ns // 5. 启用HRPWM高精度控制 // 5.1 使能CMPAHR用于通道A的上升沿和下降沿高精度控制(BEP模式) HRPWM_setCounterCompareValue(EPWM1_BASE, HRPWM_COUNTER_COMPARE_A, 20); // 设置CMPAHR = 20 (微调部分) HRPWM_enableCounterCompareHighResolution(EPWM1_BASE, HRPWM_COUNTER_COMPARE_A); HRPWM_setCounterCompareHighResolutionMode(EPWM1_BASE, HRPWM_COUNTER_COMPARE_A, HRPWM_HIGH_RESOLUTION_MODE_BOTH_EDGES); // BEP模式 // 5.2 为使死区也高精度,并使通道B同步,也必须配置CMPBHR(即使B通道由死区生成) HRPWM_setCounterCompareValue(EPWM1_BASE, HRPWM_COUNTER_COMPARE_B, 20); // 设置与CMPAHR相同的值 HRPWM_enableCounterCompareHighResolution(EPWM1_BASE, HRPWM_COUNTER_COMPARE_B); HRPWM_setCounterCompareHighResolutionMode(EPWM1_BASE, HRPWM_COUNTER_COMPARE_B, HRPWM_HIGH_RESOLUTION_MODE_BOTH_EDGES); // 5.3 使能死区高精度控制(DBREDHR, DBFEDHR) HRPWM_enableDeadBandHighResolution(EPWM1_BASE); HRPWM_setDeadBandHighResolutionMode(EPWM1_BASE, HRPWM_DB_HIGH_RESOLUTION_MODE_BOTH_RED_FED); // 设置高精度死区微调值(如果需要的话)。例如,在20ns粗调基础上再增加1.5ns。 // 首先需要将时间转换为MEP步数,这通常由DriverLib的HRPWM_setRisingEdgeDelayHighResolution等函数内部处理。 // 假设我们通过计算得到需要额外的10个MEP步长(约1.5ns)。 HRPWM_setRisingEdgeDelayHighResolution(EPWM1_BASE, 10); HRPWM_setFallingEdgeDelayHighResolution(EPWM1_BASE, 10); }配置要点解析:
- 计数模式:要使用HRPWM的占空比和死区高精度模式,时基计数器必须配置为
Up-Down模式。这是硬件限制,单边计数模式(Up或Down)下这些高精度功能是无效的。 - 加载时刻:在Up-Down模式下,HRPWM影子寄存器(CMPAHR等)的加载时刻被限制在
CTR=ZERO和CTR=PRD时。这意味着你的高精度比较值更新,必须与这两个事件同步,否则更新可能会被延迟一个PWM周期才生效。在配置触发ADC采样的PWM事件时需要特别注意这一点。 - 通道同步:如前所述,只要使用了死区模块,并且希望两个通道的边沿都精确,就必须同时配置并启用CMPAHR和CMPBHR,即使PWMxB在逻辑上只是PWMxA的互补信号。
4. HRPWM应用中的关键注意事项与避坑指南
在实际项目中,HRPWM功能强大,但“坑”也不少。下面是我总结的几个最容易出问题的地方,每个都附上原因分析和解决方案。
4.1 死区高精度模式的“半周期”生效限制
这是一个非常隐蔽但至关重要的限制。数据手册的Note会告诉你:死区的高精度控制(通过DBREDHR和DBFEDHR寄存器)其微调部分仅在半个TBCLK计数周期内生效。
这是什么意思?假设你的TBCLK周期是10ns(100MHz)。你设置了传统死区寄存器DBRED = 5,这表示50ns的粗调死区。然后你希望通过DBREDHR增加1ns的高精度死区。理论上总死区应该是51ns。但硬件限制是,DBREDHR控制的微调部分,其最大有效范围只有半个TBCLK周期,即5ns。如果你试图通过DBREDHR添加超过5ns的延迟,超出的部分是无效的,实际增加的延迟会被截断在5ns。
为什么这么设计?我个人的理解是为了简化内部逻辑设计,确保死区生成的确定性和可靠性。将高精度死区的调整范围限制在半个粗调周期内,可以避免在死区边沿附近出现复杂的竞争条件。
实操建议:
- 在计算和设置死区时,确保你期望通过高精度寄存器(DBREDHR/DBFEDHR)添加的延迟值,小于当前TBCLK周期的一半。
- 例如,TBCLK=5ns,则高精度死区调整量应
< 2.5ns。 - 如果你的总死区需求很大,应该主要通过调整传统寄存器
DBRED/DBFED来实现(以TBCLK为步进),而将HRPWM仅用于最后的“精修”。
4.2 占空比接近0%或100%时的“无效区”
HRPWM模块在PWM周期的开始和结束处(具体是每个周期开始和结束的前后各3个TBCLK周期)存在一个“无效区”或“盲区”。在这个区域内,MEP逻辑无法正常工作。
导致的问题: 如果你试图生成一个极小的占空比(比如<1%)或极大的占空比(>99%),计算出的高精度边沿可能会落在这个无效区内。结果是HRPWM无法产生预期的精确边沿,波形可能会失真,或者直接退化为传统PWM模式。
解决方案:
- 软件规避:在控制算法中,对占空比指令(Duty)进行限幅。例如,如果TBCLK周期为5ns,开关周期为1us,则一个TBCLK占0.5%。你可以将占空比输出限制在0.5%到99.5%之间,为HRPWM留出操作空间。
- 硬件配合:对于确实需要0%或100%占空比的应用(如完全关断或直通),不要依赖HRPWM。可以使用传统的AQ模块强制输出高或低电平,或者使用PWM的强制(Force)功能。
4.3 高精度周期(TBPRDHR)与相位(TBPHSHR)控制的使用场景
这两个高精度功能用得相对较少,但有其特定用途。
- TBPRDHR:用于微调PWM的开关频率。在需要多个PWM模块严格同步且频率可微调的场合有用,例如多相交错并联LLC,需要细微调整某一路的开关周期以实现最优的电流均流。
- TBPHSHR:用于微调PWM模块之间的相位差。同样在多相并联系统中,为了实现精确的相位交错(如6相每相60度),除了传统的TBPHS进行粗调,可以用TBPHSHR进行皮秒级的相位微调,以抵消PCB布局或器件特性带来的微小延时差异。
使用注意:
- 这两个功能的生效同样有模式限制,务必查阅具体芯片的数据手册。
- 它们通常也需要在Up-Down计数模式下使用。
- 更新这些高精度寄存器时,也要注意影子寄存器的加载时刻问题。
4.4 调试与测量技巧
调试HRPWM时,常规的示波器可能无法直接分辨出150ps的细微差别。以下是一些调试心得:
- 间接验证法:不要直接测量单个边沿的绝对时间。可以编写一个测试程序,让CMPAHR的值在一个小范围内(比如0-50)线性递增,同时用高精度示波器测量PWM输出的平均电压。如果HRPWM工作正常,你应该能看到平均电压随着CMPAHR值的变化而呈现非常平滑、线性的变化。任何跳变或非线性都意味着配置有问题或MEP校准失败。
- 关注SFO状态:在系统初始化后,定期(或在温度变化大时)检查
sfo_status变量。如果它变成SFO_ERROR,说明环境变化导致MEP校准失效,需要重新初始化HRPWM或采取降级措施(如切换回传统PWM模式)。 - 利用CLB/CLA进行监控:对于C2000的高端型号,可以利用可配置逻辑块(CLB)或控制律加速器(CLA)来实时监测PWM的占空比或频率,并与HRPWM的设置值进行对比,实现芯片内的自诊断。
- 电源与噪声:HRPWM的精度极高,对电源噪声和地平面干扰非常敏感。确保MCU的模拟电源(VDDA)和数字电源(VDD)干净、稳定,PCB布局时HRPWM相关的引脚(特别是PWM输出)走线要短,且远离噪声源。
5. 常见问题排查速查表
在实际开发中,HRPWM的问题现象往往比较类似。下面这个表格整理了典型问题、可能原因和排查步骤,你可以像查字典一样快速定位。
| 问题现象 | 可能原因 | 排查步骤与解决方案 |
|---|---|---|
| PWM输出无高精度效果,波形与普通PWM无异。 | 1. SFO校准未执行或失败。 2. HRPWM模块未使能(CMPAHR等未配置)。 3. 计数模式错误(非Up-Down模式)。 | 1. 检查sfo_status变量,确保为SFO_COMPLETE。单步调试,确认SFO()函数被循环调用直至完成。2. 检查代码是否调用了 HRPWM_enableCounterCompareHighResolution等使能函数。3. 确认 EPWM_setTimeBaseCounterMode配置为EPWM_COUNTER_MODE_UP_DOWN。 |
| 互补通道(PWMxB)边沿出现意外抖动或偏移。 | 仅配置了CMPAHR,未配置CMPBHR,但使用了死区模块。 | 即使PWMxB由死区模块生成,也必须同时配置并启用CMPBHR,且其值应与CMPAHR相同。 |
| 死区时间与设定值不符,特别是高精度部分失效。 | 1. 死区高精度模式未使能。 2. 高精度死区值(DBREDHR)超过了半个TBCLK周期限制。 3. 未在Up-Down模式下使用死区高精度。 | 1. 调用HRPWM_enableDeadBandHighResolution。2. 重新计算死区值,确保高精度调整部分 < (TBCLK周期/2)。 3. 确认计数模式为Up-Down。 |
| 更新CMPAHR后,新占空比不是立即生效,而是延迟一个周期。 | 在Up-Down模式下,HRPWM影子寄存器的加载时刻被限制在CTR=ZERO/PRD。 | 检查更新CMPAHR的代码执行时刻。确保在CTR=ZERO或PRD的事件中或之后立即更新,或者使用影子寄存器立即加载模式(如果芯片支持)。也可以考虑将关键更新放在PWM周期中断(CTR=ZERO或PRD)中进行。 |
| 极低或极高占空比时波形异常。 | 占空比指令使边沿落在了HRPWM的“无效区”(周期开始/结束的前后3个TBCLK)。 | 在控制软件中对占空比指令进行限幅,避开无效区(例如,限制在2%~98%)。对于需要0%或100%的场合,使用AQ模块的强制输出功能。 |
| 系统运行一段时间后,PWM精度变差。 | 温度或电压变化导致MEP特性漂移,初始的SFO校准因子失效。 | 1. 确保MCU供电稳定,散热良好。 2. 对于环境变化剧烈的应用,可以考虑定期(例如每秒一次)或在检测到温度变化较大时,重新运行 SFO()校准流程。注意校准时需暂时停止HRPWM输出或确保处于安全状态。 |
| 编译时提示未定义的SFO函数或链接错误。 | 工程中未添加SFO库文件或头文件路径不正确。 | 1. 确认在项目属性中添加了正确的SFO库文件(如sfov8_fpu32.lib)。2. 确认 #include “sfo_v8.h”语句正确,且头文件路径已包含在工程设置中。通常库和头文件在C2000Ware的安装目录下。 |
6. 进阶应用:将HRPWM用作数模转换器(DAC)
这是一个非常巧妙的应用。由于HRPWM可以产生皮秒级精度的边沿,那么通过一个简单的RC低通滤波器,就可以将PWM波转换成高度平滑的模拟电压。其有效分辨率远高于传统PWM实现的DAC。
实现原理: 传统PWM DAC的分辨率受限于计数器位数。一个16位计数器在1MHz开关频率下,其DAC输出带宽和纹波是矛盾的。HRPWM通过提高边沿时间精度,在不降低开关频率的前提下,极大地提高了等效的PWM DAC分辨率。你可以用较高的开关频率(例如1MHz)来获得较快的动态响应和较小的滤波电容,同时通过HRPWM获得高达12位甚至更高的等效精度。
配置要点:
- 固定占空比模式:将PWM配置为高精度模式后,通过实时更新CMPAHR的值来微调占空比。由于CMPAHR可以控制到个位数的MEP步长,因此占空比的调整粒度非常细。
- 滤波器设计:RC滤波器的时间常数需要仔细计算。
τ = R * C。时间常数需要远大于PWM的开关周期(T_sw),通常选择τ > 10 * T_sw以充分滤除开关纹波。例如,1MHz开关频率下,T_sw=1us,可以选择τ=20us,若R=1kΩ,则C=20nF。 - 软件线性化:由于MEP步长并非绝对精确的150ps,且可能存在非线性,直接线性地改变CMPAHR值可能得不到线性的电压输出。因此,最好能建立一个查找表,通过实际测量标定出CMPAHR值与最终输出电压的关系,在软件中进行补偿,从而获得高精度的线性DAC输出。
这个技巧在需要生成一个可编程的精密模拟参考电压,但又不想增加外部DAC芯片的场合非常有用,比如用于芯片内部的基准校准,或者产生一个可调的偏置电压。
