利用PWM与RC滤波器实现低成本DAC:原理、设计与F280013x实战
2026/7/20 11:23:56 网站建设 项目流程

1. 项目概述:从PWM到DAC的巧妙转换

在嵌入式系统开发中,数字模拟转换器(DAC)常常是稀缺资源。尤其是在像TI C2000这类专注于实时控制的微控制器上,高精度、多通道的专用DAC模块可能并不总是标配,或者数量有限。当你的项目需要生成一个可编程的模拟电压来控制电机转速、调节LED亮度,或者产生简单的音频波形时,难道只能外挂一颗DAC芯片吗?其实不然,一个隐藏在我们身边的“免费”DAC——脉宽调制(PWM)模块,正等待着被唤醒。

我手头这块F280013x LaunchPad开发板,就巧妙地预留了四路这样的“PWM DAC”通道。这并非什么黑科技,而是一种经典且实用的工程折衷方案:利用微控制器几乎都具备的PWM外设,通过软件调整其输出波形的占空比,再经过一个简单的RC低通滤波器,滤除高频的PWM方波成分,最终留下的就是与占空比成正比的直流电压。这种方法成本极低(几乎为零),不占用额外芯片,且灵活性极高。当然,它也有其局限性,比如输出阻抗、响应速度以及纹波,但这些在诸多对精度和带宽要求不苛刻的场合,完全在可接受范围内。接下来,我就结合这块LaunchPad的硬件设计,深入拆解如何将GPIO上的PWM信号,变成一路可靠的模拟电压输出,并分享在软件配置和硬件调试中的一些实战心得。

2. PWM DAC核心原理与硬件设计解析

2.1 PWM信号如何“变身”为模拟电压

要理解PWM DAC,首先得忘掉它是个“数字”信号。一个PWM波的本质是一个固定频率、但占空比可变的方波。占空比(Duty Cycle)指的是一个周期内高电平时间所占的比例。当我们用万用表直流档去测量一个PWM引脚时,表头显示的数值实际上就是这个信号的平均电压。对于一个3.3V系统,占空比为0%时平均电压是0V,50%时是1.65V,100%时是3.3V。看,一个线性的电压关系已经出现了。

但问题在于,这个“平均电压”是数学意义上的,实际引脚上的电压仍在0V和3.3V之间疯狂跳变,任何直接连接模拟电路(比如运放的同相输入端)都会引入巨大的噪声。这时,低通滤波器(Low-Pass Filter, LPF)就登场了。它的任务很明确:允许低频(我们希望留下的直流分量)通过,而极力衰减高频(PWM的开关频率及其谐波)。一个最简单的一阶无源RC滤波器就能胜任。电阻和电容构成一个分压网络,其截止频率(-3dB点)由公式f_c = 1 / (2πRC)决定。设计的关键在于,要使截止频率远低于PWM的基波频率。例如,如果你的PWM频率是100kHz,那么将滤波器的截止频率设计在1kHz以下,就能将100kHz的开关噪声衰减到非常低的水平,输出端基本上就是一个比较平滑的直流电压了。

注意:这里的“平滑”是相对的。输出端总会有残留的纹波电压,其大小与PWM频率、滤波器阶数、RC值以及负载阻抗都有关。PWM频率越高,滤波器设计越容易(可以用更小的R和C达到同样的滤波效果),输出纹波也越小,但会受限于微控制器PWM模块的最高频率。

2.2 LaunchPad上的PWM DAC硬件接口详析

翻开LAUNCHXL-F2800137的原理图,我们可以在BoosterPack插座附近找到这四路PWM DAC的硬件设计。具体引脚分配如下:

  • Site 1:
    • DAC1: GPIO0 (对应BoosterPack插座的Pin 40)
    • DAC2: GPIO1 (对应BoosterPack插座的Pin 39)
  • Site 2:
    • DAC3: GPIO12 (对应BoosterPack插座的Pin 80)
    • DAC4: GPIO13 (对应BoosterPack插座的Pin 79)

TI的硬件工程师在这里做了一个非常灵活的设计。每一路PWM DAC通道都由一个RC滤波网络构成,但在出厂默认配置下,为了保持GPIO功能的通用性(这些引脚也可能用作普通数字IO、其他外设功能),电阻位置(Rxx)焊接的是0欧姆的跳线电阻,而电容位置(Cxx)是空置的。这意味着,PWM信号从GPIO出来后,直接通过0欧姆电阻连通到了BoosterPack引脚上,没有任何滤波。

