Interrupt.c 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283
  1. /********************************************************************************
  2. **** Copyright (C), 2018, Fortior Technology Co., Ltd. ****
  3. ********************************************************************************
  4. File Name : Interrupt.c
  5. Author : Bruce HW&RD
  6. Date : 2018-12-27
  7. Description : .C file function description
  8. Version : 1.0
  9. Function List :
  10. Record :
  11. 1.Date : 2018-12-27
  12. Author : Bruce HW&RD
  13. Modification: Created file
  14. ********************************************************************************/
  15. #include "FU68xx_5.h"
  16. #include <Myproject.h>
  17. void LVW_TSD_INT(void) interrupt 0 //LVW & TSD interrupt
  18. {
  19. if (ReadBit(LVSR, LVWIF))
  20. {
  21. if (ReadBit(LVSR, LVWF))
  22. {
  23. FaultProcess();
  24. ClrBit(LVSR, LVWF);
  25. }
  26. ClrBit(LVSR, LVWIF);
  27. }
  28. if (TSDIF)
  29. {
  30. TSDIF = 0;
  31. }
  32. }
  33. /* -------------------------------------------------------------------------------------------------
  34. Function Name : void FO_INT(void)
  35. Description : FO_INT interrupt,硬件FO过流保护,关断输出,中断优先级最高
  36. Input : 无
  37. Output : 无
  38. -------------------------------------------------------------------------------------------------*/
  39. void FO_INT(void) interrupt 1 // 硬件FO过流中断,关闭输出
  40. {
  41. if (IF0)
  42. {
  43. FaultProcess(); // 关闭输出
  44. mcFaultSource = FaultHardOVCurrent; // 硬件过流保护
  45. IF0 = 0; // clear P00 interrupt flag
  46. }
  47. }
  48. /* -------------------------------------------------------------------------------------------------
  49. Function Name : EXTERN_INT1
  50. Description : interrupt1
  51. Input : 无
  52. Output : 无
  53. -------------------------------------------------------------------------------------------------*/
  54. void EXTERN_INT1(void) interrupt 2
  55. {
  56. if (ReadBit(P1_IF, P12))
  57. {
  58. ClrBit(P1_IF, P12);
  59. }
  60. }
  61. /* -------------------------------------------------------------------------------------------------
  62. Function Name : void CMP3_INT(void)
  63. Description : CMP3:硬件比较器过流保护,关断输出,中断优先级最高
  64. Input : 无
  65. Output : 无
  66. -------------------------------------------------------------------------------------------------*/
  67. void CMP3_INT(void) interrupt 12
  68. {
  69. if (ReadBit(CMP_SR, CMP3IF))
  70. {
  71. FaultProcess(); // 关闭输出
  72. mcFaultSource = FaultHardOVCurrent; // 硬件过流保护
  73. ClrBit(CMP_SR, CMP3IF);
  74. }
  75. }
  76. /*---------------------------------------------------------------------------*/
  77. /* Name : void DRV_ISR(void) interrupt 3
  78. /* Input : NO
  79. /* Output : NO
  80. /* Description: FOC中断(Drv中断),每个载波周期执行一次,用于处理响应较高的程序,中断优先级第二。DCEN开了就会产生中断。
  81. /*---------------------------------------------------------------------------*/
  82. void DRV_ISR(void) interrupt 3
  83. {
  84. if (ReadBit(DRV_SR, DCIF)) // 比较中断
  85. {
  86. SetBit(ADC_CR, ADCBSY); // 使能ADC的DCBUS采样
  87. dog_Status |= 0x01;
  88. Fault_Overcurrent(); //软件过流保护
  89. // UdcMax_Min(); //udc最大值最小值获取
  90. #if (FiledWeakenCompEnable)
  91. {
  92. FiledWeakenControl(FOC__UD, FOC__UQ, udc.WeakenUsRef, mcFocCtrl.IsRef);
  93. if (mcFieldWeaken.mcIdref < ID_Limit)
  94. {mcFieldWeaken.mcIdref = ID_Limit;}
  95. mcFocCtrl.IdRef = mcFieldWeaken.mcIdref;
  96. mcFocCtrl.IqRef = mcFieldWeaken.mcIqref;
  97. }
  98. #else
  99. {
  100. mcFocCtrl.IqRef = mcFocCtrl.IsRef;
  101. mcFocCtrl.IdRef = 0;
  102. }
  103. #endif
  104. ID_IQ_Control(); //dq轴电流赋值
  105. #if (VoltageCompensationEn==1)
  106. VoltageCompensation();//电压补偿
  107. #endif
  108. #if (Debugg==1)
  109. {
  110. Trace_Select_read();
  111. PC_MONITOR_PWM(); //工具
  112. }
  113. #else
  114. {
  115. trace1();
  116. }
  117. #endif
  118. DRV_SR = (DRV_SR | SYSTIF) & (~DCIF);
  119. }
  120. }
  121. /*---------------------------------------------------------------------------*/
  122. /* Name : void TIM4S_INT(void) interrupt 10
  123. /* Input : NO
  124. /* Output : NO
  125. /* Description: 1ms定时器中断(SYS TICK中断),用于处理附加功能,如控制环路响应、各种保护等。中断优先级低于FO中断和FOC中断。
  126. /*---------------------------------------------------------------------------*/
  127. void SYStick_INT(void) interrupt 10
  128. {
  129. if (ReadBit(DRV_SR, SYSTIF)) // SYS TICK中断
  130. {
  131. dog_Status |= 0x02;
  132. flag_1ms_main = 1;
  133. /****速度滤波、反电动势滤波*****/
  134. if ( (mcState == mcStart) || (mcState == mcRun) || (mcState == mcStop))
  135. {
  136. mcFocCtrl.SpeedFlt = LPF_realize(FOC__EOME, mcFocCtrl.SpeedFlt, LPF_K(71.0)); //LPF_K(30.0)
  137. mcFocCtrl.UDFlt = LPF_realize(FOC__UD, mcFocCtrl.UDFlt, LPF_K(30.0)); //LPF_K(30.0)
  138. mcFocCtrl.UQFlt = LPF_realize(FOC__UQ, mcFocCtrl.UQFlt, LPF_K(30.0)); //LPF_K(30.0)
  139. }
  140. else
  141. {
  142. mcFocCtrl.SpeedFlt = 0;
  143. }
  144. Speed_response(); //压机环路响应,速度环
  145. Fault_Detection(); //故障保护函数功能
  146. // PFC_timer1ms(); //pfc控制1ms中断
  147. User_Dri_timer1ms(); //user控制1ms中断
  148. IsLimit_Over_tect(); //限流处理
  149. LED_Display(); //LED灯故障显示
  150. #if (Debugg==1)
  151. {
  152. PC_MONITOR_1MS(); //工具
  153. CMDMONI_WT_SENDCMD();
  154. }
  155. #endif
  156. /*串口相关*/
  157. if (Uart.ResponseFlag == 1)
  158. {
  159. Uart.send_delay_time++;
  160. }
  161. if (mcFocCtrl.mcAcbustime < 30000)
  162. {
  163. mcFocCtrl.mcAcbustime++;
  164. }
  165. if (Uart.time_cnt < 20000)
  166. {
  167. Uart.time_cnt++;
  168. }
  169. if (Uart.time_shuju < 30000)
  170. {
  171. Uart.time_shuju++;
  172. }
  173. if (mcFocCtrl.State_Count > 0)
  174. {
  175. mcFocCtrl.State_Count--;
  176. }
  177. if (Time.PowerOnCnt < 60000)
  178. {
  179. Time.PowerOnCnt++;
  180. }
  181. if (mcFaultDect.commu_time < 60000)
  182. {
  183. mcFaultDect.commu_time++;
  184. }
  185. if (Uartwatch.uarttimejishu <= 250)
  186. {
  187. Uartwatch.uarttimejishu++;
  188. }
  189. StarRampDealwith();/*****电机启动爬坡函数处理*****/
  190. DRV_SR = (DRV_SR | DCIF) & (~SYSTIF);// 清零标志位
  191. }
  192. }
  193. /*---------------------------------------------------------------------------*/
  194. /* Name : void USART_INT(void) interrupt 12
  195. /* Input : NO
  196. /* Output : NO
  197. /* Description: 串口中断,中断优先级最低,用于接收调速信号,无中断插入时8us
  198. /*---------------------------------------------------------------------------*/
  199. void USART_INT(void) interrupt 14
  200. {
  201. // 睡眠模式下,再次接收到串口通讯信号,从待机模式中唤醒
  202. if (UT2RI == 1)
  203. {
  204. UT2RI = 0;
  205. Uart.uarttimejishu = 0;
  206. if (Uart.Recive_Flag == 0)
  207. {
  208. UartRecive1();
  209. }
  210. }
  211. if (UT2TI == 1)
  212. {
  213. UT2TI = 0;
  214. UartSend1();
  215. }
  216. }
  217. /*工具串口*/
  218. uint8 fasong = 0;
  219. extern uint8 txbuff;
  220. void USART_INT1(void) interrupt 13
  221. {
  222. #if (Debugg==1)
  223. {
  224. if (TI == 1)
  225. {
  226. TI = 0;
  227. fasong = 0;
  228. }
  229. }
  230. #endif
  231. if (RI == 1)
  232. {
  233. RI = 0;
  234. #if (Debugg==1)
  235. {
  236. PC_MONITOR_INTR();
  237. }
  238. #else
  239. {
  240. UART1RCE();
  241. }
  242. #endif
  243. }
  244. }