PFC.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214
  1. /* Includes -------------------------------------------------------------------------------------*/
  2. #include "FU68xx_5.h"
  3. #include <Myproject.h>
  4. OTHER xdata udc;
  5. PFCValue PFCSet;
  6. uint16 PFC_UDCREF_GET = 0;
  7. uint16 MduTempL = 0, MduTempH = 0, MduDIVL = 0;
  8. /*KM选择每100W一个挡位,原有KM加此值*/
  9. const int8 PFC_KM_vaule_add[25] =
  10. {
  11. -15, -13, -8, -1, 0, //0-500
  12. 10, 12, 14, 16, 20, //600-1000
  13. 30, 32, 34, 36, 38, //1100-1500
  14. 40, 42, 44, 46, 48, //1600-2000
  15. 50, 52, 54, 56, 58, //2100-2500
  16. };
  17. void PFC_init(void)
  18. {
  19. UDC_REF = 0x00; // PFC_UDCREF; // udc的参考值
  20. UDC__UK = 0x00; // 外环PI的输出
  21. UDC_KP = PFC_UKP; // 外环KP
  22. UDC_KI = PFC_UKI; // 外环KI
  23. UDC_UKMAX = 0x00; // 外环输出最大值
  24. IAC__REF = 0x00; // PFC模式时,不需要设置,由外环PI乘以Uac得到ref值
  25. IAC__UK = 0x00; // 内环PI的输出
  26. IAC_KP = PFC_IKP; // 内环KP
  27. IAC_KI = PFC_IKI; // 内环KI
  28. IAC_UKMAX = 0x00; // 最大7fff对应输出100%占空比,调试时别设太大,防止爆炸
  29. PFC_ARR = PFCPWM_ARR; // 周期值
  30. PFC_KM = 3; // Km的值
  31. /* -------------------------------------------------------------------------------------------------
  32. UAC采样分频设置
  33. 00: 不分频 01: 2分频 10: 4分频 11: 8分频
  34. -------------------------------------------------------------------------------------------------*/
  35. #if (SAMPLEFREQ==SAMPLEDIV0)
  36. ClrBit(PFC_CR1, UACSAMSEL1 | UACSAMSEL0);
  37. #elif (SAMPLEFREQ==SAMPLEDIV2)
  38. SetReg(PFC_CR1, UACSAMSEL1 | UACSAMSEL0, UACSAMSEL0) ;
  39. #elif (SAMPLEFREQ==SAMPLEDIV4)
  40. SetReg(PFC_CR1, UACSAMSEL1 | UACSAMSEL0, UACSAMSEL1);
  41. #elif (SAMPLEFREQ==SAMPLEDIV8)
  42. SetBit(PFC_CR1, UACSAMSEL1 | UACSAMSEL0);
  43. #endif
  44. /* -------------------------------------------------------------------------------------------------
  45. UTHR 0: 1/16的UACMAX 1: 1/8的UACMAX
  46. -------------------------------------------------------------------------------------------------*/
  47. SetBit(PFC_CR1, UTHR);
  48. // PFC_OUTARR = 41; // 电压环执行频率=PFC载波频率/OUTARR 200:执行频率=41k/200=205hz 40:执行频率=41k/40=1025hz
  49. PFC_ADCCH = 0xC1; // 高4位:iac的ADC12通道 低4位:uac的ADC11通道 //6815板子Uac为AD3
  50. PFC_CSO = 0x0000; // 电流基准
  51. // PFC_TRGDLY &= 0x0F;
  52. // PFC_TRGDLY |= 0x30; // 采样delay设置,只写高4位,低4位默认写0,如0xX0,X的范围为:0-F
  53. if (UAC_N > 31)
  54. { PFC_CR1 |= 0x1F; } // UAC采样次数0x1f
  55. else
  56. { PFC_CR1 |= UAC_N; } // UAC采样次数
  57. // SetBit(PFC_CR0, UAVGCDIS);// PFC硬件自动算UAVG禁止
  58. ClrBit(PFC_CR0, UAVGCDIS);//开启自动计算
  59. #if (PFCOverCurrentProtectMode==PFCOVERCURRENT)
  60. {
  61. ClrBit(PFC_CR0, PFCOA); // PFC过流
  62. }
  63. #elif (PFCOverCurrentProtectMode==PFCOVERCURRENTLimt)
  64. {
  65. SetBit(PFC_CR0, PFCOA); // PFC逐波限流
  66. }
  67. #endif
  68. // SetBit(PFC_CR0, PFCEN); // PFC使能
  69. // PFC_CR2 |=0<<6; //00:1倍死区 01:1/2 10: 2倍 11:不使能 //灯泡负载不加死区,电机负载加死区
  70. ClrBit(PFC_CR2, PFC_BLK_MD1);
  71. ClrBit(PFC_CR2, PFC_BLK_MD0);
  72. PFC_CR2 |= 1 << 5; //在大于50%的地方采样,0:使能 1:不使能
  73. ClrBit(PFC_CR2, P2FTEN); //采样时刻设置0向下计数时采样,1向上计数时采样
  74. #if (PFCOverCurrentProtectEnable)
  75. CMP5_Init();
  76. #endif
  77. // SetBit(ADC_MASK, CH12EN);//使能IAC的采样
  78. /****参数初始化*******/
  79. PFCSet.UDCREFValue = 0;
  80. PFCSet.IACOUTMax = 0;
  81. PFCSet.OverVoltFlag = 0;
  82. // PFCSet.UDCOUTMax = PFC_UDCREF;
  83. }
  84. void PFC_start(void)
  85. {
  86. ClrBit(PFC_CR0, PFCEN); // PFC使能
  87. IAC_UKMIN = 0;
  88. SetBit(PFC_CR0, PFCEN); // PFC使能
  89. UDC_REF = 0x00; // PFC_UDCREF; // udc的参考值
  90. UDC__UK = 0x00; // 外环PI的输出
  91. UDC_KP = PFC_UKP; // 外环KP
  92. UDC_KI = PFC_UKI; // 外环KI
  93. UDC_UKMAX = 0x00; // 外环输出最大值
  94. IAC__REF = 0x00; // PFC模式时,不需要设置,由外环PI乘以Uac得到ref值
  95. IAC__UK = 0x00; // 内环PI的输出
  96. IAC_KP = PFC_IKP; // 内环KP
  97. IAC_KI = PFC_IKI; // 内环KI
  98. IAC_UKMAX = 0x00; // 最大7fff对应输出100%占空比,调试时别设太大,防止爆炸
  99. PFC_ARR = PFCPWM_ARR; // 周期值
  100. PFC_KM = 3; // Km的值
  101. UDC_UKMIN = 0; //UDC_UKMIN
  102. // IAC_UKMIN = 0;
  103. PFC_OUTARR = 40; // 电压环执行频率=PFC载波频率/OUTARR 200:执行频率=41k/200=205hz 40:执行频率=41k/40=1025hz
  104. PFC_TRGDLY &= 0x0F;
  105. PFC_TRGDLY |= 0x00; // 采样delay设置,只写高4位,低4位默认写0,如0xX0,X的范围为:0-F
  106. SetBit(PFC_CR0, UAVGCDIS);// PFC硬件自动算UAVG禁止
  107. // ClrBit(PFC_CR0, UAVGCDIS);//开启自动计算
  108. #if (PFCOverCurrentProtectMode==PFCOVERCURRENT)
  109. {
  110. ClrBit(PFC_CR0, PFCOA); // PFC过流
  111. }
  112. #elif (PFCOverCurrentProtectMode==PFCOVERCURRENTLimt)
  113. {
  114. SetBit(PFC_CR0, PFCOA); // PFC逐波限流
  115. }
  116. #endif
  117. ClrBit(PFC_CR2, P2FTEN); //采样时刻设置0向下计数时采样,1向上计数时采样
  118. SetBit(ADC_MASK, CH12EN);//使能IAC的采样
  119. /****参数初始化*******/
  120. PFCSet.UDCREFValue = 0;
  121. PFCSet.IACOUTMax = 0;
  122. PFCSet.OverVoltFlag = 0;
  123. PFCSet.UDCOUTMax = PFC_UDCREF_Max;//PFC_UDCREF_GET;
  124. }
  125. // udc最大值最小值获取
  126. void UdcMax_Min(void)
  127. {
  128. // SetBit(ADC_CR, ADCBSY); // 使能ADC的DCBUS采样
  129. udc.L1 = ADC13_DR;
  130. udc.L2 = ADC10_DR;
  131. udc.L3 = ADC12_DR;
  132. if (udc.L1 >= udc.L2 && udc.L1 >= udc.L3)
  133. {
  134. udc.LMAX = udc.L1;
  135. }
  136. if (udc.L2 >= udc.L1 && udc.L2 >= udc.L3)
  137. {
  138. udc.LMAX = udc.L2;
  139. }
  140. if (udc.L3 >= udc.L2 && udc.L3 >= udc.L1)
  141. {
  142. udc.LMAX = udc.L3;
  143. }
  144. mcFocCtrl.mcDcbus = ADC2_DR;
  145. mcFocCtrl.mcAcbus = udc.LMAX;
  146. if (mcFocCtrl.mcDcbus >= mcFocCtrl.mcDcbus_max_temp)
  147. {
  148. mcFocCtrl.mcDcbus_max_temp = mcFocCtrl.mcDcbus;
  149. }
  150. if (mcFocCtrl.mcAcbus >= mcFocCtrl.mcAcbus_max_temp)
  151. {
  152. mcFocCtrl.mcAcbus_max_temp = mcFocCtrl.mcAcbus;
  153. }
  154. if (mcFocCtrl.mcDcbus <= mcFocCtrl.mcDcbus_min_temp)
  155. {
  156. mcFocCtrl.mcDcbus_min_temp = mcFocCtrl.mcDcbus;
  157. }
  158. mcFocCtrl.mcDcbus_count++;
  159. if (mcFocCtrl.mcDcbus_count >= Udcmax_ms)
  160. {
  161. mcFocCtrl.mcAcbus_max = mcFocCtrl.mcAcbus_max_temp;
  162. mcFocCtrl.mcDcbus_max = mcFocCtrl.mcDcbus_max_temp;
  163. mcFocCtrl.mcDcbus_min = mcFocCtrl.mcDcbus_min_temp;
  164. mcFocCtrl.mcDcbus_chazhi = mcFocCtrl.mcDcbus_max - mcFocCtrl.mcDcbus_min;
  165. mcFocCtrl.mcDcbus_min_temp = mcFocCtrl.mcDcbus;
  166. mcFocCtrl.mcDcbus_max_temp = mcFocCtrl.mcDcbus;
  167. mcFocCtrl.mcAcbus_max_temp = 0;
  168. mcFocCtrl.mcDcbus_count = 0;
  169. }
  170. udc.mcDcbusRef = mcFocCtrl.mcDcbus_max - mcFocCtrl.mcDcbus;
  171. if (udc.mcDcbusRef <= 1)
  172. {
  173. udc.mcDcbusRef = 1;
  174. }
  175. // udc.WeakenUsRef =(uint32)(udc.mcDcbusRef/540) * HW_BOARD_VOLT_MAX;
  176. MUL0_MA = HW_BOARD_VOLT_MAX;
  177. MUL0_MB = udc.mcDcbusRef;
  178. SMDU_RunBlock(0, SMUL);
  179. MduTempH = MUL0_MCH;
  180. MduTempL = MUL0_MCL;
  181. DIV0_DAH = MduTempH;
  182. DIV0_DAL = MduTempL;
  183. DIV0_DB = 540;
  184. SMDU_RunBlock(0, DIV);
  185. MduDIVL = DIV0_DQL;
  186. udc.WeakenUsRef = DcbusK - MduDIVL; //弱磁深度
  187. if (udc.WeakenUsRef >= _Q15(1.0))
  188. {
  189. udc.WeakenUsRef = _Q15(1.0);
  190. }
  191. }