如果你想启用PWM DAC功能,就需要进行一个小小的“手术”:

  1. 移除0欧姆电阻:使用烙铁和吸锡器,将对应通道上的0欧姆电阻(例如R115对应GPIO0)取下。这一步断开了PWM信号到引脚的直接路径。
  2. 焊接滤波电阻和电容:在刚刚移除电阻的位置,焊接上你计算好的滤波电阻(典型值在1kΩ到10kΩ之间)。同时,在相邻的空电容焊盘上,焊接上滤波电容(典型值在0.1uF到1uF之间,陶瓷电容即可)。

这个设计的好处显而易见:板子出厂时功能完整,不影响其他用例;而当用户需要DAC功能时,只需更换两个贴片元件,成本极低,且参数可完全自定义。你需要根据自己所需的PWM频率、电压纹波要求、输出驱动能力来选择合适的R和C值。

2.3 RC滤波器参数计算与选型实战

理论计算是起点,但实际选型需要权衡。假设我们计划使用F280013x的ePWM模块生成一个100kHz的PWM信号,希望DAC输出的纹波电压小于10mV(峰峰值),并且希望输出阻抗不要太高(以免驱动后级电路时负载效应太明显)。

第一步:确定滤波器阶数与结构一阶RC滤波器结构简单,但衰减斜率是-20dB/十倍频程。对于100kHz的噪声,如果我们希望衰减到足够小,可能需要非常低的截止频率,这会导致响应速度很慢(建立时间长)。更常见的做法是使用二阶滤波器,例如一个简单的两节RC滤波(两个一阶级联),或者直接使用一个运放构成有源二阶滤波器(如Sallen-Key结构)。LaunchPad预留的是无源一阶的位置,但对于要求不高的场景,通过精心计算也足够用。如果要求高,可以在BoosterPack上搭建有源滤波电路。

第二步:计算RC值(以一阶为例)我们的设计目标是截止频率f_c。一个经验法则是f_c应小于PWM频率的1/50到1/100,以确保充分衰减。取f_c = 1kHz。 选择电阻R。电阻值不宜太小,否则会从GPIO吸取过大电流;也不宜太大,否则输出阻抗高,易受干扰。选取R = 2.2kΩ是一个折中的常见起点。 根据公式f_c = 1 / (2πRC),可计算电容CC = 1 / (2π * f_c * R) = 1 / (2 * 3.1416 * 1000 * 2200) ≈ 72.3 nF我们可以选择一个接近的标准值,例如100nF (0.1uF)。此时实际的截止频率约为f_c = 1 / (2π * 2200 * 100e-9) ≈ 723 Hz,满足小于1kHz的设计目标。

第三步:评估纹波与建立时间纹波电压的精确计算较复杂,涉及傅里叶分析。但可以定性理解:PWM频率越高,经过滤波器后残留的基波幅值越小。输出端的纹波近似等于PWM的幅值(3.3V)乘以一个衰减系数。对于一阶滤波器,在频率远高于f_c时,衰减倍数约为f_pwm / f_c。100kHz / 723Hz ≈ 138倍衰减,因此100kHz分量幅值从3.3V衰减到大约24mV。但这只是基波,实际纹波会比这小,因为占空比变化时,平均电压的“阶跃”需要时间,表现为输出端的上升/下降时间。 建立时间(Settling Time)是指输出从0V变化到3.3V(或反之)达到稳定值(例如误差在1%以内)所需的时间。对于一阶RC电路,建立时间大约为4.6 * τ(τ = RC,时间常数)。这里 τ = 2200 * 100e-9 = 220 µs。因此建立时间约为 1ms。这意味着你的DAC输出带宽大约在几百赫兹量级,适合控制直流电机、LED调光等慢变化信号,不适合音频等需要快速变化的场景。

元件选型建议

  • 电阻:选择0603或0805封装的厚膜贴片电阻,精度1%即可,温度系数不是关键。
  • 电容:选择X7R或X5R介质的陶瓷电容,同样0603或0805封装。切勿使用Y5V或Z5U材料的电容,它们的容值随直流偏压和温度变化极大,会导致DAC输出增益误差和非线性。0.1uF/16V X7R电容是极佳的选择。

