新闻详情

新闻详情

首页 / 资讯中心 / 详情

STM32无DAC芯片如何输出模拟电压?PWM+二阶RC滤波器与OrCAD仿真全解析

发布时间:2026/9/28 1:07:47来源:尧图网络
STM32无DAC芯片如何输出模拟电压?PWM+二阶RC滤波器与OrCAD仿真全解析
1. 项目背景与核心需求拆解1.1 为什么要在STM32项目里用PWM冒充DAC做过STM32项目的人大概率都遇到过这种尴尬方案里需要一个模拟电压输出但手头选的芯片偏偏没有DAC外设。比如STM32F103C8T6这颗“国民芯片”定时器管够、ADC也有唯独DAC被砍掉了。这时候摆在面前的路无非三条外挂一颗DAC芯片、换带DAC的型号、或者用PWM加滤波器把数字方波“磨”成模拟电压。外挂DAC芯片意味着多一颗物料、多几根走线、多一份BOM成本对于成本敏感的消费类项目基本不考虑。换型号听起来简单但往往牵一发动全身封装、引脚、库存、已有代码全得跟着动。相比之下PWM转DAC这条路几乎是零成本——只需要两个电阻两个电容用现成的定时器资源就能实现。这也是为什么“PWM转DAC”在嵌入式圈子里一直是个高频话题从舵机控制、LED调光到传感器基准电压生成到处都能看到它的身影。这个项目的核心目标很明确用STM32的定时器输出PWM波经过二阶RC低通滤波器得到可用的模拟电压。同时借助OrCAD完成原理图设计与仿真验证把“理论计算—仿真验证—实物测试”这条链路走通。适合正在做STM32项目、需要模拟输出但芯片没有DAC的开发者也适合想系统学习滤波器设计和OrCAD仿真的朋友。1.2 核心需求与关键指标定义在动手之前得先把需求量化否则做出来的东西没法验收。PWM转DAC本质上是一个“用时间换精度”的方案它的性能天花板由几个关键参数决定。第一个是PWM频率。频率越高后级滤波器越容易把纹波压下去但频率太高又会受限于定时器分辨率和GPIO翻转速度。第二个是PWM分辨率也就是定时器的计数位数它直接决定了输出电压的调节步进。第三个是滤波器的截止频率它必须在“滤掉PWM载波”和“保留有用信号”之间找到平衡点。第四个是输出纹波这是衡量PWM转DAC成败的核心指标纹波太大就失去了模拟输出的意义。我给自己定的指标是这样的PWM频率取100kHz分辨率用12位对应4096级滤波器截止频率设在1kHz左右最终输出纹波控制在5mV以内。这个指标对于大多数传感器基准、模拟量给定场景已经够用了。下面这张表把关键参数和取值理由列清楚方便你对照自己的项目调整。参数取值选择理由PWM载波频率100kHz远高于滤波器截止频率衰减充分PWM分辨率12位兼顾调节精度与定时器资源滤波器截止频率约1kHz保留直流与低频信号压制载波目标纹波5mV满足多数模拟给定需求供电电压3.3VSTM32标准IO电平注意PWM频率和分辨率是一对矛盾体。在72MHz定时器时钟下如果既要100kHz载波又要12位分辨率计数周期需要4096那么定时器时钟至少需要100kHz×4096≈410MHz这已经超出STM32F103的定时器能力了。所以实际工程中往往要在频率和分辨率之间做取舍后面会详细讲这个计算过程。2. 二阶RC低通滤波器设计原理与参数计算2.1 一阶不够用为什么必须上二阶很多人第一次做PWM转DAC直觉上就是“一个电阻一个电容”搞定。一阶RC低通滤波器确实简单但它对PWM载波的衰减只有-20dB/十倍频程。什么意思呢假设截止频率1kHzPWM载波100kHz两者相差100倍即两个十倍频程那么载波只被衰减40dB也就是幅度降到原来的1%。听起来好像还行但PWM方波的基波幅度接近电源电压的一半3.3V系统里就是1.65V衰减40dB后还有16.5mV的纹波这还没算高次谐波。对于要求5mV以内纹波的应用一阶滤波器明显力不从心。二阶RC低通滤波器把衰减斜率提升到-40dB/十倍频程同样两个十倍频程的差距载波被衰减80dB幅度降到原来的万分之一1.65V的基波衰减后只剩0.165mV纹波指标轻松达标。这就是为什么PWM转DAC方案里二阶RC几乎是标配。它的代价仅仅是多一个电阻一个电容性价比极高。从传递函数角度看二阶RC低通滤波器的标准形式是H(s)1/(1sRC1sRC2s²R²C1C2)两级RC级联且阻抗匹配时的简化形式。实际设计中两级之间会存在负载效应后级会“吃掉”前级的输出所以不能简单地把两个一阶滤波器相乘。这也是为什么很多人照着公式算完实测发现截止频率和理论值对不上——负载效应在作祟。2.2 截止频率与元件参数的计算过程设计二阶RC滤波器第一步是确定截止频率。截止频率的选取原则是远低于PWM载波频率同时远高于有用信号的最高频率。我的应用里有用信号是直流或缓慢变化的给定电压最高频率不超过100Hz所以截止频率取1kHz既留了10倍裕量给有用信号又和100kHz载波拉开了100倍差距。确定截止频率后用公式f_c1/(2πRC)反推RC乘积。1kHz对应RC≈159μs。这里有个工程上的小技巧两级RC的电阻电容不必完全相同但为了计算方便和元件采购简单通常取相同值。假设R1R2RC1C2C那么每级的RC都等于159μs。如果取R10kΩ则C15.9nF就近取标准值15nF或16nF。但这里有个坑两级级联后由于负载效应实际截止频率会低于单级计算值。经验上两级相同RC级联的实际截止频率大约是单级计算值的0.64倍。也就是说如果按1kHz算出来RC159μs实际截止频率可能只有640Hz左右。这个偏差对于大多数应用可以接受但如果你的有用信号频率接近截止频率就需要把这个系数考虑进去适当提高单级截止频率来补偿。下面把完整的计算过程整理成表格方便你直接套用。计算步骤公式代入值结果确定截止频率经验取值—1kHz计算RC乘积RC1/(2πf_c)f_c1kHz159μs选取电阻工程常用值—10kΩ计算电容CRC/R159μs/10kΩ15.9nF就近取标准值——15nF修正实际截止频率f_actual≈0.64×f_c—约640Hz提示电容建议选C0G或X7R材质的陶瓷电容温度稳定性好容值偏差小。电解电容虽然容值大但等效串联电阻和温度特性都不适合做精密滤波千万别用。2.3 输出阻抗与带载能力的考量二阶RC滤波器有一个容易被忽视的问题输出阻抗。从输出端看进去滤波器的等效输出阻抗大约是R2加上前级R1的并联效应量级在10kΩ左右。这意味着如果后级负载输入阻抗不够高就会形成分压导致输出电压低于预期而且负载变化时输出电压跟着变完全失去了“基准”的意义。解决办法有两个。一是在滤波器后面加一级电压跟随器用运放做缓冲把输出阻抗降到毫欧级别。二是确保后级负载输入阻抗远大于滤波器输出阻抗至少高一个数量级也就是100kΩ以上。如果后级是ADC采样大多数STM32的ADC输入阻抗在几十kΩ量级直接接滤波器会有明显误差建议加跟随器或者降低滤波电阻阻值。降低电阻阻值是个双刃剑阻值小了输出阻抗低带载能力强但同样的RC乘积下电容就要变大大电容不仅体积大、成本高而且漏电流和等效串联电感也会影响高频滤波效果。所以10kΩ配15nF是一个比较均衡的选择既不至于电容太大又能保证一定的带载能力。如果确实需要驱动较重负载老老实实加一级运放跟随器是最稳妥的方案。3. STM32定时器PWM配置实操3.1 定时器选型与时钟树规划STM32F103系列有多个定时器可用TIM1和TIM8是高级定时器TIM2到TIM5是通用定时器TIM6和TIM7是基本定时器。PWM输出需要定时器具备输出比较功能基本定时器没有这个能力所以至少要用通用定时器。我选TIM3的通道1对应PA6引脚这个组合在大多数开发板上都有引出方便测试。时钟树规划是配置定时器的第一步。STM32F103的主频通常跑72MHzAPB1总线时钟36MHz但定时器时钟有个倍频机制当APB预分频系数不为1时定时器时钟是APB时钟的2倍。所以TIM3的实际时钟是72MHz。这个细节很多人会搞错以为APB1是36MHz定时器就是36MHz结果算出来的PWM频率差一倍。有了72MHz定时器时钟接下来算预分频系数和自动重装载值。PWM频率公式是f_pwm72MHz/((PSC1)×(ARR1))。我想要100kHz载波和12位分辨率ARR14096那么(PSC1)72MHz/(100kHz×4096)0.176这明显小于1说明在72MHz时钟下无法同时满足100kHz和12位。这就是前面提到的矛盾。解决办法是降低分辨率或者降低频率。我选择把分辨率降到10位ARR1023此时(PSC1)72MHz/(100kHz×1024)0.703还是小于1。继续降把PWM频率降到50kHz10位分辨率(PSC1)72MHz/(50kHz×1024)1.406取PSC0ARR1023实际频率72MHz/1024≈70.3kHz。这个频率和10位分辨率组合是可行的。最终我定的方案是PSC0ARR1023PWM频率约70kHz分辨率10位。虽然没达到最初设想的100kHz和12位但70kHz载波配合1kHz截止频率仍有70倍差距二阶滤波器衰减足够10位分辨率对应3.3V/1024≈3.2mV步进也能满足多数应用。参数计算值实际取值定时器时钟72MHz72MHz目标PWM频率100kHz约70kHz目标分辨率12位10位预分频PSC—0重装载ARR—1023实际频率—72MHz/1024≈70.3kHz3.2 寄存器级配置与代码实现配置TIM3通道1输出PWM需要动几个关键寄存器CR1控制计数模式CCMR1配置通道为PWM模式CCER使能输出ARR和PSC设定频率CCR1设定占空比。用标准库或者HAL库当然更方便但理解寄存器级操作对排查问题很有帮助。先使能TIM3时钟和GPIOA时钟。RCC_APB1ENR的bit1是TIM3时钟使能位RCC_APB2ENR的bit2是GPIOA时钟使能位。然后配置PA6为复用推挽输出CNF位设为10复用推挽MODE位设为11输出速度50MHz。定时器配置部分ARR设为1023PSC设为0。CCMR1的OC1M位设为110PWM模式1OC1PE使能预装载。CCER的CC1E使能输出CC1P设为0高电平有效。最后CR1的CEN置1启动计数。// TIM3通道1 PWM初始化PA6输出 void PWM_Init(void) { // 使能时钟 RCC-APB1ENR | (1 1); // TIM3时钟 RCC-APB2ENR | (1 2); // GPIOA时钟 // 配置PA6为复用推挽输出 GPIOA-CRL ~(0xF 24); GPIOA-CRL | (0xB 24); // 复用推挽50MHz // 定时器基础配置 TIM3-ARR 1023; // 自动重装载值 TIM3-PSC 0; // 预分频 // 通道1 PWM模式配置 TIM3-CCMR1 ~(0x7 4); TIM3-CCMR1 | (0x6 4); // PWM模式1 TIM3-CCMR1 | (1 3); // 使能预装载 // 使能通道1输出 TIM3-CCER | (1 0); // CC1E TIM3-CCER ~(1 1); // 高电平有效 // 启动定时器 TIM3-CR1 | (1 0); // CEN } // 设置占空比duty范围0-1023 void PWM_SetDuty(uint16_t duty) { if (duty 1023) duty 1023; TIM3-CCR1 duty; }这段代码里有个细节值得说CCMR1的OC1PE位bit3是预装载使能。使能后写入CCR1的值不会立即生效而是等到下一个更新事件才生效。这样做的好处是避免在计数过程中修改CCR导致输出出现毛刺。对于PWM转DAC这种对纹波敏感的应用预装载是必须开的。3.3 占空比与输出电压的对应关系PWM转DAC的输出电压和占空比是线性关系V_outDuty/ARR×V_dd。ARR1023V_dd3.3V那么每增加1个LSB输出电压增加3.3V/1024≈3.22mV。想要输出1.65V占空比设为512即可。但实际输出电压会比理论值略低原因有两个。一是GPIO输出高电平时有内阻通常在20Ω到50Ω之间虽然相对10kΩ滤波电阻可以忽略但在精密应用中仍有影响。二是滤波电阻本身有误差电容容值也有偏差这些都会导致实际输出电压偏离理论值。所以如果对精度有要求最好在输出端加一个电位器做微调或者用ADC回采做闭环校正。我在实测中发现3.3V供电下占空比512对应的理论输出是1.650V实测约1.638V偏差12mV约0.7%。这个偏差主要来自3.3V电源本身不是精确的3.300V以及GPIO高电平有约0.1V的压降。对于大多数应用这个精度够了如果要求更高就得用外部基准或者软件校准。4. OrCAD原理图设计与仿真验证4.1 OrCAD Capture原理图绘制要点OrCAD Capture是这套流程里画原理图的工具。新建工程后先放置STM32的符号。如果库里没有现成的STM32符号可以自己建一个或者从芯片厂商官网下载符号库。建符号时注意把用到的引脚都放出来至少要有PA6、VDD、VSS、NRST这几个。PA6是PWM输出引脚VDD和VSS供电NRST复位。画原理图时PWM输出引脚PA6接到二阶RC滤波器的输入端。滤波器就是两个电阻两个电容R1一端接PA6另一端接R2R2另一端是输出C1从R1和R2的连接点接到地C2从输出端接到地。这个拓扑就是标准的二阶RC低通滤波器。OrCAD里有个容易踩的坑元件库的路径。如果工程换电脑打开库路径不对会报错找不到元件。解决办法是把库文件复制到工程目录下用相对路径引用或者干脆把用到的元件放到工程自带的库缓存里。另外OrCAD Capture的DRC功能要记得跑一遍检查有没有悬空引脚、重复网络标号之类的问题。DRC通过后再导出网表给Allegro做PCB这一步在“Tools”菜单下的“Create Netlist”里操作。注意OrCAD和Allegro的关联经常出问题表现为网表导不过去或者元件找不到。常见原因是OrCAD里元件的PCB Footprint属性没填或者填的名字和Allegro库里的封装名对不上。画原理图时就把封装名填好能省掉后面很多麻烦。4.2 用PSpice仿真验证滤波器性能OrCAD自带PSpice仿真器这是它相比其他原理图工具的一大优势。画完原理图后可以直接在OrCAD里做交流扫描和瞬态仿真不用搭实际电路就能看到滤波效果。交流扫描仿真的目的是看幅频特性。设置扫描范围从1Hz到1MHz对数坐标每十倍频程取100个点。仿真结果应该看到低频段增益为0dB随着频率升高增益下降在截止频率附近下降3dB之后以-40dB/十倍频程的斜率下降。如果看到的是-20dB/十倍频程说明两级滤波器之间的负载效应没处理好或者某一级没起作用。瞬态仿真的目的是看PWM波经过滤波后的纹波。设置PWM源为方波频率70kHz幅度3.3V占空比50%。仿真时间取几个毫秒观察输出端的电压波形。理想情况下输出应该是一条平直的直流线上面叠加很小的纹波。如果纹波很大说明截止频率设高了或者滤波器阶数不够。我在PSpice里跑出来的结果是截止频率约620Hz和理论修正值640Hz很接近70kHz处的衰减约-75dB输出纹波约2mV满足5mV的设计目标。这个仿真结果给了我很大信心后面搭实物电路时基本一次成功。仿真项目设置预期结果实测结果交流扫描1Hz-1MHz-40dB/十倍频程符合截止频率—约640Hz约620Hz瞬态仿真70kHz方波纹波5mV约2mV载波衰减70kHz-60dB约-75dB4.3 仿真与实测的偏差分析仿真结果再漂亮实物测出来对不上也是白搭。我在实物上测到的截止频率约580Hz比仿真值620Hz低了约6%。纹波实测约3mV比仿真值2mV大了50%。这个偏差在工程上完全可以接受但搞清楚偏差来源对后续优化有帮助。截止频率偏低的主要原因是电容容值偏差。我用的15nF电容标称偏差±10%实际容值可能偏大导致RC乘积变大截止频率降低。另外PCB上的寄生电容也会贡献一点虽然量级很小。纹波偏大的原因主要是PWM源不是理想方波GPIO输出有上升下降时间高次谐波比理想方波丰富滤波器的实际衰减效果打了折扣。如果想缩小仿真和实测的差距有两个办法。一是选用高精度电容比如±1%的C0G电容容值偏差小截止频率就准。二是在仿真时把PWM源设置成带上升下降时间的梯形波更接近实际GPIO输出仿真结果会更贴近实测。这两个办法我都试过效果明显尤其是换高精度电容后截止频率和仿真值只差2%左右。5. 常见问题排查与实战避坑经验5.1 PWM无输出或输出异常的排查思路PWM配置完发现引脚没波形这是新手最常遇到的问题。排查要按顺序来从时钟到引脚到寄存器逐级确认。先确认时钟使能了没有。TIM3在APB1上GPIOA在APB2上两个时钟都要开。我见过有人只开了定时器时钟忘了开GPIO时钟结果定时器在跑但引脚没反应。再确认引脚配置对不对PA6要配成复用推挽如果配成普通推挽输出定时器的PWM信号出不来。然后看CCER的CC1E位有没有置1这是通道输出使能忘了置1的话定时器在计数但引脚一直是低电平。如果波形有但频率不对检查PSC和ARR的计算。最常见的错误是把定时器时钟当成APB时钟忘了倍频。STM32F103的APB1是36MHz但定时器时钟是72MHz这个倍频关系一定要搞清楚。还有就是把ARR和PSC搞反了ARR是重装载值决定周期PSC是预分频决定计数时钟两个弄反频率会差很多。如果波形有但占空比不对检查CCR1的值和PWM模式。PWM模式1下CNT小于CCR时输出有效电平大于时输出无效电平。如果模式选成PWM模式2占空比就反了。另外CCR1的值不能大于ARR否则输出一直是有效电平或者一直是无效电平。5.2 滤波器输出纹波过大的原因与对策纹波过大是PWM转DAC最典型的问题。原因无非几个截止频率太高、滤波器阶数不够、PWM频率太低、负载太重。截止频率太高是最常见的。有人按1kHz算的RC但实际电容容值偏小截止频率跑到1.5kHz对70kHz载波的衰减就不够了。解决办法是用电容表实测容值按实测值重新算电阻或者直接换高精度电容。滤波器阶数不够也常见。一阶滤波器衰减斜率只有-20dB/十倍频程70kHz载波相对1kHz截止频率是1.7个十倍频程衰减只有34dB纹波肯定大。换成二阶后衰减68dB纹波立刻降下来。如果二阶还不够可以上三阶但三阶级联的负载效应更复杂调试难度大一般二阶够用了。PWM频率太低也会导致纹波大。如果PWM频率只有10kHz和1kHz截止频率只差一个十倍频程二阶滤波器衰减40dB纹波还是偏大。这时候要么提高PWM频率要么降低截止频率但降低截止频率会影响有用信号的响应速度需要权衡。负载太重是容易被忽视的原因。如果滤波器输出直接接了一个低阻抗负载比如LED或者小电阻输出电流大了会在滤波电阻上产生压降同时负载的波动也会耦合到输出端。解决办法是加电压跟随器隔离负载或者确保负载阻抗远大于滤波器输出阻抗。问题现象可能原因排查方法解决措施无波形时钟未使能查RCC寄存器使能TIM3和GPIOA时钟无波形引脚模式错误查GPIOx_CRL配成复用推挽频率不对时钟算错确认定时器时钟注意APB倍频占空比反PWM模式选错查CCMR1的OC1M改为PWM模式1纹波大截止频率高实测电容容值换高精度电容纹波大阶数不够看衰减斜率改二阶或三阶纹波大负载太重测输出阻抗加电压跟随器5.3 OrCAD使用中的高频踩坑记录OrCAD Capture用起来有几个高频坑我踩过好几次这里集中说一下。第一个是库路径问题。OrCAD默认的库路径在安装目录下工程换电脑或者重装系统后路径就失效了。解决办法是在工程里把用到的元件复制到工程目录下的库文件里用相对路径引用。或者用“Cache”功能OrCAD会把用到的元件缓存到工程文件里换电脑也能打开。第二个是网表导出失败。常见原因是元件的PCB Footprint属性为空或者封装名和Allegro库里的对不上。导出网表前先跑DRC把悬空引脚、重复网络标号、未连接引脚都清掉。DRC通过后再导出成功率会高很多。第三个是OrCAD和Allegro关联不上。有时候OrCAD里改了原理图Allegro里更新不过去。这通常是网表路径或者工程配置的问题。检查OrCAD的“Create Netlist”设置里输出路径对不对Allegro的“Import Netlist”里网表路径对不对。两边路径一致更新就顺畅了。第四个是导出PDF原理图。OrCAD导出PDF时如果字体显示乱码通常是字体设置问题。在“Print Setup”里把字体改成TrueType字体或者导出时选“Use TrueType Fonts”选项乱码问题就解决了。导出前记得把原理图放大到合适比例太小了看不清太大了分页太多。5.4 从仿真到实物的完整验证流程把整个流程串起来从设计到验证的步骤是这样的。第一步确定指标。PWM频率、分辨率、截止频率、目标纹波这四个参数先定下来。第二步算参数。按公式算出PSC、ARR、R、C的值注意定时器时钟的倍频和两级级联的负载效应修正。第三步画原理图。在OrCAD里画STM32加二阶RC滤波器填好封装属性跑DRC。第四步仿真验证。用PSpice跑交流扫描和瞬态仿真确认幅频特性和纹波达标。第五步搭实物。按原理图焊接电路注意电容选高精度材质电阻选1%精度。第六步写代码。配置定时器PWM输出设置占空比下载到STM32。第七步实测。用示波器看PWM波形和滤波器输出波形用万用表测直流输出电压和理论值对比。第八步优化。如果纹波或精度不达标调整RC参数或者PWM频率重新验证。这个流程走下来基本一次就能成功。我在第一次做的时候跳过了仿真直接搭实物结果纹波大了三倍回头补仿真才发现截止频率算错了。后来老老实实按流程走仿真和实测的偏差控制在10%以内省了很多调试时间。提示实测时示波器探头要选对。看PWM波形用10倍探头看滤波器输出纹波用1倍探头加交流耦合否则直流分量会把纹波淹没。测量时探头地线要尽量短否则会引入额外噪声误判纹波大小。6. 性能优化与方案扩展6.1 提高输出精度的几种手段10位分辨率对应3.2mV步进对于多数应用够了但如果需要更高精度有几个办法可以试试。第一个是提高PWM分辨率。把ARR从1023提到4095分辨率变成12位步进降到0.8mV。代价是PWM频率要降低因为72MHz时钟下ARR4095时PSC0对应的频率只有17.6kHz。17.6kHz载波配合1kHz截止频率只有17倍差距二阶滤波器衰减约-50dB纹波可能超标。解决办法是提高截止频率到2kHz或者用三阶滤波器。这是个权衡需要根据实际需求取舍。第二个是用抖动技术。在相邻两个PWM周期里交替输出两个相邻的占空比值平均下来等效于更高的分辨率。比如想要输出介于512和513之间的电压可以一个周期输出512下一个周期输出513交替进行。这样等效分辨率可以提高几位代价是输出纹波里多了低频分量需要滤波器有足够的低频衰减。第三个是闭环校正。用ADC回采输出电压和设定值比较根据偏差调整占空比。STM32的ADC精度通常有12位比PWM分辨率高闭环后输出精度可以接近ADC精度。这个方案需要占用一个ADC通道软件上要做PID或者简单的比例调节复杂度高一些但精度提升明显。6.2 从单路到多路输出的扩展一个定时器有多个通道可以同时输出多路PWM每路独立控制占空比。比如TIM3有4个通道可以输出4路PWM每路配一个二阶RC滤波器就能得到4路独立的模拟输出。这对于需要多路模拟给定的应用很有用比如三相电机控制里的三路给定或者多路LED调光。多路输出的关键是定时器通道的独立性。每个通道有自己的CCR寄存器占空比互不影响但共享同一个ARR和PSC所以PWM频率是一样的。如果不同路需要不同频率就得用不同的定时器。STM32F103有4个通用定时器最多可以输出16路PWM资源足够大多数应用。多路输出时PCB布局要注意隔离。每路滤波器的电阻电容尽量靠近对应的GPIO引脚走线短而直减少串扰。如果多路输出之间有精度要求每路的RC元件要单独筛选保证容值一致。地线要统一避免地环路引入干扰。6.3 这个方案还能用在哪些场景PWM转DAC的应用场景比想象中多。除了前面提到的传感器基准和模拟给定还有几个典型场景。音频输出是一个。用PWM加滤波器可以播放音频STM32的定时器频率足够高的话音质可以做到可接受的水平。不过音频对滤波器的要求更高截止频率要设在20kHz左右PWM频率至少200kHz以上STM32F103的定时器资源会比较紧张更适合用带DAC的型号或者专用音频芯片。LED调光是另一个。PWM调光本身不需要转DAC但如果要做模拟调光也就是改变LED电流而不是通断就需要PWM转DAC加恒流源。这种方式没有频闪适合对频闪敏感的应用。电机控制里的模拟给定也常用。变频器、伺服驱动器需要模拟电压给定转速或转矩如果控制器没有DACPWM转DAC就是最经济的方案。不过电机控制环境电磁干扰大滤波器的PCB布局要格外注意屏蔽和接地。电池模拟器也是一个有意思的应用。用PWM转DAC产生可调的模拟电压模拟电池的输出特性用于测试充电器或者电池管理系统。这种应用对精度和纹波要求高通常需要12位以上分辨率和闭环校正。7. 个人实操体会与几个小技巧这个项目我从头到尾做了三版。第一版用一阶滤波器纹波大得没法用。第二版改二阶但电容用了普通X7R容值偏差大截止频率和设计值差了20%。第三版换了C0G电容重新算了参数仿真和实测终于对上了。踩过的坑总结下来最值钱的经验就几条。电容一定要用C0G或者NP0材质温度系数和容值偏差都小。X7R虽然便宜但容值随电压和温度变化大做滤波器不靠谱。电阻用1%精度的金属膜电阻温漂小噪声低。这两个元件的钱不能省省了几毛钱调试多花几小时。PWM频率和分辨率的取舍要提前想清楚。不要一开始就追求高分辨率先算定时器时钟够不够。72MHz时钟下10位分辨率配70kHz载波是个比较均衡的点再往上提分辨率频率就掉得厉害。如果确实需要高分辨率考虑用带DAC的型号或者外挂DAC芯片别在PWM这条路上硬撑。OrCAD仿真别跳过。很多人觉得仿真麻烦直接搭电路结果调试时抓瞎。PSpice仿真几分钟就能跑完能提前发现截止频率算错、阶数不够这些问题省下的调试时间远超仿真花的时间。仿真时把PWM源设成带上升下降时间的梯形波结果更贴近实际。示波器测量纹波有讲究。用交流耦合探头用1倍档地线尽量短。如果看到纹波很大先别急着改电路换个测量方法确认一下是不是测量引入的噪声。我一开始用10倍探头加长地线测出来纹波20mV换成1倍探头短地线后只有3mV差点白改一通。最后分享一个调参小技巧。如果手头没有合适容值的电容可以用两个电容并联或串联凑出需要的值。并联容值相加串联容值倒数相加。比如需要15nF手头只有10nF和4.7nF并联得到14.7nF误差2%完全可用。这个方法在打样阶段特别实用不用为了一个电容专门下单等货。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Zeek 分析器框架内部接口解析:深入 `Analyzer::__` 系列 BIF 函数与动态协议分析机制 2026/9/28 2:41:46

