cp_detection.c 37 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898
  1. /**
  2. ******************************************************************************
  3. * @file cp_detection.c
  4. * @author Edward Lien
  5. * @brief This file provides Control Pilot Voltage detection with filter algorithm.
  6. * @Version D0.03
  7. * @Date 2020/03/04
  8. ******************************************************************************
  9. */
  10. /* Private includes ----------------------------------------------------------*/
  11. /* USER CODE BEGIN Includes */
  12. #include "main.h"
  13. #include "cp_detection.h"
  14. /* USER CODE END Includes */
  15. /* Private typedef -----------------------------------------------------------*/
  16. /* USER CODE BEGIN PTD */
  17. /* USER CODE END PTD */
  18. /* Private define ------------------------------------------------------------*/
  19. /* USER CODE BEGIN PD */
  20. /* USER CODE END PD */
  21. /* Private macro -------------------------------------------------------------*/
  22. /* USER CODE BEGIN PM */
  23. /* USER CODE END PM */
  24. /* Private variables ---------------------------------------------------------*/
  25. /* USER CODE BEGIN PV */
  26. #ifdef FUNC_CP_ADC_MODIFY
  27. #ifdef NEW_CP_SPEC
  28. sCPVoltageBoundary_t CpModuleBoundary = { 0 };
  29. sCPVoltageBoundary_t SpecBoundary = { 0 };
  30. sCPVoltageHysteresis_t CpModuleHysteresis = { 0 };
  31. #ifdef NEW_CP_SPEC_20210525
  32. //--------------------------------------------------------[ GEN ]
  33. sCPVoltageBoundary_t CpModuleBoundary_20210525_GEN = {
  34. CP_GET_OPA_VOUT_ADC(12 + 1.5),
  35. CP_GET_OPA_VOUT_ADC(12 - 1.5),
  36. CP_GET_OPA_VOUT_ADC(9 + 1.5),
  37. CP_GET_OPA_VOUT_ADC(9 - 1.5),
  38. CP_GET_OPA_VOUT_ADC(6 + 1.5),
  39. CP_GET_OPA_VOUT_ADC(6 - 1.5),
  40. CP_GET_OPA_VOUT_ADC(3 + 1.5),
  41. CP_GET_OPA_VOUT_ADC(3 - 1.5),
  42. CP_GET_OPA_VOUT_ADC(0 + 1.5),
  43. CP_GET_OPA_VOUT_ADC(0 - 1.5),
  44. CP_GET_OPA_VOUT_ADC(-12 + 2.5),
  45. CP_GET_OPA_VOUT_ADC(-12 - 2.5)
  46. };
  47. sCPVoltageBoundary_t SpecBoundary_20210525_GEN = {
  48. CP_GET_OPA_VOUT_ADC(12 + 1.5),
  49. CP_GET_OPA_VOUT_ADC(12 - 1.5),
  50. CP_GET_OPA_VOUT_ADC(9 + 1.5),
  51. CP_GET_OPA_VOUT_ADC(9 - 1.5),
  52. CP_GET_OPA_VOUT_ADC(6 + 1.5),
  53. CP_GET_OPA_VOUT_ADC(6 - 1.5),
  54. CP_GET_OPA_VOUT_ADC(3 + 1.5),
  55. CP_GET_OPA_VOUT_ADC(3 - 1.5),
  56. CP_GET_OPA_VOUT_ADC(0 + 1.5),
  57. CP_GET_OPA_VOUT_ADC(0 - 1.5),
  58. CP_GET_OPA_VOUT_ADC(-12 + 2.5),
  59. CP_GET_OPA_VOUT_ADC(-12 - 2.5)
  60. };
  61. sCPVoltageHysteresis_t CpModuleHysteresis_20210525_GEN = {
  62. CP_GET_OPA_VOLT_DIFF_ADC(0.5),
  63. CP_GET_OPA_VOLT_DIFF_ADC(0.25),
  64. CP_GET_OPA_VOLT_DIFF_ADC(0.25),
  65. CP_GET_OPA_VOLT_DIFF_ADC(0.25),
  66. CP_GET_OPA_VOLT_DIFF_ADC(0.25),
  67. CP_GET_OPA_VOLT_DIFF_ADC(0.25),
  68. CP_GET_OPA_VOLT_DIFF_ADC(0.25),
  69. CP_GET_OPA_VOLT_DIFF_ADC(0.25),
  70. CP_GET_OPA_VOLT_DIFF_ADC(0.25),
  71. CP_GET_OPA_VOLT_DIFF_ADC(0.5),
  72. CP_GET_OPA_VOLT_DIFF_ADC(0.5),
  73. CP_GET_OPA_VOLT_DIFF_ADC(0.5)
  74. };
  75. //--------------------------------------------------------[ GB ]
  76. sCPVoltageBoundary_t CpModuleBoundary_20210525_GB = {
  77. CP_GET_OPA_VOUT_ADC(12 + 1.5),
  78. CP_GET_OPA_VOUT_ADC(12 - 1.5),
  79. CP_GET_OPA_VOUT_ADC(9 + 1.5),
  80. CP_GET_OPA_VOUT_ADC(9 - 1.5),
  81. CP_GET_OPA_VOUT_ADC(6 + 1.5),
  82. CP_GET_OPA_VOUT_ADC(6 - 1.5),
  83. CP_GET_OPA_VOUT_ADC(3 + 1.5),
  84. CP_GET_OPA_VOUT_ADC(3 - 1.5),
  85. CP_GET_OPA_VOUT_ADC(0 + 1.5),
  86. CP_GET_OPA_VOUT_ADC(0 - 1.5),
  87. CP_GET_OPA_VOUT_ADC(-12 + 2.5),
  88. CP_GET_OPA_VOUT_ADC(-12 - 2.5)
  89. };
  90. //sCPVoltageBoundary_t SpecBoundary_20210525_GB = {
  91. // CP_GET_OPA_VOUT_ADC(12 + 0.8),
  92. // CP_GET_OPA_VOUT_ADC(12 - 0.8),
  93. // CP_GET_OPA_VOUT_ADC(9 + 0.8),
  94. // CP_GET_OPA_VOUT_ADC(9 - 0.8),
  95. // CP_GET_OPA_VOUT_ADC(6 + 0.8),
  96. // CP_GET_OPA_VOUT_ADC(6 - 0.8),
  97. // CP_GET_OPA_VOUT_ADC(3 + 0.8),
  98. // CP_GET_OPA_VOUT_ADC(3 - 0.8),
  99. // CP_GET_OPA_VOUT_ADC(0 + 0.8),
  100. // CP_GET_OPA_VOUT_ADC(0 - 0.8),
  101. // CP_GET_OPA_VOUT_ADC(-12 + 0.8),
  102. // //CP_GET_OPA_VOUT_ADC(-12 - 0.8)
  103. // CP_GET_OPA_VOUT_ADC(-12 - 2.5)
  104. // };
  105. sCPVoltageBoundary_t SpecBoundary_20210525_GB = {
  106. CP_GET_OPA_VOUT_ADC(12 + 1.5),
  107. CP_GET_OPA_VOUT_ADC(12 - 1.5),
  108. CP_GET_OPA_VOUT_ADC(9 + 1.5),
  109. CP_GET_OPA_VOUT_ADC(9 - 1.5),
  110. CP_GET_OPA_VOUT_ADC(6 + 1.5),
  111. CP_GET_OPA_VOUT_ADC(6 - 1.5),
  112. CP_GET_OPA_VOUT_ADC(3 + 1.5),
  113. CP_GET_OPA_VOUT_ADC(3 - 1.5),
  114. CP_GET_OPA_VOUT_ADC(0 + 1.5),
  115. CP_GET_OPA_VOUT_ADC(0 - 1.5),
  116. CP_GET_OPA_VOUT_ADC(-12 + 2.5),
  117. CP_GET_OPA_VOUT_ADC(-12 - 2.5)
  118. };
  119. sCPVoltageHysteresis_t CpModuleHysteresis_20210525_GB = {
  120. CP_GET_OPA_VOLT_DIFF_ADC(0.5),
  121. CP_GET_OPA_VOLT_DIFF_ADC(0.25),
  122. CP_GET_OPA_VOLT_DIFF_ADC(0.25),
  123. CP_GET_OPA_VOLT_DIFF_ADC(0.25),
  124. CP_GET_OPA_VOLT_DIFF_ADC(0.25),
  125. CP_GET_OPA_VOLT_DIFF_ADC(0.25),
  126. CP_GET_OPA_VOLT_DIFF_ADC(0.25),
  127. CP_GET_OPA_VOLT_DIFF_ADC(0.25),
  128. CP_GET_OPA_VOLT_DIFF_ADC(0.25),
  129. CP_GET_OPA_VOLT_DIFF_ADC(0.5),
  130. CP_GET_OPA_VOLT_DIFF_ADC(0.5),
  131. CP_GET_OPA_VOLT_DIFF_ADC(0.5)
  132. };
  133. #endif //NEW_CP_SPEC_20210525
  134. #endif //NEW_CP_SPEC
  135. #else //FUNC_CP_ADC_MODIFY
  136. sCPVoltageBoundary_t CpModuleBoundary;
  137. sCPVoltageBoundary_t SpecBoundary;
  138. sCPVoltageHysteresis_t CpModuleHysteresis;
  139. #endif //FUNC_CP_ADC_MODIFY
  140. uint16_t CPTempBuffer[MAX_CLASSIFY_SECTION][MAX_SECTION_COUNT]; //PUDTB PTB1 PTB2 PTB3 PTB4 PTB5 NTB1 NUDTB
  141. uint8_t CpNewStateCounter=0;
  142. uint8_t CpPreviousState;
  143. /* USER CODE END PV */
  144. /* Private function prototypes -----------------------------------------------*/
  145. /* USER CODE BEGIN PFP */
  146. /* USER CODE END PFP */
  147. /* Private user code ---------------------------------------------------------*/
  148. /* USER CODE BEGIN 0 */
  149. #ifdef FUNC_CP_ADC_MODIFY
  150. #ifdef FUNC_CP_ADC_MODIFY_DEBUG
  151. void CP_ADC_OPA_PrintParam(void)
  152. {
  153. const char *s = "************************";
  154. HTK_UNUSED(s);
  155. DEBUG_INFO("%s\r\n", s);
  156. DEBUG_INFO("CP_ADC_REFVOLT = %f\r\n", CP_ADC_REFVOLT);
  157. DEBUG_INFO("CP_ADC_MIN_COUNT = %d\r\n", CP_ADC_MIN_COUNT);
  158. DEBUG_INFO("CP_ADC_MAX_COUNT = %d\r\n", CP_ADC_MAX_COUNT);
  159. DEBUG_INFO("CP_ADC_RESOLUTION = %f\r\n", CP_ADC_RESOLUTION);
  160. DEBUG_INFO("%s\r\n", s);
  161. DEBUG_INFO("CP_ADC_OPA_RIN_P = %f\r\n", CP_ADC_OPA_RIN_P);
  162. DEBUG_INFO("CP_ADC_OPA_RIN_N = %f\r\n", CP_ADC_OPA_RIN_N);
  163. DEBUG_INFO("CP_ADC_OPA_RG = %f\r\n", CP_ADC_OPA_RG);
  164. DEBUG_INFO("CP_ADC_OPA_RF = %f\r\n", CP_ADC_OPA_RF);
  165. DEBUG_INFO("CP_ADC_OPA_VIN_P = %f\r\n", CP_ADC_OPA_VIN_P);
  166. DEBUG_INFO("CP_ADC_OPA_VOP_P = %f\r\n", CP_ADC_OPA_VOP_P);
  167. DEBUG_INFO("CP_ADC_OPA_GAIN = %f\r\n", CP_ADC_OPA_GAIN);
  168. DEBUG_INFO("CP_ADC_OPA_GAIN_RECIPROCAL = %f\r\n", CP_ADC_OPA_GAIN_RECIPROCAL);
  169. DEBUG_INFO("CP_ADC_OPA_CALC_OPA_VOUT_SLOP = %f\r\n", CP_ADC_OPA_CALC_OPA_VOUT_SLOP);
  170. DEBUG_INFO("CP_ADC_OPA_CALC_OPA_VOUT_OFFS = %f\r\n", CP_ADC_OPA_CALC_OPA_VOUT_OFFS);
  171. DEBUG_INFO("CP_ADC_OPA_CALC_OPA_VIN_SLOP = %f\r\n", CP_ADC_OPA_CALC_OPA_VIN_SLOP);
  172. DEBUG_INFO("CP_ADC_OPA_CALC_OPA_VIN_OFFS = %f\r\n", CP_ADC_OPA_CALC_OPA_VIN_OFFS);
  173. DEBUG_INFO("%s\r\n", s);
  174. DEBUG_INFO("CP_P12V_HIGH = %d\r\n", CpModuleBoundary.CpP12VHigh);
  175. DEBUG_INFO("CP_P12V_LOW = %d\r\n", CpModuleBoundary.CpP12VLow);
  176. DEBUG_INFO("CP_P9V_HIGH = %d\r\n", CpModuleBoundary.CpP9VHigh);
  177. DEBUG_INFO("CP_P9V_LOW = %d\r\n", CpModuleBoundary.CpP9VLow);
  178. DEBUG_INFO("CP_P6V_HIGH = %d\r\n", CpModuleBoundary.CpP6VHigh);
  179. DEBUG_INFO("CP_P6V_LOW = %d\r\n", CpModuleBoundary.CpP6VLow);
  180. DEBUG_INFO("CP_P3V_HIGH = %d\r\n", CpModuleBoundary.CpP3VHigh);
  181. DEBUG_INFO("CP_P3V_LOW = %d\r\n", CpModuleBoundary.CpP3VLow);
  182. DEBUG_INFO("CP_0V_HIGH = %d\r\n", CpModuleBoundary.Cp0VHigh);
  183. DEBUG_INFO("CP_0V_LOW = %d\r\n", CpModuleBoundary.Cp0VLow);
  184. DEBUG_INFO("CP_N12V_HIGH = %d\r\n", CpModuleBoundary.CpN12VHigh);
  185. DEBUG_INFO("CP_N12V_LOW = %d\r\n", CpModuleBoundary.CpN12VLow);
  186. DEBUG_INFO("%s\r\n", s);
  187. DEBUG_INFO("CP_SPEC_P12V_HIGH = %d\r\n", SpecBoundary.CpP12VHigh);
  188. DEBUG_INFO("CP_SPEC_P12V_LOW = %d\r\n", SpecBoundary.CpP12VLow);
  189. DEBUG_INFO("CP_SPEC_P9V_HIGH = %d\r\n", SpecBoundary.CpP9VHigh);
  190. DEBUG_INFO("CP_SPEC_P9V_LOW = %d\r\n", SpecBoundary.CpP9VLow);
  191. DEBUG_INFO("CP_SPEC_P6V_HIGH = %d\r\n", SpecBoundary.CpP6VHigh);
  192. DEBUG_INFO("CP_SPEC_P6V_LOW = %d\r\n", SpecBoundary.CpP6VLow);
  193. DEBUG_INFO("CP_SPEC_P3V_HIGH = %d\r\n", SpecBoundary.CpP3VHigh);
  194. DEBUG_INFO("CP_SPEC_P3V_LOW = %d\r\n", SpecBoundary.CpP3VLow);
  195. DEBUG_INFO("CP_SPEC_0V_HIGH = %d\r\n", SpecBoundary.Cp0VHigh);
  196. DEBUG_INFO("CP_SPEC_0V_LOW = %d\r\n", SpecBoundary.Cp0VLow);
  197. DEBUG_INFO("CP_SPEC_N12V_HIGH = %d\r\n", SpecBoundary.CpN12VHigh);
  198. DEBUG_INFO("CP_SPEC_N12V_LOW = %d\r\n", SpecBoundary.CpN12VLow);
  199. DEBUG_INFO("%s\r\n", s);
  200. DEBUG_INFO("HYSTERESIS_P12V_HIGH = %d\r\n", CpModuleHysteresis.HysteresisP12VHigh);
  201. DEBUG_INFO("HYSTERESIS_P12V_LOW = %d\r\n", CpModuleHysteresis.HysteresisP12VLow);
  202. DEBUG_INFO("HYSTERESIS_P9V_HIGH = %d\r\n", CpModuleHysteresis.HysteresisP9VHigh);
  203. DEBUG_INFO("HYSTERESIS_P9V_LOW = %d\r\n", CpModuleHysteresis.HysteresisP9VLow);
  204. DEBUG_INFO("HYSTERESIS_P6V_HIGH = %d\r\n", CpModuleHysteresis.HysteresisP6VHigh);
  205. DEBUG_INFO("HYSTERESIS_P6V_LOW = %d\r\n", CpModuleHysteresis.HysteresisP6VLow);
  206. DEBUG_INFO("HYSTERESIS_P3V_HIGH = %d\r\n", CpModuleHysteresis.HysteresisP3VHigh);
  207. DEBUG_INFO("HYSTERESIS_P3V_LOW = %d\r\n", CpModuleHysteresis.HysteresisP3VLow);
  208. DEBUG_INFO("HYSTERESIS_0V_HIGH = %d\r\n", CpModuleHysteresis.Hysteresis0VHigh);
  209. DEBUG_INFO("HYSTERESIS_0V_LOW = %d\r\n", CpModuleHysteresis.Hysteresis0VLow);
  210. DEBUG_INFO("HYSTERESIS_N12V_HIGH = %d\r\n", CpModuleHysteresis.HysteresisN12VHigh);
  211. DEBUG_INFO("HYSTERESIS_N12V_LOW = %d\r\n", CpModuleHysteresis.HysteresisN12VLow);
  212. DEBUG_INFO("%s\r\n", s);
  213. }
  214. void CP_ADC_OPA_TestFormula(void)
  215. {
  216. enum { ITEM_NUM = 6 };
  217. const float Item_Vin[ITEM_NUM] = { 12.0, 9.0, 6.0, 3.0, 0, -12.0};
  218. float Item_Vout[ITEM_NUM] = { 0 };
  219. const char *s = "************************";
  220. HTK_UNUSED(Item_Vout);
  221. HTK_UNUSED(s);
  222. DEBUG_INFO("%s\r\n", s);
  223. DEBUG_INFO("%s\r\n", "CP_ADC_OPA_TestFormula");
  224. DEBUG_INFO("%s\r\n", s);
  225. for (uint8_t i = 0; i < ITEM_NUM; i++)
  226. {
  227. Item_Vout[i] = CP_GET_OPA_VOUT(Item_Vin[i]);
  228. DEBUG_INFO("CP_GET_OPA_VOUT(%f) = %f\r\n", Item_Vin[i], Item_Vout[i]);
  229. }
  230. DEBUG_INFO("%s\r\n", s);
  231. for (uint8_t i = 0; i < ITEM_NUM; i++)
  232. {
  233. DEBUG_INFO("CP_GET_OPA_VIN(%f) = %f\r\n", Item_Vout[i], CP_GET_OPA_VIN(Item_Vout[i]));
  234. }
  235. DEBUG_INFO("%s\r\n", s);
  236. }
  237. void CP_ADC_OPA_TestBoundaryValue(void)
  238. {
  239. enum { ITEM_NUM = 12 + 12 + 10 };
  240. const float Item_Vin[ITEM_NUM] =
  241. {
  242. //CP_P?V_HIGH/LOW
  243. 12.0 + 1.5,
  244. 12.0 - 1.5,
  245. 9.0 + 1.5,
  246. 9.0 - 1.5,
  247. 6.0 + 1.5,
  248. 6.0 - 1.5,
  249. 3.0 + 1.5,
  250. 3.0 - 1.5,
  251. 0.0 + 1.5,
  252. 0.0 - 1.5,
  253. -12.0 + 1.5,
  254. -12.0 - 1.5,
  255. //CP_SPEC_P?V_HIGH/LOW
  256. 12.0 + 1.0,
  257. 12.0 - 1.0,
  258. 9.0 + 1.0,
  259. 9.0 - 1.0,
  260. 6.0 + 1.0,
  261. 6.0 - 1.0,
  262. 3.0 + 1.0,
  263. 3.0 - 1.0,
  264. 0.0 + 1.0,
  265. 0.0 - 1.0,
  266. -12.0 + 1.0,
  267. -12.0 - 1.0,
  268. //HYSTERESIS_P?V_HIGH/LOW
  269. 0.3,
  270. 0.3,
  271. 0.3,
  272. 0.3,
  273. 0.3,
  274. 0.3,
  275. 0.3,
  276. 0.3,
  277. 0.3,
  278. 0.3,
  279. };
  280. const char *s = "************************";
  281. HTK_UNUSED(Item_Vin);
  282. HTK_UNUSED(s);
  283. DEBUG_INFO("%s\r\n", s);
  284. for (uint8_t i = 0; i < ITEM_NUM; i++)
  285. {
  286. if (i < 24)
  287. DEBUG_INFO("CP_GET_OPA_VOUT_ADC(%.1f) = %d\r\n", Item_Vin[i], CP_GET_OPA_VOUT_ADC(Item_Vin[i]));
  288. else
  289. DEBUG_INFO("CP_GET_OPA_VOLT_DIFF_ADC(%.1f) = %d\r\n", Item_Vin[i], CP_GET_OPA_VOLT_DIFF_ADC(Item_Vin[i]));
  290. }
  291. DEBUG_INFO("%s\r\n", s);
  292. }
  293. #endif //FUNC_CP_ADC_MODIFY_DEBUG
  294. #ifdef NEW_CP_SPEC
  295. void CpDetectModuleInitialize(char SafetyRegulationCode)
  296. {
  297. #ifdef NEW_CP_SPEC_20210525
  298. if (SafetyRegulationCode == 'G') //GB
  299. {
  300. memcpy(&CpModuleBoundary, &CpModuleBoundary_20210525_GB, sizeof(sCPVoltageBoundary_t));
  301. memcpy(&SpecBoundary, &SpecBoundary_20210525_GB, sizeof(sCPVoltageBoundary_t));
  302. memcpy(&CpModuleHysteresis, &CpModuleHysteresis_20210525_GB, sizeof(sCPVoltageHysteresis_t));
  303. }
  304. else
  305. {
  306. memcpy(&CpModuleBoundary, &CpModuleBoundary_20210525_GEN, sizeof(sCPVoltageBoundary_t));
  307. memcpy(&SpecBoundary, &SpecBoundary_20210525_GEN, sizeof(sCPVoltageBoundary_t));
  308. memcpy(&CpModuleHysteresis, &CpModuleHysteresis_20210525_GEN, sizeof(sCPVoltageHysteresis_t));
  309. }
  310. #endif //NEW_CP_SPEC_20210525
  311. CpNewStateCounter = 0;
  312. CpPreviousState = SYSTEM_STATE_A;
  313. #ifdef FUNC_CP_ADC_MODIFY_DEBUG
  314. CP_ADC_OPA_PrintParam();
  315. CP_ADC_OPA_TestFormula();
  316. CP_ADC_OPA_TestBoundaryValue();
  317. #endif
  318. }
  319. #endif //NEW_CP_SPEC
  320. #endif //FUNC_CP_ADC_MODIFY
  321. #ifdef TRACE_CP
  322. void TRACE_CP_Print_CPModuleResult(sCPModuleResult_t *p, uint8_t bOK, long EQ_Sum, long EQ_NG1, long EQ_NG2)
  323. {
  324. XP("%4d %4d %4d %4d %4d %4d %4d (%s) [%7d, %7d, %7d, %7.3f%%]\r\n",
  325. p->State,
  326. p->PositiveValue,
  327. p->NegativeValue,
  328. p->MaxPTB,
  329. p->MaxPTBCount,
  330. p->MaxNTB,
  331. p->MaxNTBCount,
  332. bOK ? "OK" : "NG",
  333. EQ_Sum,
  334. EQ_NG1,
  335. EQ_NG2,
  336. (((float)EQ_NG1 + EQ_NG2) / EQ_Sum) * 100
  337. );
  338. }
  339. #endif
  340. void CpCalculate(uint32_t * adc_value, uint16_t sample_times, sCPModuleResult_t *result)
  341. {
  342. uint16_t i,j;
  343. uint16_t ClassifyIndex[MAX_CLASSIFY_SECTION],ClassifyIndexMax = 0,MaxSection = 0;
  344. uint64_t PositiveAdcSectionSum = 0, PositiveAdcSectionAvg = 0, NegativeAdcSectionSum = 0, NegativeAdcSectionAvg = 0;
  345. uint8_t CpNewState,IndexCounterEqual=false,FlagStateUnknown=false;
  346. #ifdef FUNC_CP_VARIABLE_MAX_STATE_COUNTER
  347. uint8_t MaxStateCounter = MAX_STATE_COUNTER;
  348. #endif
  349. for(i=0;i<MAX_CLASSIFY_SECTION;i++){
  350. ClassifyIndex[i] = 0;
  351. }
  352. //classify the adc raw data
  353. for(i=0;i<sample_times;i++){
  354. if(adc_value[i]<=CpModuleBoundary.CpP12VHigh){ //PUDTB
  355. CPTempBuffer[0][ClassifyIndex[0]] = adc_value[i];
  356. ClassifyIndex[0]++;
  357. }else if((adc_value[i]<=CpModuleBoundary.CpP12VLow)&&(adc_value[i]>CpModuleBoundary.CpP12VHigh)){
  358. CPTempBuffer[1][ClassifyIndex[1]] = adc_value[i];
  359. ClassifyIndex[1]++;
  360. }else if((adc_value[i]<=CpModuleBoundary.CpP9VLow)&&adc_value[i]>CpModuleBoundary.CpP9VHigh){
  361. CPTempBuffer[2][ClassifyIndex[2]] = adc_value[i];
  362. ClassifyIndex[2]++;
  363. }else if((adc_value[i]<=CpModuleBoundary.CpP6VLow)&&(adc_value[i]>CpModuleBoundary.CpP6VHigh)){
  364. CPTempBuffer[3][ClassifyIndex[3]] = adc_value[i];
  365. ClassifyIndex[3]++;
  366. }else if((adc_value[i]<=CpModuleBoundary.CpP3VLow)&&(adc_value[i]>CpModuleBoundary.CpP3VHigh)){
  367. CPTempBuffer[4][ClassifyIndex[4]] = adc_value[i];
  368. ClassifyIndex[4]++;
  369. #ifdef FUNC_CP_CLASSIFY_TO_OV_RANGE
  370. }else if((adc_value[i]<=CpModuleBoundary.Cp0VLow)&&(adc_value[i]>CpModuleBoundary.Cp0VHigh)){
  371. CPTempBuffer[5][ClassifyIndex[5]] = adc_value[i];
  372. ClassifyIndex[5]++;
  373. #endif
  374. }else if((adc_value[i]<=CpModuleBoundary.CpN12VLow)&&(adc_value[i]>CpModuleBoundary.CpN12VHigh)){
  375. CPTempBuffer[6][ClassifyIndex[6]] = adc_value[i];
  376. ClassifyIndex[6]++;
  377. }else{ //NUDTB
  378. CPTempBuffer[7][ClassifyIndex[7]] = adc_value[i];
  379. ClassifyIndex[7]++;
  380. }
  381. }
  382. #ifdef TRACE_CP
  383. uint16_t sum = 0;
  384. {
  385. for (uint16_t i = 0; i < MAX_CLASSIFY_SECTION; i++)
  386. {
  387. sum += ClassifyIndex[i];
  388. }
  389. }
  390. //XP("%4d %4d %4d %4d %4d %4d %4d %4d\r\n",
  391. XP("[>=12VH]%4d [12V]%4d [9V]%4d [6V]%4d [3V]%4d [0V]%4d [-12V]%4d [OTHERS]%4d (%d)\r\n",
  392. ClassifyIndex[0],
  393. ClassifyIndex[1],
  394. ClassifyIndex[2],
  395. ClassifyIndex[3],
  396. ClassifyIndex[4],
  397. ClassifyIndex[5],
  398. ClassifyIndex[6],
  399. ClassifyIndex[7], sum);
  400. static long EQ_Sum = 0;
  401. static long EQ_NG1 = 0;
  402. static long EQ_NG2 = 0;
  403. EQ_Sum++;
  404. #endif
  405. //check if 2 index count were the same
  406. IndexCounterEqual = false;
  407. #ifdef FUNC_CP_CLASSIFY_TO_OV_RANGE
  408. for(i=0;i<6;i++){
  409. for(j=0;j<6;j++){
  410. #else
  411. for(i=0;i<5;i++){
  412. for(j=0;j<5;j++){
  413. #endif
  414. #ifndef TRACE_CP
  415. if((ClassifyIndex[i]==ClassifyIndex[j])&&(ClassifyIndex[i]>0)&&(i!=j)){
  416. #else
  417. //Make sure 6V => 9V, Relay must cut off in 100 ms ( < 60 ms is much better)
  418. //if((ClassifyIndex[i]==ClassifyIndex[j])&&(ClassifyIndex[i]>0)&&(i!=j)){ //60% NG
  419. //if((ClassifyIndex[i]==ClassifyIndex[j])&&(ClassifyIndex[i]>1)&&(i!=j)){ // 5% NG
  420. if((ClassifyIndex[i]==ClassifyIndex[j])&&(ClassifyIndex[i]>2)&&(i!=j)){ // 0% NG
  421. //if((ClassifyIndex[i]==ClassifyIndex[j])&&(ClassifyIndex[i]>7)&&(i!=j)){ // 0% NG
  422. #endif
  423. IndexCounterEqual = true;
  424. #ifdef TRACE_CP
  425. EQ_NG1++;
  426. #endif
  427. }
  428. }
  429. }
  430. if((ClassifyIndex[6]==ClassifyIndex[7])&&(ClassifyIndex[6]!=0)&&(ClassifyIndex[7]!=0)){
  431. IndexCounterEqual = true;
  432. #ifdef TRACE_CP
  433. EQ_NG2++;
  434. #endif
  435. }
  436. //find the positive maxinum
  437. if(!IndexCounterEqual){
  438. ClassifyIndexMax = ClassifyIndex[0];
  439. MaxSection = 0;
  440. result->PositiveValue = 0;
  441. result->NegativeValue = 0;
  442. #ifdef FUNC_CP_CLASSIFY_TO_OV_RANGE
  443. for(i=0;i<6;){
  444. #else
  445. for(i=0;i<5;){
  446. #endif
  447. if(ClassifyIndex[i]>ClassifyIndexMax){
  448. MaxSection = i;
  449. ClassifyIndexMax = ClassifyIndex[i];
  450. }
  451. i++;
  452. }
  453. result->MaxPTB = MaxSection;
  454. result->MaxPTBCount = ClassifyIndex[MaxSection];
  455. //check PTB_max is PUDTB
  456. if(MaxSection==0){
  457. FlagStateUnknown = true;
  458. }
  459. //check NTB_max is NUDTB
  460. if(ClassifyIndex[7]>ClassifyIndex[6])
  461. {
  462. #ifdef MODIFY_CP_NEG_JUDGMENT_PROCESS
  463. if (((float)(ClassifyIndex[7] - ClassifyIndex[6])) / (ClassifyIndex[7] + ClassifyIndex[6]) > 0.5f)
  464. {
  465. FlagStateUnknown = true;
  466. }
  467. #else
  468. FlagStateUnknown = true;
  469. #endif
  470. result->MaxNTB = 7;
  471. result->MaxNTBCount = ClassifyIndex[7];
  472. }else{
  473. result->MaxNTB = 6;
  474. result->MaxNTBCount = ClassifyIndex[6];
  475. }
  476. // calculate PTB_max sum & average
  477. PositiveAdcSectionAvg = 0;
  478. PositiveAdcSectionSum = 0;
  479. MaxSection = result->MaxPTB;
  480. if(ClassifyIndex[MaxSection]>0){
  481. for(j=0;j<ClassifyIndex[MaxSection];j++){
  482. PositiveAdcSectionSum+=CPTempBuffer[MaxSection][j];
  483. }
  484. if(PositiveAdcSectionSum>0){
  485. PositiveAdcSectionAvg = (PositiveAdcSectionSum/ClassifyIndex[MaxSection]);
  486. //// if (PositiveAdcSectionAvg < 81)
  487. //// {
  488. //// XP("###PositiveAdcSectionAvg = %d", PositiveAdcSectionAvg);
  489. //// }
  490. }
  491. result->PositiveValue = PositiveAdcSectionAvg;
  492. }
  493. //calculate NTB sum & average
  494. NegativeAdcSectionAvg = 0;
  495. NegativeAdcSectionSum = 0;
  496. //if(CPTempBuffer[6]>0){
  497. if(ClassifyIndex[6]>0){ //Hao@20210112: Revise previous line
  498. for(j=0;j<ClassifyIndex[6];j++){
  499. NegativeAdcSectionSum+=CPTempBuffer[6][j];
  500. }
  501. if(NegativeAdcSectionSum>0){
  502. NegativeAdcSectionAvg = (NegativeAdcSectionSum/ClassifyIndex[6]);
  503. }
  504. result->NegativeValue = NegativeAdcSectionAvg;
  505. }
  506. if(!FlagStateUnknown)
  507. {
  508. //decide the new state
  509. switch(CpPreviousState){
  510. case SYSTEM_STATE_A:
  511. if((PositiveAdcSectionAvg<=SpecBoundary.CpP12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP12VHigh)){
  512. CpNewState = SYSTEM_STATE_A;
  513. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP9VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP9VHigh+CpModuleHysteresis.HysteresisP9VHigh)){
  514. CpNewState = SYSTEM_STATE_B;
  515. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP6VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP6VHigh)){
  516. CpNewState = SYSTEM_STATE_C;
  517. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP3VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP3VHigh)){
  518. CpNewState = SYSTEM_STATE_D;
  519. }else if((PositiveAdcSectionAvg<=SpecBoundary.Cp0VLow)&&(PositiveAdcSectionAvg>SpecBoundary.Cp0VHigh)){
  520. #ifdef MODIFY_UNKNOWN_TO_STATE_E
  521. CpNewState = SYSTEM_STATE_E;
  522. #else
  523. CpNewState = SYSTEM_STATE_UNKNOWN;
  524. #endif
  525. #ifdef MODIFY_UNKNOWN_TO_STATE_F
  526. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  527. CpNewState = SYSTEM_STATE_F;
  528. #else
  529. /*}else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  530. CpNewState = SYSTEM_STATE_F; */
  531. #endif
  532. }else{
  533. CpNewState = SYSTEM_STATE_UNKNOWN;
  534. }
  535. break;
  536. case SYSTEM_STATE_B:
  537. if((PositiveAdcSectionAvg<=SpecBoundary.CpP12VLow-CpModuleHysteresis.HysteresisP12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP12VHigh)){
  538. CpNewState = SYSTEM_STATE_A;
  539. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP9VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP9VHigh)){
  540. CpNewState = SYSTEM_STATE_B;
  541. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP6VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP6VHigh+CpModuleHysteresis.HysteresisP6VHigh)){
  542. CpNewState = SYSTEM_STATE_C;
  543. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP3VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP3VHigh)){
  544. CpNewState = SYSTEM_STATE_D;
  545. }else if((PositiveAdcSectionAvg<=SpecBoundary.Cp0VLow)&&(PositiveAdcSectionAvg>SpecBoundary.Cp0VHigh)){
  546. #ifdef MODIFY_UNKNOWN_TO_STATE_E
  547. CpNewState = SYSTEM_STATE_E;
  548. #else
  549. CpNewState = SYSTEM_STATE_UNKNOWN;
  550. #endif
  551. #ifdef MODIFY_UNKNOWN_TO_STATE_F
  552. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  553. CpNewState = SYSTEM_STATE_F;
  554. #else
  555. /*}else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  556. CpNewState = SYSTEM_STATE_F; */
  557. #endif
  558. }else{
  559. CpNewState = SYSTEM_STATE_UNKNOWN;
  560. }
  561. break;
  562. case SYSTEM_STATE_C:
  563. if((PositiveAdcSectionAvg<=SpecBoundary.CpP12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP12VHigh)){
  564. CpNewState = SYSTEM_STATE_A;
  565. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP9VLow-CpModuleHysteresis.HysteresisP9VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP9VHigh)){
  566. CpNewState = SYSTEM_STATE_B;
  567. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP6VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP6VHigh)){
  568. CpNewState = SYSTEM_STATE_C;
  569. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP3VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP3VHigh+CpModuleHysteresis.HysteresisP3VHigh)){
  570. CpNewState = SYSTEM_STATE_D;
  571. #ifdef FUNC_CP_VARIABLE_MAX_STATE_COUNTER_C_TO_D_SET_3_FOR_PASS_TERTEC_TEST
  572. MaxStateCounter = 3;
  573. #endif
  574. }else if((PositiveAdcSectionAvg<=SpecBoundary.Cp0VLow)&&(PositiveAdcSectionAvg>SpecBoundary.Cp0VHigh)){
  575. #ifdef MODIFY_UNKNOWN_TO_STATE_E
  576. CpNewState = SYSTEM_STATE_E;
  577. #else
  578. CpNewState = SYSTEM_STATE_UNKNOWN;
  579. #endif
  580. #ifdef MODIFY_UNKNOWN_TO_STATE_F
  581. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  582. CpNewState = SYSTEM_STATE_F;
  583. #else
  584. /*}else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  585. CpNewState = SYSTEM_STATE_F; */
  586. #endif
  587. }else{
  588. CpNewState = SYSTEM_STATE_UNKNOWN;
  589. }
  590. break;
  591. case SYSTEM_STATE_D:
  592. if((PositiveAdcSectionAvg<=SpecBoundary.CpP12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP12VHigh)){
  593. CpNewState = SYSTEM_STATE_A;
  594. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP9VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP9VHigh)){
  595. CpNewState = SYSTEM_STATE_B;
  596. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP6VLow-CpModuleHysteresis.HysteresisP6VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP6VHigh)){
  597. CpNewState = SYSTEM_STATE_C;
  598. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP3VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP3VHigh)){
  599. CpNewState = SYSTEM_STATE_D;
  600. }else if((PositiveAdcSectionAvg<=SpecBoundary.Cp0VLow)&&(PositiveAdcSectionAvg>SpecBoundary.Cp0VHigh+CpModuleHysteresis.Hysteresis0VHigh)){
  601. #ifdef MODIFY_UNKNOWN_TO_STATE_E
  602. CpNewState = SYSTEM_STATE_E;
  603. #else
  604. CpNewState = SYSTEM_STATE_UNKNOWN;
  605. #endif
  606. #ifdef MODIFY_UNKNOWN_TO_STATE_F
  607. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  608. CpNewState = SYSTEM_STATE_F;
  609. #else
  610. /*}else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  611. CpNewState = SYSTEM_STATE_F; */
  612. #endif
  613. }else{
  614. CpNewState = SYSTEM_STATE_UNKNOWN;
  615. }
  616. break;
  617. //------------------------------------------------------------------------------- [ New Added ]
  618. #ifdef MODIFY_UNKNOWN_TO_STATE_E
  619. case SYSTEM_STATE_E:
  620. if((PositiveAdcSectionAvg<=SpecBoundary.CpP12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP12VHigh)){
  621. CpNewState = SYSTEM_STATE_A;
  622. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP9VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP9VHigh)){
  623. CpNewState = SYSTEM_STATE_B;
  624. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP6VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP6VHigh)){
  625. CpNewState = SYSTEM_STATE_C;
  626. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP3VLow-CpModuleHysteresis.HysteresisP3VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP3VHigh)){
  627. CpNewState = SYSTEM_STATE_D;
  628. }else if((PositiveAdcSectionAvg<=SpecBoundary.Cp0VLow)&&(PositiveAdcSectionAvg>SpecBoundary.Cp0VHigh)){
  629. CpNewState = SYSTEM_STATE_E;
  630. #ifdef MODIFY_UNKNOWN_TO_STATE_F
  631. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  632. CpNewState = SYSTEM_STATE_F;
  633. #else
  634. /*}else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  635. CpNewState = SYSTEM_STATE_F; */
  636. #endif
  637. }else{
  638. CpNewState = SYSTEM_STATE_UNKNOWN;
  639. }
  640. break;
  641. #endif //MODIFY_UNKNOWN_TO_STATE_E
  642. //-------------------------------------------------------------------------------
  643. #ifdef MODIFY_STATE_F_HYSTERESIS
  644. case SYSTEM_STATE_F:
  645. if((PositiveAdcSectionAvg<=SpecBoundary.CpP12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP12VHigh)){
  646. CpNewState = SYSTEM_STATE_A;
  647. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP9VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP9VHigh)){
  648. CpNewState = SYSTEM_STATE_B;
  649. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP6VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP6VHigh)){
  650. CpNewState = SYSTEM_STATE_C;
  651. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP3VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP3VHigh)){
  652. CpNewState = SYSTEM_STATE_D;
  653. }else if((PositiveAdcSectionAvg<=SpecBoundary.Cp0VLow)&&(PositiveAdcSectionAvg>SpecBoundary.Cp0VHigh)){
  654. #ifdef MODIFY_UNKNOWN_TO_STATE_E
  655. CpNewState = SYSTEM_STATE_E;
  656. #else
  657. CpNewState = SYSTEM_STATE_UNKNOWN;
  658. #endif
  659. #ifdef MODIFY_UNKNOWN_TO_STATE_F
  660. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  661. CpNewState = SYSTEM_STATE_F;
  662. #else
  663. /*}else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  664. CpNewState = SYSTEM_STATE_F; */
  665. #endif
  666. }else{
  667. CpNewState = SYSTEM_STATE_UNKNOWN;
  668. }
  669. break;
  670. #else //MODIFY_STATE_F_HYSTERESIS
  671. case SYSTEM_STATE_F:
  672. if((PositiveAdcSectionAvg<=SpecBoundary.CpP12VLow-CpModuleHysteresis.HysteresisP12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP12VHigh+CpModuleHysteresis.HysteresisP12VHigh)){
  673. CpNewState = SYSTEM_STATE_A;
  674. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP9VLow-CpModuleHysteresis.HysteresisP9VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP9VHigh+CpModuleHysteresis.HysteresisP9VHigh)){
  675. CpNewState = SYSTEM_STATE_B;
  676. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP6VLow-CpModuleHysteresis.HysteresisP6VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP6VHigh+CpModuleHysteresis.HysteresisP6VHigh)){
  677. CpNewState = SYSTEM_STATE_C;
  678. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP3VLow-CpModuleHysteresis.HysteresisP3VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP3VHigh+CpModuleHysteresis.HysteresisP3VHigh)){
  679. CpNewState = SYSTEM_STATE_D;
  680. }else if((PositiveAdcSectionAvg<=SpecBoundary.Cp0VLow-CpModuleHysteresis.Hysteresis0VLow)&&(PositiveAdcSectionAvg>SpecBoundary.Cp0VHigh+CpModuleHysteresis.Hysteresis0VHigh)){
  681. #ifdef MODIFY_UNKNOWN_TO_STATE_E
  682. CpNewState = SYSTEM_STATE_E;
  683. #else
  684. CpNewState = SYSTEM_STATE_UNKNOWN;
  685. #endif
  686. #ifdef MODIFY_UNKNOWN_TO_STATE_F
  687. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  688. CpNewState = SYSTEM_STATE_F;
  689. #else
  690. /*}else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  691. CpNewState = SYSTEM_STATE_F; */
  692. #endif
  693. }else{
  694. CpNewState = SYSTEM_STATE_UNKNOWN;
  695. }
  696. break;
  697. #endif //MODIFY_STATE_F_HYSTERESIS
  698. #ifdef MODIFY_STATE_UNKNOWN_HYSTERESIS
  699. case SYSTEM_STATE_UNKNOWN:
  700. if((PositiveAdcSectionAvg<=SpecBoundary.CpP12VLow-CpModuleHysteresis.HysteresisP12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP12VHigh+CpModuleHysteresis.HysteresisP12VHigh)){
  701. CpNewState = SYSTEM_STATE_A;
  702. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP9VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP9VHigh)){
  703. CpNewState = SYSTEM_STATE_B;
  704. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP6VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP6VHigh)){
  705. CpNewState = SYSTEM_STATE_C;
  706. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP3VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP3VHigh)){
  707. CpNewState = SYSTEM_STATE_D;
  708. }else if((PositiveAdcSectionAvg<=SpecBoundary.Cp0VLow-CpModuleHysteresis.Hysteresis0VLow)&&(PositiveAdcSectionAvg>SpecBoundary.Cp0VHigh+CpModuleHysteresis.Hysteresis0VHigh)){
  709. #ifdef MODIFY_UNKNOWN_TO_STATE_E
  710. CpNewState = SYSTEM_STATE_E;
  711. #else
  712. CpNewState = SYSTEM_STATE_UNKNOWN;
  713. #endif
  714. #ifdef MODIFY_UNKNOWN_TO_STATE_F
  715. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  716. CpNewState = SYSTEM_STATE_F;
  717. #else
  718. /*}else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  719. CpNewState = SYSTEM_STATE_F; */
  720. #endif
  721. }else{
  722. CpNewState = SYSTEM_STATE_UNKNOWN;
  723. }
  724. break;
  725. #else //MODIFY_STATE_UNKNOWN_HYSTERESIS
  726. case SYSTEM_STATE_UNKNOWN:
  727. if((PositiveAdcSectionAvg<=SpecBoundary.CpP12VLow-CpModuleHysteresis.HysteresisP12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP12VHigh+CpModuleHysteresis.HysteresisP12VHigh)){
  728. CpNewState = SYSTEM_STATE_A;
  729. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP9VLow-CpModuleHysteresis.HysteresisP9VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP9VHigh+CpModuleHysteresis.HysteresisP9VHigh)){
  730. CpNewState = SYSTEM_STATE_B;
  731. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP6VLow-CpModuleHysteresis.HysteresisP6VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP6VHigh+CpModuleHysteresis.HysteresisP6VHigh)){
  732. CpNewState = SYSTEM_STATE_C;
  733. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpP3VLow-CpModuleHysteresis.HysteresisP3VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpP3VHigh+CpModuleHysteresis.HysteresisP3VHigh)){
  734. CpNewState = SYSTEM_STATE_D;
  735. }else if((PositiveAdcSectionAvg<=SpecBoundary.Cp0VLow-CpModuleHysteresis.Hysteresis0VLow)&&(PositiveAdcSectionAvg>SpecBoundary.Cp0VHigh+CpModuleHysteresis.Hysteresis0VHigh)){
  736. #ifdef MODIFY_UNKNOWN_TO_STATE_E
  737. CpNewState = SYSTEM_STATE_E;
  738. #else
  739. CpNewState = SYSTEM_STATE_UNKNOWN;
  740. #endif
  741. #ifdef MODIFY_UNKNOWN_TO_STATE_F
  742. }else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  743. CpNewState = SYSTEM_STATE_F;
  744. #else
  745. /*}else if((PositiveAdcSectionAvg<=SpecBoundary.CpN12VLow)&&(PositiveAdcSectionAvg>SpecBoundary.CpN12VHigh)){
  746. CpNewState = SYSTEM_STATE_F; */
  747. #endif
  748. }else{
  749. CpNewState = SYSTEM_STATE_UNKNOWN;
  750. }
  751. break;
  752. #endif //MODIFY_STATE_UNKNOWN_HYSTERESIS
  753. #ifndef MODIFY_UNKNOWN_TO_STATE_E
  754. case SYSTEM_STATE_E:
  755. #endif
  756. default:
  757. break;
  758. }
  759. }
  760. else
  761. {
  762. #ifdef MODIFY_CP_STATE_F_SAMPLE_NUM_THRESHOLD
  763. if(ClassifyIndex[6] >= CP_STATE_F_SAMPLE_NUM_THRESHOLD)
  764. #else
  765. //if(ClassifyIndex[6]>=998)
  766. #endif
  767. {
  768. CpNewState = SYSTEM_STATE_F;
  769. }
  770. else
  771. {
  772. CpNewState = SYSTEM_STATE_UNKNOWN;
  773. }
  774. }
  775. #ifdef FUNC_GET_TRIP_TIME
  776. if (CpPreviousState == SYSTEM_STATE_C && CpNewState != SYSTEM_STATE_C)
  777. {
  778. Charger.m_TripBeg = HAL_GetTick();
  779. Charger.m_TripEnd = HTK_U32_MAX;
  780. }
  781. #endif
  782. //new state filter
  783. if(CpNewState == CpPreviousState){
  784. CpNewStateCounter++;
  785. #ifdef FUNC_CP_VARIABLE_MAX_STATE_COUNTER
  786. if(CpNewStateCounter >= MaxStateCounter)
  787. #else
  788. if(CpNewStateCounter >= MAX_STATE_COUNTER)
  789. #endif
  790. {
  791. result->State = CpNewState;
  792. CpNewStateCounter = 0;
  793. }
  794. }else{
  795. CpNewStateCounter = 0;
  796. }
  797. CpPreviousState = CpNewState;
  798. #ifdef TRACE_CP
  799. TRACE_CP_Print_CPModuleResult(result, true, EQ_Sum, EQ_NG1, EQ_NG2);
  800. #endif
  801. }
  802. #ifdef TRACE_CP
  803. else
  804. {
  805. TRACE_CP_Print_CPModuleResult(result, false, EQ_Sum, EQ_NG1, EQ_NG2);
  806. }
  807. #endif
  808. }
  809. /* USER CODE END 0 */