3. 软件配置:驱动ePWM模块生成精准PWM

硬件准备就绪后,下一步就是在F280013x上配置ePWM模块,产生占空比可精确控制的PWM波。C2000的ePWM模块非常强大,这里我们聚焦于最基本的“增减计数”模式来生成对称PWM,这对于DAC应用来说纹波特性更好。

3.1 ePWM模块初始化关键步骤

假设我们使用ePWM1模块,对应引脚可能通过GPIO MUX寄存器映射到我们需要的GPIO0上。以下是基于TI的C2000Ware驱动库的配置思路:

  1. 时钟与预分频:首先使能ePWM1的时钟。然后配置时基子模块的时钟预分频器(TBCLKDIV)。系统时钟SYSCLKOUT假设为100MHz。如果我们想生成100kHz的PWM,时基计数器(TB)的时钟应为PWM频率的两倍(因为增减计数模式下一个PWM周期计数器要计数两次),即200kHz。因此预分频系数应为 100MHz / 200kHz = 500。ePWM预分频器支持/1, /2, /4, /8, /16, /32, /64, /128。500无法直接得到,我们可以先选择/4分频得到25MHz,然后通过设置周期寄存器来调整频率。

  2. 设置计数模式与周期:将时基计数器模式设置为“增减计数”(TBCTL.CTRMODE = 0)。在这种模式下,计数器从0增加到周期值(TBPRD),然后再减少回0,形成一个三角波。PWM频率Fpwm = TBCLK / (2 * TBPRD)。 如果我们使用TBCLK=25MHz(SYSCLKOUT/4),想要100kHz PWM,则TBPRD = TBCLK / (2 * Fpwm) = 25e6 / (2 * 100e3) = 125。我们将TBPRD寄存器设置为125。

  3. 配置比较器与动作限定器:这是控制占空比的核心。我们需要使用CMPA寄存器。在增减计数模式下:

    • 当计数器值小于CMPA时,我们可以设置输出A为高电平(或低电平,取决于极性)。
    • 当计数器值大于CMPA时,翻转输出A的电平。 这样,在一个周期内,输出高电平的时间比例(占空比)就是CMPA / TBPRD。例如,如果CMPA设置为62(近似125的一半),则占空比约为50%。通过软件动态改变CMPA的值,就能线性改变输出平均电压。
  4. 死区与极性:对于单纯的DAC应用,不需要死区功能(DB模块),应将其禁用。输出极性(AQCTLA寄存器)需要根据你的硬件滤波电路设计来决定。如果你希望占空比越大,输出平均电压越高,那么应该设置为:当计数值小于CMPA时输出高电平(ACTIVE_HIGH)。即配置AQCTLA.ZRO = AQ_SET(计数器等于0时置高),AQCTLA.CAU = AQ_CLEAR(计数器等于CMPA且向上计数时清零)。在增减模式下,还需要处理向下计数时等于CMPA的情况:AQCTLA.CAD = AQ_SET(计数器等于CMPA且向下计数时置高)。这样就能生成中心对齐的对称PWM波。

3.2 占空比精度与分辨率计算

DAC的分辨率直接由PWM计数器的位数和周期值决定。我们的TBPRD设置为125,这意味着CMPA可以设置为0到125之间的任意整数,共126个离散的台阶。因此,电压分辨率是3.3V / 126 ≈ 26.2mV。这个分辨率不算高,但对于很多控制应用已经足够。

如何提高分辨率?

  1. 降低PWM频率:如果保持TBCLK不变,增大TBPRD可以增加步数。例如,将PWM频率降到10kHz,TBPRD = 25e6 / (2 * 10e3) = 1250。此时分辨率约为3.3V / 1250 ≈ 2.64mV,显著提升。但代价是滤波器截止频率必须更低,响应更慢。
  2. 提高时基时钟TBCLK:在计数器位数允许的范围内,使用更高的输入时钟。例如,如果SYSCLKOUT是200MHz,不分频,TBCLK=200MHz,对于100kHz PWM,TBPRD = 200e6 / (2 * 100e3) = 1000,分辨率约为3.3mV。
  3. 使用微边沿定位(MEP)技术:这是C2000 ePWM的高级功能,可以在一个系统时钟周期内进行更精细的占空比控制,能将分辨率提升数倍。但这需要更复杂的配置,且受工艺限制。

