board.c 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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(&breakPin);
  32. Sim_GpioInit(&bikeBrakePin);
  33. Sim_TimerInit(&sysTick);
  34. Sim_TimerInit(&tbsTick);
  35. Sim_TimerInit(&tbcHalfUpdateTick);
  36. Sim_TimerInit(&event1MsTick);
  37. Sim_TimerInit(&sampleTrigTimer);
  38. Sim_TimerInit(&sampleTrigTimer2);
  39. Sim_DMAInit(&pwmLoadDma);
  40. Sim_CaptureInit(&cadenceCap);
  41. Sim_CaptureInit(&bikeSpdCap);
  42. /* 调度器外设注册 */
  43. scheduler.Register(&scheduler, &pwm.Base);
  44. scheduler.Register(&scheduler, &adc.Base);
  45. scheduler.Register(&scheduler, &adc2.Base);
  46. scheduler.Register(&scheduler, &adc3.Base);
  47. scheduler.Register(&scheduler, &ledPin.Base);
  48. scheduler.Register(&scheduler, &capPin.Base);
  49. scheduler.Register(&scheduler, &breakPin.Base);
  50. scheduler.Register(&scheduler, &bikeBrakePin.Base);
  51. scheduler.Register(&scheduler, &sysTick.Base);
  52. scheduler.Register(&scheduler, &tbsTick.Base);
  53. scheduler.Register(&scheduler, &tbcHalfUpdateTick.Base);
  54. scheduler.Register(&scheduler, &event1MsTick.Base);
  55. scheduler.Register(&scheduler, &sampleTrigTimer.Base);
  56. scheduler.Register(&scheduler, &sampleTrigTimer2.Base);
  57. scheduler.Register(&scheduler, &pwmLoadDma.Base);
  58. scheduler.Register(&scheduler, &cadenceCap.Base);
  59. scheduler.Register(&scheduler, &bikeSpdCap.Base);
  60. /* Pwm配置 */
  61. pwm.CntMode = SIM_PWM_UP_DOWN;
  62. pwm.PwmMode = SIM_PWM_PWMMODE2;
  63. pwm.OCPolarity[0] = SIM_PWM_POLARITY_HIGH;
  64. pwm.OCPolarity[1] = SIM_PWM_POLARITY_HIGH;
  65. pwm.OCPolarity[2] = SIM_PWM_POLARITY_HIGH;
  66. pwm.OCPolarity[3] = SIM_PWM_POLARITY_HIGH;
  67. pwm.OCPolarity[4] = SIM_PWM_POLARITY_HIGH;
  68. pwm.OCPolarity[5] = SIM_PWM_POLARITY_HIGH;
  69. pwm.CmpPreloadEnable[0] = 0;
  70. pwm.CmpPreloadEnable[1] = 0;
  71. pwm.CmpPreloadEnable[2] = 0;
  72. pwm.PeriodPreloadEnable = 1;
  73. pwm.TotalCntNumInput = TICK_TRANS(HW_INIT_HPWM_PERIOD);
  74. pwm.TotalCntNumCurrent = TICK_TRANS(HW_INIT_HPWM_PERIOD);
  75. pwm.CmpValueCurrent[0] = TICK_TRANS(HW_INIT_HHPWM_PERIOD);
  76. pwm.CmpValueCurrent[1] = TICK_TRANS(HW_INIT_HHPWM_PERIOD);
  77. pwm.CmpValueCurrent[2] = TICK_TRANS(HW_INIT_HHPWM_PERIOD);
  78. pwm.CmpValueInput[0] = TICK_TRANS(HW_INIT_HHPWM_PERIOD);
  79. pwm.CmpValueInput[1] = TICK_TRANS(HW_INIT_HHPWM_PERIOD);
  80. pwm.CmpValueInput[2] = TICK_TRANS(HW_INIT_HHPWM_PERIOD);
  81. pwm.TotalDeadNum = TICK_TRANS(HW_DEADBAND_TIME);
  82. pwm.BridgeOffFlag[0] = 0;
  83. pwm.BridgeOffFlag[1] = 0;
  84. pwm.BridgeOffFlag[2] = 0;
  85. // scheduler.TriggerBind(&scheduler, &pwm.Base, PwmTriggerOutUpdate, &adc.Base, AdcTriggerInSample);
  86. /* Pwm Break触发 */
  87. breakPin.Mode = GPIO_MODE_IN;
  88. breakPin.EdgeType = GpioRisingEdge;
  89. scheduler.TriggerBind(&scheduler, &breakPin.Base, GpioMainTrigger, &pwm.Base, PwmTriggerInBreak);
  90. /* Bike Brake IO配置 */
  91. bikeBrakePin.Mode = GPIO_MODE_IN;
  92. /* 采样触发定时器配置 */
  93. sampleTrigTimer.CountMode = TimerCenterAlignedMode1;
  94. sampleTrigTimer.CountDir = TimerCountUp;
  95. sampleTrigTimer.PreloadEnable = 1;
  96. sampleTrigTimer.CountReloadInput = TICK_TRANS(HW_INIT_HPWM_PERIOD * 2);
  97. sampleTrigTimer._CountReloadValue = TICK_TRANS(HW_INIT_HPWM_PERIOD * 2);
  98. sampleTrigTimer.ComparePreloadEnable = 0;
  99. sampleTrigTimer._CompareValue = TICK_TRANS(HW_SAMPLE_BEFORE_UPDATE_CNTS);
  100. sampleTrigTimer.CompareReloadInput = TICK_TRANS(HW_SAMPLE_BEFORE_UPDATE_CNTS);
  101. scheduler.TriggerBind(&scheduler, &sampleTrigTimer.Base, TimerTriggerOutCCIF, &adc.Base, AdcTriggerInSample);
  102. /* 采样触发定时器配置2 */
  103. sampleTrigTimer2.CountMode = TimerCenterAlignedMode2;
  104. sampleTrigTimer2.CountDir = TimerCountUp;
  105. sampleTrigTimer2.PreloadEnable = 1;
  106. sampleTrigTimer2.CountReloadInput = TICK_TRANS(HW_INIT_HPWM_PERIOD);
  107. sampleTrigTimer2._CountReloadValue = TICK_TRANS(HW_INIT_HPWM_PERIOD);
  108. sampleTrigTimer2.ComparePreloadEnable = 0;
  109. sampleTrigTimer2._CompareValue = TICK_TRANS(HW_SAMPLE_BEFORE_UPDATE_CNTS);
  110. sampleTrigTimer2.CompareReloadInput = TICK_TRANS(HW_SAMPLE_BEFORE_UPDATE_CNTS);
  111. scheduler.TriggerBind(&scheduler, &sampleTrigTimer2.Base, TimerTriggerOutCCIF, &adc2.Base, AdcTriggerInSample);
  112. // sampleTrigTimer2.Base.Enable = 0;
  113. /* 采样触发定时器配置3 */
  114. //scheduler.TriggerBind(&scheduler, &sampleTrigTimer2.Base, TimerTriggerOutCCIF, &adc3.Base, AdcTriggerInSample);
  115. /* Tbc半更新定时器配置 */
  116. tbcHalfUpdateTick.CountMode = TimerEdgeAlignedMode;
  117. tbcHalfUpdateTick.CountDir = TimerCountUp;
  118. tbcHalfUpdateTick.PreloadEnable = 0;
  119. tbcHalfUpdateTick.CountReloadInput = TICK_TRANS(HW_INIT_PWM_PERIOD - 1);
  120. /* Tbs定时器配置 */
  121. tbsTick.CountMode = TimerEdgeAlignedMode;
  122. tbsTick.CountDir = TimerCountUp;
  123. tbsTick.PreloadEnable = 0;
  124. tbsTick.CountReloadInput = TICK_TRANS(HW_TIM_CLOCK_HZ / HW_INIT_FTBS_HZ - 1);
  125. tbsTick.UpdateInterruptEnable = 1;
  126. //scheduler.InterruptBind(&scheduler, &tbsTick.Base, TimerInterruptOutUIF, TbsTimerIsr);
  127. /* Event1Ms定时器配置 */
  128. event1MsTick.CountMode = TimerEdgeAlignedMode;
  129. event1MsTick.CountDir = TimerCountUp;
  130. event1MsTick.PreloadEnable = 0;
  131. event1MsTick.CountReloadInput = TICK_TRANS(HW_TIM_CLOCK_HZ / 1000 - 1);
  132. event1MsTick.UpdateInterruptEnable = 1;
  133. /* SysTick定时器配置 */
  134. sysTick.CountMode = TimerEdgeAlignedMode;
  135. sysTick.CountDir = TimerCountDown;
  136. sysTick.PreloadEnable = 0;
  137. sysTick.UpdateInterruptEnable = 1;
  138. sysTick.CountReloadInput = TICK_TRANS(HW_TIM_CLOCK_HZ / 1000);
  139. //scheduler.InterruptBind(&scheduler, &sysTick.Base, TimerInterruptOutUIF, SystickIsr);
  140. /* Capture配置 */
  141. cadenceCap.CountMax = TICK_TRANS(HW_TIM_CLOCK_HZ / 100 / HW_CAP_TIM_HZ);
  142. cadenceCap.CounterInterruptEnable = 1;
  143. cadenceCap.Channel[2].Edge = CaptureRisingFallingEdge;
  144. cadenceCap.Channel[2].Enable = 1;
  145. cadenceCap.Channel[2].InterruptEnable = 1;
  146. bikeSpdCap.CountMax = TICK_TRANS(HW_TIM_CLOCK_HZ / 100 / HW_CAP_TIM_HZ);
  147. bikeSpdCap.CounterInterruptEnable = 1;
  148. bikeSpdCap.Channel[3].Edge = CaptureRisingEdge;
  149. bikeSpdCap.Channel[3].Enable = 1;
  150. bikeSpdCap.Channel[3].InterruptEnable = 1;
  151. //scheduler.InterruptBind(&scheduler, &bikeSpdCap.Base, CaptureInterruptOut1, CaptureIsr);
  152. scheduler.AppTimeSlice.Add(&scheduler.AppTimeSlice, 1, 1, 0, BackgroundTask);
  153. iRt_Init();
  154. AppInit();
  155. iPwm_SetCountMax(0, HW_INIT_HPWM_PERIOD);
  156. iPwm_SetCompareValue(0, 0, HW_INIT_HHPWM_PERIOD);
  157. iPwm_SetCompareValue(0, 1, HW_INIT_HHPWM_PERIOD);
  158. iPwm_SetCompareValue(0, 2, HW_INIT_HHPWM_PERIOD);
  159. iPwm_SetCompareValueDelay(0, 0, HW_INIT_HHPWM_PERIOD);
  160. iPwm_SetCompareValueDelay(0, 1, HW_INIT_HHPWM_PERIOD);
  161. iPwm_SetCompareValueDelay(0, 2, HW_INIT_HHPWM_PERIOD);
  162. uint32_t ticks[3] = {2000, 4000, 6000};
  163. iPwm_SyncMultiSamplingCountUp(0, ticks, 3);
  164. iPwm_EnableSyncMultiSampling(0);
  165. }
  166. void BackgroundTask(void *p)
  167. {
  168. /* 应用层软件循环 */
  169. AppLoop();
  170. }