LPC24XX PWM模块深度解析:从定时器原理到电机控制实战

📅 2026/6/30 13:03:21
LPC24XX PWM模块深度解析:从定时器原理到电机控制实战
1. LPC24XX PWM模块从定时器到波形生成的深度解析如果你正在使用NXP的LPC24XX系列微控制器并且需要驱动电机、调节LED亮度或者控制一个开关电源那么PWM脉宽调制模块几乎是你绕不开的核心外设。很多人觉得PWM就是简单地输出一个方波调调占空比而已但当你真正深入到像LPC24XX这样功能丰富的PWM模块时会发现里面大有乾坤。它不仅仅是一个简单的定时器输出比较而是一个集成了影子寄存器、双边沿控制、多通道同步以及主从模式的精密波形发生器。我过去在开发无刷电机驱动器和多路LED调光系统时就曾在这个模块上“折腾”过不少时间从最初的配置混乱到后来的得心应手积累了不少实战经验。今天我就结合官方手册和实际踩过的坑带你彻底吃透LPC24XX的PWM模块从最基础的定时器原理到复杂的双边沿PWM波形生成手把手教你如何配置和应用。LPC24XX系列通常包含两个独立的PWM模块PWM0和PWM1。它们本质上是其通用定时器模块的功能超集。这意味着如果你只需要一个简单的定时器完全可以用PWM模块来实现而当你需要生成复杂的、多通道同步的PWM波形时它的高级功能就派上用场了。模块的核心是一个32位的定时器/计数器TC配合一个32位的预分频器PR可以产生从几赫兹到几十兆赫兹的PWM频率。最关键的是它提供了多达7个匹配寄存器MR0-MR6通过灵活的配置可以产生最多6路单边沿PWM或者3路双边沿PWM或者两者的混合输出。这种灵活性在控制三相无刷电机需要三路互补、带死区的PWM或者实现精密DAC功能时显得尤为重要。接下来我们就从它的“心脏”——定时器部分开始一步步拆解。1.1 核心基石定时器/计数器工作原理在理解PWM之前必须先搞懂LPC24XX的定时器是如何工作的因为PWM的所有高级功能都构建在这个基础之上。定时器的核心任务就是“数数”。它以一个基准时钟通常是PCLK外设时钟为节拍不断地递增一个计数器TC当计数器的值达到我们预设的某个目标值匹配寄存器MR的值时就会触发一系列我们预先定义好的动作比如产生中断、复位计数器或者停止计数。这个过程里有两个关键角色预分频寄存器PR和预分频计数器PC。PCLK的频率往往很高比如60MHz直接用它来驱动32位计数器TC递增计数会跑得飞快很快溢出无法产生低频信号。因此需要PR和PC来进行“降速”。你可以把PR看作一个“分频系数设定器”。例如设置PR2那么预分频计数器PC就需要计满213个PCLK时钟周期才会让主定时器计数器TC增加1。这样TC的计数频率就变成了PCLK / (PR1)。这是一个非常关键的计算直接决定了PWM的时间基准精度。匹配事件是定时器工作的“指挥棒”。每个匹配寄存器MR0-MR6都可以独立配置当TC的值等于某个MR的值时就发生了一次“匹配”。此时我们可以通过匹配控制寄存器MCR来定义三种动作产生中断Interrupt on Match向CPU申请中断通知程序“时间到了”。复位定时器Reset on Match将TC清零重新开始计数。这是产生周期性PWM波形的关键。停止定时器Stop on Match清除TCR的计数器使能位让TC和PC停止计数。常用于单次定时或脉冲计数。手册中的图24-129和图24-130完美地展示了“复位匹配”和“停止匹配”两种模式的时序。以PR2 MRx6为例在“复位匹配”模式下TC从0开始每3个PCLK周期加1当TC增加到6时即经历了6 * 3 18个PCLK周期匹配事件发生TC在下一个时钟被复位为0并产生中断然后开始下一个周期。在“停止匹配”模式下TC计数到6后TCR的使能位被清零TC停止在6并产生中断。理解这两种基本模式是后续配置PWM周期和占空比的基础。注意在PWM模式下当MR0用于设置周期时必须启用“复位匹配”功能。同时PWM模式下的计数器复位值是1而不是定时器模式下的0。这是一个非常容易忽略的细节如果按定时器思维将MR0设为期望的周期值实际输出频率会翻倍后面我们会详细解释。1.2 PWM模块的架构与核心增强功能PWM模块在标准定时器的基础上做了几项至关重要的增强使其从一个简单的时间触发器变成了一个专业的波形发生器。其模块框图手册图25-132清晰地展示了这些变化右侧和顶部新增的部分就是PWM的专属逻辑。首先最核心的增强是引入了影子寄存器Shadow Register。在标准定时器里你直接写MRx值立即生效。但在PWM应用中这会导致问题。想象一下你正在输出一个PWM波控制电机在周期的中间你修改了占空比匹配寄存器比如MR1的值如果新值立即生效可能会在当前周期内就产生一个错误的跳变沿导致输出一个极窄的“毛刺”脉冲这可能会让电机产生抖动甚至损坏。影子寄存器就是为了解决这个问题而生的。当你写MRx时实际上是写到了对应的影子寄存器里。这个新值并不会立即影响当前的PWM生成。只有当你在加载使能寄存器LER中将对应MRx的使能位置1并且当下一个由MR0定义的PWM周期结束时即MR0匹配TC复位时影子寄存器里的新值才会被加载到真正的匹配寄存器中生效。这个机制确保了PWM参数只能在周期边界安全地更新波形是连续且干净的。其次匹配寄存器增加到了7个MR0-MR6。为什么是7个这是为了支持双边沿PWM输出。一个标准的单边沿PWM输出比如从周期开始处拉高在某个时刻拉低只需要两个匹配点一个决定周期MR0一个决定拉低时刻比如MR1。而一个双边沿PWM输出高电平脉冲可以在周期内的任何位置开始和结束则需要三个匹配点一个决定周期MR0一个决定上升沿Set一个决定下降沿Clear。因此7个匹配寄存器最多可以支持1个周期寄存器MR0 6个边沿寄存器 6路单边沿PWM或者1个周期寄存器MR0 3对边沿寄存器 3路双边沿PWM。第三增加了PWM控制寄存器PCR。这个寄存器主要有两个功能一是独立使能或禁用6个PWM输出引脚PWMENA1-6二是为PWM2-PWM6这5个通道选择模式PWMSEL2-6是单边沿模式PWMSELn0还是双边沿模式PWMSELn1。PWM1通道的模式选择是固定的我们后面会提到。最后引入了主从同步模式。PWM0模块有一个“主禁用Master Disable”控制位TCR[4]。当PWM0作为主设备并且该位置1时PWM0的使能信号会同时控制PWM0和PWM1两个模块的计数使能。这意味着你可以用一条指令同时启动或停止两个PWM模块确保它们输出的多路PWM波形严格同步这对于需要多路协同工作的应用如三相逆变器至关重要。1.3 单边沿与双边沿PWM模式详解与选择策略这是LPC24XX PWM模块最强大也最容易让人困惑的特性。理解这两种模式的区别和适用场景是灵活运用该模块的关键。单边沿控制PWM是最常见、最直观的模式。其规则非常简单每个PWM周期开始时即MR0匹配TC复位时所有配置为单边沿模式的PWM输出引脚都会变为高电平除非其匹配值等于0。当TC计数到该通道对应的匹配寄存器值时例如PWM2对应MR2该PWM输出变为低电平。如果匹配值大于PWM周期值MR0则整个周期内该输出都保持高电平。举个例子MR01000定义PWM频率MR2300用于PWM2通道。在单边沿模式下PWM2的波形是每个周期开始变高当TC300时变低高电平占整个周期的30%占空比30%。这种模式生成的是左对齐的PWM波所有通道的上升沿都是对齐的只有下降沿位置不同。它非常适合LED调光、简单的直流电机调速等应用。双边沿控制PWM则复杂得多也灵活得多。它允许PWM脉冲的上升沿和下降沿被独立地放置在周期内的任何位置。手册中用了5条规则来定义其行为核心思想是每个双边沿PWM通道需要两个匹配寄存器来分别控制其置位Set上升沿和复位Clear下降沿。具体哪个匹配寄存器控制哪个边沿是由通道号和PWMSEL位共同决定的有一个固定的映射表手册表25-554。这个表是配置双边沿PWM的“密码本”必须牢记PWM1 比较特殊无论PWMSEL1是否存在实际上PCR里没有PWMSEL1位它都只能由MR0Set和MR1Clear控制效果等同于单边沿模式。因此PWM1通常不被用作复杂的双边沿输出。PWM2 单边沿模式时由MR0Set和MR2Clear控制。双边沿模式PWMSEL21时由MR1Set和MR2Clear控制。PWM3 单边沿模式时由MR0Set和MR3Clear控制。双边沿模式PWMSEL31时由MR2Set和MR3Clear控制。PWM4, PWM5, PWM6 依此类推。从映射关系可以看出为了最大化利用匹配寄存器来产生最多的双边沿PWM通道最佳实践是使用PWM2、PWM4、PWM6作为双边沿输出。因为这样只需要占用MR0周期以及MR1/2, MR3/4, MR5/6这三对寄存器正好实现3路独立的双边沿PWM。如果你试图用PWM3和PWM5做双边沿会与PWM2和PWM4的寄存器冲突减少可用通道数。双边沿PWM的强大之处在于它可以产生中心对齐的PWM或者任意位置、任意宽度的脉冲。这对于电机控制中的死区时间插入、开关电源的对称控制、以及生成特定形状的波形至关重要。例如在生成三相正弦波驱动的SPWM时中心对齐的PWM可以显著降低谐波分量。2. 寄存器精讲与配置流程实战了解了原理我们就要动手配置了。LPC24XX的PWM寄存器虽然数量不少但逻辑清晰。我们按照一个完整的配置流程来逐一解读关键寄存器的作用和配置要点。2.1 基础配置四步曲上电、时钟、引脚、中断在操作任何功能寄存器之前必须完成底层的基础配置。这就像盖房子前要通电、通水、打好地基一样。第一步电源与时钟使能微控制器为了省电很多外设默认是关闭的。我们需要在功率控制寄存器PCONP中将对应PWM模块的位PCPWM0或PCPWM1置1。手册提到复位后PWM默认是使能的但为了代码的健壮性和可移植性显式地使能它是个好习惯。 接着是时钟。PWM模块的计数时钟来源于PCLK外设时钟。你需要确认PCLK的频率并在外设时钟选择寄存器PCLK_SEL0中为PWM0/1选择正确的时钟源。通常使用默认的CCLK分频即可但如果你需要非常精确或特定频率的PWM可能需要调整PCLK的分频比。第二步引脚功能配置LPC24XX的引脚是复用的一个物理引脚可能对应GPIO、UART、PWM等多种功能。我们需要在对应的引脚选择寄存器PINSELx中将特定引脚的功能设置为PWM输出例如PWM1.1, PWM1.2等。同时引脚模式寄存器PINMODEx可以用来配置引脚的上拉/下拉电阻对于PWM输出引脚通常设置为无上拉无下拉的模式即可。第三步中断配置如果需要如果你需要PWM在匹配或捕获事件时通知CPU就需要配置中断。这分为两层PWM模块级在PWM的匹配控制寄存器MCR中使能特定匹配通道的“中断产生”位例如PWMMR0I。在捕获控制寄存器CCR中使能特定捕获通道的“中断产生”位。中断控制器VIC级在向量中断控制器VIC中找到PWM对应的中断号设置其优先级并在VICIntEnable寄存器中使能该中断。最后别忘了在启动文件中设置好中断向量表并编写对应的中断服务函数ISR。第四步PWM模块初始化这是核心步骤我们接下来详细展开。2.2 核心寄存器详解与配置公式完成基础配置后我们就可以对PWM模块本身进行精细控制了。下面这个表格汇总了最关键的几个寄存器寄存器名称地址偏移 (PWM0为例)核心功能关键位/字段说明PWM0TCR0x4004定时器控制Bit0: 计数器使能 (1启动)。Bit1: 计数器复位 (1复位需手动清0)。Bit3: PWM模式使能 (1PWM模式计数器复位到1)。Bit4: 主模式使能 (仅PWM0有1同时控制PWM0/1)。PWM0PR0x400C预分频寄存器32位值。TC递增频率 PCLK / (PR 1)。PWM0MR00x4018匹配寄存器0定义PWM周期。在PWM模式下MR0匹配时必须复位TC。PWM0MR1~MR60x401C~0x4048匹配寄存器1~6定义各PWM通道的边沿位置占空比。PWM0MCR0x4014匹配控制寄存器控制每个MR匹配时的行为。对于MR0必须设置“复位TC”位(PWMMR0R1)。其他MRx根据需要设置中断。PWM0PCR0x404CPWM控制寄存器Bit0~5: PWMENA1~6输出使能。Bit8~12: PWMSEL2~6通道模式选择 (0单边沿1双边沿)。PWM0LER0x4050加载使能寄存器Bit0~6对应MR0~MR6。写1使能对应影子寄存器的值在下一个MR0匹配时加载。写操作后自动清零。PWM频率与占空比计算这是配置的重中之重公式必须清晰PWM时钟频率Timer Clock:F_timer F_pclk / (PR 1)F_pclk是你的外设时钟频率比如60MHz。PR是预分频值32位可调范围很大。PWM周期Period:T_pwm (MR0) / F_timer因为PWM模式下TC从1开始计数到MR0匹配后复位所以一个周期总共计数MR0次。因此PWM频率为:F_pwm F_timer / MR0 F_pclk / ((PR 1) * MR0)单边沿PWM占空比Duty Cycle:Duty (MR0 - MRx) / MR0对于单边沿模式输出在周期开始为高在MRx匹配时变低。高电平时间为MRx个计数时钟。所以占空比 MRx / MR0。但注意有些平台定义占空比为高电平时间比周期有些定义为低电平。这里根据LPC24XX行为高电平时间对应MRx因此占空比 MRx / MR0。例如MR01000 MR2300则PWM2高电平占30%。双边沿PWM脉宽: 需要两个匹配值MR_set和MR_clear。脉冲宽度 |MR_set - MR_clear|个计数时钟。如果MR_set MR_clear则是正脉冲如果MR_set MR_clear则是负脉冲。实操心得在计算MR0和PR时要兼顾频率精度和分辨率。例如需要1kHz的PWMF_pclk60MHz。如果设置PR0则MR0 60M / 1k 60000这是一个很好的整数值分辨率也很高1/60000。但如果需要20kHz的PWMMR0 3000也合适。如果需要的频率除出来不是整数就要在PR和MR0之间权衡选择一个组合使得(PR1)*MR0尽可能接近F_pclk / F_pwm同时保证PR和MR0在有效范围内。2.3 完整配置流程示例生成1kHz单边沿PWM假设我们需要从PWM2引脚输出一个频率1kHz占空比30%的单边沿PWM波F_pclk 60MHz。计算参数选择PR 59。则F_timer 60MHz / (591) 1MHz。计算MR0:MR0 F_timer / F_pwm 1MHz / 1kHz 1000。计算MR2控制PWM2下降沿: 占空比30%高电平时间对应MR2 MR0 * Duty 1000 * 0.3 300。C语言配置代码以PWM0为例// 1. 基础使能 (通常在系统初始化时完成) // PCONP | (1 5); // 使能PWM0复位后默认已使能 // 配置PWM引脚功能例如P1.2为PWM1.2 // PINSEL3 | (1 5); // 将P1.2设置为PWM1.2功能 // 2. 配置PWM频率和占空比 PWM0PR 59; // 预分频值 PWM0MR0 1000; // 周期值 PWM0MR2 300; // PWM2占空比匹配值 // 3. 配置匹配控制寄存器MR0匹配时复位计数器其他根据需要 PWM0MCR (1 1); // 设置 PWMMR0R 1 MR0匹配时复位TC // 如果需要MR2匹配中断可以加上 (1 6)即PWMMR2I // 4. 配置PWM控制寄存器使能PWM2输出并选择单边沿模式 PWM0PCR (1 10); // 位10是PWMENA2使能PWM2输出 // PWMSEL2默认为0即单边沿模式无需设置 // 5. 使能影子寄存器加载关键步骤 PWM0LER (1 0) | (1 2); // 使能MR0和MR2的影子寄存器加载 // 6. 启动PWM定时器 PWM0TCR (1 3); // 首先使能PWM模式Bit31计数器复位到1 PWM0TCR | (1 0); // 然后使能计数器Bit01开始计数 // 注意必须先使能PWM模式再使能计数器。也可以同时设置PWM0TCR (13) | (10);这段代码执行后你就能在PWM2引脚上测量到1kHz、占空比30%的方波。关键点在于第5步的LER操作如果不执行这一步你写入MR0和MR2的值不会生效PWM模块会使用复位后的默认值0导致没有输出。2.4 双边沿PWM配置示例与同步更新现在我们来配置一个更复杂的场景使用PWM2和PWM4输出两路双边沿PWM要求严格同步且PWM2输出一个中心对齐的脉冲PWM4输出一个在周期后半段的脉冲。假设F_pclk60MHz, PR59, F_timer1MHz PWM频率仍为1kHzMR01000。PWM2双边沿 我们希望脉冲在周期中间宽度为200个时钟。可以设置上升沿在400下降沿在600。根据映射表PWM2双边沿模式由MR1Set和MR2Clear控制。MR1 400(上升沿)MR2 600(下降沿)PWM4双边沿 我们希望脉冲在700开始900结束。PWM4双边沿模式由MR3Set和MR4Clear控制。MR3 700(上升沿)MR4 900(下降沿)配置代码如下// 1. 配置周期和边沿匹配值 PWM0PR 59; PWM0MR0 1000; // 周期 PWM0MR1 400; // PWM2 上升沿 PWM0MR2 600; // PWM2 下降沿 PWM0MR3 700; // PWM4 上升沿 PWM0MR4 900; // PWM4 下降沿 // 2. 匹配控制MR0复位TC PWM0MCR (1 1); // PWMMR0R 1 // 3. PWM控制使能PWM2和PWM4输出并设置为双边沿模式 PWM0PCR (1 10) | (1 12); // PWMENA21, PWMENA41 PWM0PCR | (1 9) | (1 11); // PWMSEL21, PWMSEL41 (选择双边沿) // 4. 使能所有相关影子寄存器加载 PWM0LER (1 0) | (1 1) | (1 2) | (1 3) | (1 4); // 5. 启动PWM PWM0TCR (1 3) | (1 0); // 使能PWM模式并启动计数器重要注意事项在需要动态更新PWM参数如改变占空比时必须遵循“写影子寄存器 - 设置LER - 等待周期同步生效”的流程。绝对不能直接在中断服务程序或主循环中频繁地、无保护地写入MRx寄存器。正确的做法是将新的匹配值写入MRx然后一次性设置好所有需要更新的通道对应的LER位。PWM硬件会在下一个MR0匹配点周期结束自动将新值载入并清除LER位。这样可以确保波形连续无毛刺。3. 高级应用与实战技巧掌握了基本配置我们可以探索一些更高级的应用场景和解决实际开发中会遇到的问题。3.1 主从模式实现多模块严格同步在一些精密控制场合比如三相全桥逆变需要6路严格同步的PWM来驱动上下桥臂。LPC24XX虽然一个PWM模块最多只能输出6路但通过主从模式可以让PWM0和PWM1两个模块同步工作理论上可以输出12路同步PWM尽管引脚可能不够。配置主从模式非常简单分别配置PWM0和PWM1的PR、MR0等寄存器确保它们的时钟基准和周期一致。在PWM0的TCR寄存器中将Bit4Master Disable置为1。此时PWM0的“主使能”信号会输出并连接到两个模块的使能端。当使能PWM0的计数器TCR[0]1时PWM1的计数器也会被同步使能。当复位PWM0的计数器TCR[1]1时PWM1的计数器也会被同步复位。这意味着你只需要控制PWM0就可以同时控制两个模块的启动、停止和复位。这对于需要严格同步的多路PWM生成至关重要可以消除因软件先后启动两个模块而引入的微小相位差。3.2 利用捕获功能进行频率测量或脉冲计数PWM模块的捕获功能常常被忽略但它非常有用。每个PWM模块都带有捕获输入引脚CAPn.x可以捕获外部信号的边沿并记录下当时定时器计数器TC的值。典型应用一测量输入脉冲频率配置一个捕获通道如CAP0.0在上升沿和下降沿都触发捕获。在捕获中断服务程序中读取两次捕获寄存器CR0的值计算差值。差值代表了输入脉冲一个周期或半周期内TC的计数个数。结合已知的TC计数频率F_timer即可计算出输入脉冲的频率或占空比。// 示例测量CAP0.0输入频率 PWM0CCR | (1 0) | (1 1) | (1 2); // 使能CAP0.0的上升沿、下降沿捕获及中断 // 在中断中 static uint32_t last_capture 0; uint32_t current_capture PWM0CR0; uint32_t period_ticks current_capture - last_capture; // 注意处理溢出 float frequency (float)F_timer / period_ticks; last_capture current_capture;典型应用二计数器模式PWM的定时器还可以工作在计数器模式。通过设置CTCR寄存器可以让TC不再由内部PCLK驱动而是由外部捕获引脚PCAP的边沿来驱动递增。这样它就变成了一个通用的外部事件计数器。例如可以连接一个光电编码器的A相输出来计数电机转过的脉冲数。3.3 生成复杂波形与数字模拟转换DAC通过灵活配置多个双边沿PWM通道并结合简单的RC低通滤波器LPC24XX的PWM模块可以充当一个多通道、中等精度的数字模拟转换器DAC。原理PWM波是一个数字方波但其平均值即直流分量与占空比成正比。用一个电阻和电容组成低通滤波器将PWM方波中的高频成分滤除剩下的就是与占空比成正比的直流电压。Vout Vcc * Duty_Cycle。优势与局限优势节省成本无需外接DAC芯片可以利用多个PWM通道实现多路模拟输出分辨率可以很高取决于MR0的值32位理论分辨率。局限输出不是真正的模拟量仍有纹波建立时间受限于PWM频率和滤波器截止频率响应速度慢输出驱动能力弱通常需要运放缓冲。提高DAC性能的技巧提高PWM频率在满足滤波器设计的前提下尽量提高PWM频率可以使滤波后的纹波更小响应更快。但频率越高占空比分辨率越低因为MR0变小了。需要在频率和分辨率之间权衡。使用中心对齐双边沿PWM中心对齐PWM的频谱能量更集中在开关频率及其倍频上更容易被滤波器滤除相比左对齐PWM能提供更平滑的模拟输出。采用高阶滤波器一阶RC滤波器滚降慢纹波大。可以使用二阶或更高阶的有源滤波器来获得更陡的滚降和更干净的输出但电路更复杂。4. 常见问题排查与调试心得在实际项目中PWM配置不出波形或者波形不对是家常便饭。下面是我总结的一些常见问题点和排查思路。4.1 问题速查表现象可能原因排查步骤与解决方法完全没有PWM输出1. 引脚功能未配置。2. PWM模块时钟未使能。3. 输出未使能PCR.PWMENAx。4. 定时器未启动TCR[0]0。5. MR0设置为0。1. 检查PINSELx寄存器确认引脚已复用为PWM功能。2. 检查PCONP和PCLK_SEL0寄存器。3. 检查PWM0PCR的PWMENA1~6位是否置1。4. 检查PWM0TCR的Bit0和Bit3是否都已置1。5. MR0必须大于0否则周期为0无输出。PWM输出频率不对1. PCLK频率计算错误。2. PR或MR0计算错误。3. 未启用PWM模式TCR[3]0。1. 确认系统时钟配置计算准确的PCLK频率。2. 重新核对公式F_pwm F_pclk / ((PR1)*MR0)。3.特别注意在PWM模式下TCR[3]1计数器从1开始计数到MR0然后复位。如果误工作在定时器模式从0开始频率会翻倍。占空比不可调或不对1. 匹配寄存器值设置错误。2. 影子寄存器未加载未写LER。3. 单/双边沿模式混淆。1. 确认MRx的值在0到MR0之间。对于单边沿占空比 MRx / MR0。2.最关键的一步修改MRx后必须写LER寄存器使能加载。例如PWM0LER (1 x);。3. 检查PCR.PWMSELx位确认通道工作在预期模式。波形上有毛刺1. 在PWM周期中间动态写MRx且未使用LER。2. 中断服务程序执行时间过长影响了下一个周期的匹配。1.绝对禁止在周期中直接写MRx。所有参数更新必须通过写MRx写LER的方式在周期边界同步。2. 优化中断服务程序只做最必要的操作如设置标志将复杂处理放到主循环。多路PWM不同步1. PWM0和PWM1未使用主从模式且使能时间有先后。2. 各通道的MR0值不同。1. 如果需要严格同步使用PWM0的主模式TCR[4]1来控制两个模块。2. 确保所有PWM通道使用同一个MR0作为周期基准。捕获功能不工作1. 捕获引脚功能未配置。2. 捕获控制寄存器CCR未使能。3. 计数器未运行。1. 检查捕获引脚的PINSEL配置。2. 检查CCR中对应捕获通道的边沿检测和中断位是否使能。3. 确保TCR[0]1计数器在运行。4.2 调试技巧与工具使用寄存器查看在调试器如Keil MDK, IAR EWARM中实时查看PWM相关寄存器的值特别是TCR、TC、MRx和IR中断标志寄存器这是最直接的诊断方法。逻辑分析仪/示波器这是观察PWM波形的终极工具。不仅可以看频率、占空比还能看多路之间的相位关系以及检查波形是否有毛刺。测量时注意探头地线要接好。分步调试法如果完全没有输出采用“从简到繁”的策略第一步先配置一个最简单的单边沿PWM如PWM1只使用MR0和MR1确保基础功能正常。第二步再逐步增加通道改为双边沿模式。第三步最后尝试动态更新占空比、主从同步等高级功能。计算验证在修改PR和MR0值前先用计算器或Excel表格算好目标频率下的理论值。将理论值与实际测量值对比如果偏差大往往是时钟源PCLK的频率和自己想的不一样。注意复位值很多寄存器复位后是0而0对于PR、MR0等寄存器可能是非法值导致无输出。初始化代码中必须给所有用到的寄存器赋予明确的值不要依赖复位状态。最后分享一个我个人的深刻教训在一次电机控制项目中我为了追求高分辨率将MR0设置得非常大接近2^32同时PR设置得很小。结果发现PWM输出极其不稳定时有时无。后来才发现当TC计数值很大时频繁地访问TC寄存器比如在中断中读取或者进行某些寄存器操作可能会干扰计数器的正常运行尤其是在主频不高的情况下。经验是在满足分辨率要求的前提下尽量让MR0的值小一些通过增大PR来降低定时器时钟F_timer这样系统会更稳定。对于大多数应用让F_timer在1MHz到10MHz之间MR0在1000到10000之间是一个比较稳妥的选择。