user_heater.c 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. #include "onechip_include_header.h"
  2. #define HEATER_NEED_PREHEAT 37.0
  3. #define HEATER_MIN_TEMP 15.0
  4. #define HEATER_MAX_TEMP 95.0
  5. #define HEATER_MIN_ERROR_TEMP 5.0
  6. #define HEATER_MAX_ERROR_TEMP 115.0
  7. uint32_t get_heater_master_st(float *temp,unsigned int *st) {
  8. *temp = sysinf.heaterMaster.pid.realtemp + sysinf.heaterMaster.offset;
  9. *st = sysinf.heaterMaster.HeatState;
  10. return 0;
  11. }
  12. uint32_t get_heater_slave_st(float *temp,unsigned int *st) {
  13. *temp = sysinf.heaterSlave.pid.realtemp + sysinf.heaterSlave.offset;
  14. *st = sysinf.heaterSlave.HeatState;
  15. return 0;
  16. }
  17. uint32_t check_heater_master_needPreheat(void) {
  18. float temp = getADC_Chanel_value(0);
  19. sysinf.heaterMaster.pid.realtemp = temp + sysinf.heaterMaster.offset;
  20. if(sysinf.heaterMaster.pid.realtemp < HEATER_NEED_PREHEAT){
  21. sysinf.heaterMaster.needpreheat = 1;
  22. sysinf.heaterMaster.HeatState = SysPreHeatUP;
  23. sysinf.heaterMaster.stabletime = 0;
  24. }else{
  25. sysinf.heaterMaster.needpreheat = 0;
  26. sysinf.heaterMaster.HeatState = SystemPreHeat;
  27. }
  28. return 0;
  29. }
  30. void updatParm_heater_master(void) {
  31. sysinf.heaterMaster.PreHeatTime = sysinf.PreHeatTime;
  32. sysinf.heaterMaster.HoldTemp = sysinf.holdTemp;
  33. sysinf.heaterMaster.readyTemp = sysinf.readyTemp;
  34. sysinf.heaterMaster.PresetTempVal = sysinf.PresetTempVal;
  35. sysinf.heaterMaster.PresetTempTime = sysinf.PresetTempTime*10;
  36. sysinf.heaterMaster.adJTarget = sysinf.adJTarget;
  37. sysinf.heaterMaster.SetTempVal = sysinf.SetTempVal;
  38. sysinf.heaterMaster.pid.Kp = sysinf.amplif_Kp;
  39. sysinf.heaterMaster.pid.Ki = sysinf.amplif_Ki ;
  40. sysinf.heaterMaster.pid.Kd = sysinf.amplif_Kd;
  41. }
  42. void heater_work(heat_ctrl_def *heater)
  43. {
  44. if(heater->needpreheat){
  45. heater->stabletime ++;
  46. if(heater->stabletime > heater->PreHeatTime * 600){
  47. /*提前预热阶段完成,进入正式控温流程*/
  48. sysinf.heaterMaster.needpreheat = 0;
  49. sysinf.heaterMaster.HeatState = SystemPreHeat;
  50. sysinf.heaterMaster.stabletime = 0;
  51. }
  52. }
  53. if((heater->pid.realtemp < HEATER_MIN_ERROR_TEMP) || (heater->pid.realtemp > HEATER_MAX_ERROR_TEMP)){
  54. /*稍后添加*/
  55. com_pwm_Set(heater->pwdId,0);
  56. heater->HeatState = SysERRORHeat;
  57. error_set(ERROR_HEAT_SELF_CHECK);
  58. updateAmplifState(SYS_STATE_ERROR_HW);
  59. return;
  60. }
  61. if((heater->pid.realtemp < HEATER_MIN_TEMP) || (heater->pid.realtemp > HEATER_MAX_TEMP)){
  62. /*稍后添加*/
  63. com_pwm_Set(heater->pwdId,0);
  64. heater->HeatState = SystemPreHeat;
  65. return;
  66. }
  67. heater->timenum ++;
  68. switch (heater->HeatState)
  69. {
  70. case SystemCheckHeat:{
  71. if(heater->firstIn == 0){
  72. com_pwm_Set(heater->pwdId,100);
  73. heater->timenum = 0;
  74. heater->lastTemp = heater->pid.realtemp;
  75. heater->firstIn = 1;
  76. }
  77. if((heater->pid.realtemp > 70) || ((heater->pid.realtemp - heater->lastTemp) > 0.2)){
  78. check_heater_master_needPreheat();
  79. } else if (heater->timenum > 60) {
  80. error_set(ERROR_HEAT_TIMEOUT);
  81. updateAmplifState(SYS_STATE_ERROR_HW);
  82. Van_Device_Printf(VAN_LOG_ERROR, "HEAT_TIMEOUT at:%d\n\r",__LINE__);
  83. heater->HeatState = SysERRORHeat;
  84. }
  85. }
  86. break;
  87. case SystemPreHeat:{
  88. heater->pid.goal = heater->HoldTemp;
  89. if(heater->pid.realtemp - heater->HoldTemp > 0.6){
  90. com_pwm_Set(heater->pwdId,0);
  91. heater->pid.integral = 0;
  92. heater->timenum = 0;
  93. }else{
  94. PIDRealize(&heater->pid);
  95. com_pwm_Set(heater->pwdId,heater->pid.variate);
  96. // if(heater->timenum>=60*100)//system led turn red while the temperature could not heat up to PresetTemp over 10min
  97. // {
  98. // if((heater->pid.realtemp<heater->HoldTemp))
  99. // {
  100. // com_pwm_Set(heater->pwdId,0);
  101. // /*TODO 加热模块故障*/
  102. // error_set(ERROR_HEAT_TIMEOUT);
  103. // updateAmplifState(SYS_STATE_ERROR_HW);
  104. // Van_Device_Printf(VAN_LOG_ERROR, "HEAT_TIMEOUT at:%d\n\r",__LINE__);
  105. // heater->HeatState = SysERRORHeat;
  106. // return;
  107. // }
  108. // }
  109. }
  110. //稳定条件,大于待机温度-0.5度,并且小于就绪温度
  111. if(heater->pid.realtemp > ( heater->HoldTemp - 0.5) && heater->pid.realtemp < heater->readyTemp)
  112. {
  113. if(heater->stabletime++ > 10)
  114. {
  115. heater->temp_stable_sta = 1;
  116. heater->HeatState = SystemIdle;
  117. }
  118. }
  119. else
  120. {
  121. heater->temp_stable_sta = 0;
  122. heater->stabletime = 0;
  123. }
  124. }break;
  125. case SystemIdle:{
  126. PIDRealize(&heater->pid);
  127. com_pwm_Set(heater->pwdId,heater->pid.variate);
  128. }break;
  129. case SysPreHeatUP: {
  130. com_pwm_Set(heater->pwdId,100);
  131. if((heater->pid.realtemp>=(heater->PresetTempVal-1)))
  132. {
  133. heater->timenum=0;
  134. heater->HeatState=SysPreKepTemp;
  135. heater->pid.integral = 0;
  136. heater->pid.goal = heater->PresetTempVal;
  137. }
  138. if(heater->timenum>=60*100)//system led turn red while the temperature could not heat up to PresetTemp over 10min
  139. {
  140. if((heater->pid.realtemp<heater->PresetTempVal))
  141. {
  142. /*TODO 加热模块故障*/
  143. com_pwm_Set(heater->pwdId,0);
  144. Van_Device_Printf(VAN_LOG_ERROR, "HEAT_TIMEOUT at:%d\n\r",__LINE__);
  145. error_set(ERROR_HEAT_TIMEOUT);
  146. updateAmplifState(SYS_STATE_ERROR_HW);
  147. heater->HeatState = SysERRORHeat;
  148. return;
  149. }
  150. }
  151. }
  152. break;
  153. case SysPreKepTemp:{
  154. PIDRealize(&heater->pid);
  155. com_pwm_Set(heater->pwdId,heater->pid.variate);
  156. if(heater->timenum>=heater->PresetTempTime)//time of duration while initial segment constant temperature stage,timenum*1S
  157. {
  158. heater->timenum=0;
  159. heater->HeatState=SysPreCoolDown;
  160. com_pwm_Set(heater->pwdId,0);
  161. }
  162. }
  163. break;
  164. case SysPreCoolDown: {
  165. if(heater->pid.realtemp<=(heater->SetTempVal-1))
  166. {
  167. heater->HeatState=SysPreConTemp;
  168. heater->overtempnum = 0;
  169. heater->timenum=0;
  170. if(sysinf.cabinTem < ENV_ADJ_THRESHOLD){
  171. heater->targetAfterAdj = heater->adJTarget + heater->SetTempVal;
  172. }else{
  173. heater->targetAfterAdj =heater->SetTempVal;
  174. }
  175. heater->pid.integral = 0;
  176. heater->pid.goal = heater->targetAfterAdj ;
  177. }
  178. heater->stabletime = 0;
  179. }
  180. break;
  181. case SysPreConTemp:{
  182. PIDRealize(&heater->pid);
  183. com_pwm_Set(heater->pwdId,heater->pid.variate);
  184. if(heater->timenum>=20)
  185. {
  186. /*system report error while the difference of the temperature over 5℃ 3times*/
  187. if(fabs(heater->pid.realtemp-heater->SetTempVal)>5)
  188. {
  189. heater->overtempnum++;
  190. if(heater->overtempnum>=3)
  191. {
  192. com_pwm_Set(heater->pwdId,0);
  193. error_set(ERROR_HEAT_TIMEOUT);
  194. updateAmplifState(SYS_STATE_ERROR_HW);
  195. Van_Device_Printf(VAN_LOG_ERROR, "HEAT_TIMEOUT at:%d\n\r",__LINE__);
  196. heater->HeatState = SysERRORHeat;
  197. return;
  198. }
  199. else
  200. {
  201. heater->overtempnum = 0;
  202. }
  203. }
  204. else if(fabs(heater->pid.realtemp- (heater->targetAfterAdj))<=0.5)
  205. {
  206. if(heater->stabletime++ >10)
  207. {
  208. heater->temp_stable_sta = 2; //二次加热稳定
  209. }
  210. }
  211. else{
  212. heater->stabletime = 0;
  213. }
  214. }
  215. }
  216. break;
  217. default:
  218. break;
  219. }
  220. }