LPC5536 外设 SCT 生成的 PWM 与 eFlexPWM 生成的 PWM 相位差设置

1.多电机控制相位差要求

2.eFlexPWM 计时器重载介绍

3.SCT 触发信号产生

4.测试验证

5.参考文档


1. 多电机控制相位差要求

    电机控制的 PWM 信号一般由 MCU 的高级定时器生成,LPC5536 具有 2 个 eFlexPWM 外设,每个  eFlexPWM 外设可生成 6 路(3对互补)PWM,可以用于控制 2 个 PMSM,如果需要一个 MCU 控制 3 个或 4 个电机,可使用 LPC5536 特有的 SCT (state control timer)定时器生成,LPC5536 内核 Cortex-M33,主频高达 150MHz,并具有硬件 DSP,可同时控制 4 个电机的,但在处理是需要在每个 PWM 时间内错开处理每个电机的控制,下图为单个 eFlexPWM 时在下桥打开中点采样电流值,完成后运行 FOC 的时序图。

     当多个电机时 ADC 采样和计算实现不能冲突,否则采样不到正确的电流,并且 FOC 计算并步伐将会被打乱,造成电机无法控制等问题,本文介绍如何将 SCT 和 eFlexPWM 生成的 PWM 相位错开 180°,并保持同步,时序如下图所示:


2. eFlexPWM
计时器重载介绍

    eFlexPWM 计时器 counter 部分的框图如下图所示, counter 可通过 FORCE_OUT、Local Reload、MasterReload、Master Sync 、PWM_EXT_SYNC 外部触发信号触发后重新计数,从而控制 SCT 和 eFlexPWM 的相位差,因为其内部的操作都是以各自的 counter 为时间基准,通过在 INIT_SEL 寄存器中选择 PWM_EXT_SYNC 信号,eFlexPWM  可被 SCT 触发重新计数,如下图所示:

 

此操作的 eFlexPWM 代码配置:

 /* INIT_SEL,counter load init value,Local sync,Master reload,Master sync,EXT_SYNC */

  PWM0->SM[0].CTRL2 |= (uint16_t)(0x3UL <<  8UL);


3. SCT 触发信号产生

    SCT 是一个基于事件和状态的半定制的定时器,可灵活配置满足不同的控制要求,本文使用 Match 9 (匹配寄存器 9)和 Event 9(事件 9)使 SCT 在切确的时机产生触发信号,触发 eFlexPWM 的 counter 重新计数, Match 9 设置为触发事件的时间点,到达时间后产生 Event 9 事件, SCT0_OUT4 关联 Event 9 事件, SCT0_OUT4  通过 INPUTMUX 多路选择器路由至 PWM_EXT_SYNC。

代码和注释如下所示:

void SCT0_eFlexPWM0_Sync(void)
{
/* INIT_SEL,counter load init value,Local sync,Master reload,Master sync,EXT_SYNC */
PWM0->SM[0].CTRL2 |= (uint16_t)(0x3UL << 8UL);

/* Enables the clock for the Input Mux */
SYSCON->AHBCLKCTRLSET[0] = (1UL << 11UL);

INPUTMUX->PWM0_EXTSYNC[0] = INPUTMUX_PWM0_EXTSYNCN_PWM0_EXTSYNC_TRIGIN(2UL);

SCT0->CTRL |= (1UL << 2UL); /* HALT_H */

/* Sync eFlexPWM0, Delay 180° Clear eFlexPWM0 SM[0] Counter */
SCT0->MATCH[9] = (uint32_t)(MCU_CLOCK_FREQ/M1_PWM_FREQ/2UL - 1UL);
SCT0->MATCHREL[9] = (uint32_t)(MCU_CLOCK_FREQ/M1_PWM_FREQ/2UL - 1UL);

/* Event 9, Sync eFlexPWM0 */
SCT0->EV[9].CTRL |= (9UL << 0UL)| /* MATCHSEL select MATCH register */
(0UL << 4UL)| /* HEVENT Select L/H counter. Do not set this bit if UNIFY = 1 */
(0UL << 5UL)| /* OUTSEL Input/output select */
(0UL << 6UL)| /* IOSEL Selects the input or output signal number */
(0UL << 10UL)| /* IOCOND Selects the I/O condition for event n */
(0x1UL << 12UL)| /* COMBMODE Selects how the specified match and I/O condition are used and combined. */
(0x0UL << 14UL)| /* STATELD STATEV value is added or loaded into STATE */
(0x0UL << 15UL)| /* STATEV This value is loaded into or added to the state */
(0x0UL << 20UL)| /* MATCHMEM If this bit is zero, a match is only be active during the cycle */
(0x0UL << 21UL); /* DIRECTION BIDIR mode,0 Direction independent.1 Counting up.2 Counting down. */

/* SCT0_OUT4 */
SCT0->OUT[4].SET = (1UL << 9UL);
SCT0->OUT[4].CLR = 0UL;
SCT0->CTRL &= (uint32_t)(~(1UL << 2UL)); /* HALT_L = 0,START COUNTER */
}

4
. 测试验证

    SCT 和 eFlexPWM 的介绍和 PWM 的生成、引脚配置等请参阅前面的博文,SCT 生成的 PWM 通过 SCT0_OUT0 输出,eFlexPWM 的PWM 通过 PWM0_A0 输出,可通过示波器直接测量两信号进行验证,

下图黄色探头为 SCT0_OUT0 ,蓝色探头为 PWM0_A0 ,它们的相位刚好相差 180°,和代码中 SCT0->MATCHREL[9] 的配置是一致的。


5
. 参考文档

    LPC5536 参考手册:    

    https://www.nxp.com.cn/docs/en/reference-manual/LPC553xRM.pdf

★博文内容均由个人提供,与平台无关,如有违法或侵权,请与网站管理员联系。

★文明上网,请理性发言。内容一周内被举报5次,发文人进小黑屋喔~

评论