查看: 1908|回复: 1

[求助] 还是K64FPWM问题

[复制链接]
  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
    发表于 2016-7-24 07:26:58 | 显示全部楼层 |阅读模式
    上次提问的问题已解——粗心造成。其中的一个变量在前边的编程中已定义过了,由于采用模块化方式,没有检查出来。结果逐步排查法找到了。特提出,在定义变量时最好见词识意,以大小写方式定义,但有时偷懒定义省略简短容易重复定义。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;
        }
    }
    运行结果在示波器上看到的还是跳变脉宽,达不到精细调节的目标。
    请问这是何原因?
    先谢谢了
    我知道答案 目前已有1人回答
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2019-2-14 16:49
  • 签到天数: 296 天

    连续签到: 1 天

    [LV.8]以坛为家I

    241

    主题

    2239

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    4473
    最后登录
    2020-4-14
     楼主| 发表于 2016-7-24 07:32:00 | 显示全部楼层
    自己回答吧:
    将mod删除就好了:
    cnv = (mod * dutyCyclePercent) ;改为
    cnv =dutyCyclePercent ;
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-7-18 19:08 , Processed in 0.087299 second(s), 22 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表