我使用PWM+故障+QTimer来实现电机脉冲控制,但PWM3子模块0的PWM_A通道偶尔无法启动,在第一个高电平之后就一直保持高电平,后续脉冲不再出现。检查后发现,PWM的“运行”位没有正确设置。即使后来在程序中添加了重复启动操作,这种异常情况仍然发生。
你好@liu626 ,
你用的是定制板还是EVK板?如果你使用的是 EVK,你对它进行过任何修改吗?
能否分享一下您使用的PWM3配置?
您是使用示例作为参考吗?如果是,是哪一个?
如果尝试使用仅包含 PWM3 的项目来重现该问题,问题是否仍然存在?
这种情况是否只发生在 PWM3 子模块 0 PWM_A 通道上?其他PWM模块或子模块是否也出现过这种情况?
是否还有其他任务或中断会操作 PWM3 寄存器,从而影响或覆盖运行位?
此致,
巴勃罗
你好@liu626 ,
您能否帮我找出配置问题,并测试一下仅初始化 PWM3 时问题是否仍然存在?
在查看了您分享的配置后,为了尝试重现该行为,我有以下问题:
axis_ctrl_t 的定义是什么?
您的应用程序中是否启用了 HARD_PWM_LOW_START_PHASE_ENABLE 和 HARD_PWM_STATE_GUARD_ENABLE?
以下APP功能是做什么用的?
APP_PWM_Unmap_Selected_Fault
APP_PWM_ClearFault_Safe
APP_PWM_禁用输出
APP_QTMR_Disable_Low_OFLAG_Output
APP_StateGuard_Reset
APP_PWM_SelectPrescaler_FromPeriodCnt400M
APP_PwmModuleMask
此致,
巴勃罗
感谢你的回复。我使用的 GPIO 引脚是 rt1176 的 GPIO_EMC_B1_29。“axis_ctrl_t”是与电机轴相关的定义。
* PWM 输出脉冲 -> 触发 XBAR 信号 -> 脉冲下降沿驱动 QTMR 的外部时钟输入 ->
* QTMR 32 位级联计数器递减 1 -> 当计数器达到 0 时,触发 QTMR 比较中断 -> 中断内部关闭 PWM
* 同时,QTMR 触发硬件故障,直接拉低 PWM 的物理输出引脚。。ID= AXIS_Y,
。姓名= "Y", /* 用于串口日志记录或断点调试,以识别 Y 轴 */
/* ================= PWM 输出资源分配 ================= */
.pwmBase= PWM3, /* Y轴使用FlexPWM3模块 */
.pwm模块= kPWM_Module_0, /* 使用 PWM3 的子模块 0(每个 PWM 有 4 个子模块,编号从 0 到 3) */
.pwm通道= kPWM_PwmA, /* 使用子模块 0 的 A 相输出引脚,对应于物理引脚 GPIO_EMC_B1_29 */
/* ================= 32 位 QTMR 级联计数资源分配 ================= */
.tmrBase= TMR3, /* Y轴使用QTMR3外设(对应于IRQ中断号TMR3_IRQn) */
低= kQTMR_Channel_0, /* 16 位低计数器:使用 TMR3 的通道 0 */
.highCh= kQTMR_Channel_1,/* 16 位高位计数器:使用 TMR3 的通道 1 */
/*
/* ================= 硬件级联时钟源配置(核心关键) ================= */ .tmrInputsrc=kQTMR_ClockCounter0InputPin,
/* 通道 0 的时钟源:设置为“外部引脚输入 0”。
在 XBAR 配置中,PWM3 脉冲的下降沿通过 XBAR 连接到 TMR3 通道 0 的输入引脚。
因此,每次 PWM 输出脉冲时,通道 0(16 位)将执行一次减量操作。*/
.cascadePcs = 4U,
/* 高 16 位通道(通道 1)的时钟源 (PCS) 配置。
在 i.MX RT 的 QTMR 寄存器中,PCS 值对应如下:
0-3 = 外部引脚输入;
4 = 通道 0 的溢出/终止事件;
5 = 通道 1 的溢出/终止事件;
6 = 通道 2 的溢出/终止事件;
7 = 通道 3 的溢出/终止事件。
这里配置为 4U,意思是:让“TMR3 的通道 1”监测“TMR3 的通道 0 的溢出事件”。
已启用 HARD_PWM_LOW_START_PHASE_ENABLE 和 HARD_PWM_STATE_GUARD_ENABLE。APP_PWM_Unmap_Selected_Fault
功能:移除与当前轴对应的故障引脚映射。调用底层 PWM_SetupFaultDisableMap 函数来禁用故障。目的是为了:在不需要硬件故障的情况下,防止意外的外部干扰导致 PWM 关闭,从而方便底层调试过程。
APP_PWM_ClearFault(原始代码函数)
功能:清除 PWM 模块的故障状态标志(axis->pwmBase->FSTS)。触发硬件故障后,必须先清除此标志,然后才能允许 PWM 重新启动。
APP_PWM_禁用输出
功能:立即停止 PWM 定时器,强制引脚输出低电平(PWM_SetPwmForceOutputToZero),并启用输出。它的目的是确保在电机启动之前,引脚不会因为浮空或处于默认状态而输出高电平,这可能会导致电机运动不规则。
APP_QTMR_Disable_Low_OFLAG_Output
功能:禁用 QTMR 的 OFLAG(状态标志)输出,并强制 OFLAG 处于低电平。它与 XBAR 硬件配合使用,其作用是切断 QTMR 输出到 PWM 故障引脚的路径,防止在启动前意外触发故障。
APP_StateGuard_Reset
功能:清除国家卫队(看门狗)的计数器和旗帜。如果启用 HARD_PWM_STATE_GUARD_ENABLE 时系统遇到长时间无脉冲变化或死锁,则此功能用于在停止或重新启动系统之前重置这些保护变量。
APP_PWM_SelectPrescaler_FromPeriodCnt400M
功能:这是一个非常核心的底层频率计算函数。它接收高电平 + 低电平的总 400MHz 计数值,并计算应设置多少个预分频器 (PRSC) 和 PWM 周期 (PERIOD) 才能放入 16 位 PWM 寄存器中。请注意:如果计算出的周期超过 65535 且除法系数超出范围,则此函数将返回 false,导致电机无法启动。
APP_PwmModuleMask
功能:将 PWM 子模块的索引号(例如,值为 0 的 kPWM_Module_0)转换为左移 N 位的位掩码。NXP 的许多 PWM 寄存器(例如 OUTEN、MCTRL)都是逐位控制的。该函数负责生成正确的二进制掩码。