PWM例程__MK20DX128VLH5_K20系列

/* cpu:MK20DX128VLH5  */

#include "MK20D5.h"

void PWMInit(void);
void GPIOInit(void);

int main(void)
{
    //時鐘初始化在“systm_MK20D5.c”中配置爲8M
    GPIOInit();
    PWMInit();  
    while(1)
    {
    }
}

void GPIOInit(void)
{
    SIM->SCGC5 |= SIM_SCGC5_PORTC_MASK | SIM_SCGC5_PORTD_MASK;  //開端口時鐘門控

    //PC.3、PD.4配置爲普通IO口
    PORTC->PCR[3] &= ~PORT_PCR_MUX_MASK;
    PORTC->PCR[3] |= PORT_PCR_MUX(1);
    PORTD->PCR[4] &= ~PORT_PCR_MUX_MASK;
    PORTD->PCR[4] |= PORT_PCR_MUX(1);

    PTC->PDDR |= 1 << 3;            //PC.3輸出
    PTD->PDDR |= 1 << 4;            //PD.4輸出

    PTC->PSOR |= 1 << 3;            //PC.3 = 1,初始化爲高
    PTD->PSOR |= 1 << 4;            //PD.4 = 1,初始化爲高
}

/* FTM0_CH7配置爲邊界對齊PWM,對應管教PA.2,週期2ms,佔空比1/4 */
void PWMInit(void)  
{
    SIM->SCGC5 |= SIM_SCGC5_PORTA_MASK; 
    PORTA->PCR[2] &= ~PORT_PCR_MUX_MASK;
    PORTA->PCR[2] |= PORT_PCR_MUX(3);   //管腳功能FTM0_CH2

    SIM->SCGC6 |= SIM_SCGC6_FTM0_MASK;  //開FTM0門控

    /* disable FTM, we must set CLKS(0) before config FTM! */
    FTM0->SC = 0;

    FTM0->MODE |= FTM_MODE_WPDIS_MASK; //清除寫保護

    FTM0->CNT = 0;
    FTM0->CNTIN = 0;
    FTM0->MOD = 2000 - 1;           //PWM週期,對應定時器時鐘設置爲1M,則PWM週期設置爲2ms
                                    //The EPWM period is determined by (MOD - CNTIN + 0x0001) and 
                                    //the pulse width(duty cycle) is determined by (CnV - CNTIN).

    /* set LOCK bit to load MOD value */
    FTM0->PWMLOAD = 0xFFFFFFFF;         //有沒有這句話貌似沒影響

    FTM0->SC &= ~FTM_SC_CLKS_MASK;
    FTM0->SC |= FTM_SC_CLKS(1);         //時鐘源選擇sytemclock

    FTM0->SC &= ~FTM_SC_PS_MASK;
    FTM0->SC |= FTM_SC_PS(3);           //8分頻,主頻爲8M,這樣定時器時鐘爲1M

    //配置爲邊界對齊模式:QUADEN = 0, DECAPEN = 0, COMBINE = 0, CPWNS = 0, MSnB =1    ,ELSB=1/ELSA=1
    FTM0->CONTROLS[7].CnSC &= ~FTM_CnSC_MSA_MASK;
    FTM0->CONTROLS[7].CnSC |= FTM_CnSC_MSB_MASK;    
    FTM0->CONTROLS[7].CnSC &= ~FTM_CnSC_ELSA_MASK;
    FTM0->CONTROLS[7].CnSC |= FTM_CnSC_ELSB_MASK;

    FTM0->OUTINIT |= FTM_OUTINIT_CH7OI_MASK;    //通道輸出初始化爲高
    FTM0->OUTMASK &= ~FTM_OUTMASK_CH7OM_MASK;  //Channel output is not masked. It continues to operate normally.   

    FTM0->CONTROLS[7].CnV = 500;    //脈寬設置,硬件仿真顯示此句不能直接放在語句“FTM0->MOD = 2000 - 1;”之後,不然沒有輸出

    //中斷設置
    FTM0->SC |= FTM_SC_TOIE_MASK;   //使能溢出中斷
    NVIC_EnableIRQ(FTM0_IRQn);
}

/* 中斷響應 */
void FTM0_IRQHandler(void)
{
    FTM0->SC &= ~FTM_SC_TOF_MASK;  //清中斷TOF位,寫0清除,寫1沒有影響
    PTC->PTOR |= 1 << 3;    //翻轉PC.3
    PTD->PTOR |= 1 << 4;    //翻轉PD.4
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章