在软件中,我们可以定义一个函数,将目标电压值(单位:伏特)转换为CMPA寄存器的值:

#define VDDA 3.3f // 模拟电压基准,通常等于电源电压3.3V #define PWM_PERIOD 125.0f // TBPRD的值,设为浮点数方便计算 uint16_t VoltageToCmpA(float voltage) { if (voltage < 0.0f) voltage = 0.0f; if (voltage > VDDA) voltage = VDDA; // 计算占空比,并转换为CMPA值。0.5f是四舍五入。 uint16_t cmpA = (uint16_t)((voltage / VDDA) * PWM_PERIOD + 0.5f); // 确保不超过周期值 if (cmpA > PWM_PERIOD) cmpA = PWM_PERIOD; return cmpA; } // 使用示例 EPWM_setCounterCompareA(EPWM1_BASE, VoltageToCmpA(1.65f)); // 输出1.65V

3.3 多通道同步与触发配置

如果你需要四路DAC输出保持同步(例如用于生成两路差分信号或特定波形),可以利用ePWM的同步链功能。将ePWM1配置为主模块,通过EPWMxSYNCI(输入同步脉冲)和EPWMxSYNCO(输出同步脉冲)信号,依次触发ePWM2, ePWM3, ePWM4。这样,所有ePWM模块的时基计数器会在同一个时钟沿启动,确保它们产生的PWM波相位对齐,这对于某些应用至关重要。

配置同步的步骤:

  1. 在主模块(如ePWM1)的TBCTL寄存器中,配置SYNCOSEL,使其在特定事件(如计数器等于零时)产生一个输出同步脉冲(EPWM1SYNCO)。
  2. 在从模块(如ePWM2)的TBCTL寄存器中,配置SYNCOSEL为接收外部同步(例如来自EPWM1SYNCO),并设置PHSEN位为使能相位加载。
  3. 设置从模块的相位寄存器(TBPHS)为0,确保与主模块对齐。
  4. 当主模块计数器归零并发出同步脉冲时,从模块会将其计数器值加载为TBPHS的值(即0),从而实现同步启动。

4. 硬件调试、测量与性能优化

4.1 电路焊接与静态检查

在动手焊接0603的电阻电容前,确保你有合适的工具:尖头烙铁、细径焊锡丝、助焊剂、镊子和放大镜。焊接步骤:

  1. 清洁焊盘:用烙铁和吸锡线清理原有0欧姆电阻的焊盘,确保平整、干净。
  2. 先焊电阻:在其中一个焊盘上点上少量锡,用镊子夹住电阻对准位置,加热焊盘使锡熔化,固定电阻一端。然后焊接另一端。
  3. 再焊电容:电容焊接方法同电阻。注意陶瓷电容没有极性,但务必确认是X7R/X5R材质。
  4. 视觉检查:用放大镜检查是否有桥接、虚焊。电阻电容应贴紧板子。
  5. 万用表检查:焊接完成后,在断电状态下,用万用表二极管档或电阻档测量:
    • 测量滤波电阻两端阻值,应接近标称值(如2.2kΩ)。
    • 测量电容两端,不应短路(数字万用表可能显示一个从低到高的充电过程,这是正常的)。
    • 测量GPIO引脚到电阻输入端(靠近芯片端)应接近导通(0欧姆电阻已移除,此处可能通过PCB走线连接,阻值很小)。
    • 测量电阻输出端(连接电容和BoosterPack引脚的那端)与地之间,不应短路。

4.2 动态测试与波形观测

