| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- /* Includes -------------------------------------------------------------------------------------*/
- #include "FU68xx_5.h"
- #include <Myproject.h>
- 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);
- }
- }
|