• 正文
  • 相关推荐
申请入驻 产业图谱

用 PLAY (Programmable logic array) 实现 PWM 波的三态输出

21小时前
203
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

在电机、数字电源产品中,经常需要对 PWM 输出做三种状态切换:正常 PWM 输出、强制高电平 (Force Active)、强制低电平 (Force InActive)。 普通高级定时器可以修改 BDTR/CCER 寄存器,HRTIM 可以修改 SET/RESET 事件实现强制输出,但软件改写寄存器会出现在 PWM 周期中间立即生效,容易产生毛刺窄脉冲,带来电力电子器件直通风险;并且逻辑扩展能力有限。

STM32G5 新增PLAY 可编程逻辑阵列外设,内含 16 个 LUT 查找表,可以组合内部定时器信号、软件 SWIN 寄存器位,全部逻辑在硬件内部完成。本方案利用 PLAY 实现和 PWM 周期同步的三态输出切换,指令只会在 PWM 周期起点生效,避免毛刺脉冲,无需外部逻辑芯片。本文还原逻辑原理、CubeMX2 完整配置步骤、真值表定义、波形现象以及工程踩坑清单。

核心价值:软件写 SWIN 控制位,但硬件由 TIMx_TRGO 更新事件做同步锁存,强制输出指令不会在周期中途插入。

资料获取:实战经验 | LAT1704 用PLAY(Programmable logic array)实现PWM波的三态输出

1 PLAY 外设基础简介

PLAY 可编程逻辑阵列主要资源:

  1. 16 个 LUT 查找表单元,每个 LUT 支持 4 路输入、1 路输出;
  2. 信号来源:外部 GPIO 引脚、片上外设内部信号、软件寄存器PLAY_SWIN的 SWIN0‑SWIN15 软件位;
  3. LUT 输出可以直接作为其它 LUT 的输入,实现多级组合逻辑;
  4. 支持时钟门控同步,可以用定时器 TRGO 事件做同步采样,消除异步软件指令带来的毛刺。

本案例硬件资源分配:

表格

模块 用途说明
TIM4_CH4 原始 PWM 信号源,PWM Mode1 输出
TIM4_TRGO 定时器更新事件,PWM 周期起点同步时钟信号
SWIN0、SWIN1 PLAY 软件控制位,三态模式选择指令
LUT0 同步锁存 SWIN0,TIM4_TRGO 作为时钟门控,真值表0xAAAA
LUT1 同步锁存 SWIN1,TIM4_TRGO 作为时钟门控,真值表0xAAAA
LUT2 三选一组合逻辑:PWM / Force‑Active / Force‑InActive,真值表0xE8E8
PLAY_OUT0 最终输出到 GPIO 引脚,观测波形

模式指令定义(SWIN0 / SWIN1)

表格

SWIN0 SWIN1 输出模式
0 0 强制低电平 Force InActive
1 1 强制高电平 Force Active
其余组合 其余组合 原始 TIM4_CH4 正常 PWM 输出

关键点:CPU 改写 SWIN0/SWIN1 之后,并不会立刻生效;要等待 TIM4_TRGO (PWM 周期起点) 到来,LUT 才会锁存指令,执行模式切换。

2 完整实现流程(CubeMX2 配置)

2.1 输入 MUX 信号路由配置

  1. IN MUX7:信号源选择TIM4_TRGO_CKTIM,作为 LUT0/LUT1 时钟门控源;滤波器 Bypassed 直通。
  2. IN MUX8:信号源选择TIM4_OC4,接入原始 PWM 输出信号。

TIM4_TRGO 配置为定时器 Update 更新事件,每一个 PWM 周期产生一次脉冲,代表周期起始位置。

2.2 LUT0 与 LUT1 配置(软件位同步锁存)

  • LUT0:IN0 来源Software trigger,选择 SWIN0;时钟门控源IN MUX7(TIM4_TRGO);真值表0xAAAA。
  • LUT1:IN0 来源Software trigger,选择 SWIN1;时钟门控源IN MUX7(TIM4_TRGO);真值表0xAAAA。

0xAAAA真值表含义:LUT 输出直接等于 IN0 输入;时钟门控到来时刻,才采样锁存 SWINx 的值,把软件异步指令同步到 PWM 周期边界。没有 TRGO 脉冲,LUT 输出保持不变。

2.3 LUT2 配置(三选一输出组合逻辑)

LUT2 实现三选一逻辑,输入分别为:

  • IN0:来自 IN MUX8(TIM4_OC4 原始 PWM)
  • IN1:LUT0 输出(同步之后 SWIN0)
  • IN2:LUT1 输出(同步之后 SWIN1)
  • 时钟门控源:Always enabled,不做额外同步;真值表填写0xE8E8。

逻辑行为:

  1. LUT0_OUT=0、LUT1_OUT=0 →输出强制低;
  2. LUT0_OUT=1、LUT1_OUT=1 →输出强制高;
  3. 其余输入组合 →直接输出原始 PWM 波形。