Zeek 分析器框架内部接口解析:深入 `Analyzer::__` 系列 BIF 函数与动态协议分析机制

网络安全网络IDS 【免费下载链接】zeek Zeek is a powerful network analysis framework that is much different from the typical IDS you may know. 项目地址: https://gitcode.com/gh_mirrors/ze/zeek 点击查看 免费下载 导读 本文围绕 Zeek 仓库中 base/bif/…

阅读更多 →
15 分钟用 Gopeed 下载管理器跑满带宽:CLI 下载大文件、续传与服务器挂任务指南 2026/9/28 2:41:46

15 分钟用 Gopeed 下载管理器跑满带宽:CLI 下载大文件、续传与服务器挂任务指南

15 分钟用 Gopeed 下载管理器跑满带宽:CLI 下载大文件、续传与服务器挂任务指南 【免费下载链接】gopeed A fast, modern download manager for HTTP, BitTorrent, Magnet, and ed2k. Cross-platform, built with Golang and Flutter. 项目地址: https://gitcode…

阅读更多 →
Jsonnet 语言参考精读:表达式、惰性求值、对象继承与 TLA/ExtVar 外部数据注入 2026/9/28 2:41:46

Jsonnet 语言参考精读:表达式、惰性求值、对象继承与 TLA/ExtVar 外部数据注入

