查看: 4734|回复: 10

[求助] 关于KEA128的FTM0/1的PWM不能输出

[复制链接]

该用户从未签到

11

主题

40

帖子

0

中级会员

Rank: 3Rank: 3

积分
200
最后登录
2019-4-25
发表于 2019-4-23 17:06:22 | 显示全部楼层 |阅读模式
10NXP金币
这个是用寄存器写的对外输出PWM的程序,FTM2的时候能正常输出,然后要输出FTM0的时候,发现硬件错误,然后把FTM2中专用的寄存器去掉之后,FTM0没有占空比输出。请问有法子吗?请教了飞思卡尔的FAE了也没有解决。



void FTM_PWM_init(uint_8 ftmNo,uint_8 channel, float freq, float duty)
{
        uint_16 duty_channel;
        uint_16 mod;

        //防止模块号越界
                if(ftmNo>2) ftmNo=2;

        //计算mod值,周期(ms) = MOD / 1500
        if(freq <= 0.012)
                mod = 0xFFFF;
        else if(freq>2500)
                mod=0;
        else
                mod = 2500 / freq;

        //防止周期越界
        if(duty > 100)
                duty = 100;
        if(duty < 0)
                duty = 0;

        switch(ftmNo)
        {
                case FTM_0:

                        //复用引脚PTA0为FTM0通道0功能
                SIM_PINSEL0 &= ~SIM_PINSEL_FTM0PS0_MASK;
                        //复用引脚PTA1为FTM0通道1功能
                SIM_PINSEL0 &= ~SIM_PINSEL_FTM0PS1_MASK;
                        //使能FTM0的总线时钟
                SIM_SCGC |= SIM_SCGC_FTM0_MASK;
                        break;

        }

    //写保护禁止
  //  FTM_ARR[ftmNo]->MODE |= FTM_MODE_WPDIS_MASK;
    //总线时钟频率24MHz,分频因子16,分频后为1.5MHz
    FTM_ARR[ftmNo]->SC |= FTM_SC_PS(4);
                        //左对齐,先高电平后低电平
    FTM_CnSC_REG(FTM_ARR[ftmNo], channel) |= FTM_CnSC_ELSB_MASK;
    //边沿对齐
    FTM_CnSC_REG(FTM_ARR[ftmNo], channel) &= ~FTM_CnSC_ELSA_MASK;
    FTM_CnSC_REG(FTM_ARR[ftmNo], channel) |= FTM_CnSC_MSB_MASK;
    //计数器清零
    FTM_ARR[ftmNo]->CNT=0;
    //中断禁止
//   FTM_ARR[ftmNo]->SC &=  ~FTM_SC_TOIE_MASK;
    //FTM2使能
//   FTM_ARR[ftmNo]->MODE &= ~FTM_MODE_FTMEN_MASK;
    //启用需要的输出通道,屏蔽其他通道
  //  FTM_ARR[ftmNo]->OUTMASK = (0xFE << channel);
    //禁止双边沿捕捉模式
   // FTM_ARR[ftmNo]->COMBINE = 0;
    //FTM2计数初始值为0
  //  FTM_ARR[ftmNo]->CNTIN = 0;
    //周期=(MOD-CNTIN+1)*时钟周期=2.5ms
    FTM_ARR[ftmNo]->MOD = mod;
    MOD_VALUE = mod;
    //计算通道寄存器的值,设置占空比
    duty_channel = (uint_16)((float)mod * duty / 100);
    //设置通道值寄存器
    FTM_CnV_REG(FTM_ARR[ftmNo], channel) = duty_channel;
    //使用总线时钟
   FTM_ARR[ftmNo]->SC |= FTM_SC_CLKS(1);
}

//============================================================================
//函数名称:FTM_PWM_set_duty
//函数返回:无
//参数说明:ftmNo:FTM模块号:FTM_0、FTM_1、FTM_2
//          channel:选择通道号:FTM0和FTM1:通道0、通道1
//                             FTM2:通道0、1、2、3、4、5
//          duty:占空比:精度取决于设置的mod值,精度为1/mod。
//功能概要:初始化PWM模块
//============================================================================
void FTM_PWM_set_duty(uint_8 ftmNo, uint_8 channel, float duty)
{
        uint_16 duty_channel;

        if(duty >=100)
                duty = 101;
        if(duty <=0)
                duty = 0;
    //写保护禁止
    // FTM_ARR[ftmNo]->MODE |= FTM_MODE_WPDIS_MASK;
    //计算通道寄存器的值,设置占空比
    duty_channel = (uint_16)((float)MOD_VALUE * duty / 100);
    //设置通道值寄存器
    FTM_CnV_REG(FTM_ARR[ftmNo], channel) = duty_channel;
}






主函数中采用的是:
FTM_PWM_init(FTM_0,CHANNEL0,0.125,0);//PWM初始化
FTM_PWM_set_duty(FTM_0,CHANNEL0,50); //设定占空比

最佳答案

查看完整内容

