Bläddra i källkod

1、增加调试模式,在调试模式下定时上报调试信息;
2、增加0x2DF0指令,用于修改指定地址RAM参数,例如PID在线参数修改;
3、解决调试模式下,不能接收仪表设置挡位的问题。

Dail 1 år sedan
förälder
incheckning
a5a5831aed

+ 7 - 3
Core/Src/main.c

@@ -296,6 +296,9 @@ int main(void)
 			//更新电机运行信息
 			MC_RunInfo_Update();
 			
+			//更新电机调试信息
+			MC_DebugInfo_Update();
+			
 			//计算运行总时间
 			MC_RunTime_Cal(&MC_RunLog1.RunTime);
 			
@@ -344,9 +347,10 @@ int main(void)
 			//发送故障码
 			MC_SendErrorCode_Process(MC_ErrorCode);
 			
-			//配置模式,主动发送电机运行信息
+			//非运行模式,主动发送电机运行信息和调试
 			#if 1
 			MC_SendRunInfo_Process(MC_WorkMode);
+			MC_SendDebugInfo_Process(MC_WorkMode);
 			#endif
 			
 			//定时发送传感器数据给TE
@@ -356,9 +360,9 @@ int main(void)
 			SpdProportion_calculate();
 			
 			//变速器处理
-            GearBox_Loop();
+      GearBox_Loop();
 
-            //MCU自检
+      //MCU自检
 			STU_TimeBase();
 			STU_DoRunTimeChecks();
 			

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 2617 - 2617
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


BIN
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 2 - 1
User/Inc/motor_control.h

@@ -25,7 +25,8 @@ typedef struct
 typedef enum
 {
   MC_WorkMode_Run = 0U,
-	MC_WorkMode_Config
+	MC_WorkMode_Config = 1U,
+	MC_WorkMode_Debug = 2U
 }MC_WorkMode_Struct_t;
 
 typedef enum

+ 2 - 0
User/Inc/tasks.h

@@ -11,8 +11,10 @@ extern To_Te_SendStep IsSendDataToTE_Step;
 extern void CanRx_Process(void);
 extern void UartRx_Process(void);
 extern void MC_RunInfo_Update(void);
+extern void MC_DebugInfo_Update(void);
 extern void MC_SendErrorCode_Process(MC_ErrorCode_Struct_t ErrorCode);
 extern void MC_SendRunInfo_Process(MC_WorkMode_Struct_t WorkMode);
+extern void MC_SendDebugInfo_Process(MC_WorkMode_Struct_t WorkMode);
 extern void MC_TE_SensorData_Process(MC_TE_SensorData_Struct_t* p_MC_TE_SensorData);
 extern uint8_t MC_CadenceLimit_Cal(uint8_t Cadence, uint16_t Current, uint8_t T_Coil);
 extern void PowerOff_Process(TrueOrFalse_Flag_Struct_t ReturnEnable);

+ 21 - 0
User/Inc/var.h

@@ -51,6 +51,26 @@ typedef struct
 	uint8_t GearBoxInfo;                         //自动变速器运行信息 1byte
 }MC_RunInfo_Struct_t;
 
