low_task.c 4.0 KB

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