ソースを参照

解决了PWM停止时可能会出现极端占空的小脉冲的情况,解决定时器关闭不完全的情况.

2
JIU JIALIN 2ヶ月前
コミット
fb47df3bf3
3個のファイルの変更508行の追加480行の削除
  1. +61
    -33
      PLSR/PLSR/Core/Src/tim.c
  2. +447
    -447
      PLSR/PLSR/EWARM/test.1.dep
  3. バイナリ
      PLSR/PLSR/EWARM/test.1/Exe/test.1.sim

+ 61
- 33
PLSR/PLSR/Core/Src/tim.c ファイルの表示

@@ -671,8 +671,8 @@ void PLSR_PWM_Start(void)
switch(g_plsr_route.output_port)
{
case 0: // TIM10
//__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2); // 设置占空比为50%
HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2); // 设置占空比为50%
//HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1);
break;
case 1: // TIM11
@@ -715,27 +715,27 @@ void PLSR_PWM_Stop(void)
switch(g_plsr_route.output_port)
{
case 0: // TIM10
//__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); //
HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); //
//HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
break;
case 1: // TIM11
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); //
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); //
//HAL_TIM_PWM_Stop(&htim11, TIM_CHANNEL_1);
break;
case 2: // TIM13
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); //
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); //
//HAL_TIM_PWM_Stop(&htim13, TIM_CHANNEL_1);
break;
case 3: // TIM14
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); //
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); //
//HAL_TIM_PWM_Stop(&htim14, TIM_CHANNEL_1);
break;
default: // 默认使用TIM10
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); //
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, 0xFFFF); //
//HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
break;
}
@@ -1148,6 +1148,7 @@ void Calculate_PluseNum_Simplified(PLSR_RouteConfig_t *route)
// if(route->accel_pulse_count > 1) route->accel_pulse_count -= 1;
}
}

void Calculate_PluseNum(PLSR_RouteConfig_t *route)
{
int32_t part1_pulse_num = 0; // 第一部分脉冲数
@@ -1303,16 +1304,53 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route)
part3_time = 0;
}
// 确保总脉冲数不超过限制
// 确保总脉冲数完全匹配
int32_t calculated_total = part1_pulse_num + part3_pulse_num;
if (calculated_total > total_pulses)
if (calculated_total != total_pulses)
{
// 按比例调整
if (part1_pulse_num > 0) {
part1_pulse_num = (part1_pulse_num * total_pulses) / calculated_total;
if (calculated_total > total_pulses)
{
// 脉冲数超出限制,按比例缩减
if (part1_pulse_num > 0 && part3_pulse_num > 0) {
// 两个阶段都有脉冲,按比例分配
part1_pulse_num = (part1_pulse_num * total_pulses) / calculated_total;
part3_pulse_num = total_pulses - part1_pulse_num;
} else if (part1_pulse_num > 0) {
// 只有第一阶段有脉冲
part1_pulse_num = total_pulses;
} else if (part3_pulse_num > 0) {
// 只有第三阶段有脉冲
part3_pulse_num = total_pulses;
}
}
else
{
// 脉冲数不足,将剩余脉冲分配给匀速阶段
int32_t remaining_pulses = total_pulses - calculated_total;
// 将剩余脉冲分配给第二阶段(匀速阶段)
// 这样既不影响加减速的数学精确性,又能充分利用所有脉冲
part2_pulse_num = remaining_pulses;
// 计算匀速阶段的时间
if (vt > 0 && part2_pulse_num > 0) {
part2_time = (part2_pulse_num * 1000) / vt;
}
// 更新第二阶段状态为匀速
part2_state = PLSR_STATE_CONST;
}
if (part3_pulse_num > 0) {
part3_pulse_num = total_pulses - part1_pulse_num;
// 最终验证:确保总数完全匹配
int32_t final_total = part1_pulse_num + part3_pulse_num;
if (final_total != total_pulses) {
// 如果还有差异,调整第一阶段
int32_t adjustment = total_pulses - final_total;
part1_pulse_num += adjustment;
if (part1_pulse_num < 0) {
part3_pulse_num += part1_pulse_num; // 将负数转移给第三阶段
part1_pulse_num = 0;
}
}
}
}
@@ -1369,6 +1407,7 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route)
}
}


