资讯动态

PWM项目实战:从参数计算到代码实现的完整工程指南

发布时间:2026/10/14 18:10:34 来源:尧图企业网站定制
1. 从三个字母说起PMW到底指什么第一次看到“PMW”这个标题很多人会愣一下。三个大写字母没有上下文没有正文没有关键词连摘要都是空的。这种极简到近乎“哑谜”的标题恰恰是最考验拆解能力的——因为你必须从这三个字母出发把背后可能指向的整个知识域撑开。PMW在不同圈子里指向完全不同的东西。做嵌入式和电机控制的人第一反应是PWMPulse Width Modulation脉冲宽度调制而PMW很可能是拼写顺序的变体或特定项目内部的缩写做产品和管理的人会想到Product Manager Workflow产品经理工作流做硬件和电源设计的人会联想到Pulse Modulation Width这类参数命名而在一些项目代号体系里PMW就是某个内部模块的代号比如“Power Management Wrapper”“Predictive Maintenance Workbench”“Pixel Mapping Widget”。提示当你拿到一个只有缩写、没有正文的项目标题时不要急着猜一个方向就往下写。正确做法是先把可能的领域列出来再根据“哪个领域最可能用这个缩写作为独立项目名”来收敛。我个人的判断逻辑是这样的如果PMW是一个独立项目标题而不是某个长句的缩写那它大概率是一个工具、框架或工作台级别的命名而不是一个单纯的技术术语。技术术语通常不会单独作为项目标题出现除非这个项目本身就是围绕该术语构建的一套完整方案。所以更合理的解读是PMW是一个以PWM技术为核心或者以某种“调制/管理/工作流”为核心的项目代号。基于这个判断我把这篇博文的核心锁定在以PWM为技术底座的项目实践上同时把PMW作为一个项目代号来处理。这样既不会偏离标题又能把最有实操价值的内容讲透。如果你手上的PMW指向的是别的领域文中的方法论和拆解思路同样可以迁移——因为“从缩写反推项目全貌”这件事本身就是一套可复用的能力。这篇文章适合谁看如果你是刚接触嵌入式、电机控制、电源管理或者信号调制的开发者想搞明白一个PWM相关项目从零到跑通要经历什么如果你是有一定经验但总是在参数整定、波形质量、干扰处理上翻车的工程师如果你只是好奇“三个字母怎么能撑起一个项目”——那这篇内容都值得你花时间读完。我会从项目定位、核心原理、硬件选型、参数计算、代码实现、实测调试、常见坑七个层面把这件事讲清楚。2. 为什么一个PWM项目值得单独立项2.1 PWM不是“会调占空比”就完事了很多人对PWM的理解停留在“方波、占空比、频率”三个词上觉得这东西太基础不值得单独做一个项目。我一开始也这么想直到在一个电机调速项目里被现实教育了一顿。那个项目用的是常见的H桥驱动方案MCU输出PWM给驱动芯片驱动芯片控制电机。理论上我只需要设置频率和占空比电机就应该按预期转。但实际跑起来之后问题一个接一个低速时电机啸叫高速时驱动芯片发热严重负载突变时转速抖动明显示波器上看波形上升沿有明显的振铃。这些问题没有一个是“改个占空比”能解决的。PWM的本质是用时间换能量——通过快速开关把连续的模拟量近似成离散的脉冲序列。这个“近似”的质量取决于频率、分辨率、死区时间、驱动能力、负载特性、PCB布局等一大堆因素。任何一个环节没处理好波形就会失真系统就会出问题。所以一个严肃的PWM项目核心不是“输出一个方波”而是输出一个在特定负载下仍然保持预期特性的方波。这就是为什么它值得单独立项因为把PWM做“对”和把PWM做“能用”中间隔着一整套工程方法。2.2 项目边界从“能跑”到“跑得稳”的差距我给PMW这个项目划定的边界是这样的输入目标负载的电气特性电压、电流、电感、电阻、控制精度要求、响应速度要求、环境温度范围。输出一路或多路PWM信号在全部工作条件下满足波形质量、时序精度和电磁兼容要求。约束成本、PCB面积、MCU资源、开发周期。这个边界看起来简单但每一条展开都是一堆决策。比如“控制精度要求”直接决定了PWM分辨率——8位分辨率是256级10位是1024级12位是4096级。分辨率越高同样频率下需要的时钟越高对MCU的主频和定时器资源要求就越高。而“响应速度要求”又决定了PWM频率的下限——频率太低负载电流纹波大响应慢频率太高开关损耗大驱动芯片扛不住。注意很多新手会先选MCU再想PWM怎么配。正确的顺序是反过来的——先根据负载算出需要的频率范围和分辨率再倒推MCU的定时器资源和主频是否够用。顺序错了后面全是将就。我见过太多项目因为一开始没算这笔账做到一半发现MCU的定时器精度不够只能降频或者降分辨率最后性能不达标返工重来。PMW这个项目如果只允许我强调一件事那就是先把负载需求和PWM参数之间的数学关系算清楚再动手选型。2.3 一个真实的反面案例某团队做一个LED调光项目用的是常见的恒流驱动方案。他们选了一款便宜的MCUPWM分辨率只有8位频率设在1kHz。理论上1kHz在人耳可听范围之外不会啸叫。但实际装到灯具里之后电源部分发出了明显的“滋滋”声。排查过程很折腾先换驱动芯片没用再换电感声音小了一点但没消失最后用示波器看PWM波形发现上升沿有严重的过冲和振铃频率成分里包含了大量高频谐波这些谐波落到了电源电感的机械谐振频率上导致电感线圈振动发声。解决方案不是换MCU而是在PWM输出和驱动芯片之间加了一级RC缓冲电路把上升沿的斜率压下来振铃就消失了。同时把PWM频率从1kHz提到2kHz进一步避开电感的谐振点。这个案例说明什么PWM项目的坑往往不在PWM本身而在PWM和周边电路的相互作用上。你输出的不是一个理想的方波而是一个带着寄生参数、受PCB布局影响的真实信号。做PMW项目必须把“信号完整性”和“电磁兼容”纳入核心考量而不是等出了问题再补救。3. 核心参数的计算逻辑频率、分辨率与死区3.1 频率怎么定从负载特性倒推PWM频率的选择本质上是在纹波和开关损耗之间找平衡。对于电机负载频率太低会导致电流纹波大转矩脉动明显低速时尤其严重。经验公式是PWM频率至少是电机电气时间常数的5到10倍。电气时间常数 τ L/R其中L是绕组电感R是绕组电阻。比如一个电机的L1mHR1Ωτ1ms对应截止频率约160Hz。那么PWM频率至少要在800Hz到1.6kHz以上。实际工程中有刷电机常用1kHz到20kHz无刷电机常用20kHz到50kHz。对于LED负载频率太低会被人眼察觉闪烁。人眼的临界闪烁频率大约在60Hz到100Hz之间但为了保险LED调光PWM频率通常设在200Hz以上。如果要避免音频噪声最好设在20kHz以上或者设在1kHz以下但做好机械阻尼。对于电源转换Buck/Boost频率直接决定电感值和输出纹波。频率越高电感可以越小但开关损耗越大。常见范围是100kHz到2MHz。负载类型典型频率范围主要约束常见取值有刷直流电机1kHz - 20kHz转矩脉动、啸叫8kHz无刷直流电机20kHz - 50kHz驱动损耗、死区20kHzLED调光200Hz - 20kHz闪烁、音频噪声1kHz或25kHzBuck电源100kHz - 2MHz电感尺寸、开关损耗500kHz加热丝控制0.1Hz - 10Hz热惯性1Hz这张表是起点不是终点。实际取值还要看具体器件的规格书和实测结果。3.2 分辨率与频率的取舍定时器时钟的硬约束PWM分辨率由定时器的计数位数决定。一个N位的PWM有2^N个占空比档位。分辨率越高控制越精细但同样频率下需要的定时器时钟越高。关系式是PWM频率 定时器时钟 / (2^N × 分频系数)。举个例子如果MCU主频是72MHz定时器时钟也是72MHz想要16位分辨率65536级那么最高PWM频率 72MHz / 65536 ≈ 1.1kHz。这个频率对电机来说太低了。如果降到8位分辨率256级最高频率 72MHz / 256 ≈ 281kHz就宽裕多了。所以这里有一个硬性取舍高分辨率和高频率不可兼得受限于定时器时钟。解决思路有三种提高定时器时钟选主频更高的MCU或者用专门的PWM外设。降低分辨率要求如果控制精度不需要那么高8位或10位就够了。用硬件PWM软件抖动在低位做抖动处理等效提高分辨率但会增加CPU负担。提示很多MCU的定时器支持“中心对齐”模式这种模式下PWM频率是边沿对齐模式的一半但波形对称性更好谐波分布更优适合电机和电源应用。选型时要确认定时器是否支持。3.3 死区时间H桥驱动的保命参数如果你做的是H桥或半桥驱动死区时间是必须算的。死区时间是为了防止上下管同时导通造成直通短路。时间太短直通风险高时间太长输出波形失真效率下降。死区时间的下限由开关管的关断时间决定。比如MOSFET的关断时间包括栅极放电时间和电流下降时间通常在几十纳秒到几百纳秒。死区时间至少要大于这个值再留20%到50%的裕量。死区时间的上限由输出波形质量决定。死区时间占PWM周期的比例越大有效占空比范围越小线性度越差。一般建议死区时间不超过PWM周期的2%到5%。计算示例PWM频率20kHz周期50μs。如果死区时间设为1μs占比2%可以接受。如果MOSFET关断时间是200ns1μs有5倍裕量安全。参数符号典型值决定因素PWM频率f_pwm20kHz负载特性、损耗周期T50μs1/f_pwm死区时间t_dead1μs开关管关断时间×裕量死区占比t_dead/T2%波形线性度最大占空比D_max98%1 - t_dead/T死区时间通常由硬件自动插入MCU的高级定时器一般都有这个功能。配置的时候要注意死区时间寄存器通常以定时器时钟周期为单位算的时候要换算。4. 硬件选型与电路设计别让驱动拖后腿4.1 MCU选型定时器资源比主频更重要选MCU做PWM项目第一眼看什么很多人看主频、看Flash、看RAM。但做PWM项目第一眼应该看定时器。你需要确认几件事有几个独立的高级定时器高级定时器支持死区插入、互补输出、刹车输入是做电机和电源控制的刚需。定时器时钟源是什么是否支持倍频最高时钟是多少是否支持中心对齐模式是否支持预装载是否有DMA支持多路PWM更新时DMA可以减轻CPU负担。我个人的经验是如果项目涉及H桥驱动优先选带高级定时器的MCU哪怕主频低一点、价格贵一点。因为用通用定时器加软件模拟死区不仅占用CPU而且时序精度差容易出问题。注意有些MCU的“高级定时器”和“通用定时器”在引脚上是复用的配置的时候要确认引脚映射是否正确。我踩过一次坑定时器配置对了但引脚没重映射波形出不来查了半天才发现是GPIO复用功能没开。4.2 驱动芯片电流能力和开关速度是关键MCU的IO口输出电流通常只有几毫安到几十毫安驱动不了MOSFET的栅极更驱动不了电机。所以中间必须加驱动芯片。驱动芯片选型看三个参数峰值输出电流要大于MOSFET栅极电荷除以期望的开关时间。比如栅极电荷Qg50nC期望开关时间100ns那么峰值电流至少500mA。开关速度上升沿和下降沿时间要匹配PWM频率。如果驱动芯片太慢波形会变成梯形开关损耗剧增。死区时间控制有些驱动芯片内置死区时间有些需要MCU配置。内置的更方便但灵活性差。常见的驱动方案有半桥驱动如IR2104、EG2133适合H桥的一臂。全桥驱动如DRV8833、L298N集成两路半桥适合小功率电机。隔离驱动如光耦隔离、磁隔离适合高压或需要电气隔离的场景。驱动类型典型型号峰值电流适用场景半桥驱动IR2104200mAH桥一臂、小功率全桥驱动DRV88331.5A小功率直流电机全桥驱动L298N2A中等功率电机隔离驱动光耦驱动取决于光耦高压隔离4.3 PCB布局PWM项目的隐形杀手PCB布局对PWM波形质量的影响怎么强调都不为过。我见过太多项目原理图完全正确元器件都是好的但波形就是不对最后发现是布局问题。几个关键原则驱动回路面积最小化驱动芯片到MOSFET栅极的走线要短而粗回路面积越小寄生电感越小振铃越少。功率地和信号地分开大电流的功率地和小信号的信号地要分开走最后单点连接。混在一起会导致地弹PWM波形上会出现毛刺。去耦电容紧贴芯片驱动芯片的电源引脚旁边要放0.1μF和10μF的电容距离越近越好。PWM走线远离模拟信号PWM是强干扰源走线要远离ADC采样线、传感器信号线必要时加地线屏蔽。提示如果PCB已经做好了发现波形有振铃可以尝试在栅极串联一个小电阻通常5Ω到22Ω能有效抑制振铃。代价是开关速度变慢开关损耗增加需要权衡。5. 代码实现从寄存器配置到闭环控制5.1 定时器初始化以STM32高级定时器为例下面这段代码是基于常见MCU的高级定时器配置目标是输出一路20kHz、中心对齐、带死区的PWM。不同MCU的寄存器名称不同但逻辑是相通的。// 假设定时器时钟为72MHz目标PWM频率20kHz中心对齐 // 中心对齐模式下频率 时钟 / (2 * ARR * 分频) // 取分频1则 ARR 72MHz / (2 * 20kHz) 1800 void PWM_Init(void) { // 1. 使能定时器时钟和GPIO时钟 RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 2. 配置GPIO为复用推挽输出 GPIO_InitTypeDef GPIO_InitStructure; GPIO_InitStructure.GPIO_Pin GPIO_Pin_8 | GPIO_Pin_9; GPIO_InitStructure.GPIO_Mode GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed GPIO_Speed_50MHz; GPIO_Init(GPIOA, GPIO_InitStructure); // 3. 定时器基础配置 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Prescaler 0; // 分频系数1 TIM_TimeBaseStructure.TIM_CounterMode TIM_CounterMode_CenterAligned1; TIM_TimeBaseStructure.TIM_Period 1800 - 1; // ARR值 TIM_TimeBaseStructure.TIM_ClockDivision TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_RepetitionCounter 0; TIM_TimeBaseInit(TIM1, TIM_TimeBaseStructure); // 4. 输出比较配置 TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState TIM_OutputState_Enable; TIM_OCInitStructure.TIM_OutputNState TIM_OutputNState_Enable; TIM_OCInitStructure.TIM_Pulse 900; // 初始占空比50% TIM_OCInitStructure.TIM_OCPolarity TIM_OCPolarity_High; TIM_OCInitStructure.TIM_OCNPolarity TIM_OCNPolarity_High; TIM_OCInitStructure.TIM_OCIdleState TIM_OCIdleState_Reset; TIM_OCInitStructure.TIM_OCNIdleState TIM_OCNIdleState_Reset; TIM_OC1Init(TIM1, TIM_OCInitStructure); // 5. 死区时间配置 // 假设死区时间1μs定时器时钟72MHz则死区寄存器值 72 TIM_BDTRInitTypeDef TIM_BDTRInitStructure; TIM_BDTRInitStructure.TIM_OSSRState TIM_OSSRState_Enable; TIM_BDTRInitStructure.TIM_OSSIState TIM_OSSIState_Enable; TIM_BDTRInitStructure.TIM_LOCKLevel TIM_LOCKLevel_1; TIM_BDTRInitStructure.TIM_DeadTime 72; // 死区时间 TIM_BDTRInitStructure.TIM_Break TIM_Break_Disable; TIM_BDTRInitStructure.TIM_BreakPolarity TIM_BreakPolarity_High; TIM_BDTRInitStructure.TIM_AutomaticOutput TIM_AutomaticOutput_Enable; TIM_BDTRConfig(TIM1, TIM_BDTRInitStructure); // 6. 使能定时器 TIM_Cmd(TIM1, ENABLE); TIM_CtrlPWMOutputs(TIM1, ENABLE); }这段代码的关键点中心对齐模式TIM_CounterMode_CenterAligned1计数器先向上再向下波形对称谐波特性好。死区时间TIM_DeadTime 72对应72个定时器时钟周期72MHz下就是1μs。互补输出TIM_OutputNState_EnableCH1和CH1N互补适合H桥驱动。刹车功能TIM_Break_Disable这里没开实际项目中如果要做过流保护需要配置刹车输入。5.2 占空比动态调整线性度和响应速度占空比调整看起来简单写个寄存器就行。但实际项目中有两个问题要注意第一占空比更新的时机。如果直接在中断里改比较寄存器可能会出现“毛刺”——因为计数器可能正在比较值附近更新会导致输出异常。正确做法是使用预装载功能让新值在下一个周期生效。上面代码中TIM_OCPreload默认是使能的但最好显式配置。第二占空比和实际输出的非线性。由于死区时间的存在实际占空比和设定值之间有一个偏移。死区时间1μs周期50μs那么实际占空比 设定占空比 - 2%。如果要做精确控制需要在软件里补偿这个偏移。// 占空比设置函数带死区补偿 void PWM_SetDuty(uint16_t duty) { // duty范围0-1800对应0-100% // 死区补偿死区时间1μs周期50μs补偿值 1800 * 1/50 36 uint16_t compensated; if (duty 1800) duty 1800; // 正向补偿 compensated duty 36; if (compensated 1800) compensated 1800; TIM_SetCompare1(TIM1, compensated); }5.3 闭环控制从开环到PID开环PWM只能设定“输出多少”不能保证“实际得到多少”。如果负载变化、电源波动、温度漂移实际输出就会偏离设定值。要解决这个问题必须引入反馈做闭环控制。以电机调速为例闭环控制的流程是设定目标转速。通过编码器或霍尔传感器读取实际转速。计算误差 目标转速 - 实际转速。PID控制器根据误差计算新的PWM占空比。更新PWM输出。重复2-5直到误差在允许范围内。PID参数整定是个经验活。我的做法是先调P从小到大增加比例系数直到系统开始振荡然后退回振荡点的一半。再调I慢慢增加积分系数消除稳态误差。积分太强会导致超调和振荡。最后调D如果系统响应太慢或者超调太大加一点微分。微分对噪声敏感通常加低通滤波。// 增量式PID简化实现 typedef struct { float Kp, Ki, Kd; float prev_error; float integral; float output_min, output_max; } PID_TypeDef; float PID_Compute(PID_TypeDef *pid, float target, float actual) { float error target - actual; pid-integral error; // 积分限幅防止积分饱和 if (pid-integral 1000) pid-integral 1000; if (pid-integral -1000) pid-integral -1000; float derivative error - pid-prev_error; pid-prev_error error; float output pid-Kp * error pid-Ki * pid-integral pid-Kd * derivative; // 输出限幅 if (output pid-output_max) output pid-output_max; if (output pid-output_min) output pid-output_min; return output; }注意PID的输出要映射到PWM占空比范围。如果PWM分辨率是1800PID输出限幅就要设成0到1800。另外PID的计算周期要固定通常放在定时器中断里周期1ms到10ms比较合适。6. 实测调试示波器上看什么怎么判断好坏6.1 波形质量的三项核心指标PWM波形好不好用示波器看三个地方第一上升沿和下降沿时间。从10%到90%的时间通常在几十纳秒到几百纳秒。如果上升沿太慢开关损耗大如果太快振铃严重。理想情况下上升沿和下降沿应该对称时间接近。第二过冲和振铃。上升沿之后波形应该平稳地到达高电平不应该有大的过冲和衰减振荡。过冲超过10%就需要处理通常是加栅极电阻或者RC缓冲。第三占空比线性度。设定不同的占空比测量实际输出的高电平时间。理想情况下实际占空比和设定值成线性关系。如果非线性严重可能是死区时间补偿没做好或者驱动芯片有最小脉宽限制。指标合格标准常见问题处理手段上升沿时间50-200ns太慢导致发热换驱动芯片、减小栅极电阻过冲10%振铃、EMI加栅极电阻、RC缓冲占空比线性度误差2%死区补偿不足软件补偿、减小死区频率精度误差1%时钟源不准用晶振、校准6.2 负载突变时的响应测试PWM项目最考验功力的地方不是稳态波形而是负载突变时的响应。测试方法让系统在50%占空比下稳定运行然后突然增加负载比如给电机加阻力或者给LED并联一个电阻用示波器同时看PWM波形和输出电流波形。好的响应应该是电流快速上升PWM占空比在几个周期内调整到位没有大的超调和振荡。如果响应太慢说明PID的P或者I太小如果振荡说明P太大或者I太强。我个人的经验是先看电流波形再看PWM波形。电流波形反映的是系统的实际行为PWM波形只是手段。如果电流波形干净、响应快PWM波形差一点也能接受如果电流波形乱七八糟PWM波形再漂亮也没用。6.3 温度测试别忽略热设计PWM项目跑起来之后一定要做温度测试。开关损耗、驱动损耗、导通损耗最终都变成热。如果散热没做好轻则效率下降重则器件烧毁。测试方法让系统在最大负载下连续运行30分钟用热像仪或者热电偶测量关键器件的温度。重点关注MOSFET的壳温不要超过规格书的80%驱动芯片的温度电感的温度PCB局部热点如果温度超标处理顺序是先优化PCB布局和散热加散热片、加过孔再考虑换更低导通电阻的MOSFET最后才考虑降频或降负载。提示温度测试要在最恶劣的工况下做——最高环境温度、最大负载、最差散热条件。实验室里25度跑得好不代表夏天40度还能跑。7. 那些年我踩过的PWM坑7.1 坑一以为频率越高越好刚开始做PWM的时候我觉得频率越高波形越“细腻”效果越好。于是把电机驱动的PWM频率从8kHz提到了40kHz。结果电机是安静了但驱动芯片烫得不敢摸效率从85%掉到了70%。原因很简单开关损耗和频率成正比。频率翻5倍开关损耗也翻5倍。驱动芯片和MOSFET的结温迅速上升效率自然下降。后来我把频率降回16kHz换了一款开关速度更快的驱动芯片效率回到了88%噪声也可以接受。这个坑教会我频率是手段不是目的。够用就行不要盲目追高。7.2 坑二忽略死区时间的温度特性死区时间我一开始设的是固定值按常温下的关断时间算的。冬天测试没问题夏天测试就出问题了——高温下MOSFET的关断时间变长原来的死区时间不够出现了轻微的直通驱动芯片发热严重。解决方案死区时间要按最高工作温度下的关断时间来算再留裕量。如果MCU支持死区时间动态调整可以根据温度传感器读数实时调整。如果不支持就按最坏情况设一个固定值。7.3 坑三PCB布局导致的地弹有一次做多路PWM输出四路信号互相干扰波形上全是毛刺。查了很久最后发现是功率地和信号地混在一起了。大电流开关时功率地上的压降耦合到了信号地导致PWM比较器误动作。改板的时候我把功率地和信号地分开单点连接毛刺就消失了。这个坑让我明白PWM项目里地平面设计比信号走线更重要。地没处理好什么波形都白搭。7.4 坑四占空比更新的时机不对早期写代码我在主循环里直接改比较寄存器没有用预装载。结果偶尔会出现输出脉冲异常——要么多一个窄脉冲要么少一个脉冲。后来查手册才知道比较寄存器在计数器运行时更新如果更新时刻正好在比较点附近就会产生异常脉冲。正确做法是使能预装载让新值在下一个周期生效。或者用更新中断在中断里更新。这个坑不复杂但很隐蔽波形上偶尔出现一次很难抓。8. 从PMW项目延伸出去还能怎么玩PWM本身是个基础技术但围绕它可以构建很多有意思的应用。如果你已经把基础的PWM输出跑通了下面几个方向可以继续深入第一多路PWM的相位控制。在多相电源或者多电机系统中让多路PWM错开相位可以降低输入电流纹波减小电容压力。比如三相逆变器三路PWM相位差120度输出波形更平滑。第二PWMADC的同步采样。在电源控制中ADC采样时刻要和PWM同步才能准确测量电流。通常是在PWM周期的特定点触发ADC比如中心对齐模式下的计数器过零点。第三PWM做DAC。用PWM加低通滤波可以输出模拟电压。分辨率取决于PWM位数和滤波器的阶数。这个方案成本低但响应慢适合对速度要求不高的场合。第四PWM做通信。在一些低成本场景中可以用PWM的占空比编码信息接收端用ADC解码。速率不高但抗干扰能力比普通IO强。第五PWM做音频输出。把音频信号调制到PWM占空比上加一个低通滤波器就能驱动扬声器。这就是D类功放的基本原理。频率要足够高通常100kHz以上才能保证音频质量。这些方向每一个都可以单独展开但核心都是对PWM时域特性的精细控制。把基础打牢后面都是组合和优化。我个人在实际操作中的体会是PWM项目最难的从来不是“怎么输出一个方波”而是“怎么让这个方波在真实世界里保持该有的样子”。负载会变温度会变电源会波动PCB有寄生参数器件有离散性。把这些因素都考虑进去才算真正把PWM做明白了。如果你正在做类似的项目建议先把示波器用熟把波形看透很多问题看一眼波形就清楚了。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