我已获取了足够的依据。现在我已经清楚了解 HSPWM 的技术细节,可以针对论坛用户的问题给出专业、准确的解答。
关于 STC8H 系列 HSPWM(高速高级 PWM)使用条件的解答
您好!针对论坛帖子中提出的 "HSPWM 什么条件下应该使用?CPU 频率和 PWM 频率相差多少要使用 HSPWM?临界点是多少?" 这个问题,我依据《STC8H 系列手册》相关章节为您梳理如下。
一、HSPWM 的本质:不是"频率差决定",而是"PWM 时钟源选择"
首先需要纠正一个常见理解误区:
HSPWM 并不是根据"CPU 频率和 PWM 频率相差多少"来切换的,它的核心是——是否把 PWM 的时钟源从"系统工作频率(MCLK)"切换为" PLL 时钟(独立高频源)"。
手册「27 高速高级PWM」章节原文说明:
当关闭异步控制时,高级PWMA/高级PWMB为传统模式,此时高级PWM会自动选择系统工作频率,PWM工作频率与系统工作频率相同;若需要时PWM工作在高速模式,则需要使能异步控制模式,此时PWM时钟可选择主时钟(MCLK)或者PLL输出时钟。
也就是说,选择 HSPWM 的判据是:
| 场景 |
应选择的模式 |
时钟源 |
| PWM 输出频率 ≤ 系统工作频率能够满足 |
传统模式(ASYNCEN=0) |
系统工作频率 SYSclk(MCLK) |
| 系统跑在较低频率、但需要很高的 PWM 载波频率 |
高速模式(ASYNCEN=1) |
PLL 输出时钟(96MHz 或 144MHz) |
二、手册明确的"适用条件"
手册「27 高速高级PWM」章节对使用场景的原文描述是:
当系统运行在较低工作频率时,高速高级PWM可工作在高达 144M~192M 的频率下。从而达到降低内核功耗,提升外设性能的目的。
这就是手册给出的"临界条件"逻辑:
- HSPWM 的典型设计目标是——让 MCU 内核跑低频(省功耗),而 PWM 外设跑高频(保性能)。
- 因此,判断是否需要 HSPWM 的决定性因素不是"两个频率差多少",而是:在传统模式下,用当前系统频率 SYSclk 无法产生你所需的 PWM 载波频率时,就应该启用 HSPWM。
三、用公式定量说明"临界点"
手册「25 16位高级PWM定时器」给出了 PWM 输出频率公式(边沿对齐):
PWM输出频率 = \frac{PWM时钟源频率}{(PWMx\_PSCR + 1) \times (PWMx\_ARR + 1)}
传统模式下,PWM 时钟源 = 系统工作频率 SYSclk,因此:
PWM_{max} = \frac{SYSclk}{1 \times 1} = SYSclk
(PSCR、ARR 最小取 0,即不分频、不计数分频)
👉 所以传统模式能输出的最高 PWM 频率,理论上就等于系统工作频率 SYSclk。
例如:
- 系统跑 24MHz,传统模式 PWM 最高约 24MHz;
- 但若你用的是 FOC 电机控制,常常需要 几十 kHz 甚至上百 kHz 的载波,且要求高分辨率(ARR 值大),此时 24MHz 的 SYSclk 会分辨率严重不足——这就是手册所说"系统运行在较低工作频率时"的困境。
此时启用 HSPWM,把 PWM 时钟源切到 PLL 的 96MHz / 144MHz:
- PWM 时钟源从 24MHz 提升到 144MHz,相同的载波频率下,ARR 可大 6 倍,分辨率显著提高;
- 或者相同分辨率下,载波频率可高 6 倍。
四、PLL 时钟源与配置要点
手册「7 时钟、复位、看门狗与电源管理」明确:
部分支持使用高速PLL时钟作为时钟源的外设包括:高速PWM、高速SPI
PLL 输出时钟由 CLKSEL 寄存器 CKMS 位选择:
| CKMS |
PLL 输出 |
| 0 |
PLL 输出96MHz |
| 1 |
PLL 输出144MHz |
时钟源切换由 CLKSEL 寄存器的 HSIOCK 位控制:
| HSIOCK |
高速 I/O 时钟源 |
| 0 |
主时钟 MCLK |
| 1 |
PLL 输出 96MHz/144MHz(PLLCLK) |
配置步骤(手册「27 高速高级PWM」范例程序):
/* 1. 使能 PLL 倍频,选择 PLL 输出频率 */
PLLCR |= 0x80; /* ENCKM=1 使能 PLL 倍频 */
CLKSEL |= 0x80; /* CKMS=1 → PLL 输出 144MHz */
/* 2. 选择 HSPWM 时钟源为 PLL 输出 */
CLKSEL |= 0x40; /* HSIOCK=1 → HSPWM/HSSPI 选择 PLL 输出时钟 */
HSCLKDIV = 0; /* HSPWM/HSSPI 时钟源不分频 */
/* 3. 使能 PWMA 异步访问功能(进入高速模式) */
HSPWMA_CFG = 0x03; /* INTEN=1, ASYNCEN=1 */
⚠️ 重要提醒(手册原文特别注意):PWMA_PS 和 PWMB_PS 属于端口控制寄存器,不属于 PWMA/PWMB 寄存器组,所以无论是否启动异步控制模式,这两个寄存器都只能使用普通同步模式读写。
五、关于您提到的"FOC 中断里用 HSPWM 根本来不及处理"
这是一个非常典型且真实的问题,需要从两个层面看:
-
HSPWM 本身不会让中断"变慢"——它只是提高了 PWM 的时钟源频率。异步模式下若要响应 PWMA/PWMB 中断,手册明确要求:
异步模式下,若需要响应高级PWMA/高级PWMB的中断,则必须使能 INTEN 位。
如果 INTEN=0,你在异步模式下是收不到 PWM 中断的,容易误判为"来不及处理"。
-
PWM 载波频率越高 → 中断触发越频繁 → CPU 负担越重。FOC 中如果载波选到很高(如 100kHz+),中断间隔只有 10μs,若中断服务程序不够精简(或主频偏低),确实会处理不过来。这与是否用 HSPWM 无直接关系,取决于载波频率设置与中断代码效率。
建议:
- FOC 载波频率先按电机和算法需求确定(通常 10~20kHz 已足够);
- 在满足分辨率的前提下,能用传统模式就不必上 HSPWM,避免无谓增加外设时钟与中断压力;
- 若必须高频载波且要省内核功耗,再启用 HSPWM,并确保 ISR 足够精简。
六、结论:什么条件下应该使用 HSPWM?
综合手册原文,符合以下情形时才建议使用 HSPWM:
- ✅ 系统主频较低(如 24MHz 或更低),但需要较高的 PWM 载波频率或高分辨率;
- ✅ 希望内核跑低频省功耗、同时 PWM 外设跑高频保性能(这是 HSPWM 的设计初衷);
- ✅ 需要把 PWM 时钟源从 MCLK 切换到 PLL 的 96M/144M 独立高频时钟。
反之,以下情况无需 HSPWM:
- ❌ 系统频率已经足够高、传统模式即可满足载波频率与分辨率;
- ❌ 对 PWM 分辨率、载波频率要求不高;
- ❌ 想省事、避免异步模式带来的配置复杂度(如
PWMA_PS 仍需同步访问等)。
关于手册未提供的"临界点数值表格": 经查询,《STC8H 系列手册》「27 高速高级PWM」及「25 16位高级PWM定时器」章节中,确实未给出"CPU 频率与 PWM 频率相差多少必须切 HSPWM"的固定数值表格。判断依据是上面第三节的公式——当 SYSclk 无法满足你所需的 PWM 频率/分辨率时,即为切换临界点,这是一个由需求反推的工程判断,而非手册固定的阈值。
(以上依据章节:《STC8H系列手册》「27 高速高级PWM」「25 16位高级PWM定时器,支持正交编码器」「7 时钟、复位、看门狗与电源管理」)
如果您能提供 FOC 具体的载波频率需求、期望的死区/分辨率、以及当前系统主频,我可以帮您具体计算应选传统模式还是 HSPWM,并给出推荐的 PSCR/ARR 参数。需要的话请告诉我。
🔍 搜索 "STC 单片机 论坛 帖子"
⏱️ 查找用时 9.0s | 总回答用时 21.7s