low_task.c 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. /**********************************
  2. * 文件名称: low_task.c
  3. * 功能描述: 低优先级任务模块
  4. * 功能: 处理电机启停、速度调整、用户按键输入和定时任务
  5. **********************************/
  6. #include "main.h"
  7. #include "low_task.h"
  8. #include "led_app.h"
  9. // 全局变量
  10. u16 hz_100_cnt = 0; // 100Hz计数器
  11. uint8_t motor_start_stop = 0; // 电机启停状态(0:停止,1:启动)
  12. uint8_t motor_start_stop_pre = 1; // 电机启停状态前值,用于检测状态变化
  13. /**
  14. * @brief 电机启动函数
  15. * @note 初始化FOC算法,设置速度参考值,使能PWM输出
  16. */
  17. void motor_start(void)
  18. {
  19. // 初始化FOC算法
  20. foc_algorithm_initialize();
  21. // 设置速度参考值为20.0转/秒
  22. Speed_Ref = 20.0F; // 20*6.28 也就是125.6 erad/s 5转每秒
  23. // 清除速度闭环标志
  24. speed_close_loop_flag = 0;
  25. // 设置q轴电流参考值
  26. Iq_ref = 0.0f;
  27. SHUTDOWN_EN();
  28. // 使能PWM输出
  29. TIM_CtrlPWMOutputs(PWM_TIM, ENABLE);
  30. // 通知LED应用电机启动
  31. motor_state_callback(1);
  32. // 清除霍尔异常计数值
  33. Hall_Init_For_Startup();
  34. }
  35. /**
  36. * @brief 电机停止函数
  37. * @note 禁用PWM输出,通知LED应用电机停止
  38. */
  39. void motor_stop(void)
  40. {
  41. // 禁用PWM输出
  42. TIM_CtrlPWMOutputs(PWM_TIM, DISABLE);
  43. SHUTDOWN_OFF();
  44. // 通知LED应用电机停止
  45. motor_state_callback(0);
  46. //motor_start_stop_pre = motor_start_stop; // 保存状态
  47. /*
  48. if(rtY.EKF[2]<140.0f)
  49. {
  50. GPIO_ResetBits(GPIOC, GPIO_Pin_9);
  51. TIM_CtrlPWMOutputs(PWM_TIM, DISABLE);
  52. motor_start_stop_pre = motor_start_stop;
  53. motor_run_display_flag = 0;
  54. }
  55. else
  56. {
  57. rtspeed_ref = 20.0F;
  58. if(motor_start_stop == 1)
  59. {
  60. motor_start_stop_pre = 0;
  61. }
  62. else
  63. {
  64. motor_start_stop_pre = 1;
  65. }
  66. }
  67. */
  68. }
  69. /**
  70. * @brief 低优先级控制任务
  71. * @note 处理电机启停、速度调整和用户按键输入
  72. */
  73. void low_control_task(void)
  74. {
  75. // 只有电流偏移量获取完成后才执行控制逻辑
  76. if(get_offset_flag == 2)
  77. {
  78. // 检测电机启停状态变化
  79. if(motor_start_stop_pre != motor_start_stop)
  80. {
  81. // 保存状态前值
  82. motor_start_stop_pre = motor_start_stop;
  83. // 根据状态执行相应操作
  84. if(motor_start_stop == 1)
  85. {
  86. motor_start(); // 启动电机
  87. }
  88. else
  89. {
  90. motor_stop(); // 停止电机
  91. }
  92. }
  93. }
  94. // 处理KEY1按键事件,切换电机启停状态
  95. if(key1_flag == 1)
  96. {
  97. if(motor_start_stop == 0)
  98. {
  99. motor_start_stop = 1; // 启动电机
  100. }
  101. else
  102. {
  103. motor_start_stop = 0; // 停止电机
  104. }
  105. key1_flag = 0; // 清除按键标志
  106. }
  107. // 处理KEY2按键事件
  108. if(key2_flag == 1)
  109. {
  110. if(Speed_Ref < MAX_ELE_RPS)
  111. Speed_Ref += 5.0f; // 速度参考值减少5.0转/秒
  112. // Iq_ref += 0.2f;
  113. key2_flag = 0; // 清除按键标志
  114. }
  115. // 处理KEY3按键事件
  116. if(key3_flag == 1)
  117. {
  118. if(Speed_Ref > MIN_ELE_RPS)
  119. Speed_Ref -= 5.0f; // 速度参考值减少5.0转/秒
  120. // Iq_ref -= 0.2f;
  121. key3_flag = 0; // 清除按键标志
  122. }
  123. }
  124. /**
  125. * @brief SysTick中断处理函数
  126. * @note 实现100Hz定时任务,每10ms执行一次低优先级控制任务
  127. */
  128. void SysTick_Handler(void)
  129. {
  130. Temp = calculate_temperature(ADC_TO_RT(ADC3ConvertedValue[ADC3_TEMP_INDEX]));
  131. //rtspeed_ref = 20.0F; // 速度参考值(已注释)
  132. Hall_Get()->Speed = Get_Filtered_Speed();
  133. // 执行速度PID计算
  134. Speed_Pid_Calc(Speed_Ref, Speed_Fdk, &Speed_Pid_Out, &Speed_Pid);
  135. // 增加100Hz计数器
  136. hz_100_cnt++;
  137. // 每10ms执行一次低优先级控制任务
  138. if(hz_100_cnt == 10)
  139. {
  140. // 调用LED应用的tick函数,传递10ms的计时信息
  141. led_app_tick(10);
  142. // 调用LED应用的update函数,更新LED状态
  143. led_app_update();
  144. // communication_handle(); // 通信处理(已注释)
  145. // 执行低优先级控制任务
  146. low_control_task();
  147. // 减少延时计数器
  148. TimingDelay_Decrement();
  149. // 重置计数器
  150. hz_100_cnt = 0;
  151. }
  152. }