MosResCalib.c 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. //#include "at32f421.h"//#include "stm32f10x.h"
  2. //#include "at32f421_conf.h"
  3. #include "syspar.h"
  4. #include "typedefine.h"
  5. #include "user.h"
  6. #include "MosResCalib.h"
  7. //#include "at32f421_wk_config.h"
  8. #include "flash_master.h"
  9. #include "string.h"
  10. MOSINSIDE_Struct MosResInside;
  11. MOSCALIB_Struct MosCal_A;
  12. MOSCALIB_Struct MosCal_B;
  13. MOSCALIB_Struct MosCal_C;
  14. extern void delay_125us(int count);
  15. const phasePWM_Struct MosPhasePWM[4]=
  16. {
  17. {HW_HHPWM_PERIOD,HW_HHPWM_PERIOD,HW_HHPWM_PERIOD},
  18. {HW_HPWM_PERIOD,0,0}, //A下,B上,C上
  19. {0,HW_HPWM_PERIOD,0}, //A上,B下,C上
  20. {0,0,HW_HPWM_PERIOD}, //A上,B上,C下
  21. };
  22. //--------上电初始化,获取flash内阻值
  23. void MosResRead(void)
  24. {
  25. CalcMaXAdcCur(&MosCal_A); //求出最大相电流值
  26. CalcMaXAdcCur(&MosCal_B);
  27. CalcMaXAdcCur(&MosCal_C);
  28. // CalcTempRes(&EepromMosPara, adc_stUpOut.PCBTemp);//获取电阻值
  29. MosResInside.blCalibFault=FALSE;
  30. MosResInside.blCalibFlag=FALSE;
  31. }
  32. //----接收指令和校准系数
  33. void ReceiveCmdHandle(void)
  34. {
  35. // static UWORD ADCcalCnt=0;
  36. SWORD *p;
  37. EEP_RES_Struct *EEp;
  38. MOSCALIB_Struct *Temp;
  39. ADC_SUMCOF *ADCtemp;
  40. if(MosResInside.blCalibFlag==TRUE)
  41. {
  42. for(char moscnt=1;moscnt<=3;moscnt++)
  43. // char moscnt=3;
  44. {
  45. // tmr_output_enable(TMR1,FALSE);//OEN 涓昏緭鍑轰娇鑳� //MOE
  46. // dma_channel_enable(DMA1_CHANNEL5,FALSE);
  47. // delay_125us(1);
  48. pwm_stGenOut.uwNewTIM1COMPR[0] = MosPhasePWM[moscnt].PWM1;
  49. pwm_stGenOut.uwNewTIM1COMPR[1] = MosPhasePWM[moscnt].PWM2;
  50. pwm_stGenOut.uwNewTIM1COMPR[2] = MosPhasePWM[moscnt].PWM3;
  51. pwm_stGenOut.uwNewTIM1COMPR[3] = MosPhasePWM[moscnt].PWM1;
  52. pwm_stGenOut.uwNewTIM1COMPR[4] = MosPhasePWM[moscnt].PWM2;//
  53. pwm_stGenOut.uwNewTIM1COMPR[5] = MosPhasePWM[moscnt].PWM3;//
  54. /* PWM on */
  55. hw_voPWMOn();
  56. // tmr_output_enable(TMR1,TRUE);//OEN 主输出使能 //MOE
  57. // dma_channel_enable(DMA1_CHANNEL5,TRUE);
  58. delay_125us(delay_time);
  59. if(moscnt==1)
  60. {
  61. Temp= &MosCal_A;
  62. p=&adc_stDownOut.swIaPu;
  63. ADCtemp=&adc_LibSUMA;
  64. EEp= &Syspara2.EepromMosPara.EEP_MOSA;
  65. }
  66. else if(moscnt==2)
  67. {
  68. Temp=& MosCal_B;
  69. p=&adc_stDownOut.swIbPu;
  70. ADCtemp=&adc_LibSUMB;
  71. EEp= &Syspara2.EepromMosPara.EEP_MOSB;
  72. }
  73. else if(moscnt==3)
  74. {
  75. Temp= &MosCal_C;
  76. p=&adc_stDownOut.swIcPu;
  77. ADCtemp=&adc_LibSUMC;
  78. EEp= &Syspara2.EepromMosPara.EEP_MOSC;
  79. }
  80. for(int i=0;i<50;i++)
  81. {
  82. Temp->uwMOS_i_Value=-(*p);//-adc_stDownOut.swIaPu;
  83. // Temp->MOS_i_ValueCOM[i]=Temp->uwMOS_i_Value;
  84. Temp->uwCalRes_i_Value=adc_stUpOut.uwIbusAvgPu;
  85. // Temp->Res_i_ValueCOM[i]=Temp->uwCalRes_i_Value;
  86. if((Temp->uwCalRes_i_Value< LIBCURMIN)||(Temp->uwCalRes_i_Value>LIBCURMAX))
  87. {
  88. MosResInside.blCalibFault=TRUE;
  89. break;
  90. }
  91. // MosCal_A.RES.swTEMP=adc_stUpOut.PCBTemp;//
  92. pwm_stGenOut.blSampleCalibFlag = TRUE;
  93. MosResHandle(Temp,ADCtemp);
  94. // *EEp=Temp->RES.uwTEMP_RES1; //25度电阻值
  95. delay_125us(1);
  96. //GPIOB->odt ^= GPIO_PINS_10;
  97. if(ADCtemp->uwCalibcomplete==TRUE)
  98. {
  99. CalcTempRes( Temp,&Syspara2.EepromMosPara);//获取电阻值
  100. memcpy(EEp, &Temp->RES, sizeof(EEP_RES_Struct));
  101. break;
  102. }
  103. }
  104. hw_voPWMOff();
  105. delay_125us(100);
  106. }
  107. MosResInside.blCalibFlag=FALSE;
  108. if( MosResInside.blCalibFault==FALSE)
  109. {
  110. // flash_voSysParaWrite();// flash_voMosResParaWrite();
  111. }
  112. NVIC_SystemReset(); //复位
  113. }
  114. }
  115. //---处理读到的ADC值,计算MOS内阻,
  116. void MosResHandle(MOSCALIB_Struct *moscal,ADC_SUMCOF *K)
  117. {
  118. K->GainTemp = (SLONG)((SLONG)moscal->uwMOS_i_Value<< 10) / (SLONG)moscal->uwCalRes_i_Value; //系数
  119. adc_voSRCalibration(&adc_stCof , K);//系数求平均
  120. if( K->uwCalibcomplete!=0)
  121. {
  122. moscal->RES.uwTEMP_libres=K->uwCalibcoef* RMOSOFFSETVLAUE >>10; //当前温度MOS电阻值
  123. moscal->RES.swTEMP=adc_stUpOut.PCBTemp; // 当前温度值
  124. }
  125. }
  126. //---温度补偿处理读到的ADC值,计算MOS内阻,
  127. void CalcTempRes(MOSCALIB_Struct *y,MOSEEPROM_Struct *Eep)//校准时调用
  128. {
  129. //R0=50Y/(50+(K50-1)*x)
  130. y->RES.uwTEMP_RES0 = (UWORD)((SLONG)y->RES.uwTEMP_libres*50 /(50 +(SLONG)(Eep->EEP_K50-1000)*y->RES.swTEMP/1000));//0
  131. y->RES.uwTEMP_RES2 =(UWORD)((SLONG)Eep->EEP_K50 *y->RES.uwTEMP_RES0/1000);//50
  132. y->RES.uwTEMP_RES3 =(UWORD)((SLONG)Eep->EEP_K75 *y->RES.uwTEMP_RES0/1000);//75
  133. y->RES.uwTEMP_RES4 =(UWORD)((SLONG)Eep->EEP_K100 *y->RES.uwTEMP_RES0/1000);//100
  134. y->RES.uwTEMP_RES5 =(UWORD)((SLONG)Eep->EEP_K125 *y->RES.uwTEMP_RES0/1000);//125
  135. y->RES.uwTEMP_RES6 =(UWORD)((SLONG)Eep->EEP_K150 *y->RES.uwTEMP_RES0/1000);//150
  136. y->RES.uwTEMP_RES1 =y->RES.uwTEMP_RES0 +((y->RES.uwTEMP_RES2-y->RES.uwTEMP_RES0)>>1);//25
  137. }
  138. void CalcResVaule(MOSCALIB_Struct *y , SWORD Temp)//@200ms调用
  139. {
  140. if(Temp<=0)
  141. {
  142. y->uwCalib_R_Value=y->RES.uwTEMP_RES0 ;
  143. }
  144. else if(Temp<=50)
  145. {
  146. y->uwCalib_R_Value=(UWORD)(y->RES.uwTEMP_RES0 + (ULONG)(y->RES.uwTEMP_RES2-y->RES.uwTEMP_RES0)*(Temp)/50);
  147. }
  148. else if(Temp<=75)
  149. {
  150. y->uwCalib_R_Value=(UWORD)(y->RES.uwTEMP_RES2 + (ULONG)(y->RES.uwTEMP_RES3-y->RES.uwTEMP_RES2)*(Temp-50)/25);
  151. }
  152. else if(Temp<=100)
  153. {
  154. y->uwCalib_R_Value=(UWORD)(y->RES.uwTEMP_RES3 +(ULONG)(y->RES.uwTEMP_RES4-y->RES.uwTEMP_RES3)*(Temp-75)/25);
  155. }
  156. else if(Temp<=125)
  157. {
  158. y->uwCalib_R_Value=(UWORD)(y->RES.uwTEMP_RES4 +(ULONG)(y->RES.uwTEMP_RES5-y->RES.uwTEMP_RES4)*(Temp-100)/25);
  159. }
  160. else if(Temp<=150)
  161. {
  162. y->uwCalib_R_Value=(UWORD)(y->RES.uwTEMP_RES5 +(ULONG)(y->RES.uwTEMP_RES6-y->RES.uwTEMP_RES5)*(Temp-125)/25);
  163. }
  164. else
  165. {
  166. y->uwCalib_R_Value=y->RES.uwTEMP_RES6 ;
  167. }
  168. y->uwCurReg2Pu = (UWORD)((SLONG)y->uwCurRegPu_25d *(SLONG)y->RES.uwTEMP_RES1/y->uwCalib_R_Value );
  169. }
  170. void CalcMaXAdcCur(MOSCALIB_Struct *y)//上电初始化调用
  171. {
  172. y->uwMaxiPhoseCurAp = (ULONG)(MAXCURCOF *1000)/ y->RES.uwTEMP_RES1; //25度的最大相电流
  173. y->uwCurReg2Pu= ((UQWORD)y->uwMaxiPhoseCurAp << 24) / (1 << (ADC_RESOLUTION_BIT - 1)) / IBASE; // Q24
  174. y->uwCurRegPu_25d=y->uwCurReg2Pu;
  175. }