资讯动态

PWM流程架构详解:从寄存器配置到物理信号的五级映射

发布时间:2026/9/5 6:37:34 来源:尧图企业网站定制
1. 从“会用”到“理解”为什么先谈流程架构先说个我自己的经历。早几年调PWM思路基本是对着参考手册找定时器的寄存器把ARR、CCR、PSC配一遍示波器能看到波形就算完事。那时候写pwm占空比调节这种代码脑子里根本没有“流程”的概念——只知道自己是在“配置几个寄存器”而不是在“跑通一条从需求到物理信号的链路”。真正让我意识到问题严重性的是第一次做电机驱动。开环控制时随便调调没感觉一旦加上PID恒温控制或者buck变换器这类负载问题接踵而至同一个定时器为什么改了预分频值输出频率变了、占空比却出现偏移为什么急停时没有pwm故障保护机制管子直接烧了一片为什么28335配置的pwm死区dbred一侧正常、dbfed一侧却出现了对穿导通这些问题没有一个是靠“查寄存器表”能查明白的。它们全部指向同一个共性根源PWM不是一个“功能点”而是一条完整的流程链从你脑子里的需求意图开始一路经过定时器时钟树、预分频、自动重载、比较匹配、输出极性/死区、引脚复用最终才变成引脚上真实的物理电平。任何一个环节理解不到位后续所有环节都是跟着错。所以我决定把自己梳理PWM架构的过程写成这个系列。作为第一讲我不会一上来就让你抄配置代码而是先把整个PWM的流程架构拆开——你收到一句话、一个需求、一个控制目标之后它到底是怎么一步步变成一个真实的波形信号再从信号变成物理世界里的力、热、位置的。有这张“地图”在手后面聊STM32、28335、具体外设配置时你才知道自己每一步在干什么、遇到bug往哪个环节去排查。这一讲适合谁已经会配定时器输出PWM、但遇到深一点的问题还是靠试的工程师刚接触电力电子或电机控制、需要从全局理解PWM链路的学生以及那些“以为会了、其实只会抄”的开发者——说句不好听的我以前就是这种人。2. 先画一条主线从“需求域”到“物理域”的五级映射2.1 为什么你的PWM配置总是“差一口气”很多人调PWM有个共同体验波形能出来占空比也能变但总觉得哪里不对——频率上限不够、分辨率不足、动态响应慢、或者换一片芯片后同样的代码行为不一致。这其实不是某一颗芯片的锅而是你脑子里没有一个完整的流程映射关系。我习惯把PWM的完整流程拆成五个层级从需求一直映射到物理信号需求层你究竟想要什么“让LED呼吸”“让电机以某个转速转”“让加热棒维持在某个温度”这是控制目标本质上是“对时间上某个物理量的期望”。参数层把控制目标翻译成PWM参数。转速对应某个频率占空比组合温度对应PID之后输出的占空比数值LED亮度直接对应占空比。这个映射本身就有很多讲究最典型的坑就是频率选高一点还是低一点、占空比分辨率够不够。时序层PWM本质上是时间轴上“通/断”的分布。定时器时基、预分频倍频、计数模式、自动重载决定了你这个通断的“时钟骨架”也就是频率和分辨率的上限。事件层计数器跟比较寄存器匹配这件事产生了更新事件和比较事件——这两个事件才是PWM真正的“骨架”。方向、极性和死区等处理全在这一层完成。物理层事件最终以电平形式输出到引脚再经过外部驱动电路变成功率信号施加在负载上。GPIO复用、输出极性、驱动能力、故障保护联动也都在这层。这套五级映射不是学术空谈它直接决定了你排查问题的路径排序。比如你用stm32f103zet6的tim3做呼吸灯从引脚重映射到pwm占空比调节如果流程停留在“照着CubeMX点一点”你根本不知道引脚重映射实际上跨了第2层到第5层——重映射改变的不是“频率/占空比”这两个数字而是改变了“事件”到底走哪条物理通道送达引脚。2.2 参数域里的隐藏矛盾频率、分辨率与更新率在PWM参数层里有一组三方博弈的关系最容易被忽视输出频率、占空比分辨率和PWM更新率即你能多快改变一次占空比数值。这三者并没有“全都高”的免费午餐因为它们共享同一个硬件时钟资源。拿一个72MHz定时器时钟的系统举例STM32F103经典场景如果你想要20kHz的PWM频率电机驱动的常见工作点每个PWM周期能用的计数时钟是 72MHz ÷ 20kHz 3600 个时钟周期。占空比分辨率最高就是3600分之一也就是约0.0278%步进。对应到12位ADC场景3600完全覆盖0~4095中的低12位看起来够用。但如果频率升到100kHz每周期只有720个计数分辨率一下子掉到1/720动态范围明显缩水。恒温控制、LED调光这类“慢系统”这个矛盾不明显因为占空比变化不快随便用都行。但电机控制这种既要高频率为了降低噪声、减少转矩脉动又要高分辨率为了低速平稳还要高更新率为了快速响应负载突变的场景这个矛盾就是架构设计必须面对的核心问题。这也是为什么到了STM32高级定时器或DSP的ePWM模块会出现“周期寄存器与比较寄存器分离影子寄存器”“周期值自动重载”“比较值预装载”这类设计。它们本质上都是为了减少“更新”对“PWM波形”造成扰动——这一点在讲事件层时会细说。架构层面你现在只需要记住参数不是孤立选择的频率、分辨率、更新率是一组需要权衡的三元组。很多人PWM调不明白不是不会写寄存器而是没看穿这个三元组关系。2.3 被误解最多的“占空比调节”说到pwm占空比调节大多数人以为就是“把CCR写大一点、写小一点”这么简单。软件层面确实是这样硬件层面远不这么简单。占空比调节依赖比较事件而比较事件是否立即生效、是否会撕裂一个正在输出的波形完全取决于你的预装载配置。这么说吧如果你禁用了预装载直接写CCR寄存器那么新的比较值会在下一个计数时钟沿立即生效。对于高频率PWM这会造成一个畸形半周期——脉冲宽度突然变宽或变窄而后续周期恢复正常。对LED呼吸灯这无所谓但如果是buck电路、电机控制这种畸形脉冲可能造成电流尖峰或转矩抖动。如果开启了预装载新CCR值会锁存到影子寄存器等到更新事件产生时才一次性生效。代价是多了一个周期的传输等待好处是波形绝对完整。这也是为什么所有正经的电机控制库、电源控制库必然开启预装载特性而不是让用户直接“裸写”比较寄存器。这一层我在早期完全没概念直到用逻辑分析仪看波形时发现一个异常窄脉冲才追到预装载上。所以说参数层的占空比“设定”和时序层的“生效规则”是两个层面的事情。你在软件里感觉自己改了占空比实际上硬件还没把这个“意图”应用到真实的电平序列上。3. 时基与事件生成PWM内核的运转逻辑3.1 计数器、预分频和自动重载如何共同决定频率从时序层往下走真正干活的三大件是时钟源、预分频器、自动重载计数器。它们一起决定了PWM的“节拍”。时钟源定时器挂在哪个总线上运行频率是多少。以STM32F103为例APB1定时器时钟默认可达72MHzAPB2可达72MHz这是分母的源头。预分频器PSC把时钟源分频得到计数器的计数频率。理论上你可以任意设置但实际设计有一个重要权衡PSC越大计数分辨率越低。自动重载寄存器ARR计数器从0数到ARR后产生更新事件然后重新从0开始。PWM周期 (ARR1) × (PSC1) / 定时器时钟频率。举个例子用stm32f103zet6的TIM3输出20kHz PWM定时器时钟72MHz如果PSC设为7172分频计数频率变成1MHz那么ARR就需要设为49因为20k 1M ÷ (491)。每个周期49个计数点占空比分辨率约2%这对很多应用是不够用的。想要更高分辨率就必须把PSC调小PSC0计数频率72MHzARR3599分辨率一步提升到0.028%。所以“频率由PSC和ARR共同决定”这句话要记牢但更重要的是知道两者对分辨率的权重完全不同PSC不仅分频还把计数精细度一并拉低了。设PSC的本质是在“你要多长的总周期”和“你在周期内能多精细地分片”之间找平衡。这就是一个典型的参数映射问题。不少教程里总是告诉你“先定PSC再算ARR”实际上恰恰相反最好先定计数频率再用ARR匹配目标频率最后回头验证分辨率。步骤反了之后你会在后续需要调电阻值时发现一步就动了一堆参数。3.2 比较匹配事件波形切换的真正引擎很多人把PWM理解成“ARR定周期CCR定占空比”这个说法是正确的但它隐藏了一个关键的微观机制。定时器本身并不知道自己在输出PWM它只知道两件事计数器到顶要回零计数器等于某个值时产生一个比较事件。PWM波形实际上是这两个事件交替驱动引脚电平的结果计数器从0开始递增。当计数到达CCR时输出翻转或置有效电平。计数继续到ARR产生更新事件计数器回0输出再次翻转或回无效电平。如此循环两个事件之间的距离决定了一段时间内高电平的比例即占空比。这个机制解释了为什么“改CCR就能改占空比”的前提是CCR的数值必须在0~ARR之间而且CCR与ARR的相对位置还决定了有效电平方向。若CCR接近ARR1则是高占空比反过来如果配置成了递减计数第一个事件在CCR第二个在0那么“看上去”CCR控制的是低电平宽度而非高电平宽度——这经常让初学者莫名看到“占空比翻转”的怪异现象。我之前做舵机pwm控制时出现过一次“占空比越大舵机转角反而越小”的诡异情况。排查了很久最后才发现是计数方向配置成了向下计数。这种问题不看事件流光看公式是看不出来的——因为公式没错是你对“事件先后顺序”建立的心智模型错了。3.3 影子寄存器与更新事件波形完整性的最后防线现在回过头来看影子寄存器它其实不是“额外功能”而是“PWM波形完整性”的基础设施。如果没有影子寄存器你改一次CCR波形就会在任意时刻被硬切一刀。这与我们前面提到的预装载其实是同一件事的两面影子寄存器硬件层面为CCR、ARR、PSC各提供一个影子副本。软件写入的其实是影子副本。更新事件更新事件把影子副本的内容一次性锁存进正在参与计数的“工作寄存器”。用专业一点的话讲这叫“双缓冲”。PWM波形完整性、占空比跳变的时间确定性全靠这套机制保证。在电机/电源应用中波形完整性直接决定电流纹波、电磁干扰、甚至是否炸管。这块也是我从28335配置的pwm死区dbfed和dbred中彻底悟出来的。TI的ePWM模块里死亡区发生器本质上是在比较事件和输出之间插入一段延迟窗口而这段延迟发生在影子寄存器更新之后、物理输出之前。也就是说死区本身也是“事件链”的一部分更新事件→比较匹配→死区发生器延迟→输出极性处理→引脚电平。每多插一个处理环节都要搞清楚它在事件流里的位置否则配置出来的死区时间会和你预想的不一致。4. 从波形到物理世界感受与驱动两大闭环4.1 输入捕获PWM的另一面PWM从来不只是“输出波形”这一件事。当你需要测量外部PWM信号的频率和占空比时比如遥控器信号、速度传感器脉冲、别的MCU发来的指令你就进入了PWM的“感受”侧——输入捕获模式。输入捕获的流程架构可以理解成输出PWM的逆过程外部信号变化上升沿/下降沿触发捕获事件当前计数器的值被锁存进捕获寄存器。通过两次相邻捕获值之差就可以反推周期通过上升沿与下降沿之间的差值可以反推高电平时间。有个热搜词“rk3588 pwm capture”指的就是这个能力。在RK3588这类高端SoC上PWM Capture不只是“测频率测占空比”还能配合GPIO中断做脉冲计数的精确时间戳记录。这在机器人、IoT传感器数据采集上用途很广。实际使用中最容易踩的坑是输入捕获对时钟分辨率的敏感度极高。如果你拿一个72MHz时钟去测一个1kHz的PWM每个周期能采到72000个时钟计数精度在0.1%之内没问题但你拿它去测一个1MHz PWM每周期只有72个计数只需一个计数误差误差就超过1.4%。所以选输入捕获模式之前先问自己源信号频率和定时器时钟的比值够不够大不够的话宁可换更高频率的定时器时钟也不要在测量端硬凑。还有一个常见误区一个定时器能不能同时接收PWM数据和输出PWM波形答案是可以但你需要走不同的通道而且捕获和输出的时基共享关系会带来一些隐性约束。比如说同一个定时器如果要同时输出PWM和捕获外部PWM那么它的ARR是共享的这会让输出频率和捕获范围耦合起来。这种耦合一旦没理清楚就会出现“输出频率改一下捕获回来的占空比偏了”的现象。实际上占空比没偏是你的捕获窗口被输出频率牵制了。这类问题只有在“流程架构”视角下才能一眼识破。4.2 故障保护流程中的“紧急制动阀”聊到pwm故障保护很多初学者根本没这个概念直到烧了管子才追悔莫及。故障保护的流程架构本质上是在事件链中插入一个优先级高于一切的外部触发源一旦触发信号有效输出立即进入预设的安全状态高阻、强制低、强制高都有可能无论你的软件寄存器此刻写的是什么。这个机制的经典实现有两大类一是高级定时器的刹车功能如STM32的BKIN引脚二是DSP ePWM模块的Trip Zone机制。两者的设计思想一致把“快速干预”从“软件控制循环”中剥离出来由硬件直接接管输出。这样即使你的主循环卡死了故障依然能被瞬时响应延迟通常在几十纳秒到几百纳秒之间。实际项目中我见过不少工程师把故障保护做成“GPIO中断软件关PWM”的架构。这在低速场合也许能用但弊端非常明显中断响应延迟的抖动会直接体现在保护时间上万一中断本身执行不过来了后果看运气。硬件故障保护的意义恰恰是把这份“运气”给去掉。配置故障保护时有几个易错点值得提醒故障触发后输出状态是否是“安全状态”对半桥驱动来说一般是强制低对某些应用可能是高阻务必要结合外部电路确认。故障标志是否会锁存锁存之后必须软件清除才能恢复输出这可以防止故障源还在时反复重启。故障信号的有效极性不要搞反否则等于没保护甚至更糟。我见过某逆向工程项目把低有效接成高有效导致故障信号一直正常系统却直接关了输出。4.3 从信号到功率电机与恒温控制中的闭环当PWM信号从MCU引脚输出到功率电路之后流程并没有结束。占空比只是一个数字真正的控制效果是负载端电流、转速、温度等物理量。拿舵机pwm控制来说舵机内部有专门的解码芯片把50Hz周期、1ms~2ms高电平的PWM信号解算成目标角度内部再用反馈电路驱动电机到达指定角度。这个闭环在舵机内部就完成了你只需要保持输出标准的50Hz信号即可。这里的坑是如果你把PWM设置的周期偏到60Hz部分舵机也能接受但角度映射会和你预想的不一样如果偏到100Hz以上很多舵机会直接乱抖——因为解码电路已经无法稳定区分“周期”和“脉宽”了。再举个实际的例子开关量pwm恒温控制。我在做恒温加热装置时用PWM控制固态继电器SSR的通断时间比例来调节加热功率配上NTC热敏电阻采样温度和软件PID。核心架构分为三环温度采样环ADC采集电压→查表换算成温度。PID计算环目标温度与实际温度的误差→PID输出。PWM映射环PID输出通常映射到0~100%→换算成CCR值→写入定时器比较寄存器。这里最值得说的是PWM映射环。PID输出的0~100%占空比映射到CCR上时如果ARR是1000那就是0~1000如果ARR是1024就是0~1024。但如果你用了16位定时器、ARR设成65535而PID输出只有16位甚至12位那尾部分辨率就浪费了。更合理的做法是让ARR恰好等于PID输出的满量程或者用移位/限幅的方式把PID输出范围精确映射到0~ARR。温度控制的另外一个坑出在“SSR过零触发”上。固态继电器通常有过零检测意味着它只能整周期开断实际控制周期必须是电网周期的整数倍典型10Hz~20Hz。你把PWM频率设成1kHzSSR完全跟不上相当于占了坑不出力。这种应用里“PWM频率选择”根本不是看MCU能力而是看负载和执行器的物理限制。这个道理放在流程架构里很容易明白物理域决定了参数域的上限而不是反过来。5. 重映射、死区与占空比异常典型疑难点的架构级解读5.1 引脚重映射改变事件流的目的地很多人在做stm32f103zet6的tim3 PWM输出时会发现默认引脚不对或者引脚被其他外设占用这时候就需要引脚重映射。引脚重映射的本质是把“已经生成好的PWM事件流”连接到“另一个物理引脚”上——它没有改变时基、没有改变比较匹配逻辑改变的是事件流到引脚的通路。这一点很重要因为重映射经常被误解成“重新配置一个外设”。实际上你只需要启用AFIO的重映射寄存器告诉MCU“把定时器输出从这个引脚挪到那个引脚”原有时基配置完全不用动。不过要注意重映射是按“功能组”整体进行的TIM3的重映射会同时影响它的多个通道引脚如果你只打算用其中一个通道重映射后另一个通道也换了位置这是正常现象不是bug。我用stm32f103zet6的TIM3做呼吸灯时踩过一个具体坑默认的TIM3_CH1在PA6重映射后跑到PB4上。问题是PB4在JTAG模式下是NJTRST脚如果不先把SWJ配置解掉PB4部分功能会异常PWM波形死活出不来。当时排查了很久看代码、看示波器、翻手册最后才发现是AFIO和调试接口配置的冲突。这类问题只有在“事件流→引脚”全链路视角下才能快速定位——你不需要调试每一个环节但你要知道问题最可能出现在哪一层。5.2 死区配置从28335的DBFED与DBRED说起死区是PWM流程架构中“高级功能”最集中、最容易搞混的部分。热搜词里“28335配置的pwm中dbfed和dbred”“28335配置的pwm死区db”“28335配置的pwm死区主源选择”反复出现说明这个点坑了很多人。说句实在话C2000系列ePWM的死区逻辑是市场上所有MCU里数一数二的复杂也是最值得学的。因为它的每个参数都能在流程链路中找到明确位置。TI的ePWM中死区发生器插在事件生成和输出极性控制之间输入通常是“UP/DOWN计数产生的比较事件”输出则是“两路互补的、左移/右移过的PWM信号”。DBFED指上升沿延迟Rising Edge DelayDBRED指下降沿延迟Falling Edge Delay。它们分别作用于互补输出的“开通沿”和“关断沿”若上升沿延迟大于0输出信号的开通时刻向后推迟等效于“插入死区”。若下降沿延迟大于0输出信号的关断时刻向后推迟等效于“延长导通”。很多人把DEB和DBRED理解成“分别控制高边和低边”的延迟实际上并不是这样。DBFED和DBRED是作用在同一个“参考波形的边沿”上然后通过极性控制生成上下互补信号。所以当你想配置“上下管的死区合理”你需要同时看DBFED与DBRED的组合效果而不是只看其中某一个。我曾经做过一个逆变项目只配了DBRED没配DBFED结果上桥臂关断时下桥臂立刻导通——发生直通烧了管子。事后复盘发现我脑子里把“上升沿延迟”和“下降沿延迟”的物理含义搞反了。死区主源选择Dead-Band Generator source select常见理解是“哪一路比较信号作为死区发生器的输入来源”。在TI的ePWM里可以选择EPWMxA、EPWMxB或其他真值表模式。如果你做的是单极性调制通常选EPWMxA如果做双极性调制可能需要根据调制波的正负半周切换主源。很多人配置死区时忘记设置这一项导致输出端完全没有死区效果。5.3 100%占空比异常占空比接近极限时的事件冲突还有一类高频问题极容易让人崩溃定时器输出PWM时100%占空比出现异常。现象通常是把CCR设到ARR1即期望恒高电平输出示波器看到的却是波形翻转了一下或者只有一个周期的高然后输出全低。这个问题的根源在事件冲突。当CCR等于ARR1时在递增计数模式下比较事件会与更新事件重合。硬件必须决定“先执行比较翻转还是先执行更新回零”这个顺序在不同芯片、不同配置下并不一致。结果就是有时是恒高有时是高电平只出现一瞬间、然后回零后不再触发有效电平。另一个常见的100%占空比配置方式是把CCR设成ARR1但ARR本身也可能因自动装载而发生改变这会让预期值再次漂移。更稳妥的方案是用强制输出电平模式或把输出模式配置成强制高而非单纯依赖比较事件。对ST系列来说也可以设置CCMRX寄存器中的OCxM为准高模式旁路比较事件对于TI的ePWM则可以用强制高逻辑直接控制输出。这里面的架构启示非常清晰占空比调制的“边界行为”与“中间行为”在事件生成层面并不是连续的。CCR在0和ARR1这两个边界上比较事件和更新事件会发生重叠导致输出行为出现非线性。所以你在流程设计阶段就要决定好“边界占空比怎么处理”不要等到硬件调试才发现。6. 怎么把流程架构用起来一套可复用的排查与设计方法6.1 从需求倒推配置四个必问的问题在和PWM打了这么多年交道后我总结了一套“倒推配置四问”可以帮你避开大部分浅层问题也适合写进方案评审清单。物理量需要什么频率负载响应时间是多少执行器能跟得上多快的开关把这点定下来才能倒推出PWM周期范围。占空比需要多大分辨率控制精度要求是多少0.1%和0.01%对应的位宽完全不同——这是选择PSC和ARR组合的核心驱动。更新率允许多快每次占空比刷新之间你有多少计算时间这决定你是否需要DMA、是否开启预装载、要不要用影子寄存器。故障时怎么断电是高阻安全还是快速放电硬件故障保护必须保底设计。这四个问题的答案决定了下游所有配置。我自己在做新项目时一般先画一张“频率-分辨率-更新率三角图”哪个指标最敏感就往哪个方向倾斜配置。盲目照搬例程的PSC/ARR值是很多诡异问题的起始点。举例来说此前我用STM32F103的TIM3做呼吸灯如果只看“呼吸”效果根本不需要多少频率和分辨率10Hz~1kHz怎么都行。但我要从容实现呼吸效果必须让每级亮度变化足够平滑所以ARR需要至少几百。呼吸灯的“波形”最终只会连接到LED频率低到肉眼闪烁以下反而看得见跳动通常需要1kHz级别才显得顺滑。这一类“看起来简单”的项目其实已经把PSC、ARR、CCR关系全都塞进去了。6.2 带故障排查先断病灶在哪个域遇到输出异常时千万别一上来就抱着示波器探针到处点。我的排查顺序永远是沿着流程域逐层往下走需求与参数域先确认软件里算出来的占空比、频率数值是否符合预期。方法是在关键执行点设置断点或串口打印看CCR、ARR、PSC的值。事件域通过定时器状态寄存器更新标志、捕获/比较标志确认事件是否发生。如果标志位一直不置位说明问题在比较电路或时基初始化。物理域看引脚复用的AFIO配置、GPIO速度、输出模式再看外部电路是否把信号拉死了推挽/开漏、上拉下拉。记得一个真实案例某人反映PWM输出“偶发丢失脉冲”检查半天发现不是PWM逻辑问题而是GPIO外部地被干扰。在流程架构视角下这个问题属于物理域再往下排查才发现是PCB地线过长导致的噪声。如果用传统思路“死磕寄存器”估计三个月都找不到。6.3 软件PWM、DMA与高分辨率扩展的架构位置最后简单站高一点看两个常见扩展需求在流程架构中的位置。软件PWM本质上是把“事件生成”从硬件定时器挪到了软件定时/循环中。它最大的优势是灵活任意引脚都能输出PWM不需要专门的定时器通道代价是CPU占用率高且事件抖动明显。如果你只是驱动一个灯光、一个蜂鸣器完全没问题但如果是电机控制、恒温控制这类对时间确定性要求高的场景务必使用硬件PWM。PWMDMA这在热搜词“stm32f103 pwm dma pa1 pa3”中体现得很典型。DMA的架构位置是在“参数域”和“事件域”之间插入了一条快速通路CPU把一组CCR值事先放到内存中DMA按需搬移进比较寄存器由硬件自动完成波形序列的更新。这样CPU可以专注做控制算法不用反复写寄存器还可以配合定时器更新事件触发DMA实现“占空比表格”的自动播放——比如做彩虹呼吸灯、渐变电机加减速曲线。最直观的死区配置参考公式以TI ePWM为例上升沿延迟单元输入时钟为TBCLK死区时间 DBFED / TBCLK频率如果TBCLK是100MHz你需要500ns死区则DBFED50。同样DBRED独立计算。若采用“高边有效与低边有效互补”模式实际上下两管都会各延迟一次所以上下管之间真正无导通重叠的窗口大约等于两者叠加效果需按实际电路验证。总的来说流程架构理解的价值在于它给了你一张地图而不是一条条孤立的知识点。以后再遇到“PWM故障保护同时触发了什么”“为什么100%占空比异常”“死区主源选择到底要满足什么要求”你不再需要死记硬背答案而是从“需求→参数→时序→事件→物理”这条链路出发自己推导出问题出在哪一环、应该检查什么寄存器、修改什么配置。我个人这些年的体会是凡是能在流程架构层面想得很清楚的人写出来的控制代码基本不用怎么反复调参与试错而凡是拿到例程就改参数的人大多会在某个深夜被一个“看起来根本不可能”的bug卡住。希望这篇一能帮你把骨架立起来。后面几讲我会分别从“PWM的时基与事件生成”“互补PWM与死区的数学本质”“PWMADC闭环的真实案例”里挑几个方向深挖到时候咱们对着具体的寄存器、具体波形图继续拆。

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

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

免费获取报价