查看: 2959|回复: 1

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

[复制链接]

该用户从未签到

11

主题

40

帖子

0

中级会员

Rank: 3Rank: 3

积分
200
最后登录
2019-4-25
发表于 2019-4-23 17:04:39 | 显示全部楼层 |阅读模式
这个是用寄存器写的对外输出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); //设定占空比

我知道答案 目前已有1人回答
回复

使用道具 举报

该用户从未签到

723

主题

6382

帖子

0

超级版主

Rank: 8Rank: 8

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

使用道具 举报

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

本版积分规则

关闭

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

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

GMT+8, 2025-9-6 19:40 , Processed in 0.089366 second(s), 22 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

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