board.c 6.6 KB

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