在线时间613 小时
UID252169
注册时间2010-12-5
NXP金币0
TA的每日心情 | 开心 2019-2-14 16:49 |
---|
签到天数: 296 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 4473
- 最后登录
- 2020-4-14
|
上次提问的问题已解——粗心造成。其中的一个变量在前边的编程中已定义过了,由于采用模块化方式,没有检查出来。结果逐步排查法找到了。特提出,在定义变量时最好见词识意,以大小写方式定义,但有时偷懒定义省略简短容易重复定义。reg是这段语句原有的,但在前我也定义了reg变量用于LCD。
特此说明,并对给予帮助的网友们致谢。
还有个问题,在fsl_ftm.c中重新定义PWM脉宽的函数:
void FTM_UpdatePwmDutycycle(FTM_Type *base,
ftm_chnl_t chnlNumber,
ftm_pwm_mode_t currentPwmMode,
uint8_t dutyCyclePercent)
{
uint16_t cnv, cnvFirstEdge = 0, mod;
mod = base->MOD;
if ((currentPwmMode == kFTM_EdgeAlignedPwm) || (currentPwmMode == kFTM_CenterAlignedPwm))
{
cnv = (mod * dutyCyclePercent) / 100;
//For 100% duty cycle
if (cnv >= mod)
{
cnv = mod + 1;
}
base->CONTROLS[chnlNumber].CnV = cnv;
}
else
{
//This check is added for combined mode as the channel number should be the pair number
if (chnlNumber >= (FSL_FEATURE_FTM_CHANNEL_COUNTn(base) / 2))
{
return;
}
cnv = (mod * dutyCyclePercent) / 100;
cnvFirstEdge = base->CONTROLS[chnlNumber * 2].CnV;
//For 100% duty cycle
if (cnv >= mod)
{
cnv = mod + 1;
}
base->CONTROLS[(chnlNumber * 2) + 1].CnV = cnvFirstEdge + cnv;
}
}
语句中说明为100%脉宽的地方都删去了,成为:
void FTM_UpdatePwmDutycycle(FTM_Type *base,
ftm_chnl_t chnlNumber,
ftm_pwm_mode_t currentPwmMode,
uint8_t dutyCyclePercent)
{
uint16_t cnv, cnvFirstEdge = 0, mod;
mod = base->MOD;
if ((currentPwmMode == kFTM_EdgeAlignedPwm) || (currentPwmMode == kFTM_CenterAlignedPwm))
{
cnv = (mod * dutyCyclePercent) ;
base->CONTROLS[chnlNumber].CnV = cnv;
}
else
{
//This check is added for combined mode as the channel number should be the pair number
if (chnlNumber >= (FSL_FEATURE_FTM_CHANNEL_COUNTn(base) / 2))
{
return;
}
cnv = (mod * dutyCyclePercent) ;
cnvFirstEdge = base->CONTROLS[chnlNumber * 2].CnV;
base->CONTROLS[(chnlNumber * 2) + 1].CnV = cnvFirstEdge + cnv;
}
}
运行结果在示波器上看到的还是跳变脉宽,达不到精细调节的目标。
请问这是何原因?
先谢谢了
|
|