你把你FTM2可以,改成FTM0不行,卡在SIM->SCGC |= SIM_SCGC_FTM0_MASK;debug下。 看看怎么卡住的,到底是什么现象? 另外,看看寄存器,对应的SIM里面的FTM0时钟是否打开了? 尤其查看下SCGC的地址,还有FTM0的位是不是KEA128的。参考下KEA128的参考手册寄存器。
回复

使用道具 举报

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20161
最后登录
2024-5-7
发表于 2019-4-23 17:06:23 | 显示全部楼层
shmilyzgc 发表于 2019-4-23 18:56
后面我用了那个库函数,FTM2输出没有问题,然后改成FTM0的时候不行, FTM初始化的时候SIM->SCGC |= SIM_S ...

你把你FTM2可以,改成FTM0不行,卡在SIM->SCGC |= SIM_SCGC_FTM0_MASK;debug下。
看看怎么卡住的,到底是什么现象?
另外,看看寄存器,对应的SIM里面的FTM0时钟是否打开了?
尤其查看下SCGC的地址,还有FTM0的位是不是KEA128的。参考下KEA128的参考手册寄存器。
回复

使用道具 举报

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20161
最后登录
2024-5-7
发表于 2019-4-23 17:21:11 | 显示全部楼层
楼主你好,FTM0和FTM2不一样的,有些功能FTM0/1是不支持的。
你查看下KEA128的参考手册:
Table 3-34. FTM modules features
http://www.nxp.com/docs/en/reference-manual/KEA128RM.pdf
回复

使用道具 举报

该用户从未签到

11

主题

40

帖子

0

中级会员

Rank: 3Rank: 3

积分
200
最后登录
2019-4-25
 楼主| 发表于 2019-4-23 17:23:35 | 显示全部楼层
小恩GG 发表于 2019-4-23 17:21
楼主你好,FTM0和FTM2不一样的,有些功能FTM0/1是不支持的。
你查看下KEA128的参考手册:
Table 3-34. FTM  ...

有看的,对着参考手册来了,然后把没有用的寄存器都去掉了,就是不能输出。
回复

使用道具 举报

该用户从未签到

11

主题

40

帖子

0

中级会员

Rank: 3Rank: 3

积分
200
最后登录
2019-4-25
 楼主| 发表于 2019-4-23 17:25:00 | 显示全部楼层
小恩GG 发表于 2019-4-23 17:21
楼主你好,FTM0和FTM2不一样的,有些功能FTM0/1是不支持的。
你查看下KEA128的参考手册:
Table 3-34. FTM  ...

你看看我的程序中寄存器都没有什么问题,如果说2和1有很大不同的话,我在官方库函数的EPWM上,也没有看到有什么明显的说明。。。
回复

使用道具 举报

该用户从未签到

656

主题

6312

帖子

0

超级版主

Rank: 8Rank: 8

积分
20161
最后登录
2024-5-7
发表于 2019-4-23 17:25:55 | 显示全部楼层
shmilyzgc 发表于 2019-4-23 17:23
有看的,对着参考手册来了,然后把没有用的寄存器都去掉了,就是不能输出。 ...

把FTM0当TPM用。代码你可以参考KE系列的:
http://www.nxp.com/webapp/Downlo ... amp;appType=license
FRDM-KEXX-Driver-Library-Package\ke_drv_lib\build\iar\ke06\FTM_EPWM_demo
回复

使用道具 举报

该用户从未签到

11

主题

40

帖子

0

中级会员

Rank: 3Rank: 3

积分
200
最后登录
2019-4-25
 楼主| 发表于 2019-4-23 17:31:04 | 显示全部楼层
小恩GG 发表于 2019-4-23 17:25
把FTM0当TPM用。代码你可以参考KE系列的:
http://www.nxp.com/webapp/Download?colCode=FRDM-KEXX-Driv ...

    你是说调用这个库函数吗?
我这边调用的时候,发现在这个语句里面

    /* set clock source, start counter */
    FTM_ClockSet(FTM2, FTM_CLOCK_SYSTEMCLOCK, FTM_CLOCK_PS_DIV1);  

这个语句运行不了,不知道哪里出了问题
    //Select FTM2Ch5 on PTG7
    SIM_RemapFTM2CH5ToPTG7();
   
    /* FTM2 is set as edge aligned pwm mode, high true pulse */
    FTM_PWMInit(FTM2, FTM_PWMMODE_EDGEALLIGNED, FTM_PWM_HIGHTRUEPULSE);
    /* FTMEN enable */
    FTM_SetFTMEnhanced(FTM2);
    /* update MOD value */
    FTM_SetModValue(FTM2, 9999);
    /* set clock source, start counter */
    FTM_ClockSet(FTM2, FTM_CLOCK_SYSTEMCLOCK, FTM_CLOCK_PS_DIV1);  
    /* enable FTM2 interrupt in NVIC */
    NVIC_EnableIRQ(FTM2_IRQn);
    /* setup call back function for interrupt */
    FTM_SetCallback(FTM2, FTM2_Task);
    /* enable FTM2 overflow interrupt */
    FTM_EnableOverflowInt(FTM2);
回复

使用道具 举报

