소스 검색

开TIM3中断后,会自动复位,

Dail 1 년 전
부모
커밋
6c7c1e3301
6개의 변경된 파일2490개의 추가작업 그리고 2473개의 파일을 삭제
  1. 2385 2385
      MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex
  2. BIN
      MDK-ARM/bin/QD007A_CTL_APP.bin
  3. 1 1
      User/Inc/MC_FOC_Driver.h
  4. 9 0
      User/Inc/hall_sensor.h
  5. 2 2
      User/Src/hall_sensor.c
  6. 93 85
      User/Src/tim.c

파일 크기가 너무 크기때문에 변경 상태를 표시하지 않습니다.
+ 2385 - 2385
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 1 - 1
User/Inc/MC_FOC_Driver.h

@@ -10,7 +10,7 @@ extern int32_t UqVoltFlt;
 extern int32_t UdVoltFlt;
 extern uint8_t ShiftOBS_Flag;
 
-extern void FOC_Model(int16_t Ref, int16_t MotorSpeed, uint16_t SVM_Angle, FlagState OBS_Flag);
+extern void FOC_Model(int16_t Ref, int16_t MotorSpeed, uint16_t SVM_Angle, TrueOrFalse_Flag_Struct_t OBS_Flag);
 extern void FOC_Enable(void);
 extern void FOC_Disable(void);
 #endif

+ 9 - 0
User/Inc/hall_sensor.h

@@ -28,6 +28,13 @@ typedef struct
 	TrueOrFalse_Flag_Struct_t BackwardFlag;
 }MC_HallSensorData_Struct_t;
 
+//虚拟位置
+typedef struct
+{
+  uint16_t Fren;
+	uint16_t SVM_Angle;
+}MC_VirtualPosition_Struct_t;
+
 //霍尔传感器输出状态
 typedef struct
 {
@@ -39,6 +46,8 @@ extern const uint8_t HallSensorGroup_Encoder_Forward[8];
 extern const uint8_t HallSensorGroup_Encoder_Backward[8];
 
 extern MC_HallSensorData_Struct_t MC_HallSensorData;
+//虚拟位置
+extern MC_VirtualPosition_Struct_t MC_VirtualPosition;
 
 extern uint8_t Hall_ReadState(void);
 extern void HallSensor_GPIO_Init(void);

+ 2 - 2
User/Src/hall_sensor.c

@@ -21,9 +21,9 @@ const uint16_t HallAngle_Data[8] =
 //全局变量定义
 MC_HallSensorData_Struct_t MC_HallSensorData = {0, 0, 0, 0, True, True, 0};
 
-/**************************局部函数定义*************************/
-
+MC_VirtualPosition_Struct_t MC_VirtualPosition = {20, 0};
 
+/**************************局部函数定义*************************/
 
 /**************************全局函数定义*************************/
 //读取霍尔传感器IO状态

+ 93 - 85
User/Src/tim.c

@@ -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 */

이 변경점에서 너무 많은 파일들이 변경되어 몇몇 파일들은 표시되지 않았습니다.