TIDA-010062提供的圖騰柱無橋PFC的PWM狀態(tài)機(jī)實(shí)現(xiàn)
? 前言:這是2020年學(xué)習(xí)TIDA參考設(shè)計(jì)做的一些記錄,整理了TI的參考設(shè)計(jì)在無橋圖騰柱的控制上的一些思考和實(shí)現(xiàn)方法。(最近有不少人問過我正向東西)。

?
MCU的資源使用說明:

?? 首先注意這個(gè)結(jié)構(gòu)體定義,它設(shè)定了圖騰柱PFC在PWM的多個(gè)狀態(tài),并根據(jù)AC電網(wǎng)的電壓來實(shí)現(xiàn)狀態(tài)機(jī)種各個(gè)子狀態(tài)的切換??梢钥吹降氖菑恼截?fù)或者是從負(fù)到正都經(jīng)歷了三個(gè)狀態(tài),避免發(fā)生錯(cuò)誤,而且也方便引入控制功能進(jìn)去。
typedef?union{
? ??enum
? ? {
? ? ? ??pwmSwState_normalOperation?=?0,
? ? ? ??pwmSwState_positiveHalf?=?1,
? ? ? ??pwmSwState_negativeZeroCrossing1?=?2,
? ? ? ??pwmSwState_negativeZeroCrossing2?=?3,
? ? ? ??pwmSwState_negativeZeroCrossing3?=?4,
? ? ? ??pwmSwState_negativeHalf?=?5,
? ? ? ??pwmSwState_positiveZeroCrossing1?=?6,
? ? ? ??pwmSwState_positiveZeroCrossing2?=?7,
? ? ? ??pwmSwState_positiveZeroCrossing3?=?8,
? ? ? ??pwmSwState_defaultState?=?9,
? ? }enum_pwmSwState;
? ??int32_t?pad;
}TTPLPFC_pwmSwState;
extern?TTPLPFC_pwmSwState?TTPLPFC_pwm_SwState;
? 下面是PWM狀態(tài)機(jī)函數(shù),是放在每個(gè)開關(guān)周期的中斷控制函數(shù)種執(zhí)行,接受電流環(huán)輸出的Duty數(shù)據(jù),并直接寫入到PWM模塊的寄存器里面實(shí)現(xiàn)占空比輸出。下面我會(huì)在函數(shù)里面用簡單的用中文注釋里面說明以下TI的實(shí)現(xiàn)方法和思考。
#pragma?FUNC_ALWAYS_INLINE(TTPLPFC_pwmDriver)
static?inline?void?TTPLPFC_pwmDriver()
{
#if?TTPLPFC_DC_CHECK?==?0
? ??switch(TTPLPFC_pwm_SwState.enum_pwmSwState)
? ? {
? ? ? ? /*First state after B2 Tasks initialization*/
? ? ? ??case?pwmSwState_normalOperation:
? ? ? ? ? ??//
? // Wait for positive zero crossing: pwmSwState_positiveZeroCrossing1
? ? ? ? ? ??//PWM state get into positive zero crossing state1 when Vin<0.
? ? ? ? ? ??//TTPLPFC_threshold_PZC2=0.01,
? ? ? ? ? ??//
/*?在MCU復(fù)位后的全局變量初始化時(shí),會(huì)把這個(gè)狀態(tài)機(jī)放在pwmSwState_normalOperation的初始位置,通常在這個(gè)情況下會(huì)把所有PWM的輸出拉到,為了保險(xiǎn)起見還會(huì)設(shè)置一個(gè)PWM TZ FLAG的故障位標(biāo)志,讓PWM模塊也維持在輸出為低的故障模式,如果外部有管理PWM的邏輯器件,也會(huì)拉低PWM的輸出,防止錯(cuò)誤的時(shí)序損壞開關(guān)器件。*/
/* 從上面的代碼可見,已經(jīng)是進(jìn)入了開始PWM工作的流程,并且等待電網(wǎng)電壓相位的過零穿越,需要注意的是它是要等電網(wǎng)從負(fù)到正穿越,并且把PZC2這個(gè)閾值的比較點(diǎn)是設(shè)置為0.01。那么PZC2是需要跟誰進(jìn)行比較呢?很顯然是跟電網(wǎng)鎖相環(huán)的輸出值進(jìn)行比較,為了避免干擾,通常會(huì)用鎖相環(huán)輸出的完美正弦波來進(jìn)行相位的過零穿越的判定。*/
/* 下面這行代碼就是開始比較AC電網(wǎng)的鎖相環(huán)的值了,這里TTPLPFC_acSine_Prev 是把鎖相環(huán)的當(dāng)前輸出滯后了一拍,起到雙層判定的效果。如果通過這里if判定,那么可以把狀態(tài)機(jī)轉(zhuǎn)移到下一個(gè)狀態(tài)了。*/
? ? ? ? ? ??if(TTPLPFC_acSine?<?TTPLPFC_threshold_PZC2
? ? ? ? ? ? ? ? ? ? &&?TTPLPFC_acSine_Prev?<?0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//State switch.
? ? ? ? ? ? ? ??//
?/* 切換狀態(tài)到正向穿越,并且直接強(qiáng)迫限制此時(shí)的Duty到最小值,為了防止意外發(fā)出的PWM損壞開關(guān)管 */
? ? ? ? ? ? ? ??TTPLPFC_pwm_SwState.enum_pwmSwState?=
? ? ? ? ? ? ? ? ? ? ? ??pwmSwState_positiveZeroCrossing1;
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//Limit PU of Duty.
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??TTPLPFC_DutyPU?=?0.004f;
? ? ? ? ? ? ? ??//
//Force PWM output low by AQ(LOW_FREQ) and DB(HIGH_FREQ)
? ? ? ? ? ? ? ??//
/*?這里使用宏定義直接強(qiáng)迫了PWM的動(dòng)作寄存器輸出H/L都是低電平,
是用在圖騰柱的低頻橋臂,然后強(qiáng)迫設(shè)置PWM寄存器的死區(qū)模塊的上升/下降沿死區(qū)模塊為TTPLPFC_PFC_PWM_PERIOD值,也就是死區(qū)長達(dá)達(dá)到一個(gè)周期,那就是把PWM的有效輸出全部用死區(qū)吃掉了,是禁用PWM的輸出的一種簡單方法*/
? ? ? ? ? ? ? ??TTPLPFC_AQ_SW_FORCE_PWMxA_LOW_PWMxB_LOW(
? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_LOW_FREQ_PWM_BASE);
? ? ? ? ? ? ? ??TTPLPFC_SET_PWM_DBRED(TTPLPFC_HIGH_FREQ_PWM_BASE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_PFC_PWM_PERIOD);
? ? ? ? ? ? ? ??TTPLPFC_SET_PWM_DBFED(TTPLPFC_HIGH_FREQ_PWM_BASE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_PFC_PWM_PERIOD);
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//Limit output of current loop PI regulator.
? ? ? ? ? ? ? ??//
/* 初始化電流環(huán)的PI參數(shù),清除PI控制器的內(nèi)部數(shù)據(jù)和輸出,防止影響到Duty控制*/
? ? ? ? ? ? ? ??TTPLPFC_gi.i10?=?0;
? ? ? ? ? ? ? ??TTPLPFC_gi.i6?=?1;
? ? ? ? ? ? ? ??TTPLPFC_gi_out?=?0;
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//Clear trip flags twice.
? ? ? ? ? ? ? ??//This flag has been cleared in B2 Tasks.
? ??? ? ? ? ? ? /* 分別清除兩個(gè)橋臂的PWM故障,為后面開啟發(fā)波做準(zhǔn)備,前面提到的是在初始狀態(tài)強(qiáng)制設(shè)置了PWM TZ FLAG故障的標(biāo)志,這里檢查到零穿越后,在轉(zhuǎn)移函數(shù)種清除掉標(biāo)志位 */
? ? ? ? ? ?? ? ??TTPLPFC_HAL_clearPWMTripFlags(TTPLPFC_LOW_FREQ_PWM_BASE);
? ? ? ? ? ? ? ??TTPLPFC_HAL_clearPWMTripFlags(TTPLPFC_HIGH_FREQ_PWM_BASE);
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//Initialize current loop reference.
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??TTPLPFC_ac_cur_ref_inst_pu?=?0.00f;
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//Set close loop flags. Begin close loop actions.
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??TTPLPFC_closeGiLoop?=?1;
? ? ? ? ? ? ? ??TTPLPFC_closeGvLoop?=?1;
? ? ? ? ? ? }
? ? ? ? ? ??break;
? ? ? ? /*Positive half state*/
? ? ? ??case?pwmSwState_positiveHalf:
? ? ? ? ? ??//
? ? ? ? ? ??//Set LOW_FREQ PWM output to control current direction.
? ? ? ? ? ??//Set DBRED to allow HIGH_FREQ PWM output.
? ? ? ? ? ??//
/* 進(jìn)入電網(wǎng)正相位工作,這里用宏開啟低頻橋臂的低端開關(guān)位高,高端開關(guān)位低。同時(shí)減少高頻橋臂的開關(guān)的的上升沿死區(qū)到正常工作范圍,下降沿死區(qū)依然位周期長度,沒做修改*/
? ? ? ? ? ??TTPLPFC_AQ_SW_FORCE_PWMxA_LOW_PWMxB_HIGH(TTPLPFC_LOW_FREQ_PWM_BASE);
? ? ? ? ? ??TTPLPFC_SET_PWM_DBRED(TTPLPFC_HIGH_FREQ_PWM_BASE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_dbRED_SetValue_ticks);
? ? ? ??#if?TTPLPFC_CONTROL_RUNNING_ON?==?CLA_CORE
? ? ? ? ? ??if(TTPLPFC_guiPrms_W >?480?&& TTPLPFC_highPowerTrans_flag ==?0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ??TTPLPFC_gi.Kp?= TTPLPFC_GI_PI_KP_CLAH;
? ? ? ? ? ? ? ? TTPLPFC_gi_pi_ki = TTPLPFC_GI_PI_KI_CLAH;
? ? ? ? ? ? ? ??TTPLPFC_gi.Ki?= TTPLPFC_gi_pi_ki;
? ? ? ? ? ? ? ? TTPLPFC_highPowerTrans_flag =?1;
? ? ? ? ? ? }
? ? ? ? ? ??else?if(TTPLPFC_guiPrms_W <?430?&& TTPLPFC_highPowerTrans_flag ==?1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ??TTPLPFC_gi.Kp?= TTPLPFC_GI_PI_KP_CLAL;
? ? ? ? ? ? ? ? TTPLPFC_gi_pi_ki = TTPLPFC_GI_PI_KI_CLAL;
? ? ? ? ? ? ? ??TTPLPFC_gi.Ki?= TTPLPFC_gi_pi_ki;
? ? ? ? ? ? ? ? TTPLPFC_highPowerTrans_flag =?0;
? ? ? ? ? ? }
? ? ? ??#endif
? ? ? ? ? ??//
? ? ? ? ? ??//TTPLPFC_threshold_NZC1=0.01,
? ? ? ? ? ??//when TTPLPFC_ac_sign_filtered == 0, Vin is negative.
? ? ? ? ? ??//
/* 檢查到鎖相環(huán)的輸出開始轉(zhuǎn)移到從正到負(fù)的穿越點(diǎn) */
? ? ? ? ? ??if(TTPLPFC_acSine?<?TTPLPFC_threshold_NZC1?||
? ? ? ? ? ? ? ? ? ??TTPLPFC_ac_sign_filtered?==?0)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//State switch.
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??TTPLPFC_pwm_SwState.enum_pwmSwState?=
? ? ? ? ? ? ? ? ? ? ? ? ? ??pwmSwState_negativeZeroCrossing1;
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//AQCSFRC xA LOW, xB LOW
? ? ? ? ? ? ? ??//
/* 轉(zhuǎn)移到pwmSwState_negativeZeroCrossing1狀態(tài),并且首先強(qiáng)迫把低頻橋臂的開關(guān)拉低,也就說還沒等到穿越到負(fù)向,就提前關(guān)閉了低頻橋臂開關(guān)。防止低頻橋臂的開關(guān)體二極管影響的反向恢復(fù)在過零點(diǎn)產(chǎn)生電流噪音。*/
? ? ? ? ? ? ? ??TTPLPFC_AQ_SW_FORCE_PWMxA_LOW_PWMxB_LOW(
? ? ? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_LOW_FREQ_PWM_BASE);
? ? ? ? ? ? ? ? }
? ? ? ? ? ??break;
? ? ? ? /*NZC state1:*/
? ? ? ??case?pwmSwState_negativeZeroCrossing1?:
? ? ? ? ? ??//
? ? ? ? ? ??//TTPLPFC_stateSlew++;
? ? ? ? ? ??//Force high_freq PWM output low by DB(HIGH_FREQ).
? ? ? ? ? ??//
? ? ? ? ? ??TTPLPFC_SET_PWM_DBRED(TTPLPFC_HIGH_FREQ_PWM_BASE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_PFC_PWM_PERIOD);
? ? ? ? ? ??TTPLPFC_SET_PWM_DBFED(TTPLPFC_HIGH_FREQ_PWM_BASE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_PFC_PWM_PERIOD);
? ? ? ? ? ??//
? ? ? ? ? ??//Limit PU of Duty.
? ? ? ? ? ??//
? ? ? ? ? ??TTPLPFC_DutyPU?=?0.004f;
/* 轉(zhuǎn)移到負(fù)向穿越的NZC1后,同時(shí)也關(guān)閉了高頻橋臂的PWM輸出,這里還是通過把死區(qū)增加到周期長度的方法來實(shí)現(xiàn),同時(shí)也斷開了電流環(huán)的輸出,占空比強(qiáng)制寫為0.004 */
? ? ? ? ? ??if(TTPLPFC_acSine?<=?0?)
? ? ? ? ? ? {
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//State switch.
? ? ? ? ? ? ? ??//
/* 由于NZC1的判斷點(diǎn)是鎖相環(huán)的acSIN是0.01,還沒有到零點(diǎn)以下的負(fù)相位,所有這里繼續(xù)等待AC電網(wǎng)正式穿越到零以下*/
? ? ? ? ? ? ? ??TTPLPFC_pwm_SwState.enum_pwmSwState?=
? ? ? ? ? ? ? ? ? ? ? ??pwmSwState_negativeZeroCrossing2;
? ? ? ? ? ? }
? ? ? ? ? ??break;
? ? ? ? /*NZC state2:*/
? ? ? ??case?pwmSwState_negativeZeroCrossing2?:
? ? ? ? ? ??//
? ? ? ? ? ??//TTPLPFC_stateSlew++;
? ? ? ? ? ??//Limit PU of Duty.
? ? ? ? ? ??//
/* 繼續(xù)等待電網(wǎng)相位往負(fù)向穿越,當(dāng)判定到電網(wǎng)鎖相環(huán)小于-0.01后,轉(zhuǎn)移狀態(tài)到NZC3 */?
? ? ? ? ? ??TTPLPFC_DutyPU?=?0.004f;
? ? ? ? ? ??if(TTPLPFC_acSine?<?TTPLPFC_threshold_NZC2)
? ? ? ? ? ? {
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//Initialize two flags. Use in control DBFED in NZC3.
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??TTPLPFC_stateSlew?=?0;
? ? ? ? ? ? ? ??TTPLPFC_softStartDuty_ticks?=?0;
? ?
/* 初始化過零Duty軟起計(jì)數(shù)器和軟啟Duty變量 */
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//State switch.
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??TTPLPFC_pwm_SwState.enum_pwmSwState?=
? ? ? ? ? ? ? ? ? ? ? ??pwmSwState_negativeZeroCrossing3;
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//Enable xA xB Swap
? ? ? ? ? ? ? ??//
/* 需要重點(diǎn)說明的是,這里通過調(diào)整PWM模塊的DB模塊內(nèi)部的SWAP來交換PWMA和PWMB的輸出邏輯,在前面我們得知,EPWM3A是作為HG驅(qū)動(dòng),EPWM3B是LG的驅(qū)動(dòng),這里把A/B交換驅(qū)動(dòng)位置后,PWM模塊參數(shù)的Duty和互補(bǔ)的輸出則就是進(jìn)行交換后的輸出*/

? ? ??? ? ??TTPLPFC_ENABLE_SWAP_DEADBAND_OUTPUT(TTPLPFC_HIGH_FREQ_PWM_BASE);
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//PI parameter use in PZC3 state.
? ? ? ? ? ? ? ??// 清除電流環(huán)的PI控制器內(nèi)部數(shù)據(jù)
? ? ? ? ? ? ? ??TTPLPFC_gi.i10?=?0;
? ? ? ? ? ? ? ??TTPLPFC_gi.i6?=?1;
? ? ? ? ? ? ? ??TTPLPFC_gi.Ki?=?0;
? ? ? ? ? ? ? ??TTPLPFC_gi_out?=?0;
? ? ? ? ? ? }
? ? ? ? ? ??break;
? ? ? ? /*NZC state3:*/
? ? ? ??case?pwmSwState_negativeZeroCrossing3?:

? ? ? ? ? ??//
? ? ? ? ? ??//Control DBFED.
? ? ? ? ? ??//
/* 這里在每次進(jìn)入中斷后位過零后軟啟動(dòng)占空比強(qiáng)制加1,來實(shí)現(xiàn)軟啟動(dòng)由于在前面交換了A/B的輸出位置,因此這里操作FED下降沿的死區(qū)其實(shí)是在操作HG的驅(qū)動(dòng)脈寬,可見下面FED的死區(qū)由周期最大值逐漸減少到10。因?yàn)榍懊鍰uty強(qiáng)制寫入了0.004,因此HG的輸出占空比是最小的,對應(yīng)AHC(有源互補(bǔ)輸出模式)的配置,LG的占空比是達(dá)到96%這么大的。因此,這里的實(shí)現(xiàn)就是把上管的占空比從0增到最大值96%,同時(shí)還維持下管為低電平關(guān)閉狀態(tài)*/

????TTPLPFC_softStartDuty_ticks?=?TTPLPFC_softStartDuty_ticks?+?1;
? ?TTPLPFC_softStartDeadBandFED_ticks?=?TTPLPFC_PFC_PWM_PERIOD
? ? ? ? ? ? ? ? ? ? -?TTPLPFC_softStartDuty_ticks?*?50;
? ? ? ? ? ??//
? ? ? ? ? ??//Limit DBFED.
? ? ? ? ? ??//TTPLPFC_dbFED_SetValue_ticks=10
? ? ? ? ? ??//
? ? ? ? ? ??if(TTPLPFC_softStartDeadBandFED_ticks?<
? ? ? ? ? ? ? ? ? ??TTPLPFC_dbFED_SetValue_ticks)
? ? ? ? ? ? {
? ? ? ? ? ? ? ??TTPLPFC_softStartDeadBandFED_ticks?=
? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_dbFED_SetValue_ticks;
? ? ? ? ? ? }
? ? ? ? ? ??//
? ? ? ? ? ??//Set DBFED=500?.
? ? ? ? ? ??//
? ? ? ? ? ??TTPLPFC_SET_PWM_DBFED(TTPLPFC_HIGH_FREQ_PWM_BASE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_softStartDeadBandFED_ticks?);
? ? ? ? ? ??//
? ? ? ? ? ??//Count work times in PZC3.
? ? ? ? ? ??//
? ? ? ? ? ??TTPLPFC_stateSlew++;
//
// ? ? ? ? ? ?if( fabsf(TTPLPFC_DutyPU) < ?0.004f)
// ? ? ? ? ? ?{
// ? ? ? ? ? ? ? ? ? ?if(TTPLPFC_DutyPU > 0) ? ? ?TTPLPFC_DutyPU = 0.004;
// ? ? ? ? ? ? ? ? ? ?else ? ? ? ? ? ? ? ? ? ? ? ?TTPLPFC_DutyPU = -0.004;
// ? ? ? ? ? ? }
//
? ? ? ? ? ??//
? ? ? ? ? ??//TTPLPFC_stateSlew>10&&Vin<0
? ? ? ? ? ? /*? 軟啟動(dòng)這里強(qiáng)迫進(jìn)入10次,并且VAC確實(shí)是在負(fù)向相位,則正式進(jìn)入負(fù)向區(qū)域工作模式 */
? ? ? ? ? ??if(TTPLPFC_stateSlew?>?TTPLPFC_stateSlewMax
? ? ? ? ? ? ? ? ? ? &&?TTPLPFC_ac_sign_filtered?==?0)
? ? ? ? ? ? {
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//PI parameter use in PZC3 state.
? ? ? ? ? ? ? ??// 重新寫入PI參數(shù)
? ? ? ? ? ? ? ??TTPLPFC_gi.i10?=?0;
? ? ? ? ? ? ? ??TTPLPFC_gi.i6?=?1;
? ? ? ? ? ? ? ??TTPLPFC_gi.Ki?=?TTPLPFC_gi_pi_ki;
? ? ? ? ? ? ? ??TTPLPFC_gi.Umax?=?TTPLPFC_GI_PI_MAX;
? ? ? ? ? ? ? ??TTPLPFC_gi.Umin?=?TTPLPFC_GI_PI_MIN;
? ? ? ? ? ? ? ??TTPLPFC_gi_out?=?0;
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//State switch.
? ? ? ? ? ? ? ??//
TTPLPFC_pwm_SwState.enum_pwmSwState?=?pwmSwState_negativeHalf;
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//Set DBFED=10
? ? ? ? ? ? ? ??// 設(shè)置正常工作的死區(qū)時(shí)間
? ? ? ? ? ? ? ??TTPLPFC_SET_PWM_DBFED(TTPLPFC_HIGH_FREQ_PWM_BASE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_dbFED_SetValue_ticks);
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//Reset flags.
? ? ? ? ? ? ? ??// 清除過零軟啟動(dòng)flag,為正向穿越做準(zhǔn)備
? ? ? ? ? ? ? ??TTPLPFC_softStartDuty_ticks?=?0;
? ? ? ? ? ? ? ??TTPLPFC_stateSlew?=?0;
? ? ? ? ? ? }
? ? ? ? ? ??break;
? ? ? ? /*Negative half state*/
? ? ? ??case?pwmSwState_negativeHalf:
? ? ? ? ? ??//
? ? ? ? ? ??//Set LOW_FREQ PWM output to control current direction.
? ? ? ? ? ??//Set DBRED to allow HIGH_FREQ PWM output.
? ? ? ? ? ? /*??設(shè)置低頻橋臂驅(qū)動(dòng)為HG為H,LG為LOW,同時(shí)設(shè)置上升沿死區(qū)為正常工作時(shí)間,進(jìn)入正常工作模式*/
? ? ? ? ? ??TTPLPFC_AQ_SW_FORCE_PWMxA_HIGH_PWMxB_LOW(TTPLPFC_LOW_FREQ_PWM_BASE);
? ? ? ? ? ??TTPLPFC_SET_PWM_DBRED(TTPLPFC_HIGH_FREQ_PWM_BASE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_dbRED_SetValue_ticks);
/* 監(jiān)測到負(fù)向到正向穿越后,關(guān)閉低頻橋臂驅(qū)動(dòng),高頻橋臂還沒關(guān)*/
? ? ? ? ? ??if(?TTPLPFC_acSine?>?TTPLPFC_threshold_PZC1
? ? ? ? ? ? ? ? ? ? ||?TTPLPFC_ac_sign_filtered?==?1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//State switch.
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??TTPLPFC_pwm_SwState.enum_pwmSwState?=
? ? ? ? ? ? ? ? ? ? ? ??pwmSwState_positiveZeroCrossing1;
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//AQCSFRC xA LOW, xB LOW
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??TTPLPFC_AQ_SW_FORCE_PWMxA_LOW_PWMxB_LOW(
? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_LOW_FREQ_PWM_BASE);
? ? ? ? ? ? }
? ? ? ? ? ??break;
? ? ? ? /*PZC state1:*/
? ? ? ??case?pwmSwState_positiveZeroCrossing1?:
? ? ? ? ? ??//
? ? ? ? ? ??//TTPLPFC_stateSlew++; //DONOTUSE
? ? ? ? ? ??//Force high_freq PWM output low by DB(HIGH_FREQ).
? ? ? ? ? ? /* 關(guān)閉高頻橋臂的驅(qū)動(dòng)輸出,強(qiáng)迫死區(qū)為最大值*/
? ? ? ? ? ??TTPLPFC_SET_PWM_DBRED(TTPLPFC_HIGH_FREQ_PWM_BASE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_PFC_PWM_PERIOD);
? ? ? ? ? ??TTPLPFC_SET_PWM_DBFED(TTPLPFC_HIGH_FREQ_PWM_BASE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_PFC_PWM_PERIOD);
? ? ? ? ? ??//
? ? ? ? ? ??//Limit PU of Duty.
? ? ? ? ? ??//
? ? ? ? ? ??TTPLPFC_DutyPU?=?0.004f;
? ? ? ? ? ??if(TTPLPFC_acSine?>=?0?)
? ? ? ? ? ? {
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//State switch.
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??TTPLPFC_pwm_SwState.enum_pwmSwState?=
? ? ? ? ? ? ? ? ? ? ? ??pwmSwState_positiveZeroCrossing2;
? ? ? ? ? ? }
? ? ? ? ? ??break;
? ? ? ? /*PZC state2:*/
? ? ? ??case?pwmSwState_positiveZeroCrossing2?:
? ? ? ? ? ??//
? ? ? ? ? ??//TTPLPFC_stateSlew++;//DONOTUSE
? ? ? ? ? ??//Limit PU of Duty.
? ? ? ? ? ??//
? ? ? ? ? ??TTPLPFC_DutyPU?=?0.004f;
? ? ? ? ? ??if(TTPLPFC_acSine?>?TTPLPFC_threshold_PZC2?)
? ? ? ? ? ? {
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//State switch.
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??TTPLPFC_pwm_SwState.enum_pwmSwState?=
? ? ? ? ? ? ? ? ? ? ? ??pwmSwState_positiveZeroCrossing3;
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//Initialize two flags. Use in control DBFED in PZC3.
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??TTPLPFC_stateSlew?=?0;
? ? ? ? ? ? ? ??TTPLPFC_softStartDuty_ticks?=?0;
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//Dead band output swap disabled.
? ? ? ? ? ? ? ??// 恢復(fù)正常開關(guān)的邏輯,禁用SWAP功能
? ? ? ? ? ? ? ??TTPLPFC_DISABLE_SWAP_DEADBAND_OUTPUT(
? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_HIGH_FREQ_PWM_BASE);
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//PI parameter use in PZC3 state.
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??TTPLPFC_gi.i10?=?0;
? ? ? ? ? ? ? ??TTPLPFC_gi.i6?=?1;
? ? ? ? ? ? ? ??TTPLPFC_gi_out?=?0;
? ? ? ? ? ? ? ??TTPLPFC_gi.Ki?=?0;
? ? ? ? ? ? }
? ? ? ? ? ??break;
? ? ? ? /*PZC state3:*/
? ? ? ??case?pwmSwState_positiveZeroCrossing3?:
? ? ? ? ? ??//
? ? ? ? ? ??//Control DBFED.
? ? ? ? ? ??// TTPLPFC_PFC_PWM_PERIOD = 1000
? ? ? ? ? ? /*與負(fù)向穿越一樣通過在該區(qū)域操作PWM3A的下降沿來實(shí)現(xiàn)對實(shí)現(xiàn)過零軟啟動(dòng)。不同的地方是,這里讓上管維持低電平關(guān)閉,將下管的占空比從0增加到最大,實(shí)現(xiàn)過零后軟啟動(dòng)*/
? ? ? ? ? ??TTPLPFC_softStartDuty_ticks?=?TTPLPFC_softStartDuty_ticks?+?1;
? ? ? ? ? ??TTPLPFC_softStartDeadBandFED_ticks?=?TTPLPFC_PFC_PWM_PERIOD?-
? ? ? ? ? ? ? ? ? ??TTPLPFC_softStartDuty_ticks?*?50;
? ? ? ? ? ??//
? ? ? ? ? ??//Limit DBFED.
? ? ? ? ? ??//
? ? ? ? ? ??if(TTPLPFC_softStartDeadBandFED_ticks?<
? ? ? ? ? ? ? ? ? ??TTPLPFC_dbFED_SetValue_ticks?)
? ? ? ? ? ? {
? ? ? ? ? ? ? ??TTPLPFC_softStartDeadBandFED_ticks?=
? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_dbFED_SetValue_ticks;
? ? ? ? ? ? }
? ? ? ? ? ??//
? ? ? ? ? ??//Set DBFED=500?.
? ? ? ? ? ??//
? ? ? ? ? ??TTPLPFC_SET_PWM_DBFED(TTPLPFC_HIGH_FREQ_PWM_BASE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_softStartDeadBandFED_ticks);
? ? ? ? ? ??//
? ? ? ? ? ??//Count work times in PZC3.
? ? ? ? ? ??//
? ? ? ? ? ??TTPLPFC_stateSlew++;
//
// ? ? ? ? ? ?if( fabsf(TTPLPFC_DutyPU) < ?0.004f)
// ? ? ? ? ? ?{
// ? ? ? ? ? ? ? ? ? ?if(TTPLPFC_DutyPU > 0) ? ? ?TTPLPFC_DutyPU = 0.004;
// ? ? ? ? ? ? ? ? ? ?else ? ? ? ? ? ? ? ? ? ? ? ?TTPLPFC_DutyPU = -0.004;
// ? ? ? ? ? ? }
//
? ? ? ? ? ??//
? ? ? ? ? ??//TTPLPFC_stateSlew>10&&Vin>0
? ? ? ? ? ??//
? ? ? ? ? ??if(TTPLPFC_stateSlew?>?TTPLPFC_stateSlewMax
? ? ? ? ? ? ? ? ? ? ? &&?TTPLPFC_ac_sign_filtered?==?1)
? ? ? ? ? ? {
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//PI parameters use in positive half.
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??TTPLPFC_gi.i10?=?0;
? ? ? ? ? ? ? ??TTPLPFC_gi.i6?=?1;
? ? ? ? ? ? ? ??TTPLPFC_gi_out?=?0;
? ? ? ? ? ? ? ??TTPLPFC_gi.Ki?=?TTPLPFC_gi_pi_ki;
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//State switch.
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??TTPLPFC_pwm_SwState.enum_pwmSwState?=?pwmSwState_positiveHalf;
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//Set DBFED=10
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??TTPLPFC_SET_PWM_DBFED(TTPLPFC_HIGH_FREQ_PWM_BASE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_dbFED_SetValue_ticks);
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??//Reset flags.
? ? ? ? ? ? ? ??//
? ? ? ? ? ? ? ??TTPLPFC_stateSlew?=?0;
? ? ? ? ? ? ? ??TTPLPFC_softStartDuty_ticks?=?0;
? ? ? ? ? ? }
? ? ? ? ? ??break;
? ? ? ? /*Protect state: OCP OVP*/
? ? ? ??case?pwmSwState_defaultState:
? ? ? ? ? ??//
? ? ? ? ? ??//Limit PU of Duty.
? ? ? ? ? ??//
? ? ? ? ? ??TTPLPFC_DutyPU?=?0.01f;
? ? ? ? ? ??//
? ? ? ? ? ??//Force PWM output low by AQ(LOW_FREQ) and DB(HIGH_FREQ).
? ? ? ??? ??/* 初始化后,直接把高頻低頻PWM全部關(guān)閉*/
? ? ? ? ? ??TTPLPFC_AQ_SW_FORCE_PWMxA_LOW_PWMxB_LOW(TTPLPFC_LOW_FREQ_PWM_BASE);
? ? ? ? ? ??TTPLPFC_SET_PWM_DBRED(TTPLPFC_HIGH_FREQ_PWM_BASE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_PFC_PWM_PERIOD);
? ? ? ? ? ??TTPLPFC_SET_PWM_DBFED(TTPLPFC_HIGH_FREQ_PWM_BASE,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??TTPLPFC_PFC_PWM_PERIOD);
? ? ? ? ? ??break;
? ? ? ??default:
? ? ? ? ? ??TTPLPFC_pwm_SwState.enum_pwmSwState?=?pwmSwState_defaultState;
? ? }
#endif
}
PWM狀態(tài)機(jī)應(yīng)用在PFC上的測試視頻:

感謝觀看,謝謝支持,本人能力有效,如有錯(cuò)誤懇請幫忙指正,謝謝。
更多PFC介紹:
1、降低單相PFC的ithd的幾個(gè)點(diǎn)子