Kaynağa Gözat

通过步长方式解决频率过高时,因为驱动能力影响导致高电平翻转较慢导致占空比异常的问题

2
JIU JIALIN 1 ay önce
ebeveyn
işleme
d6f77f3fe8
5 değiştirilmiş dosya ile 566 ekleme ve 561 silme
  1. +1
    -0
      PLSR/PLSR/Core/Inc/tim.h
  2. +17
    -13
      PLSR/PLSR/Core/Src/tim.c
  3. +2
    -2
      PLSR/PLSR/EWARM/settings/test.1.dnx
  4. +546
    -546
      PLSR/PLSR/EWARM/test.1.dep
  5. BIN
      PLSR/PLSR/EWARM/test.1/Exe/test.1.sim

+ 1
- 0
PLSR/PLSR/Core/Inc/tim.h Dosyayı Görüntüle

@@ -210,6 +210,7 @@ void PLSR_Section_PWM_Stop(void);
void PLSR_Route_PWM_Stop();
void PLSR_PWM_SetFrequency(uint32_t frequency);
void PLSR_CalculateTimerParams(uint32_t frequency, uint16_t* prescaler, uint32_t* period);
void PLSR_Fix_Compensated(uint32_t frequency, uint32_t* ccr);

// ==================== PLSR路径控制函数 ====================
void PLSR_Route_Init(PLSR_RouteConfig_t* route); //<路径初始化


+ 17
- 13
PLSR/PLSR/Core/Src/tim.c Dosyayı Görüntüle

@@ -141,7 +141,7 @@ void MX_TIM10_Init(void)
htim10.Init.Prescaler = 83; // 预分频器设置为83,计数频率为1MHz
htim10.Init.CounterMode = TIM_COUNTERMODE_UP;
htim10.Init.Period = 9999;
htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV2;
htim10.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
htim10.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
if (HAL_TIM_Base_Init(&htim10) != HAL_OK)
{
@@ -403,7 +403,7 @@ void HAL_TIM_MspPostInit(TIM_HandleTypeDef* timHandle)
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;
GPIO_InitStruct.Alternate = GPIO_AF3_TIM10;
HAL_GPIO_Init(GPIOF, &GPIO_InitStruct);

@@ -597,28 +597,30 @@ void PLSR_PWM_Start(void)
{
if (PlsrRoute.route_state == PLSR_ROUTE_RUNNING) //<只有在路径运行状态下才可以进行pwm输出
{
uint32_t ccr = (htim10.Init.Period + 1) / 2;
PLSR_Fix_Compensated(PlsrRoute.current_freq,&ccr);
StopFlag = 0;
// 根据output_port选择目标定时器并启动PWM输出
switch(PlsrRoute.output_port)
{
case 0: // TIM10
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2); // 设置占空比为50%
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, ccr); // 设置占空比为50%
break;
case 1: // TIM11
__HAL_TIM_SET_COMPARE(&htim11, TIM_CHANNEL_1, htim11.Init.Period / 2); // 设置占空比为50%
__HAL_TIM_SET_COMPARE(&htim11, TIM_CHANNEL_1, ccr); // 设置占空比为50%
break;
case 2: // TIM13
__HAL_TIM_SET_COMPARE(&htim13, TIM_CHANNEL_1, htim13.Init.Period / 2); // 设置占空比为50%
__HAL_TIM_SET_COMPARE(&htim13, TIM_CHANNEL_1, ccr); // 设置占空比为50%
break;
case 3: // TIM14
__HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, htim14.Init.Period / 2); // 设置占空比为50%
__HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, ccr); // 设置占空比为50%
break;
default: // 默认使用TIM10
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, htim10.Init.Period / 2); // 设置占空比为50%
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, ccr); // 设置占空比为50%
break;
}
}
@@ -709,6 +711,7 @@ void PLSR_PWM_SetFrequency(uint32_t frequency)
{
uint16_t prescaler = 0; // 预分频器值
uint32_t period = 0; // 自动重载值(周期)
uint32_t ccr = 0;
// 频率范围检查 - 确保频率在1hz到100khz范围内
if(frequency < PLSR_PWM_FREQ_MIN || frequency > PLSR_PWM_FREQ_MAX)
@@ -718,7 +721,8 @@ void PLSR_PWM_SetFrequency(uint32_t frequency)
// 计算最佳定时器参数 - 根据目标频率计算预分频器和周期值
PLSR_CalculateTimerParams(frequency, &prescaler, &period);
ccr = (period + 1) / 2;
PLSR_Fix_Compensated(frequency,&ccr);
// 参数有效性检查 - 防止period为0导致除零错误
if(period == 0)
{
@@ -731,35 +735,35 @@ void PLSR_PWM_SetFrequency(uint32_t frequency)
__HAL_TIM_SET_PRESCALER(&htim10, prescaler);
__HAL_TIM_SET_AUTORELOAD(&htim10, period);
if(StopFlag == 0)
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, period / 2);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, ccr);
break;
case 1: // TIM11
__HAL_TIM_SET_PRESCALER(&htim11, prescaler);
__HAL_TIM_SET_AUTORELOAD(&htim11, period);
if(StopFlag == 0)
__HAL_TIM_SET_COMPARE(&htim11, TIM_CHANNEL_1, period / 2);
__HAL_TIM_SET_COMPARE(&htim11, TIM_CHANNEL_1, ccr);
break;
case 2: // TIM13
__HAL_TIM_SET_PRESCALER(&htim13, prescaler);
__HAL_TIM_SET_AUTORELOAD(&htim13, period);
if(StopFlag == 0)
__HAL_TIM_SET_COMPARE(&htim13, TIM_CHANNEL_1, period / 2);
__HAL_TIM_SET_COMPARE(&htim13, TIM_CHANNEL_1, ccr);
break;
case 3: // TIM14
__HAL_TIM_SET_PRESCALER(&htim14, prescaler);
__HAL_TIM_SET_AUTORELOAD(&htim14, period);
if(StopFlag == 0)
__HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, period / 2);
__HAL_TIM_SET_COMPARE(&htim14, TIM_CHANNEL_1, ccr);
break;
default: // 默认使用TIM10
__HAL_TIM_SET_PRESCALER(&htim10, prescaler);
__HAL_TIM_SET_AUTORELOAD(&htim10, period);
if(StopFlag == 0)
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, period / 2);
__HAL_TIM_SET_COMPARE(&htim10, TIM_CHANNEL_1, ccr);
break;
}



+ 2
- 2
PLSR/PLSR/EWARM/settings/test.1.dnx Dosyayı Görüntüle

@@ -12,12 +12,12 @@
<ByteLimit>50</ByteLimit>
</Stack>
<StLinkDriver>
<stlinkserialNo>46232557</stlinkserialNo>
<stlinkfoundProbes />
<CStepIntDis>_ 0</CStepIntDis>
<LeaveTargetRunning>_ 0</LeaveTargetRunning>
<stlinkResetStyle>0</stlinkResetStyle>
<stlinkResetStrategy>2</stlinkResetStrategy>
<stlinkserialNo>46232557</stlinkserialNo>
<stlinkfoundProbes />
</StLinkDriver>
<DebugChecksum>
<Checksum>630028761</Checksum>


+ 546
- 546
PLSR/PLSR/EWARM/test.1.dep
Dosya farkı çok büyük olduğundan ihmal edildi
Dosyayı Görüntüle


BIN
PLSR/PLSR/EWARM/test.1/Exe/test.1.sim Dosyayı Görüntüle


Yükleniyor…
İptal
Kaydet