main.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. #define PRINT_LEN 8
  13. static __IO uint32_t uwTimingDelay; // 延时计数器
  14. uint8_t speed=0;
  15. /**
  16. * @brief 简化版时钟信息打印(仅打印关键信息)
  17. */
  18. //static void Print_Clock_Info_Simple(void)
  19. //{
  20. // RCC_ClocksTypeDef RCC_Clocks;
  21. // RCC_GetClocksFreq(&RCC_Clocks);
  22. //
  23. // printf("\r\n=== Clock Info ===\r\n");
  24. // printf("HSE: %u MHz\r\n", HSE_VALUE/1000000);
  25. // printf("SYSCLK: %u MHz\r\n", RCC_Clocks.SYSCLK_Frequency/1000000);
  26. // printf("HCLK: %u MHz\r\n", RCC_Clocks.HCLK_Frequency/1000000);
  27. // printf("PCLK1: %u MHz (TIM2-5: %u MHz)\r\n",
  28. // RCC_Clocks.PCLK1_Frequency/1000000,
  29. // (RCC_Clocks.PCLK1_Frequency == RCC_Clocks.HCLK_Frequency) ?
  30. // RCC_Clocks.PCLK1_Frequency/1000000 : RCC_Clocks.PCLK1_Frequency*2/1000000);
  31. // printf("PCLK2: %u MHz (TIM1: %u MHz, USART1: %u MHz)\r\n",
  32. // RCC_Clocks.PCLK2_Frequency/1000000,
  33. // (RCC_Clocks.PCLK2_Frequency == RCC_Clocks.HCLK_Frequency) ?
  34. // RCC_Clocks.PCLK2_Frequency/1000000 : RCC_Clocks.PCLK2_Frequency*2/1000000,
  35. // RCC_Clocks.PCLK2_Frequency/1000000);
  36. // printf("USART1 Baud Rate: %u bps\r\n",
  37. // RCC_Clocks.PCLK2_Frequency / USART1->BRR);
  38. // printf("================\r\n\r\n");
  39. //}
  40. /**
  41. * @brief 主函数
  42. * @param 无
  43. * @retval 无
  44. */
  45. int main(void)
  46. {
  47. // 初始化硬件
  48. hard_init();
  49. // 初始化LED应用
  50. led_app_init();
  51. // 初始化串口通信
  52. uart_communication_init();
  53. //Print_Clock_Info_Simple();
  54. foc_algorithm_initialize();
  55. if(get_offset_flag==0)
  56. {
  57. get_offset_flag = 1;
  58. TIM_CtrlPWMOutputs(PWM_TIM,ENABLE);
  59. }
  60. // 主循环
  61. while (1)
  62. {
  63. #define PRINT_LEN 8
  64. float data_print[PRINT_LEN] = {0};
  65. const uint8_t tail[4] = {0x00, 0x00, 0x80, 0x7f}; // 帧尾
  66. // 准备打印数据并直接发送到 DMA 缓冲区
  67. uint8_t dma_tx_buffer[PRINT_LEN * sizeof(float) + 4];
  68. #ifdef OPENLOOP_TEST
  69. data_print[0] = theta;
  70. data_print[1] = Vbus;
  71. data_print[2] = 0;
  72. data_print[3] = get_foc_input()->Id_ref;
  73. data_print[4] = get_foc_input()->Iq_ref;
  74. data_print[5] = get_curr_dq()->Id;
  75. data_print[6] = get_curr_dq()->Iq;
  76. data_print[7] = Temp;
  77. #else
  78. // data_print[0] = FOC_Input.ia;
  79. // data_print[1] = FOC_Input.ib;
  80. // data_print[2] = FOC_Input.ic;
  81. // data_print[3] = FOC_Input.theta;
  82. // data_print[4] = FOC_Input.Iq_ref;
  83. // data_print[5] = FOC_Input.Id_ref;
  84. // data_print[6] = Speed_Ref;
  85. // data_print[7] = Speed_Fdk/(2 * PI);
  86. extern CURRENT_DQ_DEF Current_Idq;
  87. // data_print[0] = FOC_Input.ia;
  88. // data_print[1] = FOC_Input.ib;
  89. // data_print[2] = FOC_Input.ic;
  90. // data_print[3] = FOC_Input.theta;
  91. // data_print[4] = FOC_Input.Iq_ref;
  92. // data_print[5] = FOC_Input.Id_ref;
  93. // data_print[6] = Current_Idq.Id;
  94. // data_print[7] = Current_Idq.Iq;
  95. data_print[0] = FOC_Output.Tcmp1;
  96. data_print[1] = FOC_Output.Tcmp2;
  97. data_print[2] = FOC_Output.Tcmp3;
  98. data_print[3] = FOC_Input.theta;
  99. data_print[4] = FOC_Input.Iq_ref;
  100. data_print[5] = FOC_Input.Id_ref;
  101. data_print[6] = Current_Idq.Id;
  102. data_print[7] = Current_Idq.Iq;
  103. #endif
  104. // 合并数据包到 DMA 缓冲区
  105. memcpy(dma_tx_buffer, (uint8_t*)data_print, PRINT_LEN * sizeof(float));
  106. memcpy(&dma_tx_buffer[PRINT_LEN * sizeof(float)], tail, 4);
  107. // 使用 DMA 发送数据(10kHz 频率)
  108. DMA_USART_COMM_Send(dma_tx_buffer, PRINT_LEN * sizeof(float) + 4);
  109. }
  110. }
  111. /**
  112. * @brief 延时函数
  113. * @param nTime: 延时时间(毫秒)
  114. * @retval 无
  115. */
  116. void Delay(__IO uint32_t nTime)
  117. {
  118. uwTimingDelay = nTime;
  119. while(uwTimingDelay != 0);
  120. }
  121. /**
  122. * @brief 延时计数器递减函数
  123. * @param 无
  124. * @retval 无
  125. * @note 在SysTick中断中调用
  126. */
  127. void TimingDelay_Decrement(void)
  128. {
  129. if (uwTimingDelay != 0x00)
  130. {
  131. uwTimingDelay--;
  132. }
  133. }
  134. #ifdef USE_FULL_ASSERT
  135. /**
  136. * @brief 断言失败处理函数
  137. * @param file: 文件名称
  138. * @param line: 行号
  139. * @retval 无
  140. */
  141. void assert_failed(uint8_t* file, uint32_t line)
  142. {
  143. while (1)
  144. {
  145. }
  146. }
  147. #endif