board.c 9.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. #include <math.h>
  2. #include "board.h"
  3. #include "isr.h"
  4. #include "board_config.h"
  5. #include "api_rt.h"
  6. double BoardSampleTime = 1e-6;
  7. double BoardSampleRate = 1000000;
  8. int BoardSampleTimeFactor = 72;
  9. void AppInit();
  10. void AppLoop();
  11. /* 变量观测与控制参数Buffer */
  12. double WatchBuffer[16];
  13. double ControlBuffer[4];
  14. /* 中断与时间片函数定义 */
  15. void BackgroundTask(void *p);
  16. /* 虚拟MCU初始化 */
  17. void BoardInit(double ts)
  18. {
  19. BoardSampleTime = ts;
  20. BoardSampleRate = 1 / ts;
  21. BoardSampleTimeFactor = (int)(HW_TIM_CLOCK_HZ / BoardSampleRate);
  22. /* 调度器初始化 */
  23. Sim_SchedulerInit(&scheduler);
  24. /* 外设初始化 */
  25. Sim_PwmInit(&pwm);
  26. Sim_AdcInit(&adc);
  27. Sim_AdcInit(&adc2);
  28. Sim_AdcInit(&adc3);
  29. Sim_GpioInit(&ledPin);
  30. Sim_GpioInit(&capPin);
  31. Sim_GpioInit(&switchHallA);
  32. Sim_GpioInit(&switchHallB);
  33. Sim_GpioInit(&switchHallC);
  34. Sim_GpioInit(&breakPin);
  35. Sim_GpioInit(&bikeBrakePin);
  36. Sim_TimerInit(&sysTick);
  37. Sim_TimerInit(&tbsTick);
  38. Sim_TimerInit(&tbcHalfUpdateTick);
  39. Sim_TimerInit(&event1MsTick);
  40. Sim_TimerInit(&sampleTrigTimer);
  41. Sim_TimerInit(&sampleTrigTimer2);
  42. Sim_DMAInit(&pwmLoadDma);
  43. Sim_CaptureInit(&cadenceCap);
  44. Sim_CaptureInit(&bikeSpdCap);
  45. Sim_CaptureInit(&switchhalCap);
  46. /* 调度器外设注册 */
  47. scheduler.Register(&scheduler, &pwm.Base);
  48. scheduler.Register(&scheduler, &adc.Base);
  49. scheduler.Register(&scheduler, &adc2.Base);
  50. scheduler.Register(&scheduler, &adc3.Base);
  51. scheduler.Register(&scheduler, &ledPin.Base);
  52. scheduler.Register(&scheduler, &capPin.Base);
  53. scheduler.Register(&scheduler, &switchHallA.Base);
  54. scheduler.Register(&scheduler, &switchHallB.Base);
  55. scheduler.Register(&scheduler, &switchHallC.Base);
  56. scheduler.Register(&scheduler, &breakPin.Base);
  57. scheduler.Register(&scheduler, &bikeBrakePin.Base);
  58. scheduler.Register(&scheduler, &sysTick.Base);
  59. scheduler.Register(&scheduler, &tbsTick.Base);
  60. scheduler.Register(&scheduler, &tbcHalfUpdateTick.Base);
  61. scheduler.Register(&scheduler, &event1MsTick.Base);
  62. scheduler.Register(&scheduler, &sampleTrigTimer.Base);
  63. scheduler.Register(&scheduler, &sampleTrigTimer2.Base);
  64. scheduler.Register(&scheduler, &pwmLoadDma.Base);
  65. scheduler.Register(&scheduler, &cadenceCap.Base);
  66. scheduler.Register(&scheduler, &bikeSpdCap.Base);
  67. scheduler.Register(&scheduler, &switchhalCap.Base);
  68. /* Pwm配置 */
  69. pwm.CntMode = SIM_PWM_UP_DOWN;
  70. pwm.PwmMode[0] = SIM_PWM_PWMMODE2;
  71. pwm.PwmMode[1] = SIM_PWM_PWMMODE2;
  72. pwm.PwmMode[2] = SIM_PWM_PWMMODE2;
  73. pwm.OCPolarity[0] = SIM_PWM_POLARITY_HIGH;
  74. pwm.OCPolarity[1] = SIM_PWM_POLARITY_HIGH;
  75. pwm.OCPolarity[2] = SIM_PWM_POLARITY_HIGH;
  76. pwm.OCPolarity[3] = SIM_PWM_POLARITY_HIGH;
  77. pwm.OCPolarity[4] = SIM_PWM_POLARITY_HIGH;
  78. pwm.OCPolarity[5] = SIM_PWM_POLARITY_HIGH;
  79. pwm.CmpPreloadEnable[0] = 0;
  80. pwm.CmpPreloadEnable[1] = 0;
  81. pwm.CmpPreloadEnable[2] = 0;
  82. pwm.PeriodPreloadEnable = 1;
  83. pwm.TotalCntNumInput = TICK_TRANS(HW_INIT_HPWM_PERIOD);
  84. pwm.TotalCntNumCurrent = TICK_TRANS(HW_INIT_HPWM_PERIOD);
  85. pwm.CmpValueCurrent[0] = TICK_TRANS(HW_INIT_HHPWM_PERIOD);
  86. pwm.CmpValueCurrent[1] = TICK_TRANS(HW_INIT_HHPWM_PERIOD);
  87. pwm.CmpValueCurrent[2] = TICK_TRANS(HW_INIT_HHPWM_PERIOD);
  88. pwm.CmpValueInput[0] = TICK_TRANS(HW_INIT_HHPWM_PERIOD);
  89. pwm.CmpValueInput[1] = TICK_TRANS(HW_INIT_HHPWM_PERIOD);
  90. pwm.CmpValueInput[2] = TICK_TRANS(HW_INIT_HHPWM_PERIOD);
  91. pwm.TotalDeadNum = TICK_TRANS(HW_DEADBAND_TIME);
  92. pwm.BridgeOffFlag[0] = 0;
  93. pwm.BridgeOffFlag[1] = 0;
  94. pwm.BridgeOffFlag[2] = 0;
  95. // scheduler.TriggerBind(&scheduler, &pwm.Base, PwmTriggerOutUpdate, &adc.Base, AdcTriggerInSample);
  96. /* Pwm Break触发 */
  97. breakPin.Mode = GPIO_MODE_IN;
  98. breakPin.EdgeType = GpioRisingEdge;
  99. scheduler.TriggerBind(&scheduler, &breakPin.Base, GpioMainTrigger, &pwm.Base, PwmTriggerInBreak);
  100. /* Bike Brake IO配置 */
  101. bikeBrakePin.Mode = GPIO_MODE_IN;
  102. /* 采样触发定时器配置 */
  103. sampleTrigTimer.CountMode = TimerCenterAlignedMode1;
  104. sampleTrigTimer.CountDir = TimerCountUp;
  105. sampleTrigTimer.PreloadEnable = 1;
  106. sampleTrigTimer.CountReloadInput = TICK_TRANS(HW_INIT_HPWM_PERIOD * 2);
  107. sampleTrigTimer._CountReloadValue = TICK_TRANS(HW_INIT_HPWM_PERIOD * 2);
  108. sampleTrigTimer.ComparePreloadEnable = 0;
  109. sampleTrigTimer._CompareValue = TICK_TRANS(HW_SAMPLE_BEFORE_UPDATE_CNTS);
  110. sampleTrigTimer.CompareReloadInput = TICK_TRANS(HW_SAMPLE_BEFORE_UPDATE_CNTS);
  111. scheduler.TriggerBind(&scheduler, &sampleTrigTimer.Base, TimerTriggerOutCCIF, &adc.Base, AdcTriggerInSample);
  112. /* 采样触发定时器配置2 */
  113. sampleTrigTimer2.CountMode = TimerCenterAlignedMode2;
  114. sampleTrigTimer2.CountDir = TimerCountUp;
  115. sampleTrigTimer2.PreloadEnable = 1;
  116. sampleTrigTimer2.CountReloadInput = TICK_TRANS(HW_INIT_HPWM_PERIOD);
  117. sampleTrigTimer2._CountReloadValue = TICK_TRANS(HW_INIT_HPWM_PERIOD);
  118. sampleTrigTimer2.ComparePreloadEnable = 0;
  119. sampleTrigTimer2._CompareValue = TICK_TRANS(HW_SAMPLE_BEFORE_UPDATE_CNTS);
  120. sampleTrigTimer2.CompareReloadInput = TICK_TRANS(HW_SAMPLE_BEFORE_UPDATE_CNTS);
  121. scheduler.TriggerBind(&scheduler, &sampleTrigTimer2.Base, TimerTriggerOutCCIF, &adc2.Base, AdcTriggerInSample);
  122. // sampleTrigTimer2.Base.Enable = 0;
  123. /* 采样触发定时器配置3 */
  124. //scheduler.TriggerBind(&scheduler, &sampleTrigTimer2.Base, TimerTriggerOutCCIF, &adc3.Base, AdcTriggerInSample);
  125. /* Tbc半更新定时器配置 */
  126. tbcHalfUpdateTick.CountMode = TimerEdgeAlignedMode;
  127. tbcHalfUpdateTick.CountDir = TimerCountUp;
  128. tbcHalfUpdateTick.PreloadEnable = 0;
  129. tbcHalfUpdateTick.CountReloadInput = TICK_TRANS(HW_INIT_PWM_PERIOD - 1);
  130. /* Tbs定时器配置 */
  131. tbsTick.CountMode = TimerEdgeAlignedMode;
  132. tbsTick.CountDir = TimerCountUp;
  133. tbsTick.PreloadEnable = 0;
  134. tbsTick.CountReloadInput = TICK_TRANS(HW_TIM_CLOCK_HZ / HW_INIT_FTBS_HZ - 1);
  135. tbsTick.UpdateInterruptEnable = 1;
  136. //scheduler.InterruptBind(&scheduler, &tbsTick.Base, TimerInterruptOutUIF, TbsTimerIsr);
  137. /* Event1Ms定时器配置 */
  138. event1MsTick.CountMode = TimerEdgeAlignedMode;
  139. event1MsTick.CountDir = TimerCountUp;
  140. event1MsTick.PreloadEnable = 0;
  141. event1MsTick.CountReloadInput = TICK_TRANS(HW_TIM_CLOCK_HZ / 1000 - 1);
  142. event1MsTick.UpdateInterruptEnable = 1;
  143. /* SysTick定时器配置 */
  144. sysTick.CountMode = TimerEdgeAlignedMode;
  145. sysTick.CountDir = TimerCountDown;
  146. sysTick.PreloadEnable = 0;
  147. sysTick.UpdateInterruptEnable = 1;
  148. sysTick.CountReloadInput = TICK_TRANS(HW_TIM_CLOCK_HZ / 1000);
  149. //scheduler.InterruptBind(&scheduler, &sysTick.Base, TimerInterruptOutUIF, SystickIsr);
  150. /* Capture配置 */
  151. cadenceCap.CountMax = TICK_TRANS(HW_TIM_CLOCK_HZ / 100 / HW_CAP_TIM_HZ);
  152. cadenceCap.CounterInterruptEnable = 1;
  153. cadenceCap.Channel[2].Edge = CaptureRisingFallingEdge;
  154. cadenceCap.Channel[2].Enable = 1;
  155. cadenceCap.Channel[2].InterruptEnable = 1;
  156. bikeSpdCap.CountMax = TICK_TRANS(HW_TIM_CLOCK_HZ / 100 / HW_CAP_TIM_HZ);
  157. bikeSpdCap.CounterInterruptEnable = 1;
  158. bikeSpdCap.Channel[3].Edge = CaptureRisingEdge;
  159. bikeSpdCap.Channel[3].Enable = 1;
  160. bikeSpdCap.Channel[3].InterruptEnable = 1;
  161. switchhalCap.CountMax = TICK_TRANS(HW_TIM_CLOCK_HZ / HW_INIT_FTBS_HZ - 1);
  162. switchhalCap.CounterInterruptEnable = 1;
  163. switchhalCap.Channel[0].Edge = CaptureRisingFallingEdge;
  164. switchhalCap.Channel[0].Enable = 1;
  165. switchhalCap.Channel[0].InterruptEnable = 1;
  166. switchhalCap.Channel[1].Edge = CaptureRisingFallingEdge;
  167. switchhalCap.Channel[1].Enable = 1;
  168. switchhalCap.Channel[1].InterruptEnable = 1;
  169. switchhalCap.Channel[2].Edge = CaptureRisingFallingEdge;
  170. switchhalCap.Channel[2].Enable = 1;
  171. switchhalCap.Channel[2].InterruptEnable = 1;
  172. //scheduler.InterruptBind(&scheduler, &bikeSpdCap.Base, CaptureInterruptOut1, CaptureIsr);
  173. scheduler.AppTimeSlice.Add(&scheduler.AppTimeSlice, 1, 1, 0, BackgroundTask);
  174. iRt_Init();
  175. AppInit();
  176. iPwm_SetCountMax(0, HW_INIT_HPWM_PERIOD);
  177. iPwm_SetCompareValue(0, 0, HW_INIT_HHPWM_PERIOD);
  178. iPwm_SetCompareValue(0, 1, HW_INIT_HHPWM_PERIOD);
  179. iPwm_SetCompareValue(0, 2, HW_INIT_HHPWM_PERIOD);
  180. iPwm_SetCompareValueDelay(0, 0, HW_INIT_HHPWM_PERIOD);
  181. iPwm_SetCompareValueDelay(0, 1, HW_INIT_HHPWM_PERIOD);
  182. iPwm_SetCompareValueDelay(0, 2, HW_INIT_HHPWM_PERIOD);
  183. uint32_t ticks[3] = {2000, 4000, 6000};
  184. iPwm_SyncMultiSamplingCountUp(0, ticks, 3);
  185. iPwm_EnableSyncMultiSampling(0);
  186. }
  187. void BackgroundTask(void *p)
  188. {
  189. /* 应用层软件循环 */
  190. AppLoop();
  191. }