/**
* @brief 计算最优中间频率
* @param v0 起始频率
@@ -1613,14 +1652,11 @@ void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
}
else
{
// 第二部分完成且无减速阶段,当前段结束
g_plsr_route.current_part = PLSR_PART_COMPLETE;
PLSR_HandleSectionEnd();
}
break;
case PLSR_PART_3:
g_plsr_route.current_part = PLSR_PART_COMPLETE;
PLSR_HandleSectionEnd();
break;
@@ -1754,8 +1790,6 @@ void PLSR_Route_Init(PLSR_RouteConfig_t* route)
*/
void PLSR_Route_Start(PLSR_RouteConfig_t* route)
{


// 参数有效性检查
if (route == NULL) return;
// 状态检查 - 避免重复启动
@@ -1938,6 +1972,7 @@ void PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route)
{
if(g_plsr_mod_flag == 1)
{
g_plsr_route.initial_freq = g_plsr_route.current_freq; // 更新加减速初始频率
if(route->current_part == PLSR_PART_2) //匀速过程被修改
{
// 目标频率被修改,重新计算实际脉冲数
@@ -2122,13 +2157,6 @@ void PLSR_Section_StartNewSection(PLSR_RouteConfig_t* route)
// 重置TIM2计数器
__HAL_TIM_SET_COUNTER(&htim2, 0);
// 设置PWM频率为当前段的起始频率
if(route->current_freq > 0)
{
PLSR_PWM_SetFrequency(route->current_freq);
PLSR_PWM_Start();
}
// 清除外部事件标志,确保新段开始时状态干净
PLSR_ClearExtEvent(route);
@@ -2581,8 +2609,8 @@ void PLSR_TaskSectionSwitch(PLSR_RouteConfig_t* route)
PLSR_Section_SwitchNext(route, 0); // 外部事件触发,传入0
/* 启动新段,设置新的脉冲参数和频率 */
PLSR_Section_StartNewSection(route);
// /* 启动PWM输出 */
// PLSR_PWM_Start();
/* 启动PWM输出 */
PLSR_PWM_Start();
PLSR_ClearGpioTriggerFlag(); // 清除GPIO触发标志
}
return; // 等待外部事件时不需要继续处理
@@ -2611,8 +2639,8 @@ void PLSR_TaskSectionSwitch(PLSR_RouteConfig_t* route)
PLSR_Section_SwitchNext(route, 1); // 脉冲完成触发,传入1
/* 启动新段,设置新的脉冲参数和频率 */
PLSR_Section_StartNewSection(route);
// /* 启动PWM输出 */
// PLSR_PWM_Start();
/* 启动PWM输出 */
PLSR_PWM_Start();
}
}
else
@@ -2624,8 +2652,8 @@ void PLSR_TaskSectionSwitch(PLSR_RouteConfig_t* route)
PLSR_Section_SwitchNext(route, 0); // 其他等待条件触发,传入0
/* 启动新段,设置新的脉冲参数和频率 */
PLSR_Section_StartNewSection(route);
// /* 启动PWM输出 */
// PLSR_PWM_Start();
/* 启动PWM输出 */
PLSR_PWM_Start();
}
/* 如果等待条件未满足,保持等待状态,等待下次检查 */
}


+ 447
- 447
PLSR/PLSR/EWARM/test.1.dep
ファイル差分が大きすぎるため省略します
ファイルの表示


バイナリ
PLSR/PLSR/EWARM/test.1/Exe/test.1.sim ファイルの表示


読み込み中…
キャンセル
保存