该用户从未签到

11

主题

40

帖子

0

中级会员

Rank: 3Rank: 3

积分
200
最后登录
2019-4-25
 楼主| 发表于 2019-4-23 18:56:01 | 显示全部楼层
小恩GG 发表于 2019-4-23 17:25
把FTM0当TPM用。代码你可以参考KE系列的:
http://www.nxp.com/webapp/Download?colCode=FRDM-KEXX-Driv ...

后面我用了那个库函数,FTM2输出没有问题,然后改成FTM0的时候不行, FTM初始化的时候SIM->SCGC |= SIM_SCGC_FTM0_MASK;这个语句过不了
回复

使用道具 举报

该用户从未签到

11

主题

40

帖子

0

中级会员

Rank: 3Rank: 3

积分
200
最后登录
2019-4-25
 楼主| 发表于 2019-4-23 18:56:23 | 显示全部楼层
shmilyzgc 发表于 2019-4-23 18:56
后面我用了那个库函数,FTM2输出没有问题,然后改成FTM0的时候不行, FTM初始化的时候SIM->SCGC |= SIM_S ...

void FTM_PWMInit(FTM_Type *pFTM, uint8_t u8PWMModeSelect, uint8_t u8PWMEdgeSelect)
{
    uint8_t   channels, i;
   
    ASSERT((FTM0== pFTM) || (FTM1== pFTM) || (FTM2== pFTM));
   
    /* open the clock gate */
        if (FTM0 == pFTM)
    {
        channels = 2;
        SIM->SCGC |= SIM_SCGC_FTM0_MASK;
    }
    else if(FTM1 == pFTM)
    {
        channels = 2;
#if !defined(CPU_KEA64)
        SIM->SCGC |= SIM_SCGC_FTM1_MASK;
#endif
    }        
    else
    {
        channels = 6;
        SIM->SCGC  |= SIM_SCGC_FTM2_MASK;
    }
   
    pFTM->SC  = 0x0;                                    /* disable counter */  
        pFTM->MOD = FTM_MOD_INIT;
   
    if(FTM_PWMMODE_CENTERALLIGNED == u8PWMModeSelect)   /* enable CPWM */
    {
        pFTM->SC |= FTM_SC_CPWMS_MASK;
    }
    else if(FTM_PWMMODE_COMBINE == u8PWMModeSelect)     /* enable combine pwm mode */
    {
        ASSERT(FTM2 == pFTM);
        pFTM->MODE    |= FTM_MODE_WPDIS_MASK | FTM_MODE_FTMEN_MASK;
        pFTM->COMBINE = FTM_COMBINE_COMBINE0_MASK | FTM_COMBINE_COMP0_MASK | FTM_COMBINE_SYNCEN0_MASK | FTM_COMBINE_DTEN0_MASK |
                        FTM_COMBINE_COMBINE1_MASK | FTM_COMBINE_COMP1_MASK | FTM_COMBINE_SYNCEN1_MASK | FTM_COMBINE_DTEN1_MASK |
                        FTM_COMBINE_COMBINE2_MASK | FTM_COMBINE_COMP2_MASK | FTM_COMBINE_SYNCEN2_MASK | FTM_COMBINE_DTEN2_MASK
                        ;     
        pFTM->SC &= ~FTM_SC_CPWMS_MASK;
    }
    if(FTM_PWM_HIGHTRUEPULSE == u8PWMEdgeSelect)
    {
        /* Configure timers PWM High True Pulses */
        for(i=0; i<channels; i++)
        {
            pFTM->CONTROLS.CnSC = FTM_CnSC_MSB_MASK | FTM_CnSC_ELSB_MASK;  
            pFTM->CONTROLS.CnV  = FTM_C0V_INIT + i*100;
        }
    }
    else if(FTM_PWM_LOWTRUEPULSE == u8PWMEdgeSelect)
    {
        /* Configure timers for PWM Low True Pulses */
        for(i=0; i<channels; i++)
        {
            pFTM->CONTROLS.CnSC = FTM_CnSC_MSB_MASK | FTM_CnSC_ELSA_MASK;
            pFTM->CONTROLS.CnV  = FTM_C0V_INIT + i*100 ;
        }
    }  
}
回复

使用道具 举报

该用户从未签到

11

主题

40

帖子

0

中级会员

Rank: 3Rank: 3

积分
200
最后登录
2019-4-25
 楼主| 发表于 2019-4-23 19:02:29 | 显示全部楼层
小恩GG 发表于 2019-4-23 17:25
把FTM0当TPM用。代码你可以参考KE系列的:
http://www.nxp.com/webapp/Download?colCode=FRDM-KEXX-Driv ...

微信截图_20190423190052.png 更夸张的是这个是官方库函数里面的东西,只有FTM2,是不是写这个库函数的工程也发现FTM1/0用不了了?然后就放弃抵抗了。。。。反正从目前来看,FTM0/1只要出现调用mode这个寄存器,就一定会出现硬件错误,卡死在那里
回复

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2024-5-8 03:41 , Processed in 0.160019 second(s), 28 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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