|
@@ -278,7 +278,7 @@ void MX_TIM3_Init(void)
|
|
|
htim3.Instance = TIM3;
|
|
|
htim3.Init.Prescaler = 0;
|
|
|
htim3.Init.CounterMode = TIM_COUNTERMODE_UP;
|
|
|
- htim3.Init.Period = 71; //频率1MHz
|
|
|
+ htim3.Init.Period = 1098 / MC_VirtualPosition.Fren - 1; //电角度频率f = 72MHz / (分频系数 + 1) / 65535
|
|
|
htim3.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
|
|
|
htim3.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_ENABLE;
|
|
|
if (HAL_TIM_PWM_Init(&htim3) != HAL_OK)
|
|
@@ -294,7 +294,7 @@ void MX_TIM3_Init(void)
|
|
|
}
|
|
|
|
|
|
sConfigOC.OCMode = TIM_OCMODE_PWM1;
|
|
|
- sConfigOC.Pulse = 36;
|
|
|
+ sConfigOC.Pulse = (1098 / MC_VirtualPosition.Fren) >> 1;
|
|
|
sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
|
|
|
sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
|
|
|
if (HAL_TIM_PWM_ConfigChannel(&htim3, &sConfigOC, TIM_CHANNEL_1) != HAL_OK)
|
|
@@ -317,8 +317,9 @@ void HAL_TIM_PWM_MspInit(TIM_HandleTypeDef* tim_pwmHandle)
|
|
|
/* TIM3 clock enable */
|
|
|
__HAL_RCC_TIM3_CLK_ENABLE();
|
|
|
/* USER CODE BEGIN TIM3_MspInit 1 */
|
|
|
- HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
|
|
|
- HAL_NVIC_EnableIRQ(TIM3_IRQn);
|
|
|
+ HAL_NVIC_SetPriority(TIM3_IRQn, 0, 0);
|
|
|
+ HAL_NVIC_EnableIRQ(TIM3_IRQn);
|
|
|
+ //__HAL_TIM_ENABLE_IT(&htim3, TIM_IT_UPDATE);
|
|
|
/* USER CODE END TIM3_MspInit 1 */
|
|
|
}
|
|
|
}
|
|
@@ -370,99 +371,106 @@ void HAL_TIM_PWM_MspDeInit(TIM_HandleTypeDef* tim_pwmHandle)
|
|
|
|
|
|
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
|
|
|
{
|
|
|
- static uint8_t ADC_PreCnt = 0;
|
|
|
- static TrueOrFalse_Flag_Struct_t IsPwmEnableFlag = False;
|
|
|
- static uint32_t FaultDelayTimeCnt = 0;
|
|
|
-
|
|
|
- #if 1
|
|
|
- static uint16_t PeriodTest = 0;
|
|
|
- //运行频率测试
|
|
|
- PeriodTest ++;
|
|
|
- if(PeriodTest >= 300) //频率15K,周期200 / 3 us * 300 = 20ms
|
|
|
- {
|
|
|
- PeriodTest = 0;
|
|
|
- }
|
|
|
- #endif
|
|
|
-
|
|
|
- //Light控制
|
|
|
- LightDriver_Process(MC_ConfigParam2.MC_TailLight_Mode, MC_ConfigParam2.HeadLightVol, MC_ConfigParam2.TailLightVol, IsBreakTrig_Flag, MC_ControlCode.LightSwitch);
|
|
|
-
|
|
|
- //ADC采集分频
|
|
|
- ADC_PreCnt++;
|
|
|
- if(ADC_PreCnt >= 5)
|
|
|
+ if(htim->Instance == htim3.Instance)
|
|
|
{
|
|
|
- __HAL_ADC_ENABLE(&hadc1);
|
|
|
- ADC_PreCnt = 0;
|
|
|
+ if(MC_VirtualPosition.SVM_Angle++ >= 65535)
|
|
|
+ MC_VirtualPosition.SVM_Angle = 0;
|
|
|
}
|
|
|
-
|
|
|
- //霍尔传感器状态更新
|
|
|
- MC_HallSensorData.PWM_NumCnt++;
|
|
|
- HallSensor_Process();
|
|
|
- if(MC_HallSensorData.Delta_AngleSum < (ANGLE_60D + (ANGLE_60D >> 3)))
|
|
|
- {
|
|
|
- MC_HallSensorData.SVM_Angle += MC_HallSensorData.Delta_Angle;
|
|
|
- MC_HallSensorData.Delta_AngleSum += MC_HallSensorData.Delta_Angle;
|
|
|
- }
|
|
|
-
|
|
|
- //计算电机转速
|
|
|
- MC_RunInfo.MotorSpeed = MotorSpeedCal(MC_HallSensorData.SVM_Angle, MC_HallSensorData.IsStopFlag);
|
|
|
-
|
|
|
- //过流检测
|
|
|
- MC_Protect_OverCurrent_Process(&MC_Protect_OverCurrentTrig_Flag, &MC_ErrorCode);
|
|
|
-
|
|
|
- //FOC运算
|
|
|
- if(((uint8_t)(MC_CalParam.AssistRunMode ^ MC_CalParam_Back.AssistRunMode) != (uint8_t)~0) ||
|
|
|
- ((uint8_t)(MC_CalParam.Foc_Flag ^ MC_CalParam_Back.Foc_Flag) != (uint8_t)~0) ||
|
|
|
- ((uint16_t)(MC_CalParam.Ref_Speed ^ MC_CalParam_Back.Ref_Speed) != (uint16_t)~0)||
|
|
|
- ((uint16_t)(MC_CalParam.Ref_Torque ^ MC_CalParam_Back.Ref_Torque) != (uint16_t)~0))
|
|
|
- {
|
|
|
- if((HAL_GetTick() - FaultDelayTimeCnt) > 200)
|
|
|
+ else if(htim->Instance == htim1.Instance)
|
|
|
+ {
|
|
|
+ static uint8_t ADC_PreCnt = 0;
|
|
|
+ static TrueOrFalse_Flag_Struct_t IsPwmEnableFlag = False;
|
|
|
+ static uint32_t FaultDelayTimeCnt = 0;
|
|
|
+
|
|
|
+ #if 1
|
|
|
+ static uint16_t PeriodTest = 0;
|
|
|
+ //运行频率测试
|
|
|
+ PeriodTest ++;
|
|
|
+ if(PeriodTest >= 300) //频率15K,周期200 / 3 us * 300 = 20ms
|
|
|
{
|
|
|
- FOC_Status = FOC_Status_WAIT;
|
|
|
+ PeriodTest = 0;
|
|
|
}
|
|
|
- }
|
|
|
- else
|
|
|
- {
|
|
|
- FaultDelayTimeCnt = HAL_GetTick();
|
|
|
- }
|
|
|
- switch(FOC_Status)
|
|
|
- {
|
|
|
- case FOC_Status_RUN:
|
|
|
+ #endif
|
|
|
+
|
|
|
+ //Light控制
|
|
|
+ LightDriver_Process(MC_ConfigParam2.MC_TailLight_Mode, MC_ConfigParam2.HeadLightVol, MC_ConfigParam2.TailLightVol, IsBreakTrig_Flag, MC_ControlCode.LightSwitch);
|
|
|
+
|
|
|
+ //ADC采集分频
|
|
|
+ ADC_PreCnt++;
|
|
|
+ if(ADC_PreCnt >= 5)
|
|
|
+ {
|
|
|
+ __HAL_ADC_ENABLE(&hadc1);
|
|
|
+ ADC_PreCnt = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ //霍尔传感器状态更新
|
|
|
+ MC_HallSensorData.PWM_NumCnt++;
|
|
|
+ HallSensor_Process();
|
|
|
+ if(MC_HallSensorData.Delta_AngleSum < (ANGLE_60D + (ANGLE_60D >> 3)))
|
|
|
+ {
|
|
|
+ MC_HallSensorData.SVM_Angle += MC_HallSensorData.Delta_Angle;
|
|
|
+ MC_HallSensorData.Delta_AngleSum += MC_HallSensorData.Delta_Angle;
|
|
|
+ }
|
|
|
+
|
|
|
+ //计算电机转速
|
|
|
+ MC_RunInfo.MotorSpeed = MotorSpeedCal(MC_HallSensorData.SVM_Angle, MC_HallSensorData.IsStopFlag);
|
|
|
+
|
|
|
+ //过流检测
|
|
|
+ MC_Protect_OverCurrent_Process(&MC_Protect_OverCurrentTrig_Flag, &MC_ErrorCode);
|
|
|
+
|
|
|
+ //FOC运算
|
|
|
+ if(((uint8_t)(MC_CalParam.AssistRunMode ^ MC_CalParam_Back.AssistRunMode) != (uint8_t)~0) ||
|
|
|
+ ((uint8_t)(MC_CalParam.Foc_Flag ^ MC_CalParam_Back.Foc_Flag) != (uint8_t)~0) ||
|
|
|
+ ((uint16_t)(MC_CalParam.Ref_Speed ^ MC_CalParam_Back.Ref_Speed) != (uint16_t)~0)||
|
|
|
+ ((uint16_t)(MC_CalParam.Ref_Torque ^ MC_CalParam_Back.Ref_Torque) != (uint16_t)~0))
|
|
|
{
|
|
|
- if(MC_CalParam.Foc_Flag == SET)
|
|
|
+ if((HAL_GetTick() - FaultDelayTimeCnt) > 200)
|
|
|
{
|
|
|
- //发波
|
|
|
- if(IsPwmEnableFlag == False)
|
|
|
- {
|
|
|
- Enable_PwmGpio_Out();
|
|
|
- IsPwmEnableFlag = True;
|
|
|
- }
|
|
|
- //参考值设定
|
|
|
- switch(MC_CalParam.AssistRunMode)
|
|
|
+ FOC_Status = FOC_Status_WAIT;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ else
|
|
|
+ {
|
|
|
+ FaultDelayTimeCnt = HAL_GetTick();
|
|
|
+ }
|
|
|
+ switch(FOC_Status)
|
|
|
+ {
|
|
|
+ case FOC_Status_RUN:
|
|
|
+ {
|
|
|
+ if(MC_CalParam.Foc_Flag == SET)
|
|
|
{
|
|
|
- case MC_AssistRunMode_TORQUE://力矩模式
|
|
|
+ //发波
|
|
|
+ if(IsPwmEnableFlag == False)
|
|
|
{
|
|
|
- FOC_Model(MC_CalParam.Ref_Torque, MC_RunInfo.MotorSpeed, MC_HallSensorData.SVM_Angle);
|
|
|
- break;
|
|
|
+ Enable_PwmGpio_Out();
|
|
|
+ IsPwmEnableFlag = True;
|
|
|
}
|
|
|
- case MC_AssistRunMode_WALK: case MC_AssistRunMode_CADENCE: case MC_AssistRunMode_GAS://速度模式
|
|
|
+ //参考值设定
|
|
|
+ switch(MC_CalParam.AssistRunMode)
|
|
|
{
|
|
|
- FOC_Model(MC_CalParam.Ref_Speed, MC_RunInfo.MotorSpeed, MC_HallSensorData.SVM_Angle);
|
|
|
- break;
|
|
|
- }
|
|
|
- default:break;
|
|
|
- }
|
|
|
- }
|
|
|
- break;
|
|
|
- }
|
|
|
- case FOC_Status_WAIT:
|
|
|
- {
|
|
|
- IsPwmEnableFlag = False;
|
|
|
- break;
|
|
|
+ case MC_AssistRunMode_TORQUE://力矩模式
|
|
|
+ {
|
|
|
+ FOC_Model(MC_CalParam.Ref_Torque, MC_RunInfo.MotorSpeed, MC_HallSensorData.SVM_Angle, False);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case MC_AssistRunMode_WALK: case MC_AssistRunMode_CADENCE: case MC_AssistRunMode_GAS://速度模式
|
|
|
+ {
|
|
|
+ FOC_Model(MC_CalParam.Ref_Speed, MC_RunInfo.MotorSpeed, MC_HallSensorData.SVM_Angle, False);
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ case FOC_Status_WAIT:
|
|
|
+ {
|
|
|
+ IsPwmEnableFlag = False;
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ default:break;
|
|
|
}
|
|
|
- default:break;
|
|
|
}
|
|
|
-
|
|
|
}
|
|
|
|
|
|
/* USER CODE END 1 */
|