2.4 PLAY 输出路由

将 LUT2 输出连接到PLAY_OUT0,映射到 MCU GPIO 引脚,示波器可以直接观测输出波形。配置完成开启 PLAY 外设,生成初始化工程代码。

2.5 软件控制逻辑

应用层只需要改写PLAY_SWIN寄存器的 SWIN0、SWIN1 两位,硬件自动等待下一个 PWM 周期起点执行切换,软件不需要处理定时器同步。

//强制低电平
MODIFY_REG(PLAY->SWIN, PLAY_SWIN_SWIN0|PLAY_SWIN_SWIN1, 0U);

//强制高电平
MODIFY_REG(PLAY->SWIN, PLAY_SWIN_SWIN0|PLAY_SWIN_SWIN1, PLAY_SWIN_SWIN0|PLAY_SWIN_SWIN1);

//恢复正常PWM输出
MODIFY_REG(PLAY->SWIN, PLAY_SWIN_SWIN0|PLAY_SWIN_SWIN1, PLAY_SWIN_SWIN0);

示波器现象:原始 TIM4_CH4 波形不受影响;PLAY_OUT 输出只会在每个 PWM 周期边界切换强制 / 正常模式,周期中间不会出现异常毛刺脉冲。

3. 工程落地排查清单

  1. 切换 SWIN0/SWIN1,PLAY 输出完全不变化
    • 核查 IN MUX7 是否正确选择TIM4_TRGO_CKTIM;确认 TIM4 主模式已经开启 Update 事件输出 TRGO;
    • LUT0/LUT1 时钟门控源必须选 IN MUX7,真值表确认填写0xAAAA;
    • 确认 PLAY 外设时钟已经开启,外设使能位打开。
  2. 模式切换会在 PWM 周期中间发生,产生毛刺脉冲
    • 故障根因:LUT0/LUT1 时钟门控没有绑定 TIM4_TRGO,软件 SWIN 修改立刻异步生效;
    • 修复:LUT0、LUT1 必须配置时钟门控源为 TIM4_TRGO,实现周期同步锁存。
  3. 强制高低电平正常,但 PWM 模式输出无波形
    • 核查 IN MUX8 输入源是否为 TIM4_OC4;LUT2 真值表确认填写0xE8E8;核对 LUT2 三路输入来源。
  4. TIM4 有 PWM 输出,但 PLAY_OUT 一直为固定电平
    • 检查 PLAY 输出 MUX,确认 LUT2 输出已经路由到 PLAY_OUTx 对应的 GPIO;GPIO 复用功能配置为 PLAY 输出。
  5. 修改 CubeMX 配置,重新生成代码后 PLAY 逻辑失效
    • 确认 CubeMX2 中 PLAY 全部 LUT、MUX、真值表参数完整保存;PLAY 配置项重新核对。

4. 小结

  1. STM32G5 的 PLAY 可编程逻辑阵列,借助 LUT 查找表、TIM4_TRGO 周期同步,实现 PWM 三态输出(正常 PWM / 强制高 / 强制低);强制输出动作只会发生在 PWM 周期起点,消除中途切换产生的毛刺脉冲,适合数字电源、电机驱动安全保护场景。
  2. LUT0、LUT1 真值表0xAAAA完成 SWIN 软件位同步锁存;LUT2 真值表0xE8E8完成三选一组合逻辑;TIM4_TRGO 作为同步时钟门控是本方案的核心。
  3. 软件仅操作 PLAY_SWIN 寄存器 SWIN0、SWIN1 控制模式,周期同步全部由 PLAY 硬件自动完成,CPU 无需介入定时器中断。
  4. 对比传统改写定时器寄存器实现强制输出,PLAY 方案硬件完成同步,避免异步软件操作带来窄毛刺脉冲;同时可以扩展更加复杂保护逻辑,不需要外部 FPGA / 逻辑器件。

5. FAQ

Q:这套方案可以直接用于互补 PWM(带死区)半桥驱动吗?

A:原理可行,需要两路独立 PLAY 链路分别处理 CHx、CHxN 互补信号,同时注意死区由 TIM 内部 BDTR 产生,PLAY 只做后级强制输出。

Q:如果 PWM 频率改变,PLAY 配置需要修改吗?

A:不需要修改 LUT 真值表,TIM4_TRGO 跟随 PWM 周期自动变化,硬件同步逻辑不受 PWM 频率影响。

Q:SWIN 修改之后,最长要等待多久才生效?

A:最多等待一个完整 PWM 周期,在下一个 TRGO 更新事件到来执行模式切换。

免责声明:本文全部基于 ST 官方 LAT1704 文档,PLAY 外设 LUT、MUX 配置请以 RM0514 参考手册、CubeMX2 配置界面为准。

相关推荐