news 2026/7/1 11:30:29

低成本PWM转模拟电压方案:原理、设计与工程实践

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
低成本PWM转模拟电压方案:原理、设计与工程实践

1. 项目概述:为什么我们需要低成本模拟信号输出?

在嵌入式开发、工业控制或者电子DIY项目中,我们常常会遇到一个看似简单却有点“尴尬”的需求:需要用单片机或数字控制器输出一个平滑、可调的模拟电压。比如,你想用一块STM32去控制一个老式模拟调光LED的亮度,或者驱动一个需要0-5V电压输入的电机调速器,又或者为某个传感器提供一个可编程的基准电压。直接的想法可能是找一块带DAC(数模转换器)功能的单片机,但现实往往是,你手头的那块性价比极高的芯片(比如经典的STM32F103C8T6)或者为了成本考虑选型的MCU,它偏偏没有集成DAC。这时候,重新选型、增加外部DAC芯片(如MCP4725)都会带来额外的成本和PCB面积。

于是,一个经典且充满“工程师智慧”的方案就浮出水面了:利用PWM(脉冲宽度调制)配合一个简单的低通滤波器,来“模拟”出DAC的功能。这个方案的核心思想非常直观:PWM输出的是占空比可变的数字方波,其平均电压值与占空比成正比。如果我们能用一个滤波器把方波里的高频成分(即开关的毛刺和基波)滤除掉,只留下缓慢变化的直流分量,那么输出端就能得到一个相对平滑的模拟电压。这就像快速摇晃一个装有半杯水的水杯,肉眼看到的水面是平稳的,原理上就是高频运动被平均化了。

我最近在一个小型温控设备上就用了这个方案。主控是一颗没有DAC的GD32,需要输出一个0-3.3V的电压去控制一个加热模块的功率。外部DAC芯片要好几块钱,而用一个GPIO口加上几个电阻电容,成本可能不到一毛钱。这中间的性价比差异,就是驱动我们深入理解这个方案的最佳理由。这个方案绝不仅仅是“凑合用”,在精度和响应速度要求不极端(比如12位分辨率、百Hz级带宽)的场合,它完全能胜任,并且具有极高的灵活性和成本优势。接下来,我就把这个方案的里里外外、设计要点、实操坑点都拆解清楚。

2. 方案核心原理与设计权衡

2.1 PWM信号的直流分量本质

要理解这个方案,首先得看透PWM的本质。一个理想的PWM波,其电压值在高电平(Vdd,如3.3V)和低电平(0V)之间跳变。占空比(Duty Cycle)定义为高电平时间在一个周期内所占的比例。当我们说这个PWM的“平均电压”时,在数学上就是在一个周期内对电压值进行积分再平均。对于一个幅值为Vdd的PWM,其平均电压 Vavg = D * Vdd,其中D是占空比(0到1之间)。例如,3.3V系统,50%占空比对应的平均电压就是1.65V。

但是,这个“平均电压”是我们的目标,PWM信号本身并不是一个干净的直流电压,它包含了丰富的谐波。除了我们想要的直流分量(频率为0Hz),它还包含一个基波(频率等于PWM频率Fpwm)及其无数个倍频谐波。我们的目标就是用低通滤波器,像筛子一样,把这些高频的“杂质”滤掉,只留下我们想要的直流“细沙”。

2.2 低通滤波器的角色与选型

低通滤波器是这个方案中的关键“翻译官”,负责将数字化的PWM语言“翻译”成平滑的模拟电压。它的性能直接决定了输出信号的质量——平滑度(纹波大小)和响应速度。

一阶RC无源滤波器是最简单、最廉价的选择,只需要一个电阻和一个电容。它的传递函数决定了其衰减特性:截止频率 Fc = 1 / (2πRC)。对于频率远高于Fc的信号,其衰减速率是-20dB/十倍频程。这意味着,如果PWM频率是1kHz,滤波器截止频率设为10Hz,那么1kHz的基波成分会被衰减大约40dB(100倍),这能有效平滑电压,但响应速度会很慢。

