board.c 8.1 KB

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