编程语言模板引擎CLI 【免费下载链接】jsonnet Jsonnet - The data templating language 项目地址: https://gitcode.com/gh_mirrors/js/jsonnet 点击查看 免费下载 本篇基于仓库内 doc/ref/language.html.md 语言参考文档编写,面向已经通过 入门教程 掌…

阅读更多 →
App-Store-Connect-CLI 的 Go 代码规范:格式化、错误处理、CLI 行为与测试最佳实践 2026/9/28 2:41:46

App-Store-Connect-CLI 的 Go 代码规范:格式化、错误处理、CLI 行为与测试最佳实践

【免费下载链接】App-Store-Connect-CLI Fast, scriptable CLI for the App Store Connect API. Automate TestFlight, builds, submissions, signing, analytics, screenshots, subscriptions, and more 项目地址: https://gitcode.com/gh_mirrors/ap/App-Store-Co…

阅读更多 →
Flyoobe Setup Actions 完全指南:从安装可选动作包到编写可复用的 PowerShell 动作与配方 2026/9/28 2:41:45

Flyoobe Setup Actions 完全指南:从安装可选动作包到编写可复用的 PowerShell 动作与配方

桌面应用操作系统 【免费下载链接】Flyoobe Fly through your Windows 11 setup 🐝 项目地址: https://gitcode.com/gh_mirrors/fl/Flyoobe 点击查看 免费下载 本文围绕 Flyoobe 项目中的 Setup Actions(可选动作包) 机制展开&am…

阅读更多 →
搞懂网页制作标准这5步,备案不迷糊 2026/9/28 2:41:39

搞懂网页制作标准这5步,备案不迷糊

搞懂网页制作标准这5步,备案不迷糊 别再说备案流程一头雾水了,90%的中小企业老板卡在这里,不是代码写不好,而是没搞懂 网页制作标准 背后的合规逻辑。其实,只要把技术选型、代码规范和部署细节对齐 最佳实践…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