高阶滤波器(如二阶、四阶)可以提供更陡峭的滚降特性。例如一个二阶巴特沃斯低通滤波器,在截止频率后的衰减速率是-40dB/十倍频程。这意味着它能用更高的截止频率(从而获得更快的响应速度),达到与一阶滤波器相同的对PWM基波的衰减效果。或者,在相同截止频率下,它能提供更好的高频抑制,从而得到纹波更小的输出。有源滤波器(使用运放)还可以提供增益和缓冲,避免负载影响滤波效果,但成本也相应增加。

设计时的核心权衡三角是:PWM频率、滤波器截止频率、响应速度与纹波。这是一个需要仔细平衡的三角关系:

  1. 提高PWM频率:可以让PWM基波和谐波离我们想要的直流信号更“远”,更容易被滤波器滤除。这样,我们可以适当提高滤波器的截止频率,从而获得更快的响应速度,同时保持低纹波。
  2. 降低滤波器截止频率:可以更彻底地滤除高频噪声,得到更平滑的输出,但代价是系统响应变慢。当你要改变的PWM占空比时,输出电压需要多个RC时间常数才能稳定到新值。
  3. 响应速度需求:你的应用需要多快跟上设定值的变化?对于温控这类慢过程,几百毫秒的响应可以接受;但对于电机控制或者音频生成,可能需要毫秒甚至更快的响应。

在我的温控项目中,加热器本身的热惯性很大,响应速度要求不高(秒级),但我希望电压尽量稳定以减少不必要的功率波动。因此,我选择了较高的PWM频率(20kHz,超出人耳可闻范围,也远离可能的干扰频段),搭配一个截止频率约2Hz的二阶有源低通滤波器。这样,20kHz的纹波被极大地抑制,而温度设定值变化的响应也在可接受范围内。

2.3 方案优势与局限性分析

优势:

  • 极低成本:核心元件仅为电阻、电容,可能再加一个廉价运放(如LM358)。
  • 几乎通用:任何能输出PWM的数字器件(单片机、FPGA、甚至数字逻辑电路)均可使用。
  • 分辨率高:PWM的分辨率取决于计数器的位数。一个16位定时器产生的PWM,其占空比调节分辨率可达1/65535,理论上比很多12位DAC(1/4096)还要高。
  • 灵活性强:通过软件即可改变PWM频率和占空比,适应不同滤波和响应需求。

局限性:

  • 输出阻抗与驱动能力:无源滤波器的输出阻抗较高(约等于滤波电阻R),带负载能力弱。当连接后续电路(如运放、ADC)时,负载效应会改变滤波特性,导致输出电压不准。解决方案:在滤波器后增加一个电压跟随器(运放构成)进行缓冲。
  • 纹波(Ripple):这是无法完全消除的。输出电压上总会叠加一个微小的、频率等于PWM频率的交流成分。纹波大小取决于PWM频率、滤波器阶数和截止频率。
  • 响应速度:与低通滤波器的带宽直接相关。需要快速变化的场合,此方案可能不适用。
  • 绝对精度:输出电压精度受限于MCU电源电压Vdd的精度、PWM占空比精度以及运放的失调电压等。对于高精度基准源需求,此方案不如专用DAC或基准源芯片。

3. 硬件电路设计与参数计算实战

3.1 无源一阶RC滤波器设计

这是最简单的起点。电路就是一个电阻R和电容C串联,从PWM引脚连接到电阻,电容另一端接地,从电阻和电容的连接点取输出Vout。

