DSP TMS320F280049之移相控制(Phase-Shift Control)-庫函數實現

(1)原理介紹

        F280049C的PWM模塊功能強大,可以比較容易的實現移相控制。 本節主要向大家講述用DSP如何編程實現移相控制,如下圖所示爲移相全橋變換器的移相控制示意圖,其中EPWM1A和EPWM1B爲佔空比50%的互補信號,EPWM2A和EPWM2B也爲佔空比50%的互補信號。通過控制EPWM1A和EPWM2B的移相角來實現移相控制。

         如上圖標註所示,控制上以PWM1的計數時基爲基準信號,在PWM1的計數器爲零(宏:EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO)時PWM1發出同步脈衝SyncOut,同時配置PWM2的同步信號來源爲Syncln(宏:EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN)。相關的宏定義如下所示:

typedef enum
{
    //! sync pulse is generated by software
    EPWM_SYNC_OUT_PULSE_ON_SOFTWARE  = 0,
    //! sync pulse is passed from EPWMxSYNCIN
    EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN = 0,
    //! sync pulse is generated when time base counter equals zero
    EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO = 1,
    //! sync pulse is generated when time base counter equals compare B value.
    EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_B = 2,
    //! sync pulse is disabled
    EPWM_SYNC_OUT_PULSE_DISABLED = 4,
    //! sync pulse is generated when time base counter equals compare D value.
    EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_C = 5,
    //! sync pulse is disabled.
    EPWM_SYNC_OUT_PULSE_ON_COUNTER_COMPARE_D = 6
}EPWM_SyncOutPulseMode;

          當PWM1的時基計數到零數發出同步脈衝,此時,PWM2接收到同步脈衝後將相位寄存器TBPHS中的值加載到時基計數器TBCTR中。也就是說,當PWM1從零開始計數時,PWM2此時從TBPHS寄存器中的值開始計數。因此,PWM1和PWM2實現了移相,改變TBPHS寄存器中的值可以改變移相控制的移相角。

(2)相關寄存器配置

如上圖所示,PWM1只需要配置其何時發出同步脈衝即可,相關配置如下所示:

EPWM_setSyncOutPulseMode(EPWM1_BASE,EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);  //計數到零時發出同步脈衝

PWM2需要配置其同步脈衝輸入源和相位寄存器TBPHS的值,同時還需要使能相位寄存器的加載(圖中的En,寄存器TBCTL中的PHSEN位),相關配置代碼如下:

    EPWM_enablePhaseShiftLoad(EPWM2_BASE);                                      //使能相位寄存器
    EPWM_setSyncOutPulseMode(EPWM2_BASE,EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);    //計數到零時發出同步脈衝
    EPWM_setPhaseShift(EPWM2_BASE,250);                                         //設置初始移相值

(3)PWM1和PWM2的配置 

        PWM1和PWM2的完整配置程序如下所示,其中包含了基本PWM輸出的配置、死區時間的配置和移相控制的配置,每句程序後邊都有詳細的註釋,方便大家閱讀理解。要想實現PWM的輸出,還需要配置與PWM相關的GPIO引腳,限於篇幅,在此不再列出,需要的話大家可以下載完整的實驗工程(下載鏈接見文章末尾)。

void ePWM1_Configuration(void)
{
    EPWM_setClockPrescaler(EPWM1_BASE,
                           EPWM_CLOCK_DIVIDER_1,
                           EPWM_HSCLOCK_DIVIDER_1);                         //ePWM 時鐘爲100MHZ

    EPWM_setTimeBaseCounterMode(EPWM1_BASE,EPWM_COUNTER_MODE_UP);           //設置計數模式(增計數)
    EPWM_setTimeBaseCounter(EPWM1_BASE,0);                                  //計數初始值設置
    EPWM_setTimeBasePeriod(EPWM1_BASE,1000);                                //計數週期 fs=100kHz

    EPWM_setPeriodLoadMode(EPWM1_BASE,EPWM_PERIOD_SHADOW_LOAD);             //週期加載模式
    EPWM_setCounterCompareShadowLoadMode(EPWM1_BASE,
                                         EPWM_COUNTER_COMPARE_A,
                                         EPWM_COMP_LOAD_ON_CNTR_ZERO_PERIOD);//比較值加載模式

    EPWM_setCounterCompareValue(EPWM1_BASE,EPWM_COUNTER_COMPARE_A,500);     //設定比較值
    EPWM_setCounterCompareValue(EPWM1_BASE,EPWM_COUNTER_COMPARE_B,500);

    EPWM_setActionQualifierAction(EPWM1_BASE,
                                  EPWM_AQ_OUTPUT_A,
                                  EPWM_AQ_OUTPUT_LOW,
                                  EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);      //ePWMA的
    EPWM_setActionQualifierAction(EPWM1_BASE,
                                  EPWM_AQ_OUTPUT_A,
                                  EPWM_AQ_OUTPUT_HIGH,
                                  EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);

    EPWM_setSyncOutPulseMode(EPWM1_BASE,EPWM_SYNC_OUT_PULSE_ON_COUNTER_ZERO);  //計數到零時發出同步脈衝

    EPWM_setRisingEdgeDeadBandDelayInput(EPWM1_BASE,EPWM_DB_INPUT_EPWMA);
    EPWM_setFallingEdgeDeadBandDelayInput(EPWM1_BASE,EPWM_DB_INPUT_EPWMA);     //配置死區輸入模式
    EPWM_setDeadBandDelayPolarity(EPWM1_BASE,EPWM_DB_RED,EPWM_DB_POLARITY_ACTIVE_HIGH);
    EPWM_setDeadBandDelayPolarity(EPWM1_BASE,EPWM_DB_FED,EPWM_DB_POLARITY_ACTIVE_LOW);//配置極性
    EPWM_setDeadBandDelayMode(EPWM1_BASE,EPWM_DB_RED,true);
    EPWM_setDeadBandDelayMode(EPWM1_BASE,EPWM_DB_FED,true);                     //配置輸出模式
    EPWM_setDeadBandOutputSwapMode(EPWM1_BASE,EPWM_DB_OUTPUT_A,false);
    EPWM_setDeadBandOutputSwapMode(EPWM1_BASE,EPWM_DB_OUTPUT_B,false);          //輸出不交換

    EPWM_setRisingEdgeDelayCount(EPWM1_BASE,0);                                //上升沿延時0nS
    EPWM_setFallingEdgeDelayCount(EPWM1_BASE,0);                               //下降沿延時0nS

    EPWM_enableADCTrigger(EPWM1_BASE,EPWM_SOC_A);
    EPWM_setADCTriggerSource(EPWM1_BASE,EPWM_SOC_A,EPWM_SOC_TBCTR_ZERO);
    EPWM_setADCTriggerEventPrescale(EPWM1_BASE,EPWM_SOC_A,1);
}

