在线时间20 小时
UID3355975
注册时间2018-11-17
NXP金币0
该用户从未签到
中级会员
- 积分
- 200
- 最后登录
- 2019-4-25
|
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的参考手册寄存器。
|