设计步骤:

  1. 确定PWM频率(Fpwm):根据你的MCU定时器配置能力选择。通常建议选择较高的频率,例如8kHz以上,这样更容易滤波。假设我们选择Fpwm = 10kHz
  2. 确定目标纹波电压(Vripple):这是你能接受的输出电压波动峰峰值。例如,对于3.3V系统,要求纹波小于10mV。
  3. 计算所需的衰减系数:PWM方波的基波幅值约为 (2/π)Vdd ≈ 0.636Vdd。对于3.3V系统,基波幅值约2.1V。要将其衰减到10mV以下,需要的衰减倍数 Att = 2.1V / 0.01V = 210倍,即大约46dB
  4. 计算滤波器截止频率(Fc):对于一阶滤波器,衰减公式为:Att = Fpwm / Fc (当Fpwm >> Fc时近似成立)。因此,Fc = Fpwm / Att = 10,000Hz / 210 ≈47.6Hz
  5. 选取R和C值:根据公式 Fc = 1 / (2πRC)。选取一个常见的电容值,比如C = 1μF。则 R = 1 / (2π * Fc * C) = 1 / (2 * 3.14 * 47.6 * 1e-6) ≈3.34kΩ。我们可以取一个标准值3.3kΩ

注意:这个计算是近似值,实际纹波会略大于计算值,因为公式忽略了高次谐波。实际搭建后需要用示波器观察验证。另外,输出阻抗等于R(3.3kΩ),这意味着如果后续电路输入阻抗小于33kΩ,就会产生明显的负载效应,导致输出电压下降。

3.2 有源二阶低通滤波器设计(以Sallen-Key拓扑为例)

为了获得更好的性能,我们使用运放构建一个二阶滤波器。Sallen-Key拓扑结构简单,易于设计。

设计步骤(以巴特沃斯响应为例):

  1. 确定设计参数:假设 Vdd=3.3V, Fpwm=20kHz, 目标Fc=2Hz, 采用单位增益(缓冲)结构。
  2. 查找巴特沃斯系数:对于二阶巴特沃斯滤波器,通常取 Q=0.707, 对应的元件系数有多种分配方式。一种常见简化是设 R1=R2=R, C1=C2=C。
  3. 计算RC值:对于R1=R2=R, C1=C2=C的Sallen-Key巴特沃斯滤波器,截止频率公式为 Fc = 1 / (2πRC)。因此,RC = 1 / (2πFc) = 1 / (23.142) ≈ 0.0796。
  4. 选取标准值:先选取一个合适的电容值。由于Fc很低,电容值会比较大。我们可以选C = 10μF(电解电容或钽电容,注意极性)。则 R = 0.0796 / 10e-6 =7960Ω, 取标准值7.87kΩ8.2kΩ
  5. 绘制电路图:PWM信号通过一个电阻R1连接到运放同相输入端。在同相输入端和地之间接电容C1。在运放输出端和同相输入端之间接反馈电容C2。另一个电阻R2接在R1和C1的连接点与运放同相输入端之间?这里需要更正:标准Sallen-Key单位增益拓扑是:输入通过R1连接到运放同相端,同相端通过C1接地。运放输出通过C2连接到R1和同相端的连接点。同相端还通过R2接地?不,更标准的描述是:信号经过R1,然后节点连接R2到地,同时该节点连接C1到运放输出端?为了避免混淆,建议直接使用标准设计工具或公式。 更可靠的方法是使用在线滤波器计算器(如TI的FilterPro)或根据标准公式计算。对于巴特沃斯响应,若设R1=R2=R, 则C1=2C, C2=C/2 是一种常见配置,其中C由Fc和R决定。例如,设R=10kΩ, Fc=2Hz, 则 C = 1 / (2πFcR) = 1/(23.142*10000) ≈ 7.96μF。那么C1=15.92μF, C2=3.98μF。取标称值:C1=22μF, C2=4.7μF, 并微调R。

实操心得:对于极低频率的滤波器,电容值会很大,可能不得不使用电解电容。电解电容的容值误差大、漏电流大,会影响滤波器精度和直流偏移。一个技巧是使用T型电阻网络配合较小容值的薄膜电容来模拟大电阻,或者考虑使用开关电容滤波器等更专业的方案。在我的项目中,我最终使用了两个10μF的钽电容和8.2kΩ的金属膜电阻,实测-3dB点约为1.9Hz,满足要求。

3.3 运放选型与电源去耦

