你好!
我需要将FTM0和FTM2同步,使用软件触发始终不成功,不知啥原因?代码如下:
// FTM2 配置
SIM->PINSEL &= ~SIM_PINSEL_FTM2PS2_MASK; // 0 T22--PTC2 PWT_IN0
//SIM->PINSEL |= SIM_PINSEL_FTM2PS2_MASK; // 1 T22--PTC4 PWT_IN0
//SIM->PINSEL |= SIM_PINSEL_FTM2PS3_MASK; //T23--PTC5
SIM->PINSEL &= ~SIM_PINSEL_FTM2PS3_MASK; //T23--PTC3
SIM->SCGC |= SIM_SCGC_FTM2_MASK;
FTM2->SC = 0x0; // CLKS为0,关计数器
//FTM2->CONF |=0xC0; //DBM 11
FTM2->MOD = 959; //50KHz 20*48-1
FTM2->CNTIN=0;
//FTM2->DEADTIME |= 0xF;
FTM2->SC &= ~FTM_SC_CPWMS_MASK; //向上或中心对齐模式选择 ,选向上模式
FTM2->MODE |= 0x5; // FTM使能
FTM2->COMBINE |= 0x232323; // 全部通道组合互补
FTM2->CONTROLS[0].CnSC |= 0x8; // H真脉冲
FTM2->CONTROLS[1].CnSC |= 0x8;
FTM2->CONTROLS[2].CnSC |= 0x8;
FTM2->CONTROLS[3].CnSC |= 0x8;
FTM2->CONTROLS[4].CnSC |= 0x8;
FTM2->CONTROLS[5].CnSC |= 0x8;
FTM2->CONTROLS[0].CnV = 300;
FTM2->CONTROLS[1].CnV = 600;
FTM2->CONTROLS[2].CnV = 300;
FTM2->CONTROLS[3].CnV = 600;
FTM2->CONTROLS[4].CnV = 0;
FTM2->CONTROLS[5].CnV = 500;
FTM2->CNT=0;
FTM2->SC |= 0x8; //系统时钟,直通
FTM2->SYNCONF |= 0x380; //软件触发
FTM2->SYNC |= 0x4;
void FTM0_Isr(void)
{
FTM2->CONTROLS[4].CnV = 0;
FTM2->CONTROLS[5].CnV = 300;
FTM2->PWMLOAD |=0x200; //使能更新值加载
FTM2->SYNC |= 0x80; //软件触发同步
}
FTM0是计数器为0时发生中断,在中断程序中软件触发FTM2计数器回0,但无法实现.
采用硬件触发方法可行,但为啥会有2微秒左右延时,在变频起点会变化,约0.5微秒左右的摆动,固定频率时没有这个问题.
Hi 建雄,
抱歉这么晚才答复你!
我测试了这两种同步方式,但从PWM波形上看同步效果是一样的。
你可以测试以下配置,延迟估计是进中断延迟、中断内语句执行时间、同步延迟。
SIM->SOPT |= SIM_SOPT_FTMSYNC_MASK; //硬件触发同步/*PWM Synchronization Hardware Trigger 2*/
FTM2->SYNCONF |= FTM_SYNCONF_SYNCMODE_MASK|FTM_SYNCONF_HWRSTCNT_MASK|FTM_SYNCONF_HWWRBUF_MASK;
FTM2->SYNC |= FTM_SYNC_TRIG2_MASK|FTM_SYNC_REINIT_MASK;
FTM2->SYNC |= FTM_SYNC_SWSYNC_MASK; //软件触发同步
/*PWM Synchronization Software Trigger*/
FTM2->SYNCONF |= FTM_SYNCONF_SYNCMODE_MASK|FTM_SYNCONF_SWRSTCNT_MASK|FTM_SYNCONF_SWWRBUF_MASK;
FTM2->SYNC |= FTM_SYNC_SWSYNC_MASK|FTM_SYNC_REINIT_MASK;
不是很清楚你想达到什么效果。如果想要FTM0和FTM2的PWM波形同时开始,还可以试试将FTM2的硬件触发源选择为FTM2 Trigger1(FTM0 CH0 Output)
/*PWM Synchronization Hardware Trigger 1*/
FTM2->SYNCONF |= FTM_SYNCONF_SYNCMODE_MASK|FTM_SYNCONF_HWRSTCNT_MASK|FTM_SYNCONF_HWWRBUF_MASK;
FTM2->SYNC |= FTM_SYNC_TRIG1_MASK|FTM_SYNC_REINIT_MASK;
Best Regards,
Robin
-----------------------------------------------------------------------------------------------------------------------
Note: If this post answers your question, please click the Correct Answer button. Thank you!
-----------------------------------------------------------------------------------------------------------------------