main.c 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  1. /**********************************
  2. * 主函数文件
  3. * 功能:系统初始化、硬件配置和主循环
  4. * 说明:
  5. * 1. 初始化系统时钟和硬件
  6. * 2. 配置PWM输出,默认占空比50%
  7. * 3. 测试串口通信功能
  8. **********************************/
  9. #include "main.h"
  10. #include "led_app.h"
  11. #include <stdio.h>
  12. static __IO uint32_t uwTimingDelay; // 延时计数器
  13. /**
  14. * @brief 简化版时钟信息打印(仅打印关键信息)
  15. */
  16. //static void Print_Clock_Info_Simple(void)
  17. //{
  18. // RCC_ClocksTypeDef RCC_Clocks;
  19. // RCC_GetClocksFreq(&RCC_Clocks);
  20. //
  21. // printf("\r\n=== Clock Info ===\r\n");
  22. // printf("HSE: %u MHz\r\n", HSE_VALUE/1000000);
  23. // printf("SYSCLK: %u MHz\r\n", RCC_Clocks.SYSCLK_Frequency/1000000);
  24. // printf("HCLK: %u MHz\r\n", RCC_Clocks.HCLK_Frequency/1000000);
  25. // printf("PCLK1: %u MHz (TIM2-5: %u MHz)\r\n",
  26. // RCC_Clocks.PCLK1_Frequency/1000000,
  27. // (RCC_Clocks.PCLK1_Frequency == RCC_Clocks.HCLK_Frequency) ?
  28. // RCC_Clocks.PCLK1_Frequency/1000000 : RCC_Clocks.PCLK1_Frequency*2/1000000);
  29. // printf("PCLK2: %u MHz (TIM1: %u MHz, USART1: %u MHz)\r\n",
  30. // RCC_Clocks.PCLK2_Frequency/1000000,
  31. // (RCC_Clocks.PCLK2_Frequency == RCC_Clocks.HCLK_Frequency) ?
  32. // RCC_Clocks.PCLK2_Frequency/1000000 : RCC_Clocks.PCLK2_Frequency*2/1000000,
  33. // RCC_Clocks.PCLK2_Frequency/1000000);
  34. // printf("USART1 Baud Rate: %u bps\r\n",
  35. // RCC_Clocks.PCLK2_Frequency / USART1->BRR);
  36. // printf("================\r\n\r\n");
  37. //}
  38. /**
  39. * @brief 主函数
  40. * @param 无
  41. * @retval 无
  42. */
  43. int main(void)
  44. {
  45. // 初始化硬件
  46. hard_init();
  47. // 初始化LED应用
  48. led_app_init();
  49. // 初始化串口通信
  50. uart_communication_init();
  51. //Print_Clock_Info_Simple();
  52. foc_algorithm_initialize();
  53. if(get_offset_flag==0)
  54. {
  55. get_offset_flag = 1;
  56. TIM_CtrlPWMOutputs(PWM_TIM,ENABLE);
  57. }
  58. // 主循环
  59. while (1)
  60. {
  61. #define PRINT_LEN 13
  62. float data_print[PRINT_LEN] = {0};
  63. const uint8_t tail[4] = {0x00, 0x00, 0x80, 0x7f}; // 帧尾
  64. // 准备打印数据并直接发送到 DMA 缓冲区
  65. uint8_t dma_tx_buffer[PRINT_LEN * sizeof(float) + 4];
  66. #ifdef OPENLOOP_TEST
  67. // data_print[0] = theta;
  68. // data_print[1] = Vbus;
  69. // data_print[2] = 0;
  70. // data_print[3] = get_foc_input()->Id_ref;
  71. // data_print[4] = get_foc_input()->Iq_ref;
  72. // data_print[5] = get_curr_dq()->Id;
  73. // data_print[6] = get_curr_dq()->Iq;
  74. // data_print[7] = Temp;
  75. // data_print[0] = Hall_Get()->count[0];
  76. // data_print[1] = Hall_Get()->count[1];
  77. // data_print[2] = Hall_Get()->count[2];
  78. // data_print[3] = Hall_Get()->count[3];
  79. // data_print[4] = Hall_Get()->count[4];
  80. // data_print[5] = Hall_Get()->count[5];
  81. // data_print[6] = Hall_Get()->speed[0];
  82. // data_print[7] = Hall_Get()->speed[1];
  83. // data_print[8] = Hall_Get()->speed[2];
  84. // data_print[9] = Hall_Get()->speed[3];
  85. // data_print[10] = Hall_Get()->speed[4];
  86. // data_print[11] = Hall_Get()->speed[5];
  87. // data_print[12] = Hall_Get()->state;
  88. // data_print[13] = Hall_Get()->Speed;
  89. // data_print[14] = Hall_Get()->angle;
  90. // data_print[15] = Hall_Get()->angle_add;
  91. // data_print[16] = theta;
  92. // data_print[0] = Hall_Get()->speed[0];
  93. // data_print[1] = Hall_Get()->speed[1];
  94. // data_print[2] = Hall_Get()->speed[2];
  95. // data_print[3] = Hall_Get()->speed[3];
  96. // data_print[4] = Hall_Get()->speed[4];
  97. // data_print[5] = Hall_Get()->speed[5];
  98. // data_print[6] = Hall_Get()->state;
  99. // data_print[7] = Hall_Get()->Speed;
  100. // data_print[8] = Hall_Get()->angle;
  101. // data_print[9] = Hall_Get()->angle_add;
  102. // data_print[10] = theta;
  103. // data_print[0] = get_curr_dq()->Iq;
  104. // data_print[1] = get_foc_input()->Iq_ref;
  105. // data_print[2] = get_curr_dq()->Id;
  106. // data_print[3] = get_foc_input()->Id_ref;
  107. // data_print[4] = FOC_Input.ia;
  108. // data_print[5] = FOC_Input.ib;
  109. // data_print[6] = FOC_Input.ic;
  110. // data_print[7] = Hall_Get()->state;
  111. // data_print[8] = Hall_Get()->Speed;
  112. // data_print[9] = Hall_Get()->angle;
  113. // data_print[10] = Hall_Get()->angle_add;
  114. // data_print[11] = theta;
  115. // data_print[12] = MAX_ELE_RAD;
  116. data_print[0] = get_curr_dq()->Iq;
  117. data_print[1] = get_foc_input()->Iq_ref;
  118. data_print[2] = get_curr_dq()->Id;
  119. data_print[3] = get_foc_input()->Id_ref;
  120. data_print[4] = FOC_Input.ia;
  121. data_print[5] = FOC_Input.ib;
  122. data_print[6] = FOC_Input.ic;
  123. data_print[7] = Speed_Fdk / 2.0f / PI;
  124. data_print[8] = Speed_Ref;
  125. data_print[9] = Hall_Get()->angle;
  126. data_print[10] = Hall_Get()->angle_add;
  127. data_print[11] = theta;
  128. data_print[12] = MAX_ELE_RAD;
  129. #else
  130. // data_print[0] = FOC_Input.ia;
  131. // data_print[1] = FOC_Input.ib;
  132. // data_print[2] = FOC_Input.ic;
  133. // data_print[3] = FOC_Input.theta;
  134. // data_print[4] = FOC_Input.Iq_ref;
  135. // data_print[5] = FOC_Input.Id_ref;
  136. // data_print[6] = Speed_Ref;
  137. // data_print[7] = Speed_Fdk/(2 * PI);
  138. extern CURRENT_DQ_DEF Current_Idq;
  139. // data_print[0] = FOC_Input.ia;
  140. // data_print[1] = FOC_Input.ib;
  141. // data_print[2] = FOC_Input.ic;
  142. // data_print[3] = FOC_Input.theta;
  143. // data_print[4] = FOC_Input.Iq_ref;
  144. // data_print[5] = FOC_Input.Id_ref;
  145. // data_print[6] = Current_Idq.Id;
  146. // data_print[7] = Current_Idq.Iq;
  147. data_print[0] = FOC_Output.Tcmp1;
  148. data_print[1] = FOC_Output.Tcmp2;
  149. data_print[2] = FOC_Output.Tcmp3;
  150. data_print[3] = FOC_Input.theta;
  151. data_print[4] = FOC_Input.Iq_ref;
  152. data_print[5] = FOC_Input.Id_ref;
  153. data_print[6] = Current_Idq.Id;
  154. data_print[7] = Current_Idq.Iq;
  155. #endif
  156. // 合并数据包到 DMA 缓冲区
  157. memcpy(dma_tx_buffer, (uint8_t*)data_print, PRINT_LEN * sizeof(float));
  158. memcpy(&dma_tx_buffer[PRINT_LEN * sizeof(float)], tail, 4);
  159. // 使用 DMA 发送数据(10kHz 频率)
  160. DMA_USART_COMM_Send(dma_tx_buffer, PRINT_LEN * sizeof(float) + 4);
  161. }
  162. }
  163. /**
  164. * @brief 延时函数
  165. * @param nTime: 延时时间(毫秒)
  166. * @retval 无
  167. */
  168. void Delay(__IO uint32_t nTime)
  169. {
  170. uwTimingDelay = nTime;
  171. while(uwTimingDelay != 0);
  172. }
  173. /**
  174. * @brief 延时计数器递减函数
  175. * @param 无
  176. * @retval 无
  177. * @note 在SysTick中断中调用
  178. */
  179. void TimingDelay_Decrement(void)
  180. {
  181. if (uwTimingDelay != 0x00)
  182. {
  183. uwTimingDelay--;
  184. }
  185. }
  186. #ifdef USE_FULL_ASSERT
  187. /**
  188. * @brief 断言失败处理函数
  189. * @param file: 文件名称
  190. * @param line: 行号
  191. * @retval 无
  192. */
  193. void assert_failed(uint8_t* file, uint32_t line)
  194. {
  195. while (1)
  196. {
  197. }
  198. }
  199. #endif