运放的选择至关重要:

  • 输入输出电压范围:必须支持从0V到Vdd(或你的供电电压)的轨到轨(Rail-to-Rail)输入和输出。否则,当PWM占空比接近0%或100%时,输出无法接近0V或Vdd。推荐型号:MCP6002(双运放,低成本,轨到轨)、TLV9002等。
  • 带宽:运放的单位增益带宽至少应是滤波器截止频率的10倍以上。对于Fc=2Hz,任何通用运放都绰绰有余。
  • 失调电压(Vos):这会引入系统误差。对于精度要求高的场合,选择低失调电压的运放。

电源去耦:必须在运放的电源引脚附近(通常小于1cm)放置一个0.1μF的陶瓷电容到地,用于滤除高频噪声。对于较大电流或长导线供电,还应并联一个10μF的电解或钽电容。这是保证运放稳定工作、避免振荡的必备措施,千万不能省。

4. 软件配置与PWM生成要点

4.1 基于STM32 HAL库的PWM配置示例

假设我们使用STM32F103C8T6的TIM1的通道1(PA8)输出PWM。

// PWM初始化函数 void PWM_Init(void) { TIM_HandleTypeDef htim1; TIM_OC_InitTypeDef sConfigOC = {0}; // 1. 定时器基础配置 htim1.Instance = TIM1; htim1.Init.Prescaler = 72 - 1; // 系统时钟72MHz, 预分频后为1MHz htim1.Init.CounterMode = TIM_COUNTERMODE_UP; htim1.Init.Period = 1000 - 1; // 自动重装载值ARR, 决定PWM频率 // PWM频率 Fpwm = 72MHz / ((Prescaler+1) * (Period+1)) = 72M / (72 * 1000) = 1kHz // 这里仅为示例,实际应设置更高频率,如将Prescaler设为9-1, Period为100-1, 得到Fpwm=72M/(9*100)=80kHz htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1; htim1.Init.RepetitionCounter = 0; htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE; if (HAL_TIM_PWM_Init(&htim1) != HAL_OK) { Error_Handler(); } // 2. PWM通道配置 sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 0; // 初始占空比对应的比较值CCR, 0代表0% sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; // 高电平有效 sConfigOC.OCFastMode = TIM_OCFAST_DISABLE; sConfigOC.OCIdleState = TIM_OCIDLESTATE_RESET; if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_1) != HAL_OK) { Error_Handler(); } // 3. 启动PWM输出 HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); } // 设置占空比函数 (范围0-1000, 对应Period=1000) void Set_PWM_Duty(uint16_t duty) { if (duty > 1000) duty = 1000; // 限制范围 __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, duty); // 设置捕获比较寄存器CCR }

关键参数解析:

  • Prescaler (PSC):定时器时钟预分频系数。定时器实际时钟 = 系统时钟 / (PSC+1)。
  • Period (ARR):自动重装载值。计数器从0计数到ARR,然后归零,形成一个周期。
  • Pulse (CCR):捕获/比较值。当计数器计数到CCR值时,根据PWM模式翻转输出电平。
  • PWM频率计算公式Fpwm = F_tim_clk / ((PSC+1) * (ARR+1))。其中F_tim_clk是定时器的输入时钟频率。
  • 占空比计算公式Duty = (CCR+1) / (ARR+1)。在HAL库中,通常设置CCR值来控制占空比。

4.2 提高PWM有效分辨率与频率的策略

有时我们需要高分辨率(如16位)的同时也需要高频率,但这会冲突,因为ARR值决定了分辨率(ARR越大,分辨率越高),而频率Fpwm = F_tim_clk / ( (PSC+1)*(ARR+1) )。在时钟F_tim_clk固定的情况下,ARRFpwm成反比。

策略一:利用定时器时钟预分频:如果系统时钟很高(如STM32F1的72MHz),我们可以设置较小的PSC,从而在较高的ARR值下仍能获得较高的PWM频率。例如,目标PWM频率80kHz,16位分辨率(ARR=65535)。计算所需定时器时钟:F_tim_clk_needed = Fpwm * (ARR+1) = 80k * 65536 ≈ 5.24GHz,这显然不可能。因此,在需要高频率时,必须降低分辨率要求。例如,80kHz频率下,若F_tim_clk=72MHz,则(PSC+1)*(ARR+1) = 72M/80k = 900。我们可以设PSC=0,则ARR=899,分辨率约为1/900(略低于10位)。这通常足够用于模拟输出。

