⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pfc_ctrl.c

📁 boost-pfc升压型功率因素校正程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/********************************************/
/*            广州天河双龙电子公司          */
/*            http://www.sl.com.cn          */
/*                PFC控制模块               */
/*            作者:deny@sl.com.cn          */
/*               2007年05月21日             */
/*   目标MCU:AT90PWM2B   晶振:外部16MHZ     */
/********************************************/

#include <config.h>
#include <main_pwm2.h>
#include <pfc_ctrl.h>

unsigned int psc_ontime0;              //更新 PSC 的OCR0SA值
unsigned int psc_deadtime0;            //更新 PSC 的OCR0RA值
unsigned int psc_ontime1;              //更新 PSC 的OCR0SB值
unsigned int psc_deadtime1;            //更新 PSC 的OCR0RB值
unsigned int comparison_ontime0;       //更新 psc_ontime0的临时寄存器
unsigned char gvs_zcd_occures;          //电感过零标志
unsigned char gvs_pfc_soft_start_shots; //PSC驱动中断标志
unsigned int gs_v_haversine_peak    = 0;        //输入峰值电压
volatile unsigned int g_max_pulse_width    = 0; //PFC最大脉宽值
extern void DALI_init(void);

/**********************************************
模拟比较器初始化
***********************************************/
void ACMP0_init(void)
{
    //! ****** AC0CON
    //! 7   AC0EN     : 1 Enable the comparator
    //! 6   AC0IE     : 1 Analog Comparator Interrupt Enable
    //! 5:4 AC0IS1:0  : Analog comparator Interrupt selection
    //!               : 00 interrupt on output toggle
    //!               : 01 reserved
    //!               : 10 interrupt on output falling edge
    //!               : 11 interrupt on output rising edge
    //! 3 Reserved    : Not used
    //! 2:0 AC0M2:0   : Comparator 0 Multiplexer register
    //!               : 000 Vref/6.40V
    //!               : 001 Vref/3.20V
    //!               : 010 Vref/2.13V
    //!               : 011 Vref/1.60V
    //!               : 100 Analog Comparator Negative Input pin (ACMPM pin)
    //!               : 101 DAC result
    //!               : 110 reserved
    //!               : 111 reserved
    //! ****** END AC0CON
    //允许灯管检测--允许下降延中断,vref/3.2比较电压
    AC0CON=(1<<AC0EN)|(1<<AC0IE)|(1<<AC0IS1)|(1<<AC0IS0)|(0<<AC0M2)|(0<<AC0M1)|(0<<AC0M0);
}


#pragma vector=ANACOMP_0_vect                  //中断为:ANACOMP 0,Analog Comparator 0
__interrupt void ANACOMP_0_interrupt(void)
{
    gvs_zcd_occures = 1;
}


#pragma vector=PSC0_EC_vect                     //中断为:PSC0_EC,PSC0 End Cycle Handler
__interrupt void PSC0EC_interrupt(void)
{
    gvs_pfc_soft_start_shots ++;
}

void init_psc0(void)
{
    //使用 外部16M 或PLL 16M
    Disable_both_psc0_outputs();                //Disable Both PSC0 Waveform Generator A and B
    
    Psc0_outputs_active_high();                 //PSC0 outputs are active high

    
    Psc0_in_4_ramps_mode();                     //选择工作模式 4斜模式

    
    Disable_psc0_fifty_percent_mode();          //不使用 50%模式
    Psc0_end_of_cycle_flank_width_modulation();
    
    Disable_psc0_autolock_mode();               //不自动锁定
    Disable_psc0_prescaler();                   //不进行预分频16M
    
    Psc0_use_io_clock();                        //使用系统时钟,I/O clock,slow clock input (CLKPS).
   
    
    psc_ontime0=STRAT_PLUS;                     // d=10%  f=20k(错[PFC脉宽控制定义值])
    psc_ontime1=STRAT_FRE;
    psc_deadtime0=0;
    psc_deadtime1=0;
    update_psc0 (psc_deadtime0,psc_ontime0,psc_deadtime1,psc_ontime1);
}

