main.c 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. /**
  2. * @copyright None
  3. * @file main.c
  4. * @author Comment Vivre
  5. * @date 2024-08-26
  6. * @brief None
  7. */
  8. #include <MyProject.h>
  9. #include <SanityCheck.h>
  10. uint8 data g_1mTick = 0; ///< 1ms滴答信号,每隔1ms在SYSTICK定时器被置1,需在大循环使用处清零
  11. /**
  12. @brief 参考电压,偏置电压配置
  13. @date 2022-07-14
  14. */
  15. void VREFConfigInit(void)
  16. {
  17. #if (HW_ADC_VREF == VREF3_0)
  18. {
  19. SetBit(VREF_VHALF_CR, VRVSEL1); // 00-->4.5V 01-->VDD5
  20. ClrBit(VREF_VHALF_CR, VRVSEL0); // 10-->3.0V 11-->4.0V
  21. }
  22. #elif (HW_ADC_VREF == VREF4_0)
  23. {
  24. SetBit(VREF_VHALF_CR, VRVSEL1); // 00-->4.5V 01-->VDD5
  25. SetBit(VREF_VHALF_CR, VRVSEL0); // 10-->3.0V 11-->4.0V
  26. }
  27. #elif (HW_ADC_VREF == VREF4_5)
  28. {
  29. ClrBit(VREF_VHALF_CR, VRVSEL1); // 00-->4.5V 01-->VDD5
  30. ClrBit(VREF_VHALF_CR, VRVSEL0); // 10-->3.0V 11-->4.0V
  31. }
  32. #elif (HW_ADC_VREF == VREF5_0)
  33. {
  34. ClrBit(VREF_VHALF_CR, VRVSEL1); // 00-->4.5V 01-->VDD5
  35. SetBit(VREF_VHALF_CR, VRVSEL0); // 10-->3.0V 11-->4.0V
  36. }
  37. #endif
  38. // VHALF电压配置 00:1/8VREF 01:1/4VREF 10:25/64VREF 11:1/2VREF(default)
  39. #if (HW_VHALF_SEL == VHALF1_8)
  40. {
  41. ClrBit(VREF_VHALF_CR, VHALFSEL1);
  42. ClrBit(VREF_VHALF_CR, VHALFSEL0);
  43. }
  44. #elif (HW_VHALF_SEL == VHALF1_4)
  45. {
  46. ClrBit(VREF_VHALF_CR, VHALFSEL1);
  47. SetBit(VREF_VHALF_CR, VHALFSEL0);
  48. }
  49. #elif (HW_VHALF_SEL == VHALF25_64)
  50. {
  51. SetBit(VREF_VHALF_CR, VHALFSEL1);
  52. ClrBit(VREF_VHALF_CR, VHALFSEL0);
  53. }
  54. #elif (HW_VHALF_SEL == VHALF1_2)
  55. {
  56. SetBit(VREF_VHALF_CR, VHALFSEL1);
  57. SetBit(VREF_VHALF_CR, VHALFSEL0);
  58. }
  59. #else
  60. #error " VHALF MODE Err "
  61. #endif
  62. #if (VREF_OUT_EN)
  63. {
  64. SetBit(P3_AN, PIN5); // VREF Voltage -->P35 Output 是否输出到P35引脚,需同步配置输出
  65. SetBit(P3_OE, PIN5); // VREF Voltage -->P35 Output 是否输出到P35引脚
  66. }
  67. #endif
  68. #if (VHALF_EN)
  69. SetBit(VREF_VHALF_CR, VHALFEN); // VREF_VHALF_CR = 0x11;
  70. #endif
  71. SetBit(VREF_VHALF_CR, VREFEN);
  72. }
  73. /**
  74. @brief 硬件初始化,初始化需要使用的硬件设备配置,FOC必须配置的是运放电压、运放初始化、ADC初始化、Driver初始化
  75. 其他的可根据实际需求加。
  76. @date 2022-07-14
  77. */
  78. static void HardwareInit(void)
  79. {
  80. // ADC参考电压电压配置
  81. VREFConfigInit();
  82. // 硬件过流,比较器初始化,用于硬件过流比较保护
  83. CMP3_Init();
  84. GPIO_Init();
  85. ADC_Init(); // 初始化需要在Driver之前
  86. Driver_Init();
  87. #if (FG_Enable)
  88. // 端口GP12
  89. TIM4_Init();
  90. #endif
  91. AMP_Init();
  92. // 温度配置初始化
  93. TSD_Init();
  94. // 比较器中断配置,与CMP3硬件配置间隔一段时间等待硬件稳定
  95. CMP3_Interrupt_Init();
  96. // SYSTICK定时器配置
  97. // 1ms定时中断优先级别为1
  98. ClrBit(IP2, PTIM41);
  99. SetBit(IP2, PTIM40);
  100. // 使能系统定时器中断
  101. SetBit(DRV_SR, SYSTIE);
  102. // 开启全局中断
  103. EA = 1;
  104. }
  105. /**
  106. @brief 部分变量初始化,上电运行一次
  107. @date 2022-07-14
  108. */
  109. static void SoftwareInit(void)
  110. {
  111. // 电机状态机时序变量
  112. McStaSet.SetMode = 0;
  113. // 电机目标方向
  114. #if (FR_MODE == CW)
  115. mcFocCtrl.FR = CW;
  116. #else
  117. mcFocCtrl.FR = CCW;
  118. #endif // end IRMODE
  119. // 电流偏置校准变量初始化
  120. mcCurOffset.IuOffsetSum = 16383;
  121. mcCurOffset.IvOffsetSum = 16383;
  122. mcCurOffset.Iw_busOffsetSum = 16383;
  123. // 输入捕获定时器初始化
  124. mcPwmInput.TimerARR = 65535;
  125. mcState = mcReady;
  126. mcFaultSource = FaultNoSource;
  127. }
  128. /**
  129. @brief 主函数,大循环运行偏置电流采集函数,电机状态机控制函数,以及环路响应函数
  130. @date 2022-07-14
  131. */
  132. void main(void)
  133. {
  134. uint16 PowerUpCnt = 0;
  135. // 上电空指令延时 等待系统稳定
  136. for (PowerUpCnt = 0; PowerUpCnt < SystemPowerUpTime; PowerUpCnt++);
  137. // 部分变量初始化
  138. SoftwareInit();
  139. // 硬件初始化
  140. HardwareInit();
  141. while (1)
  142. {
  143. // 获取电流采样偏置电压
  144. if (!mcCurOffset.OffsetFlag)
  145. { GetCurrentOffset(); }
  146. else
  147. {
  148. // 电机控制状态机
  149. FiniteStateManger();
  150. if (g_1mTick)
  151. {
  152. TickCycle();
  153. g_1mTick = 0;
  154. }
  155. }
  156. }
  157. }