上电测试是激动人心的环节。你需要一台示波器,最好是双通道的。

  1. 第一步:观测原始PWM波

    • 将示波器探头地线夹在LaunchPad的GND测试点。
    • 探头尖端直接点在GPIO引脚上(或者滤波电阻的输入端)。由于0欧姆电阻已移除,你可能需要飞线或使用细探针。
    • 运行一个简单的测试程序,让ePWM输出一个50%占空比的100kHz PWM。
    • 在示波器上应能看到一个干净的、3.3V幅值的方波。测量其频率和占空比,确认与软件设置一致。检查上升/下降沿是否陡峭,有无过冲或振铃(这可能会影响滤波效果)。
  2. 第二步:观测滤波后波形

    • 将示波器探头移到滤波电路的输出端,即电容与BoosterPack引脚相连的节点。
    • 此时你应该会看到一个带有纹波的直流电压。将示波器时基调大(如1ms/div),电压档调小(如100mV/div),并打开带宽限制(通常为20MHz)以滤除高频噪声,可以更清楚地看到纹波形状。
    • 测量其平均直流电压。在50%占空比下,它应该非常接近1.65V。使用示波器的测量功能,读取电压的“平均值”或“直流值”。
  3. 第三步:测试动态响应

    • 编写一个循环,让CMPA寄存器值从0线性增加到最大值,再减少回来,模拟一个三角波输出。
    • 用示波器观察滤波后的输出。你应该会看到一个带有阶梯的三角波。阶梯的平滑度取决于PWM分辨率和滤波器截止频率。如果滤波器截止频率太低,你会看到一个明显“圆滑”的三角波,上升和下降沿变缓。
    • 测量输出的最大电压和最小电压,以及上升/下降时间,评估DAC的线性度和建立时间。

4.3 常见问题、故障排查与优化技巧

即使按照指南操作,你也可能会遇到一些问题。下面是一个快速排查清单:

现象可能原因排查步骤与解决方案
无输出或电压为01. GPIO未正确复用为ePWM功能。
2. ePWM模块时钟未使能。
3. 滤波电阻或电容虚焊、损坏。
4. 软件未启动ePWM计数器(TBCTL[SWFSYNC]或使能时钟后未触发)。
1. 检查GPIO MUX配置寄存器,确认引脚功能已设置为ePWM。
2. 检查外设时钟控制寄存器(PCLKCRx)中对应ePWM模块的时钟使能位。
3. 断电,用万用表检查滤波网络通路是否连通。
4. 在调试器中单步运行,查看ePWM时基计数器状态寄存器(TBSTS)是否在计数。
输出电压不正确1. 占空比计算或设置错误。
2. 滤波器负载效应(后级电路输入阻抗太低)。
3. 电源电压VDDA不准确。
1. 用示波器在滤波前测量PWM占空比,验证是否与软件设定值匹配。
2. 断开后级电路,单独测量PWM DAC输出点电压。如果恢复正常,说明后级负载过重,需增加电压跟随器(运放缓冲)。
3. 直接测量MCU的3.3V电源引脚电压,确认其精度。
输出纹波过大1. PWM频率太低。
2. 滤波器截止频率过高(RC值太小)。
3. 电容类型不对(如用了Y5V)。
4. 测量引入噪声(探头接地不良)。
1. 尝试提高PWM频率(需同步调整滤波器参数)。
2. 增大电容C或电阻R的值,以降低截止频率。注意,增大R会提高输出阻抗。
3. 更换为X7R或X5R材质的陶瓷电容。
4. 使用示波器探头的弹簧接地针,而不是长长的鳄鱼夹地线,以减少接地环路噪声。
输出电压建立慢(响应迟滞)滤波器截止频率过低(RC值太大)。这是提高精度(降低纹波)的必然代价。需要在纹波和响应速度之间权衡。如果应用需要更快响应,考虑提高PWM频率,并允许稍大的纹波,或者使用更高阶的有源滤波器。
多通道输出不同步ePWM模块未配置同步链,或同步源/目标配置错误。1. 用双通道示波器同时观察两路PWM滤波前的信号,看其上升沿是否对齐。
2. 检查主从ePWM模块的TBCTL中SYNCOSEL和PHSEN配置。
3. 确保所有需要同步的ePWM模块使用相同的时基时钟(TBCLK)配置。

