123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- //#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;
- }
|