+//电机调试信息,占用空间32bytes
+typedef struct
+{
+  uint8_t SysFSM1;                    //系统功能状态机1,赋值助力模式
+	uint8_t SysFSM2;                    //系统功能状态机2,赋值助力模式
+	uint8_t SysFSM3;                    //系统功能状态机3,赋值助力模式
+	uint8_t SysFSM4;                    //系统功能状态机4,赋值助力模式
+  int16_t IdRef;                      //D轴参考电流
+	int16_t IqRef;                      //Q轴参考电流
+	int16_t UdRef;                      //D轴参考电压
+	int16_t UqRef;                      //Q轴参考电压
+	uint16_t PedalTorquePer;            //踩踏瞬时力矩
+	uint16_t PedalTorqueAvg;            //踩踏时域滤波力矩
+	uint16_t PedalTorqueByCad;          //踩踏踏频滤波力矩
+	int16_t IdFdb;                      //D轴反馈电流
+	int16_t IqFdb;                      //Q轴反馈电流
+	uint16_t AssistOut;                 //助力输出值
+	uint8_t RS[8];
+}MC_DebugInfo_Struct_t;
+
 //电机故障码,占用空间4bytes
 typedef union
 {
@@ -494,6 +514,7 @@ extern const uint16_t Ver_Table[11];
 
 /**************************全局变量声明Begin*************************/
 extern MC_RunInfo_Struct_t MC_RunInfo;
+extern MC_DebugInfo_Struct_t MC_DebugInfo;
 extern MC_ErrorCode_Struct_t MC_ErrorCode;
 extern MC_VerInfo_Struct_t MC_VerInfo;
 extern char Firmware_Special[32];

+ 5 - 5
User/Src/MC_PID_regulators.c

@@ -508,7 +508,7 @@ void PID_Init (uint8_t SerialNum)
 *******************************************************************************/
 
 /******************************PID 调节函数的说明******************************/
-int16_t PID_Regulator(int16_t hReference, int16_t hPresentFeedback,PID_Struct_t *PID_Struct)
+int16_t PID_Regulator(int16_t hReference, int16_t hPresentFeedback, PID_Struct_t *PID_Struct)
 {
   int16_t wError;
 	int32_t	wProportional_Term,wIntegral_Term, houtput_32;
@@ -545,14 +545,14 @@ int16_t PID_Regulator(int16_t hReference, int16_t hPresentFeedback,PID_Struct_t
 		
 	}
   // Differential term computation
-	houtput_32 = (wProportional_Term/PID_Struct->hKp_Divisor) + 	//不含微分环节的总调节量  <Q16
-								(PID_Struct->wIntegral/PID_Struct->hKi_Divisor);  
+	houtput_32 = (wProportional_Term / PID_Struct->hKp_Divisor) + 	//不含微分环节的总调节量  <Q16
+								(PID_Struct->wIntegral / PID_Struct->hKi_Divisor);  
 
-	if((houtput_32<0)&&(houtput_32<PID_Struct->hLower_Limit_Output)) //超下限
+	if((houtput_32 < 0) && (houtput_32 < PID_Struct->hLower_Limit_Output)) //超下限
 	{
 		return(PID_Struct->hLower_Limit_Output);
 	}
-	if((houtput_32>0)&&(houtput_32>=PID_Struct->hUpper_Limit_Output))	   //测试输出是否饱和,超上限
+	if((houtput_32 > 0) && (houtput_32 >= PID_Struct->hUpper_Limit_Output))	   //测试输出是否饱和,超上限
 	{
 		return(PID_Struct->hUpper_Limit_Output);		  			 	
 	}

+ 14 - 4
User/Src/can_process.c

@@ -151,7 +151,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				#if 1  // PBU/OBC发送给MC的指令
 				case 0x3002://控制电机指令
 				{
-				  if(MC_WorkMode == MC_WorkMode_Run)
+				  if(MC_WorkMode != MC_WorkMode_Config)
 					{
 					  memcpy(&MC_ControlCode.GearSt, Data, DataLength);
 					  Update_MC_ControlCode_Back();
@@ -263,7 +263,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				}
 				case 0x3708://ECU控制指令
 				{
-				if(MC_WorkMode == MC_WorkMode_Run)
+				if(MC_WorkMode != MC_WorkMode_Config)
 					{
 					  memcpy(&MC_ControlCode.GearSt, Data, 2);
 					  Update_MC_ControlCode_Back();
@@ -551,7 +551,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				  MC_WorkMode = (MC_WorkMode_Struct_t)*Data;
 					MC_WorkMode_Back = (MC_WorkMode_Struct_t)~MC_WorkMode;
 					//配置模式时,清除设备校验失败故障码
-					if(MC_WorkMode == MC_WorkMode_Config)
+					if(MC_WorkMode != MC_WorkMode_Run)
 					{
 					  MC_ErrorCode.ERROR_Bit.Fault_BMS_Check = 0;
 						MC_ErrorCode.ERROR_Bit.Fault_PBU_Check = 0;
@@ -712,7 +712,7 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 				  MC_WalkMode_Persent = Data[0];
 					break;
 				}
-        case 0x2D08://读取Flash存储器指定地址数据
+        case 0x2D08://读取RAM或FLASH存储器指定地址数据
 				{
 				  do
 					{
@@ -723,6 +723,16 @@ void DataProcess(uint16_t ID, uint8_t Mode, uint16_t Cmd, uint8_t* Data)
 					}while(0);
 					break;
 				}
+				case 0x2DF0://指定RAM寄存器写入地址,前面8个字节是起始地址,长度 = 结束地址 - 起始地址 + 1,有效数据长度为232Bytes
+				{
+					do
+					{
+					  uint32_t DataLength;
+						DataLength = (uint32_t)((Data[4] << 24) + (Data[5] << 16) + (Data[6] << 8) + (Data[7])) - (uint32_t)((Data[0] << 24) + (Data[1] << 16) + (Data[2] << 8) + (Data[3])) + 1;
+						memcpy((uint8_t*)((Data[0] << 24) + (Data[1] << 16) + (Data[2] << 8) + (Data[3])), (uint8_t*)(Data + 8), DataLength);
+						SendData(ID_MC_TO_CDL, MODE_REPORT, 0xA903, (uint8_t*)"ACK");
+					}while(0);
+				}
 				case 0x2E00://查询骑行历史信息
 				{
 					SendData(ID_MC_BC, MODE_REPORT, 0x1510, (uint8_t*)&MC_RideLog.ODO_Km);

+ 1 - 1
User/Src/fault_check.c

@@ -146,7 +146,7 @@ void MC_Fault_TorqueSensor_Process(uint16_t* SensorData,
 	
 	static ToruqeSensorFaultCheck_Struct_t ToruqeSensorFaultCheck_Struct_t[3]; //ÓÃÓÚ´«¸ÐÆ÷1\2\3µÄÅжÏ
 		
-	if((HAL_GetTick() < 5000) || (MC_WorkMode == MC_WorkMode_Config))
+	if((HAL_GetTick() < 5000) || (MC_WorkMode == MC_WorkMode_Config) || (MC_WorkMode == MC_WorkMode_Debug))
 	{	  
 		ToruqeSensorFaultCheck_Struct_t[0].TrigTimeCnt_1 = HAL_GetTick();
 		ToruqeSensorFaultCheck_Struct_t[0].TrigTimeCnt_2 = HAL_GetTick();

+ 26 - 27
User/Src/motor_control.c

@@ -775,8 +775,31 @@ MC_CalParam_Struct_t MC_AssistRunMode_Walk_Process(MC_WorkMode_Struct_t p_MC_Wor
 	int16_t SpdMotorByIdc = 0;
 	uint8_t StepData = 0;
 	
-	//配置模式,设定转速 = 最高转速
-	if(p_MC_WorkMode == MC_WorkMode_Config)
+	//运行模式,设定转速 = 设置值
+	if(p_MC_WorkMode == MC_WorkMode_Run)
+	{
+		uint8_t WalkMode_MotorSpeedSet = 0;
+		
+		//新增配置项,兼容旧电机
+		WalkMode_MotorSpeedSet = (MC_ConfigParam1.WalkMode_MotorSpeedSet == 0) ? 135 : MC_ConfigParam1.WalkMode_MotorSpeedSet;
+		
+		if(MC_WalkProcess_Param.MotorSpeedSetBigin < (WalkMode_MotorSpeedSet << 5) - 10)
+		{
+		  MC_WalkProcess_Param.MotorSpeedSetBigin += 1;
+		}
+		else if(MC_WalkProcess_Param.MotorSpeedSetBigin > (WalkMode_MotorSpeedSet << 5) + 10)
+		{
+		  MC_WalkProcess_Param.MotorSpeedSetBigin -= 1;
+		}
+		else
+		{
+		  MC_WalkProcess_Param.MotorSpeedSetBigin = WalkMode_MotorSpeedSet << 5;
+		}
+		//根据SOC计算限流
+	  SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 500 * MC_LimitCurrent_Cal_K_BySOC((((MC_ConfigParam1.CurrentLimit >> 7) & 0x01) == 0 ? ENABLE : DISABLE), MC_RunInfo.SOC)) >> 17, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower); // 母线电流闭环
+	}	
+	//配置模式或调试模式,设定转速 = 最高转速
+	else
 	{
 	  StepData = (MC_MotorParam.Rate_Speed << 5) / 5000;//设计5s加速到最大值
 		StepData = (StepData < 1) ? 1 : StepData;
@@ -802,36 +825,12 @@ MC_CalParam_Struct_t MC_AssistRunMode_Walk_Process(MC_WorkMode_Struct_t p_MC_Wor
 		SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 1000) >> 7, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower); // 母线电流闭环
 	}
 	
-	//运行模式,设定转速 = 设置值
-	else
-	{
-		uint8_t WalkMode_MotorSpeedSet = 0;
-		
-		//新增配置项,兼容旧电机
-		WalkMode_MotorSpeedSet = (MC_ConfigParam1.WalkMode_MotorSpeedSet == 0) ? 135 : MC_ConfigParam1.WalkMode_MotorSpeedSet;
-		
-		if(MC_WalkProcess_Param.MotorSpeedSetBigin < (WalkMode_MotorSpeedSet << 5) - 10)
-		{
-		  MC_WalkProcess_Param.MotorSpeedSetBigin += 1;
-		}
-		else if(MC_WalkProcess_Param.MotorSpeedSetBigin > (WalkMode_MotorSpeedSet << 5) + 10)
-		{
-		  MC_WalkProcess_Param.MotorSpeedSetBigin -= 1;
-		}
-		else
-		{
-		  MC_WalkProcess_Param.MotorSpeedSetBigin = WalkMode_MotorSpeedSet << 5;
-		}
-		//根据SOC计算限流
-	  SpdMotorByIdc = PID_Regulator((MC_ConfigParam1.CurrentLimit * 500 * MC_LimitCurrent_Cal_K_BySOC((((MC_ConfigParam1.CurrentLimit >> 7) & 0x01) == 0 ? ENABLE : DISABLE), MC_RunInfo.SOC)) >> 17, MC_RunInfo.BusCurrent >> 7, &PID_ConstantPower); // 母线电流闭环
-	}
-	
 	//速度环
 	TorQueBySpd = PID_Regulator((MC_WalkProcess_Param.MotorSpeedSetBigin >> 5), MC_RunInfo.MotorSpeed, &PID_MotorSpd); // 电机速度闭环输出
 	TorQueBySpd += SpdMotorByIdc;
 	
 	//限制车速低于设置值
-	if(p_MC_WorkMode != MC_WorkMode_Config) //运行模式,推行限速
+	if(p_MC_WorkMode == MC_WorkMode_Run) //运行模式,推行限速
 	{
 		uint8_t WalkMode_SpeedLimit = 0;
 		

+ 47 - 0
User/Src/tasks.c

@@ -18,6 +18,8 @@
 #include "encrypt.h"
 #include "enviolo_can.h"
 #include "light_driver.h"
+#include "MC_Globals.h"
+#include "MC_FOC_Driver.h"
 
 /************************全局变量************************/
 TrueOrFalse_Flag_Struct_t IsInitFinish_Flag = FALSE;
@@ -290,6 +292,31 @@ void MC_RunInfo_Update(void)
 	}
 }
 
+//调试信息更新
+void MC_DebugInfo_Update(void)
+{
+  static uint32_t PeriodTimeCnt = 0;
+		
+	if((HAL_GetTick() - PeriodTimeCnt) >= 100)
+	{
+	  PeriodTimeCnt = HAL_GetTick();
+		MC_DebugInfo.SysFSM1 = MC_CalParam.AssistRunMode;
+		MC_DebugInfo.SysFSM2 = FOC_Status;
+		MC_DebugInfo.SysFSM3 = 0;
+		MC_DebugInfo.SysFSM4 = 0;
+		MC_DebugInfo.IdRef = Stat_Curr_q_d.qI_Component2;
+		MC_DebugInfo.IqRef = Stat_Curr_q_d.qI_Component1;
+		MC_DebugInfo.UdRef = Stat_Volt_q_d.qV_Component2;
+		MC_DebugInfo.UqRef = Stat_Volt_q_d.qV_Component1;
+		MC_DebugInfo.PedalTorquePer = MC_RunInfo.Torque;
+		MC_DebugInfo.PedalTorqueAvg = 0;
+		MC_DebugInfo.PedalTorqueByCad = MC_CadenceResult.torqueByCadence;
+		MC_DebugInfo.IdFdb = IdFdbFlt >> 10;
+		MC_DebugInfo.IqFdb = IqFdbFlt >> 10;
+		MC_DebugInfo.AssistOut = (MC_CalParam.AssistRunMode == MC_AssistRunMode_TORQUE) ? MC_CalParam.Ref_Torque : MC_CalParam.Ref_Speed;		
+	}
+}
+
 //MC故障码发送
 void MC_SendErrorCode_Process(MC_ErrorCode_Struct_t ErrorCode)
 {
@@ -333,6 +360,26 @@ void MC_SendRunInfo_Process(MC_WorkMode_Struct_t WorkMode)
 	}
 }
 
+//MC主动发送运行信息
+void MC_SendDebugInfo_Process(MC_WorkMode_Struct_t WorkMode)
+{
+  static uint32_t PeriodTimeCnt = 0;
+	
+	if(WorkMode == MC_WorkMode_Debug)
+	{
+	  if((HAL_GetTick() - PeriodTimeCnt) >= 200)
+		{
+		  SendData(ID_MC_BC, MODE_REPORT, 0x1020, (uint8_t*)&MC_RunInfo.BikeSpeed);
+			SendData(ID_MC_TO_CDL, MODE_REPORT, 0xBA20, (uint8_t*)&MC_DebugInfo.SysFSM1);
+			PeriodTimeCnt = HAL_GetTick();
+		}
+	}
+	else
+	{
+	  PeriodTimeCnt = HAL_GetTick();
+	}
+}
+
 //发给TE的传感器数据扫描
 void MC_TE_SensorScan(MC_TE_SensorData_Struct_t* p_MC_TE_SensorData)
 {

+ 1 - 0
User/Src/var.c

@@ -2,6 +2,7 @@
 #include "torque_sensor.h"
 
 MC_RunInfo_Struct_t MC_RunInfo;                           //MC运行信息
+MC_DebugInfo_Struct_t MC_DebugInfo;                       //MC调试信息
 MC_ErrorCode_Struct_t MC_ErrorCode;                       //MC故障代码
 MC_VerInfo_Struct_t MC_VerInfo;                           //MC版本信息
 char Firmware_Special[32];                                //MC软件版本特性说明

Vissa filer visades inte eftersom för många filer har ändrats