一些实战优化技巧:

  • 软件滤波:如果你的DAC输出用于设定一个缓慢变化的参考电压,可以在软件中采用“斜坡”变化,而不是阶跃变化。即每次只改变一个最小的CMPA步进,并等待一段时间(如几个PWM周期),这样可以避免滤波器因输入突变而产生较大的过冲或下冲。
  • 输出缓冲:一阶RC滤波器的输出阻抗等于电阻R(如2.2kΩ)。这对于高输入阻抗的电路(如运放同相端)没问题,但如果要驱动低阻抗负载,电压会被严重拉低。务必在RC滤波器后添加一个电压跟随器(Unity-Gain Buffer),使用一颗通用运放(如TLV9002,单电源3.3V供电)即可,它能提供极低的输出阻抗和较强的带负载能力。
  • 基准电压:PWM DAC的输出精度最终依赖于电源电压VDDA的稳定性。如果系统对精度要求高,可以考虑使用一颗独立的低压差线性稳压器(LDO)或电压基准芯片(如REF3033)为MCU的模拟电源引脚供电,以确保VDDA的纯净和稳定。
  • PCB布局注意:如果你是自己设计带有PWM DAC的板子,RC滤波器应尽可能靠近MCU的GPIO引脚放置,以减少引线引入的噪声和振铃。滤波电容的接地端到系统主地的回路要短而粗。

5. 进阶应用与设计扩展

掌握了基础的PWM DAC实现后,我们可以探索一些更深入的应用和优化设计。

5.1 提高精度:过采样与噪声整形

对于需要更高有效位数(ENOB)的应用,单纯提高PWM分辨率(降低频率)可能不可接受。此时可以借助过采样和噪声整形技术,这是一种在数字域进行的处理。 基本思想是:以远高于最终输出更新率的频率来更新PWM的占空比,并通过一个Σ-Δ调制器将量化噪声(由PWM有限分辨率引起)推向高频段。由于后续的模拟RC低通滤波器会衰减高频噪声,从而在感兴趣的频带内(通常是直流或低频)获得更高的信噪比和有效分辨率。 例如,你可以使用一个16位的目标值,但PWM硬件只有10位分辨率(TBPRD=1024)。通过运行一个一阶Σ-Δ调制器,在每个PWM周期(100kHz)动态调整10位的CMPA值,使其长时间的平均占空比无限逼近16位目标值所对应的比例。经过滤波后,低频段的精度可以得到显著提升。F280013x的CPU性能强大,完全可以在中断服务程序中实现简单的Σ-Δ算法。

5.2 生成复杂波形:任意波形发生器(AWG)

PWM DAC不仅可以输出直流电压,通过快速更新占空比,配合合适的滤波器,还能生成低频的任意波形,如正弦波、三角波、锯齿波。

  1. 创建波形表:在内存中预先计算好一个周期波形(如正弦波)各个点所对应的CMPA值数组。数组长度决定了输出波形的频率精度。
  2. 定时更新:使用一个高优先级的定时器中断(或ePWM本身的事件触发ADC中断),以固定的采样率更新CMPA寄存器。采样率必须远高于输出波形的频率,通常遵循奈奎斯特定律,并考虑滤波器特性,一般要求采样率是输出频率的10倍以上。
  3. 滤波器设计:此时,模拟低通滤波器的截止频率需要仔细选择。它必须高于你希望生成的目标波形最高频率分量,但同时又要远低于PWM的更新频率(即采样率),以滤除PWM开关噪声和采样带来的高频镜像分量。这通常需要一个阶数更高、滚降更陡的滤波器(如巴特沃斯有源低通滤波器)。
  4. 示例:生成1kHz正弦波。假设PWM频率为100kHz,我们以20kHz的速率(每5个PWM周期更新一次CMPA)更新占空比。那么一个周期的正弦波(1kHz)需要20个点。模拟滤波器截止频率可以设在2kHz到5kHz之间,以通过1kHz基波及其低次谐波,同时强烈衰减20kHz以上的噪声。

5.3 集成到完整系统:闭环控制中的DAC应用

在电机控制、电源转换等闭环系统中,PWM DAC可以扮演一个非常实用的角色——监控与调试。例如,在开发一个磁场定向控制(FOC)算法时,你可以将计算出的Id、Iq电流值,或者转子角度,通过PWM DAC实时输出。用示波器观察这些模拟波形,可以直观地看到算法运行状态、环路响应,比查看调试器中的变量数组要方便得多。 具体实现时,可以在控制循环的末尾,添加几行代码将关键的浮点变量缩放到0-3.3V范围,并调用VoltageToCmpA()函数更新对应的ePWM寄存器。这样,你就拥有了一个低成本、多通道的实时模拟监控接口。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询