策略二:使用高级定时器互补输出与死区:对于电机控制等应用,TIM1/TIM8支持互补输出和死区插入。死区时间(Dead Time)是为了防止上下桥臂同时导通而设置的短暂关闭时间。在HAL_TIM_PWM_ConfigChannel之后,可以通过HAL_TIMEx_ConfigBreakDeadTime()函数配置死区时间。这对于驱动H桥电路至关重要,但在单纯的模拟电压生成场景中一般不需要。

策略三:动态调整PWM频率:如果应用场景对响应速度和平滑度有不同阶段的要求,可以在软件中动态改变ARRPSC寄存器来切换PWM频率。但要注意,改变这些寄存器可能会引起当前周期输出异常,最好在计数器为0时同步更新。

5. 系统测试、校准与性能优化

5.1 测试方法与仪器使用

  1. 静态精度测试

    • 工具:数字万用表(高阻抗模式)。
    • 方法:编写程序,让PWM输出固定的占空比(例如0%, 25%, 50%, 75%, 100%)。用万用表测量滤波器后的输出电压。记录实测电压与理论电压(Duty * Vdd)的偏差。这个偏差反映了系统的整体精度,包括MCU电源误差、PWM占空比误差、运放失调等。
  2. 动态响应与纹波测试

    • 工具:数字示波器。
    • 方法
      • 纹波观察:将示波器探头设置为交流耦合(AC Coupling),垂直档位调到最小(如10mV/div),时基调到适合观察PWM周期的档位(如50μs/div)。观察输出电压波形上的毛刺或正弦波,其峰峰值即为纹波电压。确保其在设计范围内。
      • 阶跃响应测试:编写程序,让PWM占空比从一个值阶跃到另一个值(如从10%跳到90%)。用示波器(直流耦合)观察输出电压的上升曲线。测量从阶跃开始到输出电压稳定在终值±5%范围内的时间,这就是系统的响应时间。它应近似等于滤波器时间常数的数倍。
  3. 负载调整率测试

    • 工具:可调电子负载或不同阻值的功率电阻。
    • 方法:在滤波器输出端接入一个可变负载。测量空载和带载(如拉电流1mA, 5mA)时的输出电压变化。变化越小,说明输出驱动能力越强(通常得益于运放缓冲)。对于无源RC滤波器,这个变化会非常明显。

5.2 软件校准与线性度补偿

即使硬件完美,由于电源电压微小的波动和运放的失调,输入占空比和输出电压之间也可能存在非线性或偏移。我们可以通过软件进行两点校准。

校准步骤:

  1. 让MCU输出Duty_min(如0),用高精度万用表测量实际输出电压Vout_min
  2. 让MCU输出Duty_max(如对应ARR的值),测量实际输出电压Vout_max
  3. 在软件中建立一个线性映射关系。假设我们期望的电压范围是V_target_minV_target_max
    • 计算实际斜率:slope = (Vout_max - Vout_min) / (Duty_max - Duty_min)
    • 计算实际偏移:offset = Vout_min
    • 那么,为了得到目标电压V_target, 需要设置的占空比Duty_set应为:Duty_set = Duty_min + (V_target - V_target_min) * (Duty_max - Duty_min) / (V_target_max - V_target_min)
    • 但这是理想情况。更通用的方法是,我们存储Vout_minVout_max的实测值。当需要输出任意电压V时,使用公式:Duty = Duty_min + (V - Vout_min) * (Duty_max - Duty_min) / (Vout_max - Vout_min)

实操心得:校准最好在系统上电稳定一段时间后进行。如果MCU的Vdd由LDO提供且非常稳定,那么主要误差来源可能是运放的失调电压。对于精度要求不高的场合,可以忽略校准。对于要求高的场合,甚至可以进行多点校准并存储一个查找表(LUT)。