void ePWM2_Configuration(void)
{
    EPWM_setClockPrescaler(EPWM2_BASE,
                           EPWM_CLOCK_DIVIDER_1,
                           EPWM_HSCLOCK_DIVIDER_1);                         //ePWM 時鐘爲100MHZ

    EPWM_setTimeBaseCounterMode(EPWM2_BASE,EPWM_COUNTER_MODE_UP);           //設置計數模式(增計數)
    EPWM_setTimeBaseCounter(EPWM2_BASE,0);                                  //計數初始值設置
    EPWM_setTimeBasePeriod(EPWM2_BASE,1000);                                //計數週期 fs=100kHz

    EPWM_setPeriodLoadMode(EPWM2_BASE,EPWM_PERIOD_SHADOW_LOAD);             //週期加載模式
    EPWM_setCounterCompareShadowLoadMode(EPWM2_BASE,
                                         EPWM_COUNTER_COMPARE_A,
                                         EPWM_COMP_LOAD_ON_CNTR_ZERO_PERIOD);//比較值加載模式

    EPWM_setCounterCompareValue(EPWM2_BASE,EPWM_COUNTER_COMPARE_A,500);     //設定比較值
    EPWM_setCounterCompareValue(EPWM2_BASE,EPWM_COUNTER_COMPARE_B,500);

    EPWM_setActionQualifierAction(EPWM2_BASE,
                                  EPWM_AQ_OUTPUT_A,
                                  EPWM_AQ_OUTPUT_LOW,
                                  EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);      //ePWMA的
    EPWM_setActionQualifierAction(EPWM2_BASE,
                                  EPWM_AQ_OUTPUT_A,
                                  EPWM_AQ_OUTPUT_HIGH,
                                  EPWM_AQ_OUTPUT_ON_TIMEBASE_PERIOD);

    EPWM_enablePhaseShiftLoad(EPWM2_BASE);                                      //使能相位寄存器
    EPWM_setSyncOutPulseMode(EPWM2_BASE,EPWM_SYNC_OUT_PULSE_ON_EPWMxSYNCIN);    //計數到零時發出同步脈衝
    EPWM_setPhaseShift(EPWM2_BASE,250);                                         //設置初始移相值

    EPWM_setRisingEdgeDeadBandDelayInput(EPWM2_BASE,EPWM_DB_INPUT_EPWMA);
    EPWM_setFallingEdgeDeadBandDelayInput(EPWM2_BASE,EPWM_DB_INPUT_EPWMA);     //配置死區輸入模式
    EPWM_setDeadBandDelayPolarity(EPWM2_BASE,EPWM_DB_RED,EPWM_DB_POLARITY_ACTIVE_HIGH);
    EPWM_setDeadBandDelayPolarity(EPWM2_BASE,EPWM_DB_FED,EPWM_DB_POLARITY_ACTIVE_LOW);//配置極性
    EPWM_setDeadBandDelayMode(EPWM2_BASE,EPWM_DB_RED,true);
    EPWM_setDeadBandDelayMode(EPWM2_BASE,EPWM_DB_FED,true);                     //配置輸出模式
    EPWM_setDeadBandOutputSwapMode(EPWM2_BASE,EPWM_DB_OUTPUT_A,false);
    EPWM_setDeadBandOutputSwapMode(EPWM2_BASE,EPWM_DB_OUTPUT_B,false);          //輸出不交換

    EPWM_setRisingEdgeDelayCount(EPWM2_BASE,0);                  //上升沿延時0nS
    EPWM_setFallingEdgeDelayCount(EPWM2_BASE,0);                  //下降沿延時0nS
}

(4)實驗波形

設定移相角爲90度,開關頻率爲100kHZ,佔空比爲50%。輸出PWM1A和PWM2A的波形如下所示:

F280049移相控制完整的CCS工程我已經上傳到了CSDN上,需要的可自行下載哈,程序中有不懂得地方都可以給我留言哈。下載鏈接如下:

https://download.csdn.net/download/fanxianyan1993/11110315

 

提問方式:有啥不懂的可以隨時向我提問哈,掃描下方二維碼我會在第一時間給大家回覆的哈,謝謝。 

發佈了16 篇原創文章 · 獲贊 31 · 訪問量 8787
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章