RT1176 PWM startup failed

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

RT1176 PWM startup failed

195件の閲覧回数
liu626
Contributor I

I am using PWM + fault + QTimer to implement motor pulse control, but the PWM3 submodule 0 PWM_A channel occasionally fails to start, where after the first high level it remains constant and subsequent pulses do not appear.After the inspection, it was found that the "run" bit of the pwm was not correctly set. Even though repeated startup operations were added in the program later, this anomaly still occurred.

liu626_0-1782287927569.png

 

0 件の賞賛
返信
2 返答(返信)

124件の閲覧回数
Pablo_Ramos
NXP Employee
NXP Employee

Hi @liu626,

Are you using a custom board or an EVK? If you are using the EVK, did you make any rework to it?

Could you share the configuration you are using for PWM3?

Are you using an example as a reference? If so, which one?

If you try to replicate the issue using a project with only PWM3, does the problem persist?

Does this only happen with PWM3 submodule 0 PWM_A channel? Has this occurred on other PWM modules or submodules?

Is there any other task or interrupt that manipulates PWM3 registers and could affect or overwrite the run bit?

Best Regards,
Pablo

0 件の賞賛
返信

105件の閲覧回数
liu626
Contributor I
hi,I used a custom circuit board. I didn't refer to any examples. This was a problem that was discovered during the official development of the project. I configured six PWM channels for pulse control. Only this channel had problems, while no such issue occurred on the other sub-modules. I checked and found that only this channel was using the PWM3 module. No other interfering factors were detected. Below is my configuration.
static axis_ctrl_t g_axes[AXIS_NUM] =
{
{
.id = AXIS_X1, .name = "X1",
.pwmBase = PWM1, .pwmModule = kPWM_Module_0, .pwmChannel = kPWM_PwmA,
.tmrBase = TMR3, .lowCh = kQTMR_Channel_2, .highCh = kQTMR_Channel_3,
.tmrInputsrc=kQTMR_ClockCounter2InputPin, .cascadePcs = 6U,
.faultNum = 0U, .hwExactSupported = true, .outTrigMask = kPWM_ValueRegisterMask_3,
},

{
.id = AXIS_X2, .name = "X2",
.pwmBase = PWM2, .pwmModule = kPWM_Module_0, .pwmChannel = kPWM_PwmA,
.tmrBase = TMR2, .lowCh = kQTMR_Channel_0, .highCh = kQTMR_Channel_1,
.tmrInputsrc=kQTMR_ClockCounter0InputPin, .cascadePcs = 4U,
.faultNum = 0U, .hwExactSupported = true, .outTrigMask = kPWM_ValueRegisterMask_3,
},

{
.id = AXIS_Y, .name = "Y",
.pwmBase = PWM3, .pwmModule = kPWM_Module_0, .pwmChannel = kPWM_PwmA,
.tmrBase = TMR3, .lowCh = kQTMR_Channel_0, .highCh = kQTMR_Channel_1,
.tmrInputsrc=kQTMR_ClockCounter0InputPin, .cascadePcs = 4U,
.faultNum = 0U, .hwExactSupported = true, .outTrigMask = kPWM_ValueRegisterMask_3,
},

{
.id = AXIS_Z, .name = "Z",
.pwmBase = PWM4, .pwmModule = kPWM_Module_0, .pwmChannel = kPWM_PwmA,
.tmrBase = TMR1, .lowCh = kQTMR_Channel_0, .highCh = kQTMR_Channel_1,
.tmrInputsrc=kQTMR_ClockCounter0InputPin, .cascadePcs = 4U,
.faultNum = 0U, .hwExactSupported = true, .outTrigMask = kPWM_ValueRegisterMask_3,
},

{
.id = AXIS_EX1, .name = "EX1",
.pwmBase = PWM1, .pwmModule = kPWM_Module_1, .pwmChannel = kPWM_PwmA,
.tmrBase = TMR1, .lowCh = kQTMR_Channel_2, .highCh = kQTMR_Channel_3,
.tmrInputsrc=kQTMR_ClockCounter2InputPin, .cascadePcs = 6U,
.faultNum = 1U, .hwExactSupported = true, .outTrigMask = kPWM_ValueRegisterMask_3,
},

{
.id = AXIS_EX2, .name = "EX2",
.pwmBase = PWM2, .pwmModule = kPWM_Module_1, .pwmChannel = kPWM_PwmA,
.tmrBase = TMR2, .lowCh = kQTMR_Channel_2, .highCh = kQTMR_Channel_3,
.tmrInputsrc=kQTMR_ClockCounter2InputPin, .cascadePcs = 6U,
.faultNum = 1U, .hwExactSupported = true, .outTrigMask = kPWM_ValueRegisterMask_3,
},
};static void APP_Init_PWM_QTMR(void)
{
pwm_config_t pwmConfig;
pwm_fault_param_t faultConfig;
qtmr_config_t qtmrConfig;

PWM_GetDefaultConfig(&pwmConfig);
pwmConfig.pairOperation = kPWM_Independent;
pwmConfig.reloadLogic = kPWM_ReloadImmediate;

PWM_FaultDefaultConfig(&faultConfig);
faultConfig.faultLevel = true;

faultConfig.enableCombinationalPath = false;
faultConfig.faultClearingMode = kPWM_ManualSafety;
faultConfig.recoverMode = kPWM_NoRecovery;

QTMR_GetDefaultConfig(&qtmrConfig);
CLOCK_EnableClock(kCLOCK_Qtimer1);
CLOCK_EnableClock(kCLOCK_Qtimer2);
CLOCK_EnableClock(kCLOCK_Qtimer3);

PWM_StopTimer(PWM1, 0x0FU); PWM_StopTimer(PWM2, 0x0FU);
PWM_StopTimer(PWM3, 0x0FU); PWM_StopTimer(PWM4, 0x0FU);
pwm_fault_input_filter_param_t faultFilter;
faultFilter.faultFilterPeriod = 255U;
faultFilter.faultFilterCount = 7U;
faultFilter.faultGlitchStretch = false;

/* 记录每个 PWM 实例上已配置的 fault channel,避免重复设置 */
uint16_t pwm1FaultDone = 0U, pwm2FaultDone = 0U, pwm3FaultDone = 0U, pwm4FaultDone = 0U;

for (uint8_t i = 0U; i < AXIS_NUM; i++)
{
axis_ctrl_t *ax = &g_axes[i];
PWM_Init(ax->pwmBase, ax->pwmModule, &pwmConfig);
PWM_SetupFaults(ax->pwmBase, (pwm_fault_input_t)ax->faultNum, &faultConfig);

/* 故障滤波(每个 PWM 实例的每个 fault channel 只设一次) */
{
uint16_t *faultDone;
if (ax->pwmBase == PWM1) faultDone = &pwm1FaultDone;
else if (ax->pwmBase == PWM2) faultDone = &pwm2FaultDone;
else if (ax->pwmBase == PWM3) faultDone = &pwm3FaultDone;
else faultDone = &pwm4FaultDone;

uint16_t faultBit = (uint16_t)(1U << ax->faultNum);
if ((*faultDone & faultBit) == 0U)
{
PWM_SetupFaultInputFilterExt(ax->pwmBase,
(pwm_fault_channels_t)ax->faultNum,
&faultFilter);
*faultDone |= faultBit;
}
}

/* Fault 时输出低电平 */
ax->pwmBase->SM[ax->pwmModule].OCTRL &= ~(PWM_OCTRL_PWMAFS_MASK | PWM_OCTRL_PWMBFS_MASK);

APP_PWM_Unmap_Selected_Fault(ax);
APP_PWM_ClearFault_Safe(ax);

ax->pwmBase->SM[ax->pwmModule].INIT = 0U;
ax->pwmBase->SM[ax->pwmModule].VAL0 = 0U;
ax->pwmBase->SM[ax->pwmModule].VAL1 = 1U;
ax->pwmBase->SM[ax->pwmModule].VAL2 = 0U;
ax->pwmBase->SM[ax->pwmModule].VAL3 = 0U;
ax->pwmBase->SM[ax->pwmModule].VAL4 = 0U;
ax->pwmBase->SM[ax->pwmModule].VAL5 = 0U;
ax->pwmBase->SM[ax->pwmModule].TCTRL = PWM_TCTRL_OUT_TRIG_EN(ax->outTrigMask);
APP_PWM_Disable_Output(ax);

if (ax->hwExactSupported)
{
qtmrConfig.primarySource = ax->tmrInputSrc;
QTMR_Init(ax->tmrBase, ax->lowCh, &qtmrConfig);
QTMR_Init(ax->tmrBase, ax->highCh, &qtmrConfig);

ax->tmrBase->CHANNEL[ax->lowCh].CTRL = TMR_CTRL_CM(kQTMR_PriSrcRiseEdge)
| TMR_CTRL_PCS(ax->tmrInputSrc);
ax->tmrBase->CHANNEL[ax->highCh].CTRL = TMR_CTRL_CM(kQTMR_CascadeCount)
| TMR_CTRL_PCS(ax->cascadePcs);

APP_QTMR_Disable_Low_OFLAG_Output(ax);
QTMR_DisableInterrupts(ax->tmrBase, ax->lowCh, 0xFFU);
QTMR_DisableInterrupts(ax->tmrBase, ax->highCh, 0xFFU);
QTMR_ClearStatusFlags(ax->tmrBase, ax->lowCh, 0xFFU);
QTMR_ClearStatusFlags(ax->tmrBase, ax->highCh, 0xFFU);
}

ax->phase = kAxisIdle;

ax->armed = false;
ax->running = false;
ax->done = true;
#if HARD_PWM_STATE_GUARD_ENABLE
APP_StateGuard_Reset(ax);
#endif
}

/* 使能 QTMR 中断 */
NVIC_SetPriority(TMR1_IRQn, 2U);
NVIC_SetPriority(TMR2_IRQn, 2U);
NVIC_SetPriority(TMR3_IRQn, 2U);
EnableIRQ(TMR1_IRQn);
EnableIRQ(TMR2_IRQn);
EnableIRQ(TMR3_IRQn);
}static bool APP_PWM_Config_Pulse(axis_ctrl_t *axis,
uint32_t highCnt400M,
uint32_t lowCnt400M)
{
pwm_clock_prescale_t prescale;
uint16_t periodTicks;
uint32_t totalCnt400M = highCnt400M + lowCnt400M;

if ((axis == NULL) || (totalCnt400M == 0U)) return false;
if (!APP_PWM_SelectPrescaler_FromPeriodCnt400M(totalCnt400M, &prescale, &periodTicks))
return false;

uint32_t highTicks32 = (uint32_t)(((uint64_t)periodTicks * (uint64_t)highCnt400M +
((uint64_t)totalCnt400M / 2ULL)) /
(uint64_t)totalCnt400M);
if (highTicks32 == 0U) highTicks32 = 1U;
if (highTicks32 >= periodTicks) highTicks32 = (uint32_t)periodTicks - 1U;

uint32_t riseTicks32 = 0U;
uint32_t fallTicks32 = highTicks32;

#if HARD_PWM_LOW_START_PHASE_ENABLE
uint32_t lowTicks32 = (uint32_t)periodTicks - highTicks32;
if (lowTicks32 >= (2U * HARD_PWM_LOW_START_PHASE_MIN_TICKS))
{
uint32_t desiredLeadCnt400M = highCnt400M;
uint32_t minLeadCnt400M = (uint32_t)HARD_PWM_LOW_START_PHASE_MIN_US * 400U;
if (desiredLeadCnt400M < minLeadCnt400M) desiredLeadCnt400M = minLeadCnt400M;

uint32_t desiredLeadTicks32 = (uint32_t)(((uint64_t)periodTicks * (uint64_t)desiredLeadCnt400M +
((uint64_t)totalCnt400M / 2ULL)) /
(uint64_t)totalCnt400M);
if (desiredLeadTicks32 < HARD_PWM_LOW_START_PHASE_MIN_TICKS)
desiredLeadTicks32 = HARD_PWM_LOW_START_PHASE_MIN_TICKS;

uint32_t maxRiseByHalfTicks32 = lowTicks32 / 2U;
uint32_t postGuardTicks32 = (uint32_t)(((uint64_t)periodTicks *
(uint64_t)(HARD_PWM_VAL3_POST_LOW_GUARD_US * 400U) +
((uint64_t)totalCnt400M / 2ULL)) /
(uint64_t)totalCnt400M);
if (postGuardTicks32 < HARD_PWM_VAL3_POST_LOW_GUARD_MIN_TICKS)
postGuardTicks32 = HARD_PWM_VAL3_POST_LOW_GUARD_MIN_TICKS;
uint32_t maxRiseByPostGuardTicks32 = (lowTicks32 > postGuardTicks32) ?
(lowTicks32 - postGuardTicks32) : 0U;

uint32_t selectedRiseTicks32;
if (maxRiseByHalfTicks32 >= desiredLeadTicks32)
{
selectedRiseTicks32 = desiredLeadTicks32;
if (selectedRiseTicks32 > maxRiseByHalfTicks32)
selectedRiseTicks32 = maxRiseByHalfTicks32;
}
else if (maxRiseByPostGuardTicks32 >= desiredLeadTicks32)
{
selectedRiseTicks32 = desiredLeadTicks32;
if (selectedRiseTicks32 > maxRiseByPostGuardTicks32)
selectedRiseTicks32 = maxRiseByPostGuardTicks32;
}
else
{
selectedRiseTicks32 = maxRiseByPostGuardTicks32;
}

if (selectedRiseTicks32 >= HARD_PWM_LOW_START_PHASE_MIN_TICKS)
{
riseTicks32 = selectedRiseTicks32;
fallTicks32 = riseTicks32 + highTicks32;
}
}
#endif

if (fallTicks32 >= (uint32_t)periodTicks) fallTicks32 = (uint32_t)periodTicks - 1U;
uint16_t riseTicks = (uint16_t)riseTicks32;
uint16_t fallTicks = (uint16_t)fallTicks32;
PWM_SetPwmLdok(axis->pwmBase, APP_PwmModuleMask(axis), false);
uint16_t ctrl = axis->pwmBase->SM[axis->pwmModule].CTRL;
ctrl &= (uint16_t)(~PWM_CTRL_PRSC_MASK);
ctrl |= PWM_CTRL_PRSC(prescale);
axis->pwmBase->SM[axis->pwmModule].CTRL = ctrl;

axis->pwmBase->SM[axis->pwmModule].INIT = 0U;
axis->pwmBase->SM[axis->pwmModule].VAL0 = 0U;
axis->pwmBase->SM[axis->pwmModule].VAL1 = (uint16_t)(periodTicks - 1U);
if (axis->pwmChannel == kPWM_PwmA) {
axis->pwmBase->SM[axis->pwmModule].VAL2 = riseTicks;
axis->pwmBase->SM[axis->pwmModule].VAL3 = fallTicks;
} else if (axis->pwmChannel == kPWM_PwmB) {
axis->pwmBase->SM[axis->pwmModule].VAL4 = riseTicks;
axis->pwmBase->SM[axis->pwmModule].VAL5 = fallTicks;
}
axis->pwmBase->SM[axis->pwmModule].TCTRL = PWM_TCTRL_OUT_TRIG_EN(axis->outTrigMask);

PWM_SetPwmLdok(axis->pwmBase, APP_PwmModuleMask(axis), true);
PWM_SetPwmLdok(axis->pwmBase, APP_PwmModuleMask(axis), true);
axis->pwmConfigValid = true;
axis->cachedHighCnt400M = highCnt400M;
axis->cachedLowCnt400M = lowCnt400M;
return true;
}
0 件の賞賛
返信
%3CLINGO-SUB%20id%3D%22lingo-sub-2385575%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3ERT1176%20PWM%E3%81%AE%E8%B5%B7%E5%8B%95%E3%81%AB%E5%A4%B1%E6%95%97%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2385575%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E7%A7%81%E3%81%AFPWM%20%2B%20Fault%20%2B%20QTimer%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC%E3%83%91%E3%83%AB%E3%82%B9%E5%88%B6%E5%BE%A1%E3%82%92%E5%AE%9F%E8%A3%85%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%81%8C%E3%80%81PWM3%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB0%E3%81%AEPWM_A%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%8C%E6%99%82%E3%80%85%E8%B5%B7%E5%8B%95%E3%81%A7%E3%81%8D%E3%81%9A%E3%80%81%E6%9C%80%E5%88%9D%E3%81%AE%E3%83%8F%E3%82%A4%E3%83%AC%E3%83%99%E3%83%AB%E4%BB%A5%E9%99%8D%E3%81%AF%E4%B8%80%E5%AE%9A%E3%81%AE%E3%81%BE%E3%81%BE%E3%81%A7%E3%80%81%E3%81%9D%E3%81%AE%E5%BE%8C%E3%81%AE%E3%83%91%E3%83%AB%E3%82%B9%E3%81%AF%E7%8F%BE%E3%82%8C%E3%81%BE%E3%81%9B%E3%82%93%E3%80%82%E6%A4%9C%E6%9F%BB%E3%81%AE%E7%B5%90%E6%9E%9C%E3%80%81PWM%E3%81%AE%E3%80%8C%E3%83%A9%E3%83%B3%E3%80%8D%E9%83%A8%E5%88%86%E3%81%8C%E6%AD%A3%E3%81%97%E3%81%8F%E8%A8%AD%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84%E3%81%93%E3%81%A8%E3%81%8C%E5%88%A4%E6%98%8E%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%E5%BE%8C%E3%81%8B%E3%82%89%E3%83%97%E3%83%AD%E3%82%B0%E3%83%A9%E3%83%A0%E3%81%AB%E8%B5%B7%E5%8B%95%E6%99%82%E3%81%AE%E5%87%A6%E7%90%86%E3%82%92%E7%B9%B0%E3%82%8A%E8%BF%94%E3%81%97%E8%BF%BD%E5%8A%A0%E3%81%97%E3%81%9F%E3%81%AB%E3%82%82%E3%81%8B%E3%81%8B%E3%82%8F%E3%82%89%E3%81%9A%E3%80%81%E3%81%93%E3%81%AE%E7%95%B0%E5%B8%B8%E3%81%AF%E4%BE%9D%E7%84%B6%E3%81%A8%E3%81%97%E3%81%A6%E7%99%BA%E7%94%9F%E3%81%97%E3%81%9F%E3%80%82%3C%2FP%3E%3CP%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%20lia-image-align-inline%22%20image-alt%3D%22liu626_0-1782287927569.png%22%20style%3D%22width%3A%20400px%3B%22%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%22%20image-alt%3D%22liu626_0-1782287927569.png%22%20style%3D%22width%3A%20400px%3B%22%3E%3CSPAN%20class%3D%22lia-inline-image-display-wrapper%22%20image-alt%3D%22liu626_0-1782287927569.png%22%20style%3D%22width%3A%20400px%3B%22%3E%3Cspan%20class%3D%22lia-inline-image-display-wrapper%22%20image-alt%3D%22liu626_0-1782287927569.png%22%20style%3D%22width%3A%20400px%3B%22%3E%3Cimg%20src%3D%22https%3A%2F%2Fcommunity.nxp.com%2Ft5%2Fimage%2Fserverpage%2Fimage-id%2F389985i82C105A58467F67F%2Fimage-size%2Fmedium%3Fv%3Dv2%26amp%3Bpx%3D400%22%20role%3D%22button%22%20title%3D%22liu626_0-1782287927569.png%22%20alt%3D%22liu626_0-1782287927569.png%22%20%2F%3E%3C%2Fspan%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FSPAN%3E%3C%2FP%3E%3CBR%20%2F%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2386554%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20RT1176%20PWM%20startup%20failed%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2386554%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%3CP%3E%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%81%20%3CA%20href%3D%22https%3A%2F%2Fcommunity.nxp.com%2Ft5%2Fuser%2Fviewprofilepage%2Fuser-id%2F264017%22%20target%3D%22_blank%22%3E%40liu626%20%E3%81%95%E3%82%93%3C%2FA%3E%E3%80%82%3C%2FP%3E%0A%3CP%3E%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E3%83%9C%E3%83%BC%E3%83%89%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%81%8B%E3%80%81%E3%81%9D%E3%82%8C%E3%81%A8%E3%82%82EVK%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9FEVK%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E5%A0%B4%E5%90%88%E3%80%81%E4%BD%95%E3%81%8B%E6%94%B9%E9%80%A0%E3%82%92%E5%8A%A0%E3%81%88%E3%81%BE%E3%81%97%E3%81%9F%E3%81%8B%EF%BC%9F%3C%2FP%3E%0A%3CP%3EPWM3%E3%81%A7%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E6%A7%8B%E6%88%90%E3%82%92%E6%95%99%E3%81%88%E3%81%A6%E3%82%82%E3%82%89%E3%81%88%E3%81%BE%E3%81%99%E3%81%8B%3F%3C%2FP%3E%0A%3CP%3E%E4%BD%95%E3%81%8B%E4%BE%8B%E3%82%92%E5%8F%82%E8%80%83%E3%81%AB%E3%81%97%E3%81%A6%E3%81%84%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%E3%82%82%E3%81%97%E3%81%9D%E3%81%86%E3%81%AA%E3%82%89%E3%80%81%E3%81%A9%E3%81%AE%E5%AD%A6%E6%A0%A1%E3%81%A7%E3%81%99%E3%81%8B%3F%3C%2FP%3E%0A%3CP%3EPWM3%E3%81%AE%E3%81%BF%E3%82%92%E5%90%AB%E3%82%80%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%A6%E5%95%8F%E9%A1%8C%E3%82%92%E5%86%8D%E7%8F%BE%E3%81%97%E3%82%88%E3%81%86%E3%81%A8%E3%81%97%E3%81%9F%E5%A0%B4%E5%90%88%E3%80%81%E5%95%8F%E9%A1%8C%E3%81%AF%E8%A7%A3%E6%B6%88%E3%81%95%E3%82%8C%E3%81%BE%E3%81%99%E3%81%8B%EF%BC%9F%3C%2FP%3E%0A%3CP%3E%E3%81%93%E3%82%8C%E3%81%AFPWM3%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB0%E3%81%AEPWM_A%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%A0%E3%81%91%E3%81%AB%E8%B5%B7%E3%81%93%E3%82%8B%E3%81%AE%E3%81%A7%E3%81%97%E3%82%87%E3%81%86%E3%81%8B%3F%E4%BB%96%E3%81%AEPWM%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%84%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%A7%E3%82%82%E5%90%8C%E6%A7%98%E3%81%AE%E7%8F%BE%E8%B1%A1%E3%81%8C%E7%99%BA%E7%94%9F%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%81%8B%EF%BC%9F%3C%2FP%3E%0A%3CP%3EPWM3%E3%83%AC%E3%82%B8%E3%82%B9%E3%82%BF%E3%82%92%E6%93%8D%E4%BD%9C%E3%81%97%E3%80%81%E3%83%A9%E3%83%B3%E3%83%93%E3%83%83%E3%83%88%E3%81%AB%E5%BD%B1%E9%9F%BF%E3%82%92%E4%B8%8E%E3%81%88%E3%81%9F%E3%82%8A%E4%B8%8A%E6%9B%B8%E3%81%8D%E3%81%97%E3%81%9F%E3%82%8A%E3%81%99%E3%82%8B%E4%BB%96%E3%81%AE%E3%82%BF%E3%82%B9%E3%82%AF%E3%82%84%E5%89%B2%E3%82%8A%E8%BE%BC%E3%81%BF%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B%3F%3C%2FP%3E%0A%3CP%3E%E3%82%88%E3%82%8D%E3%81%97%E3%81%8F%E3%81%8A%E9%A1%98%E3%81%84%E3%81%97%E3%81%BE%E3%81%99%E3%80%81%3CBR%20%2F%3E%E3%83%91%E3%83%96%E3%83%AD%3C%2FP%3E%3C%2FLINGO-BODY%3E%3CLINGO-SUB%20id%3D%22lingo-sub-2386633%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%20translate%3D%22no%22%3ERe%3A%20RT1176%20PWM%20startup%20failed%3C%2FLINGO-SUB%3E%3CLINGO-BODY%20id%3D%22lingo-body-2386633%22%20slang%3D%22en-US%22%20mode%3D%22CREATE%22%3E%E3%81%93%E3%82%93%E3%81%AB%E3%81%A1%E3%81%AF%E3%80%81%E3%82%AB%E3%82%B9%E3%82%BF%E3%83%A0%E5%9B%9E%E8%B7%AF%E5%9F%BA%E6%9D%BF%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%E7%A7%81%E3%81%AF%E5%85%B7%E4%BD%93%E7%9A%84%E3%81%AA%E4%BE%8B%E3%82%92%E6%8C%99%E3%81%92%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82%E3%81%93%E3%82%8C%E3%81%AF%E3%80%81%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%81%AE%E6%AD%A3%E5%BC%8F%E3%81%AA%E9%96%8B%E7%99%BA%E9%81%8E%E7%A8%8B%E3%81%A7%E7%99%BA%E8%A6%8B%E3%81%95%E3%82%8C%E3%81%9F%E5%95%8F%E9%A1%8C%E3%81%A0%E3%81%A3%E3%81%9F%E3%80%82%E3%83%91%E3%83%AB%E3%82%B9%E5%88%B6%E5%BE%A1%E7%94%A8%E3%81%AB6%E3%81%A4%E3%81%AEPWM%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%82%92%E8%A8%AD%E5%AE%9A%E3%81%97%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%E3%81%93%E3%81%AE%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%A0%E3%81%91%E3%81%8C%E5%95%8F%E9%A1%8C%E3%82%92%E8%B5%B7%E3%81%93%E3%81%97%E3%80%81%E4%BB%96%E3%81%AE%E3%82%B5%E3%83%96%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%A7%E3%81%AF%E5%90%8C%E6%A7%98%E3%81%AE%E5%95%8F%E9%A1%8C%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93%E3%81%A7%E3%81%97%E3%81%9F%E3%80%82%E8%AA%BF%E3%81%B9%E3%81%9F%E3%81%A8%E3%81%93%E3%82%8D%E3%80%81%E3%81%93%E3%81%AE%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%E3%81%A0%E3%81%91%E3%81%8CPWM3%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%A6%E3%81%84%E3%82%8B%E3%81%93%E3%81%A8%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82%E4%BB%96%E3%81%AB%E5%B9%B2%E6%B8%89%E5%9B%A0%E5%AD%90%E3%81%AF%E6%A4%9C%E5%87%BA%E3%81%95%E3%82%8C%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F%E3%80%82%E4%BB%A5%E4%B8%8B%E3%81%AF%E7%A7%81%E3%81%AE%E8%A8%AD%E5%AE%9A%E3%81%A7%E3%81%99%E3%80%82%3CBR%20%2F%3Estatic%20axis_ctrl_t%20g_axes%5BAXIS_NUM%5D%20%3D%3CBR%20%2F%3E%E3%83%A4%E3%83%BC%E3%82%B8%E3%83%A5%3CBR%20%2F%3E%E3%83%A4%E3%83%BC%E3%82%B8%E3%83%A5%3CBR%20%2F%3E.id%3D%20AXIS_X1%E3%80%81.name%3D%20%22X1%22%2C%3CBR%20%2F%3E%20.pwmBase%3D%20PWM1%E3%80%81.pwmModule%3D%20kPWM_Module_0%E3%80%81.pwmChannel%3D%20kPWM_PwmA%E3%80%81%3CBR%20%2F%3E%20.tmrBase%3D%20TMR3%E3%80%81.lowCh%3D%20kQTMR_Channel_2%E3%80%81.highCh%3D%20kQTMR_Channel_3%E3%80%81%3CBR%20%2F%3E%20.tmrInputsrc%3DkQTMR_ClockCounter2InputPin%E3%80%81.cascadePcs%3D%206U%E3%80%81%3CBR%20%2F%3E%20.faultNum%3D%200U%E3%80%81.hwExactSupported%3D%20true%E3%80%81.outTrigMask%3D%20kPWM_ValueRegisterMask_3%E3%80%81%3CBR%20%2F%3E%20%7D%E3%80%81%3CBR%20%2F%3E%3CBR%20%2F%3E%E3%83%A4%E3%83%BC%E3%82%B8%E3%83%A5%3CBR%20%2F%3E.id%3D%20AXIS_X2%E3%80%81.name%3D%20%22X2%22%2C%3CBR%20%2F%3E%20.pwmBase%3D%20PWM2%E3%80%81.pwmModule%3D%20kPWM_Module_0%E3%80%81.pwmChannel%3D%20kPWM_PwmA%E3%80%81%3CBR%20%2F%3E%20.tmrBase%3D%20TMR2%E3%80%81.lowCh%3D%20kQTMR_Channel_0%E3%80%81.highCh%3D%20kQTMR_Channel_1%E3%80%81%3CBR%20%2F%3E%20.tmrInputsrc%3DkQTMR_ClockCounter0InputPin%E3%80%81.cascadePcs%3D%204U%E3%80%81%3CBR%20%2F%3E%20.faultNum%3D%200U%E3%80%81.hwExactSupported%3D%20true%E3%80%81.outTrigMask%3D%20kPWM_ValueRegisterMask_3%E3%80%81%3CBR%20%2F%3E%20%7D%E3%80%81%3CBR%20%2F%3E%3CBR%20%2F%3E%E3%83%A4%E3%83%BC%E3%82%B8%E3%83%A5%3CBR%20%2F%3E.id%3D%20AXIS_Y%E3%80%81.name%3D%20%22Y%22%E3%80%81%3CBR%20%2F%3E%20.pwmBase%3D%20PWM3%E3%80%81.pwmModule%3D%20kPWM_Module_0%E3%80%81.pwmChannel%3D%20kPWM_PwmA%E3%80%81%3CBR%20%2F%3E%20.tmrBase%3D%20TMR3%E3%80%81.lowCh%3D%20kQTMR_Channel_0%E3%80%81.highCh%3D%20kQTMR_Channel_1%E3%80%81%3CBR%20%2F%3E%20.tmrInputsrc%3DkQTMR_ClockCounter0InputPin%E3%80%81.cascadePcs%3D%204U%E3%80%81%3CBR%20%2F%3E%20.faultNum%3D%200U%E3%80%81.hwExactSupported%3D%20true%E3%80%81.outTrigMask%3D%20kPWM_ValueRegisterMask_3%E3%80%81%3CBR%20%2F%3E%20%7D%E3%80%81%3CBR%20%2F%3E%3CBR%20%2F%3E%E3%83%A4%E3%83%BC%E3%82%B8%E3%83%A5%3CBR%20%2F%3E.id%3D%20AXIS_Z%E3%80%81.name%3D%20%22Z%22%E3%80%81%3CBR%20%2F%3E%20.pwmBase%3D%20PWM4%E3%80%81.pwmModule%3D%20kPWM_Module_0%E3%80%81.pwmChannel%3D%20kPWM_PwmA%E3%80%81%3CBR%20%2F%3E%20.tmrBase%3D%20TMR1%E3%80%81.lowCh%3D%20kQTMR_Channel_0%E3%80%81.highCh%3D%20kQTMR_Channel_1%E3%80%81%3CBR%20%2F%3E%20.tmrInputsrc%3DkQTMR_ClockCounter0InputPin%E3%80%81.cascadePcs%3D%204U%E3%80%81%3CBR%20%2F%3E%20.faultNum%3D%200U%E3%80%81.hwExactSupported%3D%20true%E3%80%81.outTrigMask%3D%20kPWM_ValueRegisterMask_3%E3%80%81%3CBR%20%2F%3E%20%7D%E3%80%81%3CBR%20%2F%3E%3CBR%20%2F%3E%E3%83%A4%E3%83%BC%E3%82%B8%E3%83%A5%3CBR%20%2F%3E.id%3D%20AXIS_EX1%E3%80%81.name%3D%20%22EX1%22%2C%3CBR%20%2F%3E%20.pwmBase%3D%20PWM1%E3%80%81.pwmModule%3D%20kPWM_Module_1%E3%80%81.pwmChannel%3D%20kPWM_PwmA%E3%80%81%3CBR%20%2F%3E%20.tmrBase%3D%20TMR1%E3%80%81.lowCh%3D%20kQTMR_Channel_2%E3%80%81.highCh%3D%20kQTMR_Channel_3%E3%80%81%3CBR%20%2F%3E%20.tmrInputsrc%3DkQTMR_ClockCounter2InputPin%E3%80%81.cascadePcs%3D%206U%E3%80%81%3CBR%20%2F%3E%20.faultNum%3D%201U%E3%80%81.hwExactSupported%3D%20true%E3%80%81.outTrigMask%3D%20kPWM_ValueRegisterMask_3%E3%80%81%3CBR%20%2F%3E%20%7D%E3%80%81%3CBR%20%2F%3E%3CBR%20%2F%3E%E3%83%A4%E3%83%BC%E3%82%B8%E3%83%A5%3CBR%20%2F%3E.id%3D%20AXIS_EX2%E3%80%81.name%3D%20%22EX2%22%2C%3CBR%20%2F%3E%20.pwmBase%3D%20PWM2%E3%80%81.pwmModule%3D%20kPWM_Module_1%E3%80%81.pwmChannel%3D%20kPWM_PwmA%E3%80%81%3CBR%20%2F%3E%20.tmrBase%3D%20TMR2%E3%80%81.lowCh%3D%20kQTMR_Channel_2%E3%80%81.highCh%3D%20kQTMR_Channel_3%E3%80%81%3CBR%20%2F%3E%20.tmrInputsrc%3DkQTMR_ClockCounter2InputPin%E3%80%81.cascadePcs%3D%206U%E3%80%81%3CBR%20%2F%3E%20.faultNum%3D%201U%E3%80%81.hwExactSupported%3D%20true%E3%80%81.outTrigMask%3D%20kPWM_ValueRegisterMask_3%E3%80%81%3CBR%20%2F%3E%20%7D%E3%80%81%3CBR%20%2F%3E%20%7D%3Bstatic%20void%20APP_Init_PWM_QTMR(void)%3CBR%20%2F%3E%E3%83%A4%E3%83%BC%E3%82%B8%E3%83%A5%3CBR%20%2F%3Epwm_config_t%20pwmConfig%3B%3CBR%20%2F%3E%20pwm_fault_param_t%20faultConfig%3B%3CBR%20%2F%3E%20qtmr_config_t%20qtmrConfig%3B%3CBR%20%2F%3E%3CBR%20%2F%3E%20PWM_GetDefaultConfig(%26amp%3BpwmConfig)%3B%3CBR%20%2F%3E%20pwmConfig.pairOperation%3D%20kPWM_Independent%3B%3CBR%20%2F%3E%20pwmConfig.reloadLogic%20%3D%20kPWM_ReloadImmediate%3B%3CBR%20%2F%3E%3CBR%20%2F%3E%20PWM_FaultDefaultConfig(%26amp%3BfaultConfig)%3B%3CBR%20%2F%3E%20faultConfig.faultLevel%20%3D%20true%3B%3CBR%20%2F%3E%3CBR%20%2F%3E%20faultConfig.enableCombinationalPath%3D%20%E5%81%BD%3B%3CBR%20%2F%3E%20faultConfig.faultClearingMode%3D%20kPWM_ManualSafety%3B%3CBR%20%2F%3E%20faultConfig.recoverMode%20%3D%20kPWM_NoRecovery%3B%3CBR%20%2F%3E%3CBR%20%2F%3E%20QTMR_GetDefaultConfig(%26amp%3BqtmrConfig)%3B%3CBR%20%2F%3E%20CLOCK_EnableClock(kCLOCK_Qtimer1)%3B%3CBR%20%2F%3E%20CLOCK_EnableClock(kCLOCK_Qtimer2)%3B%3CBR%20%2F%3E%20CLOCK_EnableClock(kCLOCK_Qtimer3)%3B%3CBR%20%2F%3E%3CBR%20%2F%3E%20PWM_StopTimer(PWM1%2C%200x0FU)%3B%20PWM_StopTimer(PWM2%2C%200x0FU)%3B%3CBR%20%2F%3E%20PWM_StopTimer(PWM3%2C%200x0FU)%3B%20PWM_StopTimer(PWM4%2C%200x0FU)%3B%3CBR%20%2F%3E%20pwm_fault_input_filter_param_t%20faultFilter%3B%3CBR%20%2F%3E%20faultFilter.faultFilterPeriod%3D%20255U%3B%3CBR%20%2F%3E%20faultFilter.aultFilterCount%3D%207U%3B%3CBR%20%2F%3E%20faultFilter.faultGlitchStretch%3D%20%E5%81%BD%3B%3CBR%20%2F%3E%3CBR%20%2F%3E%2F*%20%E8%AE%B0%E5%BD%95%E6%AF%8F%E4%B8%AA%20PWM%20%E5%AE%9E%E4%BE%8B%E4%B8%8A%E5%B7%B2%E9%85%8D%E7%BD%AE%E7%9A%84%20fault%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%2C%E9%81%BF%E5%85%8D%E9%87%8D%E5%A4%8D%E8%AE%BE%E7%BD%AE%20*%2F%3CBR%20%2F%3Euint16_t%20pwm1FaultDone%20%3D%200U%2C%20pwm2FaultDone%20%3D%200U%2C%20pwm3FaultDone%20%3D%200U%2C%20pwm4FaultDone%20%3D%200U%3B%3CBR%20%2F%3E%3CBR%20%2F%3Efor%20(uint8_t%20i%20%3D%200U%3B%20i%20%26lt%3B%20AXIS_NUM%3B%20i%2B%2B)%3CBR%20%2F%3E%7B%3CBR%20%2F%3Eaxis_ctrl_t%20*ax%20%3D%20%26amp%3Bg_axes%5Bi%5D%3B%3CBR%20%2F%3EPWM_Init(ax-%26gt%3BpwmBase%2C%20ax-%26gt%3BpwmModule%2C%20%26amp%3BpwmConfig)%3B%3CBR%20%2F%3EPWM_SetupFaults(ax-%26gt%3BpwmBase%2C%20(pwm_fault_input_t)ax-%26gt%3BfaultNum%2C%20%26amp%3BfaultConfig)%3B%3CBR%20%2F%3E%3CBR%20%2F%3E%2F*%20%E6%95%85%E9%9A%9C%E6%BF%BE%E6%B3%A2(%E6%AF%8F%E5%80%8B%20PWM%20%E5%AE%9E%E4%BE%8B%E7%9A%84%E6%AF%8F%E4%B8%AA%20fault%E3%83%81%E3%83%A3%E3%83%8D%E3%83%AB%20%E5%8F%AA%E8%AE%BE%E4%B8%80%E6%AC%A1)%20*%2F%3CBR%20%2F%3E%7B%3CBR%20%2F%3Euint16_t%20*faultDone%3B%3CBR%20%2F%3Eif%20(ax-%26gt%3BpwmBase%20%3D%3D%20PWM1)%20faultDone%20%3D%20%26amp%3Bpwm1FaultDone%3B%3CBR%20%2F%3Eelse%20if%20(ax-%26gt%3BpwmBase%20%3D%3D%20PWM2)%20faultDone%20%3D%20%26amp%3Bpwm2FaultDone%3B%3CBR%20%2F%3Eelse%20if%20(ax-%26gt%3BpwmBase%20%3D%3D%20PWM3)%20faultDone%20%3D%20%26amp%3Bpwm3FaultDone%3B%3CBR%20%2F%3Eelse%20faultDone%20%3D%20%26amp%3Bpwm4FaultDone%3B%3CBR%20%2F%3E%3CBR%20%2F%3Euint16_t%20faultBit%20%3D%20(uint16_t)(1U%20%26lt%3B%26lt%3B%20ax-%26gt%3BfaultNum)%3B%3CBR%20%2F%3Eif((*faultDone%20%26amp%3B%20faultBit)%20%3D%3D%200U)%3CBR%20%2F%3E%7B%3CBR%20%2F%3EPWM_SetupFaultInputFilterExt(ax-%26gt%3BpwmBase%2C%3CBR%20%2F%3E(pwm_fault_channels_t)ax-%26gt%3BfaultNum%2C%3CBR%20%2F%3E%26amp%3BfaultFilter)%3B%3CBR%20%2F%3E*faultDone%20%7C%3D%20faultBit%3B%3CBR%20%2F%3E%7D%3CBR%20%2F%3E%7D%3CBR%20%2F%3E%3CBR%20%2F%3E%2F*%20%E6%95%85%E9%9A%9C%E6%99%82%E8%BC%B8%E5%87%BA%E4%BD%8E%E9%9B%BB%E5%B9%B3%20*%2F%3CBR%20%2F%3Eax-%26gt%3BpwmBase-%26gt%3BSM%5Bax-%26gt%3BpwmModule%5D.OCTRL%20%26amp%3B%3D%20~(PWM_OCTRL_PWMAFS_MASK%20%7CPWM_OCTRL_PWMBFS_MASK)%3B%3CBR%20%2F%3E%3CBR%20%2F%3EAPP_PWM_Unmap_Selected_Fault(ax)%3B%3CBR%20%2F%3EAPP_PWM_ClearFault_Safe(ax)%3B%3CBR%20%2F%3E%3CBR%20%2F%3Eax-%26gt%3BpwmBase-%26gt%3BSM%5Bax-%26gt%3BpwmModule%5D.INIT%20%3D%200U%3B%3CBR%20%2F%3Eax-%26gt%3BpwmBase-%26gt%3BSM%5Bax-%26gt%3BpwmModule%5D.VAL0%20%3D%200U%3B%3CBR%20%2F%3Eax-%26gt%3BpwmBase-%26gt%3BSM%5Bax-%26gt%3BpwmModule%5D.VAL1%20%3D%201U%3B%3CBR%20%2F%3Eax-%26gt%3BpwmBase-%26gt%3BSM%5Bax-%26gt%3BpwmModule%5D.VAL2%20%3D%200U%3B%3CBR%20%2F%3Eax-%26gt%3BpwmBase-%26gt%3BSM%5Bax-%26gt%3BpwmModule%5D.VAL3%20%3D%200U%3B%3CBR%20%2F%3Eax-%26gt%3BpwmBase-%26gt%3BSM%5Bax-%26gt%3BpwmModule%5D.VAL4%20%3D%200U%3B%3CBR%20%2F%3Eax-%26gt%3BpwmBase-%26gt%3BSM%5Bax-%26gt%3BpwmModule%5D.VAL5%20%3D%200U%3B%3CBR%20%2F%3Eax-%26gt%3BpwmBase-%26gt%3BSM%5Bax-%26gt%3BpwmModule%5D.TCTRL%20%3D%20PWM_TCTRL_OUT_TRIG_EN(ax-%26gt%3BoutTrigMask)%3B%3CBR%20%2F%3EAPP_PWM_Disable_Output(ax)%3B%3CBR%20%2F%3E%3CBR%20%2F%3Eif%20(ax-%26gt%3BhwExactSupported)%3CBR%20%2F%3E%7B%3CBR%20%2F%3EqtmrConfig.primarySource%3D%20ax-%26gt%3BtmrInputSrc%3B%3CBR%20%2F%3EQTMR_Init(ax-%26gt%3BtmrBase%2C%20ax-%26gt%3BlowCh%2C%20%26amp%3BqtmrConfig)%3B%3CBR%20%2F%3EQTMR_Init(ax-%26gt%3BtmrBase%2C%20ax-%26gt%3BhighCh%2C%20%26amp%3BqtmrConfig)%3B%3CBR%20%2F%3E%3CBR%20%2F%3Eax-%26gt%3BtmrBase-%26gt%3BCHANNEL%5Bax-%26gt%3BlowCh%5D%E3%80%82CTRL%20%3D%20TMR_CTRL_CM(kQTMR_PriSrcRiseEdge)%3CBR%20%2F%3E%7CTMR_CTRL_PCS(ax-%26gt%3BtmrInputSrc)%3B%3CBR%20%2F%3Eax-%26gt%3BtmrBase-%26gt%3BCHANNEL%5Bax-%26gt%3BhighCh%5D%E3%80%82CTRL%20%3D%20TMR_CTRL_CM(kQTMR_CascadeCount)%3CBR%20%2F%3E%7CTMR_CTRL_PCS(ax-%26gt%3B%E3%82%AB%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%89Pcs)%3B%3CBR%20%2F%3E%3CBR%20%2F%3EAPP_QTMR_Disable_Low_OFLAG_Output(ax)%3B%3CBR%20%2F%3EQTMR_DisableInterrupts(ax-%26gt%3BtmrBase%2C%20ax-%26gt%3BlowCh%2C%200xFFU)%3B%3CBR%20%2F%3EQTMR_DisableInterrupts(ax-%26gt%3BtmrBase%2C%20ax-%26gt%3BhighCh%2C%200xFFU)%3B%3CBR%20%2F%3EQTMR_ClearStatusFlags(ax-%26gt%3BtmrBase%2C%20ax-%26gt%3BlowCh%2C%200xFFU)%3B%3CBR%20%2F%3EQTMR_ClearStatusFlags(ax-%26gt%3BtmrBase%2C%20ax-%26gt%3BhighCh%2C%200xFFU)%3B%3CBR%20%2F%3E%7D%3CBR%20%2F%3E%3CBR%20%2F%3Eax-%26gt%3B%E4%BD%8D%E7%9B%B8%20%3D%20kAxisIdle%3B%3CBR%20%2F%3E%3CBR%20%2F%3Eax-%26gt%3Barmed%20%3D%20false%3B%3CBR%20%2F%3Eax-%26gt%3Brunning%3Dfalse%3B%3CBR%20%2F%3Eax-%26gt%3Bdone%20%3D%20%E7%9C%9F%3B%3CBR%20%2F%3E%23if%20HARD_PWM_STATE_GUARD_ENABLE%3CBR%20%2F%3EAPP_StateGuard_Reset(%E6%96%A7)%3B%3CBR%20%2F%3E%23endif%3CBR%20%2F%3E%7D%3CBR%20%2F%3E%3CBR%20%2F%3E%2F*%20%E4%BD%BF%E8%83%BD%20QTMR%20%E4%B8%AD%E6%96%AD%20*%2F%3CBR%20%2F%3ENVIC_SetPriority(TMR1_IRQn%E3%80%812U)%3B%3CBR%20%2F%3ENVIC_SetPriority(TMR2_IRQn%E3%80%812U)%3B%3CBR%20%2F%3ENVIC_SetPriority(TMR3_IRQn%E3%80%812U)%3B%3CBR%20%2F%3EEnableIRQ(TMR1_IRQn)%3B%3CBR%20%2F%3EEnableIRQ(TMR2_IRQn)%3B%3CBR%20%2F%3EEnableIRQ(TMR3_IRQn)%3B%3CBR%20%2F%3E%7D%E9%9D%99%E7%9A%84%E3%83%96%E3%83%BC%E3%83%ABAPP_PWM_Config_Pulse(axis_ctrl_t%20*%E8%BB%B8%E3%80%81%3CBR%20%2F%3Euint32_t%20highCnt400M%E3%80%81%3CBR%20%2F%3Euint32_t%20%E4%BD%8ECnt400M)%3CBR%20%2F%3E%7B%3CBR%20%2F%3Epwm_clock_prescale_t%E3%83%97%E3%83%AA%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB%3B%3CBR%20%2F%3Euint16_t%E6%9C%9F%E9%96%93%E3%83%80%E3%83%83%E3%82%AF%E3%82%B9%3B%3CBR%20%2F%3Euint32_t%20totalCnt400M%20%3D%20highCnt400M%20%2B%20lowCnt400M%3B%3CBR%20%2F%3E%3CBR%20%2F%3E%E3%82%82%E3%81%97((%E8%BB%B8%20%3D%3D%20NULL)%20%7C%7C(totalCnt400M%20%3D%3D%200U))Return%20false%3B%3CBR%20%2F%3E%E3%82%82%E3%81%97(!APP_PWM_SelectPrescaler_FromPeriodCnt400M(totalCnt400M%E3%80%81%E3%81%8A%E3%82%88%E3%81%B3prescale%E3%80%81%26amp%3BperiodTicks))%3CBR%20%2F%3EReturn%20false%3B%3CBR%20%2F%3E%3CBR%20%2F%3Euint32_t%20highTicks32%20%3D%20(uint32_t)((((uint64_t)periodTicks%20*%20(uint64_t)highCnt400M%20%2B%3CBR%20%2F%3E((uint64_t)totalCnt400M%20%2F%202ULL))%2F%3CBR%20%2F%3E(uint64_t)totalCnt400M)%3B%3CBR%20%2F%3E%E3%82%82%E3%81%97(highTicks32%20%3D%3D%200U)%20highTicks32%20%3D%201U%3B%3CBR%20%2F%3E%E3%82%82%E3%81%97(highTicks32%20%26gt%3B%3D%20periodTicks)%20highTicks32%20%3D%20(uint32_t)periodTicks%20-%201U%3B%3CBR%20%2F%3E%3CBR%20%2F%3Euint32_t%20riseTicks32%20%3D%200U%3B%3CBR%20%2F%3Euint32_t%20fallTicks32%20%3D%20highTicks32%3B%3CBR%20%2F%3E%3CBR%20%2F%3E%23if%20HARD_PWM_LOW_START_PHASE_ENABLE%3CBR%20%2F%3Euint32_t%20lowTicks32%20%3D%20(uint32_t)periodTicks%20-%20highTicks32%3B%3CBR%20%2F%3E%E3%82%82%E3%81%97%20(lowTicks32%20%26gt%3B%3D%20(2U%20*%20HARD_PWM_LOW_START_PHASE_MIN_TICKS))%3CBR%20%2F%3E%7B%3CBR%20%2F%3Euint32_t%20LeadCnt400M%20%3D%20highCnt400M%3B%3CBR%20%2F%3Euint32_t%20minLeadCnt400M%20%3D%20(uint32_t)HARD_PWM_LOW_START_PHASE_MIN_US%20*%20400U%3B%3CBR%20%2F%3E%E3%82%82%E3%81%97(desiredLeadCnt400M%20%26lt%3B%20minLeadCnt400M)%20desiredLeadCnt400M%20%3D%20minLeadCnt400M%3B%3CBR%20%2F%3E%3CBR%20%2F%3Euint32_t%20desiredLeadTicks32%20%3D%20(uint32_t)(((uint64_t)periodTicks%20*%20(uint64_t)desiredLeadCnt400M%20%2B%3CBR%20%2F%3E((uint64_t)totalCnt400M%20%2F%202ULL))%2F%3CBR%20%2F%3E(uint64_t)totalCnt400M)%3B%3CBR%20%2F%3Eif%20(desiredLeadTicks32%20%26lt%3B%20HARD_PWM_LOW_START_PHASE_MIN_TICKS)%3CBR%20%2F%3EdesiredLeadTicks32%20%3D%20HARD_PWM_LOW_START_PHASE_MIN_TICKS%3B%3CBR%20%2F%3E%3CBR%20%2F%3Euint32_t%20maxRiseByHalfTicks32%20%3D%20lowTicks32%20%2F%202U%3B%3CBR%20%2F%3Euint32_t%20postGuardTicks32%20%3D%20(uint32_t)(((uint64_t)periodTicks%20*%3CBR%20%2F%3E(uint64_t)(HARD_PWM_VAL3_POST_LOW_GUARD_US%20*%20400U)%20%2B%3CBR%20%2F%3E((uint64_t)totalCnt400M%20%2F%202ULL))%2F%3CBR%20%2F%3E(uint64_t)totalCnt400M)%3B%3CBR%20%2F%3Eif(postGuardTicks32%20%26lt%3B%20HARD_PWM_VAL3_POST_LOW_GUARD_MIN_TICKS)%3CBR%20%2F%3EpostGuardTicks32%20%3D%20HARD_PWM_VAL3_POST_LOW_GUARD_MIN_TICKS%3B%3CBR%20%2F%3Euint32_t%20maxRiseByPostGuardTicks32%20%3D%20(lowTicks32%20%26gt%3B%20postGuardTicks32)%20%3F%3CBR%20%2F%3E(lowTicks32%20-%20postGuardTicks32)%20%3A%200U%3B%3CBR%20%2F%3E%3CBR%20%2F%3Euint32_t%20RiseTicks32%3B%3CBR%20%2F%3E%E3%82%82%E3%81%97%20(maxRiseByHalfTicks32%20%26gt%3B%3D%20desiredLeadTicks32)%3CBR%20%2F%3E%7B%3CBR%20%2F%3EselectedRiseTicks32%20%3D%20desiredLeadTicks32%3B%3CBR%20%2F%3Eif(selectedRiseTicks32%20%26gt%3B%20maxRiseByHalfTicks32)%3CBR%20%2F%3EselectedRiseTicks32%20%3D%20maxRiseByHalfTicks32%3B%3CBR%20%2F%3E%7D%3CBR%20%2F%3E%E3%81%9D%E3%81%86%E3%81%A7%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0(maxRiseByPostGuardTicks32%20%26gt%3B%3D%20desiredLeadTicks32)%3CBR%20%2F%3E%7B%3CBR%20%2F%3EselectedRiseTicks32%20%3D%20desiredLeadTicks32%3B%3CBR%20%2F%3Eif%20(selectedRiseTicks32%20%26gt%3B%20maxRiseByPostGuardTicks32)%3CBR%20%2F%3EselectedRiseTicks32%20%3D%20maxRiseByPostGuardTicks32%3B%3CBR%20%2F%3E%7D%3CBR%20%2F%3E%E3%81%9D%E3%81%86%E3%81%A7%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%3CBR%20%2F%3E%7B%3CBR%20%2F%3EselectedRiseTicks32%20%3D%20maxRiseByPostGuardTicks32%3B%3CBR%20%2F%3E%7D%3CBR%20%2F%3E%3CBR%20%2F%3Eif%20(selectedRiseTicks32%20%26gt%3B%3D%20HARD_PWM_LOW_START_PHASE_MIN_TICKS)%3CBR%20%2F%3E%7B%3CBR%20%2F%3EriseTicks32%20%3D%20selectedRiseTicks32%3B%3CBR%20%2F%3EfallTicks32%20%3D%20riseTicks32%20%2B%20highTicks32%3B%3CBR%20%2F%3E%7D%3CBR%20%2F%3E%7D%3CBR%20%2F%3E%23endif%3CBR%20%2F%3E%3CBR%20%2F%3E%E3%82%82%E3%81%97(fallTicks32%20%26gt%3B%3D%20(uint32_t)periodTicks)%20fallTicks32%20%3D%20(uint32_t)periodTicks%20-%201U%3B%3CBR%20%2F%3Euint16_t%20riseTicks%20%3D%20(uint16_t)riseTicks32%3B%3CBR%20%2F%3Euint16_t%20fallTicks%20%3D%20(uint16_t)fallTicks32%3B%3CBR%20%2F%3EPWM_SetPwmLdok(axis-%26gt%3BpwmBase%2C%20APP_PwmModuleMask(axis)%2C%20false)%3B%3CBR%20%2F%3Euint16_t%20ctrl%20%3D%20axis-%26gt%3BpwmBase-%26gt%3BSM%5Baxis-%26gt%3BpwmModule%5D%E3%80%82CTRL%3B%3CBR%20%2F%3Ectrl%20%26amp%3B%3D(uint16_t)(~PWM_CTRL_PRSC_MASK)%3B%3CBR%20%2F%3Ectrl%20%7C%3D%20PWM_CTRL_PRSC(%E3%83%97%E3%83%AA%E3%82%B9%E3%82%B1%E3%83%BC%E3%83%AB)%3B%3CBR%20%2F%3Eaxis-%26gt%3BpwmBase-%26gt%3BSM%5Baxis-%26gt%3BpwmModule%5D%E3%80%82CTRL%20%3D%20ctrl%3B%3CBR%20%2F%3E%3CBR%20%2F%3Eaxis-%26gt%3BpwmBase-%26gt%3BSM%5Baxis-%26gt%3BpwmModule%5D%E3%80%82INIT%20%3D%200U%3B%3CBR%20%2F%3Eaxis-%26gt%3BpwmBase-%26gt%3BSM%5Baxis-%26gt%3BpwmModule%5D%E3%80%82VAL0%20%3D%200U%3B%3CBR%20%2F%3Eaxis-%26gt%3BpwmBase-%26gt%3BSM%5Baxis-%26gt%3BpwmModule%5D%E3%80%82VAL1%20%3D%20((uint16_t)(periodTicks%20-%201U)%3B%3CBR%20%2F%3E%E3%82%82%E3%81%97(%E8%BB%B8%26gt%3Bpwm%E3%83%81%E3%83%A3%E3%83%B3%E3%83%8D%E3%83%AB%3D%3D%20kPWM_PwmA)%20%7B%3CBR%20%2F%3Eaxis-%26gt%3BpwmBase-%26gt%3BSM%5Baxis-%26gt%3BpwmModule%5D%E3%80%82VAL2%20%3D%20riseTicks%3B%3CBR%20%2F%3Eaxis-%26gt%3BpwmBase-%26gt%3BSM%5Baxis-%26gt%3BpwmModule%5D%E3%80%82VAL3%20%3D%20fallTicks%3B%3CBR%20%2F%3E%7D%20%E3%81%9D%E3%81%86%E3%81%A7%E3%81%AA%E3%81%91%E3%82%8C%E3%81%B0%20(axis-%26gt%3BpwmChannel%20%3D%3D%20kPWM_PwmB)%20%7B%3CBR%20%2F%3Eaxis-%26gt%3BpwmBase-%26gt%3BSM%5Baxis-%26gt%3BpwmModule%5D%E3%80%82VAL4%20%3D%20riseTicks%3B%3CBR%20%2F%3Eaxis-%26gt%3BpwmBase-%26gt%3BSM%5Baxis-%26gt%3BpwmModule%5D%E3%80%82VAL5%20%3D%20fallTicks%3B%3CBR%20%2F%3E%7D%3CBR%20%2F%3Eaxis-%26gt%3BpwmBase-%26gt%3BSM%5Baxis-%26gt%3BpwmModule%5D%E3%80%82TCTRL%20%3D%20PWM_TCTRL_OUT_TRIG_EN(axis-%26gt%3BoutTrigMask)%3B%3CBR%20%2F%3E%3CBR%20%2F%3EPWM_SetPwmLdok(%E8%BB%B8%26gt%3BpwmBase%E3%80%81APP_PwmModuleMask(%E8%BB%B8)%E3%80%81%E7%9C%9F)%3B%3CBR%20%2F%3EPWM_SetPwmLdok(%E8%BB%B8%26gt%3BpwmBase%E3%80%81APP_PwmModuleMask(%E8%BB%B8)%E3%80%81%E7%9C%9F)%3B%3CBR%20%2F%3Eaxis-%26gt%3BpwmConfigValid%20%3D%20true%3B%3CBR%20%2F%3E%E8%BB%B8%26gt%3B%E3%82%AD%E3%83%A3%E3%83%83%E3%82%B7%E3%83%A5%E3%83%89HighCnt400M%20%3D%20highCnt400M%3B%3CBR%20%2F%3Eaxis-%26gt%3BcachedLowCnt400M%20%3D%20lowCnt400M%3B%3CBR%20%2F%3E%E7%9C%9F%E3%82%92%E8%BF%94%E3%81%99%3B%3CBR%20%2F%3E%7D%3C%2FLINGO-BODY%3E