5.3 降低纹波与噪声的进阶技巧

  1. 增加PWM频率:这是最有效的方法。将PWM频率提高到滤波器截止频率的100倍甚至1000倍以上,可以极大地降低基波幅值,从而在相同的滤波器阶数下获得更小的纹波。例如,使用STM32的高级定时器,在72MHz时钟下很容易产生100kHz以上的PWM。
  2. 采用高阶滤波器:如四阶巴特沃斯或贝塞尔滤波器。高阶滤波器在截止频率附近有更陡峭的滚降,能更有效地抑制PWM基波。可以使用现成的滤波器设计软件(如FilterPro, Analog Filter Wizard)来设计。
  3. 后级增加LC滤波器:在RC或有源滤波器之后,再串联一个电感L和电容C组成二阶滤波器,可以进一步滤除高频噪声。但电感体积大、成本高,且可能引入谐振问题,需谨慎设计。
  4. 优化PCB布局
    • PWM走线尽量短,远离模拟信号线和滤波器部分。
    • 滤波器部分的元件(尤其是电容)应紧靠运放引脚放置。
    • 为模拟部分(运放、滤波器)提供干净、独立的电源,并通过磁珠或0Ω电阻与数字电源隔离。
    • 大面积铺地,为模拟信号提供良好的回流路径。

6. 常见问题排查与实战案例

6.1 问题速查表

现象可能原因排查步骤与解决方案
输出电压纹波过大1. PWM频率过低。
2. 滤波器截止频率过高。
3. 滤波器阶数不够。
4. 电源噪声大。
5. 负载过重或动态变化。
1. 用示波器测量PWM引脚频率是否正确。
2. 计算或测量滤波器截止频率,确认是否远低于PWM频率(建议100倍以上)。
3. 考虑增加滤波器阶数(如一阶改二阶)。
4. 检查运放电源引脚的去耦电容(0.1μF陶瓷电容)是否紧靠引脚。
5. 测量空载和带载时的纹波,确认是否为负载引起,考虑增加运放缓冲。
输出电压无法达到Vdd或0V1. 运放不是轨到轨输出。
2. PWM占空比未设置为0%或100%。
3. 滤波器存在漏电流(如电解电容)。
4. 负载电流过大,超出运放输出能力。
1. 确认运放型号是否支持轨到轨输出(RRIO)。
2. 检查软件中CCR值是否设置为0和ARR。
3. 更换为漏电流小的电容(如薄膜电容、钽电容)。
4. 测量运放输出端电流,选择输出电流能力更强的运放。
输出电压响应太慢滤波器截止频率过低。1. 计算滤波器的时间常数(τ=RC或类似)。响应时间约为3τ-5τ。
2. 根据应用需求,权衡纹波和响应速度,适当提高截止频率。可能需要同时提高PWM频率。
输出电压有台阶或不平滑1. PWM分辨率不足,占空比变化步进太大。
2. 软件中占空比更新方式导致毛刺。
1. 增加PWM的ARR值以提高分辨率,但会降低频率,需权衡。
2. 在更新PWM占空比寄存器(CCR)时,确保在计数器为0或使用定时器的预装载功能(如HAL库中__HAL_TIM_SET_COMPARE是安全的)。
系统上电后输出电压漂移1. 运放输入失调电压随温度变化。
2. 电容(特别是电解电容)的漏电流或介质吸收效应。
3. 电源电压不稳定。
1. 选用低失调电压、低温漂的运放。
2. 避免在关键路径使用大容量电解电容,改用多个陶瓷电容并联或钽电容。
3. 为模拟部分使用线性稳压器(LDO)供电,并确保其带载能力和散热。

6.2 实战案例:基于STM32G474的高精度可调电压源

在这个案例中,我需要一个0-3V可调、分辨率优于1mV、纹波小于1mV的电压源。STM32G474具有高精度定时器,可以产生非常高分辨率的PWM。

