//#include "at32f421.h"//#include "stm32f10x.h" //#include "at32f421_conf.h" #include "syspar.h" #include "typedefine.h" #include "user.h" #include "MosResCalib.h" //#include "at32f421_wk_config.h" #include "flash_master.h" #include "string.h" MOSINSIDE_Struct MosResInside; MOSCALIB_Struct MosCal_A; MOSCALIB_Struct MosCal_B; MOSCALIB_Struct MosCal_C; extern void delay_125us(int count); const phasePWM_Struct MosPhasePWM[4]= { {HW_HHPWM_PERIOD,HW_HHPWM_PERIOD,HW_HHPWM_PERIOD}, {HW_HPWM_PERIOD,0,0}, //A下,B上,C上 {0,HW_HPWM_PERIOD,0}, //A上,B下,C上 {0,0,HW_HPWM_PERIOD}, //A上,B上,C下 }; //--------上电初始化,获取flash内阻值 void MosResRead(void) { CalcMaXAdcCur(&MosCal_A); //求出最大相电流值 CalcMaXAdcCur(&MosCal_B); CalcMaXAdcCur(&MosCal_C); // CalcTempRes(&EepromMosPara, adc_stUpOut.PCBTemp);//获取电阻值 MosResInside.blCalibFault=FALSE; MosResInside.blCalibFlag=FALSE; } //----接收指令和校准系数 void ReceiveCmdHandle(void) { // static UWORD ADCcalCnt=0; SWORD *p; EEP_RES_Struct *EEp; MOSCALIB_Struct *Temp; ADC_SUMCOF *ADCtemp; if(MosResInside.blCalibFlag==TRUE) { for(char moscnt=1;moscnt<=3;moscnt++) // char moscnt=3; { // tmr_output_enable(TMR1,FALSE);//OEN 涓昏緭鍑轰娇鑳� //MOE // dma_channel_enable(DMA1_CHANNEL5,FALSE); // delay_125us(1); pwm_stGenOut.uwNewTIM1COMPR[0] = MosPhasePWM[moscnt].PWM1; pwm_stGenOut.uwNewTIM1COMPR[1] = MosPhasePWM[moscnt].PWM2; pwm_stGenOut.uwNewTIM1COMPR[2] = MosPhasePWM[moscnt].PWM3; pwm_stGenOut.uwNewTIM1COMPR[3] = MosPhasePWM[moscnt].PWM1; pwm_stGenOut.uwNewTIM1COMPR[4] = MosPhasePWM[moscnt].PWM2;// pwm_stGenOut.uwNewTIM1COMPR[5] = MosPhasePWM[moscnt].PWM3;// /* PWM on */ hw_voPWMOn(); // tmr_output_enable(TMR1,TRUE);//OEN 主输出使能 //MOE // dma_channel_enable(DMA1_CHANNEL5,TRUE); delay_125us(delay_time); if(moscnt==1) { Temp= &MosCal_A; p=&adc_stDownOut.swIaPu; ADCtemp=&adc_LibSUMA; EEp= &Syspara2.EepromMosPara.EEP_MOSA; } else if(moscnt==2) { Temp=& MosCal_B; p=&adc_stDownOut.swIbPu; ADCtemp=&adc_LibSUMB; EEp= &Syspara2.EepromMosPara.EEP_MOSB; } else if(moscnt==3) { Temp= &MosCal_C; p=&adc_stDownOut.swIcPu; ADCtemp=&adc_LibSUMC; EEp= &Syspara2.EepromMosPara.EEP_MOSC; } for(int i=0;i<50;i++) { Temp->uwMOS_i_Value=-(*p);//-adc_stDownOut.swIaPu; // Temp->MOS_i_ValueCOM[i]=Temp->uwMOS_i_Value; Temp->uwCalRes_i_Value=adc_stUpOut.uwIbusAvgPu; // Temp->Res_i_ValueCOM[i]=Temp->uwCalRes_i_Value; if((Temp->uwCalRes_i_Value< LIBCURMIN)||(Temp->uwCalRes_i_Value>LIBCURMAX)) { MosResInside.blCalibFault=TRUE; break; } // MosCal_A.RES.swTEMP=adc_stUpOut.PCBTemp;// pwm_stGenOut.blSampleCalibFlag = TRUE; MosResHandle(Temp,ADCtemp); // *EEp=Temp->RES.uwTEMP_RES1; //25度电阻值 delay_125us(1); //GPIOB->odt ^= GPIO_PINS_10; if(ADCtemp->uwCalibcomplete==TRUE) { CalcTempRes( Temp,&Syspara2.EepromMosPara);//获取电阻值 memcpy(EEp, &Temp->RES, sizeof(EEP_RES_Struct)); break; } } hw_voPWMOff(); delay_125us(100); } MosResInside.blCalibFlag=FALSE; if( MosResInside.blCalibFault==FALSE) { // flash_voSysParaWrite();// flash_voMosResParaWrite(); } NVIC_SystemReset(); //复位 } } //---处理读到的ADC值,计算MOS内阻, void MosResHandle(MOSCALIB_Struct *moscal,ADC_SUMCOF *K) { K->GainTemp = (SLONG)((SLONG)moscal->uwMOS_i_Value<< 10) / (SLONG)moscal->uwCalRes_i_Value; //系数 adc_voSRCalibration(&adc_stCof , K);//系数求平均 if( K->uwCalibcomplete!=0) { moscal->RES.uwTEMP_libres=K->uwCalibcoef* RMOSOFFSETVLAUE >>10; //当前温度MOS电阻值 moscal->RES.swTEMP=adc_stUpOut.PCBTemp; // 当前温度值 } } //---温度补偿处理读到的ADC值,计算MOS内阻, void CalcTempRes(MOSCALIB_Struct *y,MOSEEPROM_Struct *Eep)//校准时调用 { //R0=50Y/(50+(K50-1)*x) y->RES.uwTEMP_RES0 = (UWORD)((SLONG)y->RES.uwTEMP_libres*50 /(50 +(SLONG)(Eep->EEP_K50-1000)*y->RES.swTEMP/1000));//0 y->RES.uwTEMP_RES2 =(UWORD)((SLONG)Eep->EEP_K50 *y->RES.uwTEMP_RES0/1000);//50 y->RES.uwTEMP_RES3 =(UWORD)((SLONG)Eep->EEP_K75 *y->RES.uwTEMP_RES0/1000);//75 y->RES.uwTEMP_RES4 =(UWORD)((SLONG)Eep->EEP_K100 *y->RES.uwTEMP_RES0/1000);//100 y->RES.uwTEMP_RES5 =(UWORD)((SLONG)Eep->EEP_K125 *y->RES.uwTEMP_RES0/1000);//125 y->RES.uwTEMP_RES6 =(UWORD)((SLONG)Eep->EEP_K150 *y->RES.uwTEMP_RES0/1000);//150 y->RES.uwTEMP_RES1 =y->RES.uwTEMP_RES0 +((y->RES.uwTEMP_RES2-y->RES.uwTEMP_RES0)>>1);//25 } void CalcResVaule(MOSCALIB_Struct *y , SWORD Temp)//@200ms调用 { if(Temp<=0) { y->uwCalib_R_Value=y->RES.uwTEMP_RES0 ; } else if(Temp<=50) { y->uwCalib_R_Value=(UWORD)(y->RES.uwTEMP_RES0 + (ULONG)(y->RES.uwTEMP_RES2-y->RES.uwTEMP_RES0)*(Temp)/50); } else if(Temp<=75) { y->uwCalib_R_Value=(UWORD)(y->RES.uwTEMP_RES2 + (ULONG)(y->RES.uwTEMP_RES3-y->RES.uwTEMP_RES2)*(Temp-50)/25); } else if(Temp<=100) { y->uwCalib_R_Value=(UWORD)(y->RES.uwTEMP_RES3 +(ULONG)(y->RES.uwTEMP_RES4-y->RES.uwTEMP_RES3)*(Temp-75)/25); } else if(Temp<=125) { y->uwCalib_R_Value=(UWORD)(y->RES.uwTEMP_RES4 +(ULONG)(y->RES.uwTEMP_RES5-y->RES.uwTEMP_RES4)*(Temp-100)/25); } else if(Temp<=150) { y->uwCalib_R_Value=(UWORD)(y->RES.uwTEMP_RES5 +(ULONG)(y->RES.uwTEMP_RES6-y->RES.uwTEMP_RES5)*(Temp-125)/25); } else { y->uwCalib_R_Value=y->RES.uwTEMP_RES6 ; } y->uwCurReg2Pu = (UWORD)((SLONG)y->uwCurRegPu_25d *(SLONG)y->RES.uwTEMP_RES1/y->uwCalib_R_Value ); } void CalcMaXAdcCur(MOSCALIB_Struct *y)//上电初始化调用 { y->uwMaxiPhoseCurAp = (ULONG)(MAXCURCOF *1000)/ y->RES.uwTEMP_RES1; //25度的最大相电流 y->uwCurReg2Pu= ((UQWORD)y->uwMaxiPhoseCurAp << 24) / (1 << (ADC_RESOLUTION_BIT - 1)) / IBASE; // Q24 y->uwCurRegPu_25d=y->uwCurReg2Pu; }