|
|
@@ -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; |
|
|
|
} |
|
|
|
|
|
|
|