/* Includes -------------------------------------------------------------------------------------*/ #include "FU68xx_5.h" #include PFCValue PFCSet; uint16 PFCoffset = 0, PFCoffsetflag = 0; uint16 PFC_UDCREF_GET = 0; uint16 MduTempL = 0, MduTempH = 0, MduDIVL = 0; /*KM选择每100W一个挡位,原有KM加此值*/ const int8 PFC_KM_vaule_add[25] = { -15, -13, -8, -1, 0, //0-500 10, 12, 14, 16, 20, //600-1000 30, 32, 34, 36, 38, //1100-1500 40, 42, 44, 46, 48, //1600-2000 50, 52, 54, 56, 58, //2100-2500 }; void PFC_init(void) { UDC_REF = 0x00; // PFC_UDCREF; // udc的参考值 UDC__UK = 0x00; // 外环PI的输出 UDC_KP = PFC_UKP; // 外环KP UDC_KI = PFC_UKI; // 外环KI UDC_UKMAX = 0x00; // 外环输出最大值 IAC__REF = 0x00; // PFC模式时,不需要设置,由外环PI乘以Uac得到ref值 IAC__UK = 0x00; // 内环PI的输出 IAC_KP = PFC_IKP; // 内环KP IAC_KI = PFC_IKI; // 内环KI IAC_UKMAX = 0x00; // 最大7fff对应输出100%占空比,调试时别设太大,防止爆炸 PFC_ARR = PFCPWM_ARR; // 周期值 PFC_KM = 3; // Km的值 /* ------------------------------------------------------------------------------------------------- UAC采样分频设置 00: 不分频 01: 2分频 10: 4分频 11: 8分频 -------------------------------------------------------------------------------------------------*/ #if (SAMPLEFREQ==SAMPLEDIV0) ClrBit(PFC_CR1, UACSAMSEL1 | UACSAMSEL0); #elif (SAMPLEFREQ==SAMPLEDIV2) SetReg(PFC_CR1, UACSAMSEL1 | UACSAMSEL0, UACSAMSEL0) ; #elif (SAMPLEFREQ==SAMPLEDIV4) SetReg(PFC_CR1, UACSAMSEL1 | UACSAMSEL0, UACSAMSEL1); #elif (SAMPLEFREQ==SAMPLEDIV8) SetBit(PFC_CR1, UACSAMSEL1 | UACSAMSEL0); #endif /* ------------------------------------------------------------------------------------------------- UTHR 0: 1/16的UACMAX 1: 1/8的UACMAX -------------------------------------------------------------------------------------------------*/ SetBit(PFC_CR1, UTHR); // PFC_OUTARR = 41; // 电压环执行频率=PFC载波频率/OUTARR 200:执行频率=41k/200=205hz 40:执行频率=41k/40=1025hz PFC_ADCCH = 0xC1; // 高4位:iac的ADC12通道 低4位:uac的ADC11通道 //6815板子Uac为AD3 PFC_CSO = 0x0000; // 电流基准 // PFC_TRGDLY &= 0x0F; // PFC_TRGDLY |= 0x30; // 采样delay设置,只写高4位,低4位默认写0,如0xX0,X的范围为:0-F if (UAC_N > 31) { PFC_CR1 |= 0x1F; } // UAC采样次数0x1f else { PFC_CR1 |= UAC_N; } // UAC采样次数 // SetBit(PFC_CR0, UAVGCDIS);// PFC硬件自动算UAVG禁止 ClrBit(PFC_CR0, UAVGCDIS);//开启自动计算 #if (PFCOverCurrentProtectMode==PFCOVERCURRENT) { ClrBit(PFC_CR0, PFCOA); // PFC过流 } #elif (PFCOverCurrentProtectMode==PFCOVERCURRENTLimt) { SetBit(PFC_CR0, PFCOA); // PFC逐波限流 } #endif // SetBit(PFC_CR0, PFCEN); // PFC使能 // PFC_CR2 |=0<<6; //00:1倍死区 01:1/2 10: 2倍 11:不使能 //灯泡负载不加死区,电机负载加死区 ClrBit(PFC_CR2, PFC_BLK_MD1); ClrBit(PFC_CR2, PFC_BLK_MD0); PFC_CR2 |= 1 << 5; //在大于50%的地方采样,0:使能 1:不使能 ClrBit(PFC_CR2, P2FTEN); //采样时刻设置0向下计数时采样,1向上计数时采样 #if (PFCOverCurrentProtectEnable) CMP5_Init(); #endif // SetBit(ADC_MASK, CH12EN);//使能IAC的采样 /****参数初始化*******/ PFCSet.UDCREFValue = 0; PFCSet.IACOUTMax = 0; PFCSet.OverVoltFlag = 0; // PFCSet.UDCOUTMax = PFC_UDCREF; } void PFC_start(void) { ClrBit(PFC_CR0, PFCEN); // PFC使能 IAC_UKMIN = 0; SetBit(PFC_CR0, PFCEN); // PFC使能 UDC_REF = 0x00; // PFC_UDCREF; // udc的参考值 UDC__UK = 0x00; // 外环PI的输出 UDC_KP = PFC_UKP; // 外环KP UDC_KI = PFC_UKI; // 外环KI UDC_UKMAX = 0x00; // 外环输出最大值 IAC__REF = 0x00; // PFC模式时,不需要设置,由外环PI乘以Uac得到ref值 IAC__UK = 0x00; // 内环PI的输出 IAC_KP = PFC_IKP; // 内环KP IAC_KI = PFC_IKI; // 内环KI IAC_UKMAX = 0x00; // 最大7fff对应输出100%占空比,调试时别设太大,防止爆炸 PFC_ARR = PFCPWM_ARR; // 周期值 PFC_KM = 3; // Km的值 UDC_UKMIN = 0; //UDC_UKMIN // IAC_UKMIN = 0; PFC_OUTARR = 40; // 电压环执行频率=PFC载波频率/OUTARR 200:执行频率=41k/200=205hz 40:执行频率=41k/40=1025hz PFC_TRGDLY &= 0x0F; PFC_TRGDLY |= 0x00; // 采样delay设置,只写高4位,低4位默认写0,如0xX0,X的范围为:0-F SetBit(PFC_CR0, UAVGCDIS);// PFC硬件自动算UAVG禁止 // ClrBit(PFC_CR0, UAVGCDIS);//开启自动计算 #if (PFCOverCurrentProtectMode==PFCOVERCURRENT) { ClrBit(PFC_CR0, PFCOA); // PFC过流 } #elif (PFCOverCurrentProtectMode==PFCOVERCURRENTLimt) { SetBit(PFC_CR0, PFCOA); // PFC逐波限流 } #endif ClrBit(PFC_CR2, P2FTEN); //采样时刻设置0向下计数时采样,1向上计数时采样 SetBit(ADC_MASK, CH12EN);//使能IAC的采样 /****参数初始化*******/ PFCSet.UDCREFValue = 0; PFCSet.IACOUTMax = 0; PFCSet.OverVoltFlag = 0; PFCSet.UDCOUTMax = PFC_UDCREF_Max;//PFC_UDCREF_GET; } /*---------------------------------------------------------------------------*/ /* Name : void GetPFCCurrentOffset(void) /* Input : NO /* Output : NO /* Description: 上电时,先对PFC的AC电流进行校准。即先采集AC电流,时间不是固定。 /*---------------------------------------------------------------------------*/ // void UdcMax_Min(void) { // SetBit(ADC_CR, ADCBSY); // 使能ADC的DCBUS采样 udc.L1 = ADC13_DR; udc.L2 = ADC10_DR; udc.L3 = ADC12_DR; if (udc.L1 >= udc.L2 && udc.L1 >= udc.L3) { udc.LMAX = udc.L1; } if (udc.L2 >= udc.L1 && udc.L2 >= udc.L3) { udc.LMAX = udc.L2; } if (udc.L3 >= udc.L2 && udc.L3 >= udc.L1) { udc.LMAX = udc.L3; } mcFocCtrl.mcDcbus = ADC2_DR; mcFocCtrl.mcAcbus = udc.LMAX; if (mcFocCtrl.mcDcbus >= mcFocCtrl.mcDcbus_max_temp) { mcFocCtrl.mcDcbus_max_temp = mcFocCtrl.mcDcbus; } if (mcFocCtrl.mcAcbus >= mcFocCtrl.mcAcbus_max_temp) { mcFocCtrl.mcAcbus_max_temp = mcFocCtrl.mcAcbus; } if (mcFocCtrl.mcDcbus <= mcFocCtrl.mcDcbus_min_temp) { mcFocCtrl.mcDcbus_min_temp = mcFocCtrl.mcDcbus; } mcFocCtrl.mcDcbus_count++; if (mcFocCtrl.mcDcbus_count >= Udcmax_ms) { mcFocCtrl.mcAcbus_max = mcFocCtrl.mcAcbus_max_temp; mcFocCtrl.mcDcbus_max = mcFocCtrl.mcDcbus_max_temp; mcFocCtrl.mcDcbus_min = mcFocCtrl.mcDcbus_min_temp; mcFocCtrl.mcDcbus_chazhi = mcFocCtrl.mcDcbus_max - mcFocCtrl.mcDcbus_min; mcFocCtrl.mcDcbus_min_temp = mcFocCtrl.mcDcbus; mcFocCtrl.mcDcbus_max_temp = mcFocCtrl.mcDcbus; mcFocCtrl.mcAcbus_max_temp = 0; mcFocCtrl.mcDcbus_count = 0; } udc.mcDcbusRef = mcFocCtrl.mcDcbus_max - mcFocCtrl.mcDcbus; if (udc.mcDcbusRef <= 1) { udc.mcDcbusRef = 1; } // udc.WeakenUsRef =(uint32)(udc.mcDcbusRef/540) * HW_BOARD_VOLT_MAX; MUL0_MA = HW_BOARD_VOLT_MAX; MUL0_MB = udc.mcDcbusRef; SMDU_RunBlock(0, SMUL); MduTempH = MUL0_MCH; MduTempL = MUL0_MCL; DIV0_DAH = MduTempH; DIV0_DAL = MduTempL; DIV0_DB = 540; SMDU_RunBlock(0, DIV); MduDIVL = DIV0_DQL; udc.WeakenUsRef = DcbusK - MduDIVL; //弱磁深度 if (udc.WeakenUsRef >= _Q15(1.0)) { udc.WeakenUsRef = _Q15(1.0); } }