FTM輸出PWM
1、宏定義
#define FTM_INSTANCE FTM2 //FTM端口
#define FTM_CHANNAL0 0U //FTM通道
#define FTM_CHANNAL1 1U //FTM通道
#define FTM_CLKFREQ() CLOCK_GetFreq(kCLOCK_BusClk) //獲取總線時鐘頻率
#define FTM_PORT PORTB //PORT端口
#define FTM_PIN1 18U //PWM引腳
#define FTM_PIN2 19U //PWM引腳
2、PWM初始化
void FWM_INIT(void)
{
ftm_config_t FTMconfig;//初始化結構體句柄
CLOCK_EnableClock(kCLOCK_PortB);//GPIOB端口時鐘初始化
PORT_SetPinMux(FTM_PORT,FTM_PIN1,kPORT_MuxAlt3);//端口複用爲FTM模式
PORT_SetPinMux(FTM_PORT,FTM_PIN2,kPORT_MuxAlt3);//端口複用爲FTM模式
ftm_chnl_pwm_signal_param_t FTM_PARAM[2]; //初始化參數配置數組
FTM_PARAM[0].chnlNumber = FTM_CHANNAL0; //配置通道
FTM_PARAM[0].dutyCyclePercent = 0U; //初始化的佔空比
FTM_PARAM[0].firstEdgeDelayPercent = 10U; //死區時間
FTM_PARAM[0].level = kFTM_HighTrue; //極性爲高電平
FTM_PARAM[1].chnlNumber = FTM_CHANNAL1; //配置通道
FTM_PARAM[1].dutyCyclePercent = 0U; //初始化的佔空比
FTM_PARAM[1].firstEdgeDelayPercent = 10U; //死區時間
FTM_PARAM[1].level = kFTM_HighTrue; //極性爲高電平
FTM_GetDefaultConfig(&FTMconfig); //配置重置
FTM_Init(FTM_INSTANCE,&FTMconfig); //初始化配置
FTM_SetupPwm(FTM_INSTANCE,FTM_PARAM,2U,kFTM_EdgeAlignedPwm,200000,FTM_CLKFREQ());//配置PWM
FTM_StartTimer(FTM_INSTANCE,kFTM_SystemClock);//開啓定時器,時鐘源配置爲系統時鐘
}
其中,FTM_SetupPwm函數的參數爲:
status_t FTM_SetupPwm(FTM_Type *base, //FTM端口號
const ftm_chnl_pwm_signal_param_t *chnlParams, //初始化參數配置數組地址
uint8_t numOfChnls, //通道個數
ftm_pwm_mode_t mode, //PWM模式,一般選擇邊沿觸發
uint32_t pwmFreq_Hz, //輸出PWM頻率
uint32_t srcClock_Hz) //時鐘源
FTM_StartTimer的函數
static inline void FTM_StartTimer(FTM_Type *base, //FTM端口號
ftm_clock_source_t clockSource)//時鐘源(系統時鐘)
3、改變佔空比
void FTM_UpdatePwmDutycycle(FTM_Type *base, //FTM端口號
ftm_chnl_t chnlNumber, //通道號
ftm_pwm_mode_t currentPwmMode, pwm模式(一般爲邊緣觸發)
uint8_t dutyCyclePercent) //佔空比(0-100)
//行如:
FTM_UpdatePwmDutycycle(FTM0_INSTANCE,FTM0_CHANNAL0,kFTM_EdgeAlignedPwm,duty);
4、使能軟件流控制
static inline void FTM_SetSoftwareTrigger(FTM_Type *base,//FTM端口號
bool enable) //布爾值(0或1)
//行如:
FTM_SetSoftwareTrigger(FTM_INSTANCE,1);
這裏注意一點:每次改變完佔空比後都要使能軟件流控制,不然不會執行,也就是沒有PWM輸出