方案设计:

  1. PWM生成:使用STM32G474的高分辨率定时器(HRTIM),其计数器时钟可达4.6GHz(通过PLL)。我配置产生一个200kHz的PWM信号。选择200kHz是为了平衡滤波难度和开关损耗(对后级MOSFET)。HRTIM可以轻松实现16位分辨率(ARR=65535),此时占空比最小步进对应电压变化约为 3V / 65536 ≈ 46μV, 远优于1mV的要求。
  2. 滤波电路:为了在200kHz下实现极低纹波,我设计了一个四阶巴特沃斯有源低通滤波器,截止频率设定为50Hz。使用FilterPro工具,选择单位增益Sallen-Key拓扑,计算得到两组RC值。运放选用双路、低噪声、轨到轨的OPA2182
  3. 缓冲与输出:滤波器后级再跟随一个由OPA2182另一路构成的电压跟随器,提供低输出阻抗(<1Ω),确保带载能力。
  4. 校准:系统内置一个16位ADC(如STM32G474内部的ADC),用于采样一个外部高精度基准电压源(如REF5025)和本方案输出的电压。上电后,MCU控制输出几个已知占空比的电压,用ADC读取实际值,通过最小二乘法拟合出占空比-电压曲线,并存储在Flash中。后续输出时,通过这个曲线进行逆运算补偿,消除运放失调和非线性。

实测结果:输出电压纹波在示波器上(AC耦合, 1mV/div)几乎为一条直线,峰峰值小于500μV。在0-3V范围内,用6位半数字万用表测量,线性度误差在±0.5mV以内。整个方案的成本远低于同等性能的16位DAC模块。

这个案例表明,通过精心设计PWM参数、采用高阶滤波和软件校准,基于PWM和滤波器的模拟输出方案完全可以达到甚至超越中低档专用DAC的性能,尤其在需要高分辨率、低成本且对绝对精度要求可通过校准解决的场合,其优势非常明显。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/1 11:26:15

Sunshine终极指南:如何打造你的跨平台游戏串流服务器

Sunshine终极指南&#xff1a;如何打造你的跨平台游戏串流服务器 【免费下载链接】Sunshine Self-hosted game stream host for Moonlight. 项目地址: https://gitcode.com/GitHub_Trending/su/Sunshine 你是否厌倦了被束缚在电脑前玩游戏&#xff1f;Sunshine游戏串流主…

作者头像 李华
网站建设 2026/7/1 11:20:35

LAN7850 EEPROM配置与无EEPROM模式实战指南

1. 项目概述&#xff1a;为什么LAN7850的EEPROM配置如此关键&#xff1f;在嵌入式网络设备开发中&#xff0c;LAN7850这颗Microchip&#xff08;原Microsemi&#xff09;的USB 2.0高速以太网控制器芯片&#xff0c;因其高集成度和相对友好的开发门槛&#xff0c;被广泛应用于各…

作者头像 李华
网站建设 2026/7/1 11:19:42

MC9S12 Flash裕度测试与D-Flash操作实战指南

1. 项目概述与Flash可靠性挑战 在嵌入式系统&#xff0c;尤其是汽车电子和工业控制领域&#xff0c;微控制器内部的Flash存储器承载着程序代码、标定数据、故障日志等核心信息。它的可靠性直接决定了整个系统的稳定性和生命周期。我们常说的“程序跑飞了”或者“数据莫名其妙变…

作者头像 李华
网站建设 2026/7/1 11:17:45

MCF5251中断控制器与软件看门狗实战解析

1. 项目概述与核心价值在嵌入式系统的开发中&#xff0c;中断机制是保障系统实时性和可靠性的基石。它就像一位时刻待命的“管家”&#xff0c;当有紧急事件&#xff08;如按键按下、数据到达、定时器溢出&#xff09;发生时&#xff0c;能立刻打断处理器当前的工作&#xff0c…

作者头像 李华
网站建设 2026/7/1 11:17:29

I2C总线协议深度解析与MCF5251实战编程指南

1. I2C总线协议&#xff1a;从理论到实践的嵌入式通信基石 在嵌入式系统开发中&#xff0c;设备间的通信如同神经系统&#xff0c;决定了整个系统的协同效率。面对GPIO点对点连线复杂、SPI总线需要较多信号线的场景&#xff0c;一种名为I2C&#xff08;Inter-Integrated Circui…

作者头像 李华