/*************************************
PFC控制主功能程序
*************************************/
void pfc_fun()
{
    static signed   int   gos_err_last=0;
    static unsigned int  delay=0;
    static signed   int   PI_ERR=0;             //累计误差
    static unsigned char  PI_ERR_num=0;		//累计误差计数
	 
    switch (fun_pfc_state)                      //
    {

    case PFC_OFF:                               //PFC_OFF=0

        break;

    case INIT_PFC_CHECK: 			//INIT_PFC_CHECK=1;初始化PFC控制
        {
            //! Init the control values of the PFC.
            PFC_DDR  &=~(1<<PFC_PIN);           //PFC_PIN=0,  PFC_DDR=DDRD
            PFC_PORT &=~(1<<PFC_PIN);           //PFC_PORT=PORTD
            PFC_DDR  |=(1<<PFC_PIN);            //
            AD_v_in = 0;                        //输入采样电压
            gs_v_haversine_peak = 0;            //输入峰值电压
            fun_pfc_state = VIN_CHECK;          //fun_pfc_state=pfc运行状态    VIN_CHECK=2
            pfc_previous_timer = 0;             //pfc时间控制参数
            break;
        }
    case VIN_CHECK:				 //检测是否输入电压正确, 检查过0中断是否正确,VIN_CHECK输入正弦波值
        {
            // Measure the haversine peak voltage
            if (pfc_previous_timer < VIN_CHECK_TIME)  //20ms,应该为VIN_CHECK,VIN_CHECK_TIME未定义???????????????????????????
            {
                //! 峰值电压检测
                if (AD_v_in > gs_v_haversine_peak)    //输入采样电压大于输入峰值电压 
                {
                    gs_v_haversine_peak = AD_v_in;
                }
                fun_pfc_state = VIN_CHECK;
            }
            else
            {
                //电压过压判断
                if (  (gs_v_haversine_peak <= HAVERSINE_PEAK_MAX)&&(gs_v_haversine_peak >= HAVERSINE_PEAK_MIN) )
                {
                    //输出母线电压是否正常检测
                    if ( (AD_v_bus >= temp_v_haversine) && (AD_v_bus <= V_BUS_SET_POINT) )
                    {
                        g_max_pulse_width =  (unsigned int)(MAX_PLUS_CAL/gs_v_haversine_peak);//us    PFC最大脉宽值
                        if (g_max_pulse_width > PFC_MAX_PULSE)
                        {
                            g_max_pulse_width = PFC_MAX_PULSE;
                        }
                        fun_pfc_state = CONFIGURE_PFC_SOFT_START;
                    }
                }
                pfc_previous_timer=0;   //判断输入电压是否正确,否则再检测
            }
            break;

        }
    case CONFIGURE_PFC_SOFT_START:  //初始化PSC,启动PFC输出,让系统有足够能量
        {
            //起始20K 占空比 10% 运行 让系统有能量起来
            init_psc0();
            PFRC0B = 0x00;  // disable autoretrig
            Enable_psc0_end_of_cycle_interrupt();
            Enable_pscout00();
            Start_psc0();
            fun_pfc_state = START_PFC_SOFT_START;
            pfc_previous_timer=0;
            gvs_pfc_soft_start_shots=0;
            ACMP0_init();
            break;
        }
    case START_PFC_SOFT_START:  //系统恢复到高速模式
        {
            //用来判断PSC是否正常起来 还有电感过零正常
            if((gvs_pfc_soft_start_shots>5)&&(gvs_zcd_occures == 1))//电感过0判断
            {
                psc_ontime0=0;
                psc_deadtime0=0;
                psc_ontime1=0;
                psc_deadtime1=0;
                update_psc0 (psc_deadtime0,psc_ontime0,psc_deadtime1,psc_ontime1);

                CLI();

                CLKPR = 0x80;
                CLKPR = 0x00;


                SEI();
                TCCR0B = ( (0x08) | (TIMER_0_PRESCALER) );

                fosck=1;
                DALI_init();
                if(gs_v_haversine_peak>(VIN_220V))
                    psc_ontime0=PSC_ON1;
                else if(gs_v_haversine_peak>(VIN_200V))
                    psc_ontime0=PSC_ON2;
                else if(gs_v_haversine_peak>(VIN_190V))
                    psc_ontime0=PSC_ON3;
                else psc_ontime0=PSC_ON4;

                psc_deadtime0=0;
                psc_ontime1=8000/30;
                psc_deadtime1=0;
                update_psc0 (psc_deadtime0,psc_ontime0,psc_deadtime1,psc_ontime1);

                fun_pfc_state = PFC_WAIT;
                pfc_previous_timer=0;

            }
            else
            {
                if (pfc_previous_timer >=800)         //电感过零,psc启动错误                   
                    fun_pfc_state = PFC_PROBLEM;
            }
            break;
        }
    case PFC_WAIT:  //切换到PLL的PFC ,并配置为动态变频控制
        {
            fun_pfc_state = PFC_WAIT;
            if(AD_v_bus >= (PFC_V_440V) &&(fun_lamp_state <= LAMP_NUMBER_CHECK))   //3.57
            {
                psc_ontime0=0;
                psc_deadtime0=0;
                psc_ontime1=8000/30;
                psc_deadtime1=0;
                update_psc0 (psc_deadtime0,psc_ontime0,psc_deadtime1,psc_ontime1);
            }
            else
            {
                if(pfc_previous_timer>=V_400_S_TIME)
                {
                    if(AD_v_bus < (PFC_V_350))
                    {
                        psc_ontime0++;
                        psc_deadtime0=0;
                        psc_ontime1=8000/30;
                        psc_deadtime1=0;
                        update_psc0 (psc_deadtime0,psc_ontime0,psc_deadtime1,psc_ontime1);
                    }

                    if(gs_v_haversine_peak>(VIN_CMP_V1))
                        pfc_previous_timer=V_400_S_T1;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -