浏览代码

1、修改波特率宏定义方式;
2、修改转把力矩模式曲线,做非线性处理;
3、Iq和Id参考值改为全局变量;
4、助力输出电流限制为非零值。

Dail 1 年之前
父节点
当前提交
0da30c0698

+ 0 - 1
Core/Inc/main.h

@@ -50,7 +50,6 @@
 /* Private define ------------------------------------------------------------*/
 #define DEBUG 1
 #define NormalWork 1
-#define BaudRate250K 1
 #define BREAK_IN_Pin GPIO_PIN_12
 #define BREAK_IN_GPIO_Port GPIOB
 #define BREAK_IN_EXTI_IRQn EXTI15_10_IRQn

+ 2 - 1
Core/Src/adc.c

@@ -505,12 +505,13 @@ void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
 	if( MC_HallSensorData.InverterExistFlag == FALSE )
 	{
 		Temp_32 = (ADC1_Result[ADC1_RANK_CURRENT] - uw_current_offset) * 39449 >> 10; //3300/4095* 0.98/8.2 /0.0025
+		Temp_32 = (Temp_32 <= 0) ? 0 : ((Temp_32 >= 39449) ? 39448 : Temp_32);
 	}
 	else
 	{
 		Temp_32 = (ADC1_Result[ADC1_RANK_CURRENT] - uw_current_offset) * 50000 >> 11;  //3300/4095* 0.98/13 /0.0025
+		Temp_32 = (Temp_32 <= 0) ? 0 : ((Temp_32 >= 50000) ? 50000 : Temp_32);
 	}
-	Temp_32 = (Temp_32 <= 0) ? 0 : ((Temp_32 >= 50000) ? 50000 : Temp_32);
 	IdcFltSum += ((Temp_32 << 10) - IdcFltSum) >> 9;
 	MC_RunInfo.BusCurrent = IdcFltSum >> 10;
 	

+ 4 - 2
Core/Src/can.c

@@ -68,10 +68,12 @@ void MX_CAN_Init(void)
 {
 
   hcan.Instance = CAN1;
-	#if BaudRate250K
+	#if defined BARD_250K
 	hcan.Init.Prescaler = 18;
-	#else
+	#elif defined BARD_125K
 	hcan.Init.Prescaler = 36;
+	#else
+	Error();
 	#endif
   hcan.Init.Mode = CAN_MODE_NORMAL;
   hcan.Init.SJW = CAN_SJW_1TQ;

+ 1 - 1
MDK-ARM/QD007A_CTL_APP.uvprojx

@@ -362,7 +362,7 @@
             <useXO>0</useXO>
             <VariousControls>
               <MiscControls></MiscControls>
-              <Define>USE_HAL_DRIVER,STM32F103xB,VOLANS_36V</Define>
+              <Define>USE_HAL_DRIVER,STM32F103xB,VOLANS_36V,BARD_250K</Define>
               <Undefine></Undefine>
               <IncludePath>../Core/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc;../Drivers/STM32F1xx_HAL_Driver/Inc/Legacy;../Drivers/CMSIS/Device/ST/STM32F1xx/Include;../Drivers/CMSIS/Include;..\User\Inc;..\SEGGER_RTT\Inc;..\SelfTestUser\Inc</IncludePath>
             </VariousControls>

文件差异内容过多而无法显示
+ 2204 - 2204
MDK-ARM/QD007A_CTL_APP/QD007A_CTL_APP_CRC.hex


二进制
MDK-ARM/bin/QD007A_CTL_APP.bin


+ 2 - 0
User/Inc/MC_FOC_Driver.h

@@ -3,6 +3,8 @@
 
 #include "stm32f1xx_hal.h"
 
+extern int32_t IqFluxLessRef;
+extern int32_t IdFluxLessRef;
 extern int32_t IqFdbFlt;
 extern int32_t IdFdbFlt;
 extern int32_t VoltSquareFlt;

+ 2 - 1
User/Src/MC_FOC_Driver.c

@@ -10,6 +10,8 @@
 
 //全局变量定义
 
+int32_t IqFluxLessRef = 0;
+int32_t IdFluxLessRef = 0;
 int32_t IqFdbFlt = 0;
 int32_t IdFdbFlt = 0;
 int32_t VoltSquareFlt = 0;
@@ -26,7 +28,6 @@ void FOC_Model(int16_t Ref, int16_t MotorSpeed, uint16_t SVM_Angle)	  //
 	int32_t VoltSquare = 0;    //弱磁控制预留
 	int32_t VoltMax = 0; 
 	#endif
-	static int32_t IdFluxLessRef = 0, IqFluxLessRef = 0;
 	int32_t UqCal = 0;
 	static int32_t FOC_IqLim = 0;
 	Curr_Components Stat_Curr_a_b;       // Stator currents Ia,Ib

+ 6 - 6
User/Src/MC_PID_regulators.c

@@ -36,7 +36,7 @@ const PID_Struct_t PID_Torque_InitStructure_Volans =
   (int16_t)0,          //hKd_Gain
   (uint16_t)1024,      //hKd_Divisor
   (int32_t)0,          //wPreviousError
-  (int32_t)-100,     //hLower_Limit_Output   //电流环给微弱的负值,给转子施加反向扭矩让电机可以缓慢降速
+  (int32_t)-100,       //hLower_Limit_Output   //电流环给微弱的负值,给转子施加反向扭矩让电机可以缓慢降速
   (int32_t)32767,      //hUpper_Limit_Output
   (int32_t)(-32768 * 1024),  //wLower_Limit_Integral
   (int32_t)(32767 * 1024),   //wUpper_Limit_Integral
@@ -197,7 +197,7 @@ const PID_Struct_t PID_MotorSpd_Volans_Plus =
   (int16_t)0,           //hKd_Gain
   (uint16_t)1024,       //hKd_Divisor
   (int32_t)0,           //wPreviousError
-  (int32_t)-100,       //hLower_Limit_Output
+  (int32_t)-100,        //hLower_Limit_Output
   (int32_t)1050,        //hUpper_Limit_Output
   (int32_t)-102400,     //wLower_Limit_Integral
   (int32_t)1075200,      //wUpper_Limit_Integral
@@ -294,7 +294,7 @@ const PID_Struct_t PID_MotorSpd_Pegasi =
   (int16_t)0,           //hKd_Gain
   (uint16_t)1024,       //hKd_Divisor
   (int32_t)0,           //wPreviousError
-  (int32_t)-100,       //hLower_Limit_Output
+  (int32_t)-100,        //hLower_Limit_Output
   (int32_t)1050,        //hUpper_Limit_Output
   (int32_t)-102400,     //wLower_Limit_Integral
   (int32_t)1075200,      //wUpper_Limit_Integral
@@ -327,7 +327,7 @@ const PID_Struct_t PID_Torque_InitStructure_Pegasi_Plus =
   (int16_t)0,          //hKd_Gain
   (uint16_t)1024,      //hKd_Divisor
   (int32_t)0,          //wPreviousError
-  (int32_t)-100,     //hLower_Limit_Output   //电流环给微弱的负值,给转子施加反向扭矩让电机可以缓慢降速
+  (int32_t)-100,       //hLower_Limit_Output   //电流环给微弱的负值,给转子施加反向扭矩让电机可以缓慢降速
   (int32_t)32767,      //hUpper_Limit_Output
   (int32_t)(-32768 * 1024),  //wLower_Limit_Integral
   (int32_t)(32767 * 1024),   //wUpper_Limit_Integral
@@ -391,7 +391,7 @@ const PID_Struct_t PID_MotorSpd_Pegasi_Plus =
   (int16_t)0,           //hKd_Gain
   (uint16_t)1024,       //hKd_Divisor
   (int32_t)0,           //wPreviousError
-  (int32_t)-100,       //hLower_Limit_Output
+  (int32_t)-100,        //hLower_Limit_Output
   (int32_t)1050,        //hUpper_Limit_Output
   (int32_t)-102400,     //wLower_Limit_Integral
   (int32_t)1075200,      //wUpper_Limit_Integral
@@ -401,7 +401,7 @@ const PID_Struct_t PID_MotorSpd_Pegasi_Plus =
 const PID_Struct_t PID_IMax_Pegasi_Plus = 
 {
 	(int16_t)30000,      //hKp_Gain
-  (uint16_t)1024,       //hKp_Divisor
+  (uint16_t)1024,      //hKp_Divisor
 	(int16_t)300,        //hKi_Gain
   (uint16_t)1024,      //hKi_Divisor
   (int16_t)0,          //hKd_Gain

+ 8 - 5
User/Src/motor_control.c

@@ -528,8 +528,8 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasTorque_Process(MC_GasMode_Struct_t GasM
 	static uint8_t TorqueRefEndUpdateCount = 0;
 	
 	
-	//踩踏力矩输入
-  MC_TorqueProcess_Param.TorqueApp = (GasSensorData < TorqueSensorData) ? TorqueSensorData : GasSensorData;
+	//力矩输入
+  MC_TorqueProcess_Param.TorqueApp = (GasSensorData < TorqueSensorData) ? ((TorqueSensorData * TorqueSensorData) >> 11) : ((GasSensorData * GasSensorData) >> 11);
 	MC_TorqueProcess_Param.TorqueApp = (MC_TorqueProcess_Param.TorqueApp > 2048) ? 2048 : MC_TorqueProcess_Param.TorqueApp;
 
   //输出目标力矩
@@ -752,14 +752,15 @@ MC_CalParam_Struct_t MC_AssistRunMode_GasTorque_Process(MC_GasMode_Struct_t GasM
 	#endif
 	
   //根据SOC计算限流
-	IqRefByInPower = PID_Regulator((CurrentLimitPresent * MC_LimitCurrent_Cal_K_BySOC((((MC_ConfigParam1.CurrentLimit >> 7) & 0x01) == 0 ? ENABLE : DISABLE), MC_RunInfo.SOC) / 100) >> 10, (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
+	IqRefByInPower = PID_Regulator((CurrentLimitPresent * MC_LimitCurrent_Cal_K_BySOC((((MC_ConfigParam1.CurrentLimit >> 7) & 0x01) == 0 ? ENABLE : DISABLE), MC_RunInfo.SOC) / 100) >> 10, 
+	                               (MC_RunInfo.BusCurrent >> 7), &PID_IMax);
 
 	Torque_Ref_Temp = ((int32_t)MC_TorqueProcess_Param.TorqueRefEnd * K_ByVoltage_Result) >> 10;
 	Torque_Ref_Temp = (Torque_Ref_Temp * K_ByTemperature_Result) >> 10;
 	Torque_Ref_Temp = (Torque_Ref_Temp + IqRefByInPower) >> 1;
 	
 	//Iq输出
-	p_MC_CalParam.Ref_Torque = (int16_t)Torque_Ref_Temp;
+	p_MC_CalParam.Ref_Torque = (int16_t)(Torque_Ref_Temp < 0 ? 0 : Torque_Ref_Temp);
 	p_MC_CalParam.Foc_Flag = SET;
 	p_MC_CalParam.AssistRunMode = MC_AssistRunMode_GAS;
 	
@@ -1384,7 +1385,7 @@ MC_CalParam_Struct_t MC_AssistRunMode_Torque_Process(uint16_t SenorData, MC_Gear
 	Torque_Ref_Temp = (Torque_Ref_Temp + IqRefByInPower) >> 1;
 	
 	//Iq输出
-	p_MC_CalParam.Ref_Torque = (int16_t)Torque_Ref_Temp;
+	p_MC_CalParam.Ref_Torque = (int16_t)(Torque_Ref_Temp < 0 ? 0 : Torque_Ref_Temp);;
 	p_MC_CalParam.Foc_Flag = SET;
 	p_MC_CalParam.AssistRunMode = MC_AssistRunMode_TORQUE;
 	
@@ -1458,6 +1459,8 @@ void MC_ControlParam_Init(void)
 	MC_TorqueProcess_Param.TorqueRefEnd = 0;
 	
 	//全局运算变量归零
+	IqFluxLessRef = 0;
+	IdFluxLessRef = 0;
 	IqFdbFlt =0;
 	IdFdbFlt = 0;
 	VoltSquareFlt = 0;

+ 3 - 3
User/Src/tasks.c

@@ -306,14 +306,14 @@ void MC_DebugInfo_Update(void)
 		MC_DebugInfo.SysFSM2 = FOC_Status;                                //FOC状态
 		MC_DebugInfo.SysFSM3 = 0;
 		MC_DebugInfo.SysFSM4 = 0;
-		MC_DebugInfo.IdRef = Stat_Curr_q_d.qI_Component2;                 //IdRef
-		MC_DebugInfo.IqRef = Stat_Curr_q_d.qI_Component1;                 //IqRef
+		MC_DebugInfo.IdRef = IqFluxLessRef;                               //IdRef
+		MC_DebugInfo.IqRef = IdFluxLessRef;                               //IqRef
 		MC_DebugInfo.UdRef = Stat_Volt_q_d.qV_Component2;                 //UdRef
 		MC_DebugInfo.UqRef = Stat_Volt_q_d.qV_Component1;                 //UqRef
 		MC_DebugInfo.PedalTorquePer = ADC_SensorData.TorqueSensor;        //力矩AD,减去零点
 		MC_DebugInfo.PedalTorqueAvg = ADC_SensorData.GasSensor;           //转把AD,减去零点
 		MC_DebugInfo.PedalTorqueByCad = MC_CadenceResult.torqueByCadence; //力矩AD,根据踏频滤波
-		MC_DebugInfo.IdFdb = IdFdbFlt >> 10;                              //IddFdb
+		MC_DebugInfo.IdFdb = IdFdbFlt >> 10;                              //IdFdb
 		MC_DebugInfo.IqFdb = IqFdbFlt >> 10;                              //IqFdb
 		if(MC_CalParam.AssistRunMode == MC_AssistRunMode_TORQUE)
 			MC_DebugInfo.AssistOut = MC_CalParam.Ref_Torque;

+ 4 - 2
User/Src/var.c

@@ -646,10 +646,12 @@ void Var_Init(void)
 		
 	//MC版本信息初始化,Mode和SN从EEPROM读取
 	strncpy(MC_VerInfo.HW_Version, (char*)"QD007H.       ", 16);
-	#if BaudRate250K
+	#if defined BARD_250K
   strncpy(MC_VerInfo.FW_Version, (char*)"V6r2r2_20231121C", 16);
-	#else
+	#elif defined BARD_125K
 	strncpy(MC_VerInfo.FW_Version, (char*)"V2r3r2_20231121C", 16);
+	#else
+	Error();
 	#endif
 	
 	#if NormalWork

部分文件因为文件数量过多而无法显示