📄 pfc_ctrl.c
字号:
/********************************************/
/* 广州天河双龙电子公司 */
/* 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 + -