Pārlūkot izejas kodu

修改PWM停止和启动逻辑

1
JIU JIALIN pirms 1 mēnesi
vecāks
revīzija
83b25c81b8
3 mainītis faili ar 469 papildinājumiem un 452 dzēšanām
  1. +35
    -18
      PLSR/PLSR/Core/Src/tim.c
  2. +434
    -434
      PLSR/PLSR/EWARM/test.1.dep
  3. Binārs
      PLSR/PLSR/EWARM/test.1/Exe/test.1.sim

+ 35
- 18
PLSR/PLSR/Core/Src/tim.c Parādīt failu

@@ -647,8 +647,11 @@ void PLSR_PWM_Init(void)
MX_TIM14_Init();
MX_TIM2_Init(); // TIM2恢复用于脉冲计数
MX_TIM6_Init();
// 停止PWM输出
HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);

HAL_TIM_PWM_Start(&htim10, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim11, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim13, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim14, TIM_CHANNEL_1);

BackupSRAM_RestoreData();
}
@@ -667,23 +670,28 @@ void PLSR_PWM_Start(void)
switch(g_plsr_route.output_port)
{
case 0: // TIM10
HAL_TIM_PWM_Start_IT(&htim10, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2); // 设置占空比为50%
//HAL_TIM_PWM_Start_IT(&htim10, TIM_CHANNEL_1);
break;
case 1: // TIM11
HAL_TIM_PWM_Start_IT(&htim11, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2);
//HAL_TIM_PWM_Start_IT(&htim11, TIM_CHANNEL_1);
break;
case 2: // TIM13
HAL_TIM_PWM_Start_IT(&htim13, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2);
//HAL_TIM_PWM_Start_IT(&htim13, TIM_CHANNEL_1);
break;
case 3: // TIM14
HAL_TIM_PWM_Start_IT(&htim14, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2);
//HAL_TIM_PWM_Start_IT(&htim14, TIM_CHANNEL_1);
break;
default: // 默认使用TIM10
HAL_TIM_PWM_Start_IT(&htim10, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2);
//HAL_TIM_PWM_Start_IT(&htim10, TIM_CHANNEL_1);
break;
}
}
@@ -706,23 +714,28 @@ void PLSR_PWM_Stop(void)
switch(g_plsr_route.output_port)
{
case 0: // TIM10
HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); //
//HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
break;
case 1: // TIM11
HAL_TIM_PWM_Stop(&htim11, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); //
//HAL_TIM_PWM_Stop(&htim11, TIM_CHANNEL_1);
break;
case 2: // TIM13
HAL_TIM_PWM_Stop(&htim13, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); //
//HAL_TIM_PWM_Stop(&htim13, TIM_CHANNEL_1);
break;
case 3: // TIM14
HAL_TIM_PWM_Stop(&htim14, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); //
//HAL_TIM_PWM_Stop(&htim14, TIM_CHANNEL_1);
break;
default: // 默认使用TIM10
HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period); //
//HAL_TIM_PWM_Stop(&htim10, TIM_CHANNEL_1);
break;
}
}
@@ -997,7 +1010,7 @@ static void PLSR_UpdateGlobalPulseCount(int32_t current_pulse_count)
s_last_total_pulse = current_pulse_count;
}
// 将32位全局累加脉冲计数分解为两个16位寄存器(支持负数)
int32_t signed_count = g_plsr_total_pulse_count; // 使用有符号数进行计算
int32_t signed_count = g_plsr_location; // 使用有符号数进行计算
ModbusSlave.holding_regs[0x1000] = signed_count & 0xFFFF; // 低16位
ModbusSlave.holding_regs[0x1001] = (signed_count >> 16) & 0xFFFF; // 高16位
}
@@ -1250,7 +1263,8 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route)
// 计算第一部分:v0 -> vt
PLSR_RunState_t part1_state = PLSR_STATE_CONST; // 默认匀速
if (v0 < vt) {
if (v0 < vt)
{
// 需要加速
part1_state = PLSR_STATE_ACCEL;
part1_time = (vt - v0) / a;
@@ -1260,7 +1274,8 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route)
part1_pulse_num = (uint32_t)(temp_calc / 2000);
if(part1_pulse_num == 0) part1_pulse_num = 1; // 防止为0
}
else if (v0 > vt) {
else if (v0 > vt)
{
// 需要减速
part1_state = PLSR_STATE_DECEL;
part1_time = (v0 - vt) / d;
@@ -1279,7 +1294,8 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route)
// 计算第三部分:vt -> 0(必须减速到0)
PLSR_RunState_t part3_state = PLSR_STATE_DECEL;
if (vt > 0) {
if (vt > 0)
{
part3_time = vt / d;
if (part3_time == 0) part3_time = 1;
@@ -1287,7 +1303,9 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route)
uint64_t temp_calc = (uint64_t)vt * part3_time;
part3_pulse_num = (uint32_t)(temp_calc / 2000);
if(part3_pulse_num == 0) part3_pulse_num = 1; // 防止为0
} else {
}
else
{
// 目标频率已经是0,无需第三部分
part3_pulse_num = 0;
part3_time = 0;
@@ -1309,7 +1327,6 @@ void Calculate_PluseNum(PLSR_RouteConfig_t *route)
else if (used_pulses > total_pulses) {
// 脉冲数不足,需要调整运动参数
// 策略:优先保证能减速到0,然后调整第一部分
if (part3_pulse_num <= total_pulses) {
// 第三部分可以完成,调整第一部分
int32_t remaining_pulses = total_pulses - part3_pulse_num;


+ 434
- 434
PLSR/PLSR/EWARM/test.1.dep
Failā izmaiņas netiks attēlotas, jo tās ir par lielu
Parādīt failu


Binārs
PLSR/PLSR/EWARM/test.1/Exe/test.1.sim Parādīt failu


Notiek ielāde…
Atcelt
Saglabāt