user_heater.c 9.9 KB

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