PWM Synchronization Using Kinetis Flextimers

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

PWM Synchronization Using Kinetis Flextimers

656 Views
pliqy666
Contributor I

你好!
    我需要将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微秒左右的摆动,固定频率时没有这个问题.

Labels (1)
0 Kudos
1 Reply

532 Views
Robin_Shen
NXP TechSupport
NXP TechSupport

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; 

FTMx_SYNC.png

Table 3-1. Module-to-module interconnects.png

3.9.1.3 FTM interconnections.png

     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!
-----------------------------------------------------------------------------------------------------------------------

0 Kudos