Ver código fonte

update uart

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 3 anos atrás
pai
commit
45392820d3

+ 6 - 4
Applications/app/app.c

@@ -14,6 +14,7 @@
 
 
 static u32 _app_low_task(void *args);
+static u32 _app_report_task(void *args);
 extern void PMSM_FOC_LogDebug(void);
 extern measure_time_t g_meas_hall;
 extern measure_time_t g_meas_foc;
@@ -78,19 +79,20 @@ void app_start(void){
 #endif
 	gpio_led1_enable(true);
 	shark_task_create(_app_low_task, NULL);
-
+	shark_task_create(_app_report_task, NULL);
 	sys_debug("mc start\n");
 	shark_task_run();
 }
 
-static void _can_report_info(void) {
-	//can_report_speed(0x45, PMSM_FOC_GetSpeed());
+static u32 _app_report_task(void *p) {
+	can_report_power(0x45, (s16)PMSM_FOC_GetSpeed(), PMSM_FOC_GetVbusVoltage(), PMSM_FOC_GetVbusCurrent());
+	can_report_dq_current(0x45, PMSM_FOC_GetDQCurrent()->d, PMSM_FOC_GetDQCurrent()->q);
+	return 500;
 }
 
 
 static u32 _app_low_task(void *args) {
 	wdog_reload();
-	_can_report_info();
 	mc_exec_log();
 	fetch_jtag_cmd();
 	return 100;

+ 5 - 5
Applications/app/nv_storage.c

@@ -42,8 +42,8 @@ static void nv_default_foc_params(void) {
 	foc_params.s_maxiDC = 30;
 	//foc_params.s_maxIdq = 200;
 	//foc_params.s_minIdq = -200;
-	foc_params.s_PhaseCurrLim = 20;
-	foc_params.s_maxRPM = 2300;
+	foc_params.s_PhaseCurrLim = 30;
+	foc_params.s_maxRPM = 8000;
 	foc_params.s_maxEpmRPM = 133;
 	foc_params.s_maxTorque = 50;
 	foc_params.s_PhaseCurreBrkLim = 0.0f;
@@ -64,10 +64,10 @@ static void nv_default_foc_params(void) {
 
 	foc_params.pid_conf[PID_TRQ_id].kp = 0.1f;
 	foc_params.pid_conf[PID_TRQ_id].ki = 0.5f;
-	foc_params.pid_conf[PID_TRQ_id].kb = 1.2f;
+	foc_params.pid_conf[PID_TRQ_id].kb = 1.0f;
 
-	foc_params.pid_conf[PID_Spd_id].kp = 0.1f;
-	foc_params.pid_conf[PID_Spd_id].ki = 0.5f;
+	foc_params.pid_conf[PID_Spd_id].kp = 0.05f;
+	foc_params.pid_conf[PID_Spd_id].ki = 0.15f;
 	foc_params.pid_conf[PID_Spd_id].kb = 1.2f;
 
 	foc_params.pid_conf[PID_Pow_id].kp = 0.5f;

+ 2 - 2
Applications/bsp/board_mc_v1.h

@@ -11,7 +11,7 @@
 #define SCHED_TIMER_IRQ TIMER5_IRQn
 #define SCHED_TIMER_IRQHandler TIMER5_IRQHandler
 
-#define PWM_DEAD_TIME_NS 300u
+#define PWM_DEAD_TIME_NS 200u
 #define HW_DEAD_TIME_NS  200u
 #define HW_RISE_TIME_NS  500u
 #define HW_NOISE_TIME_NS 300u
@@ -207,7 +207,7 @@
 #define ENC_Duty(d, t) ((1.0f/128.0f) * (130.0f * (d)/(t) - 1.0f))
 
 
-#define DEBUG_PORT_UART1
+#define DEBUG_PORT_UART2
 
 #define CONFIG_BEEP 
 

+ 1 - 1
Applications/bsp/pwm.c

@@ -150,7 +150,7 @@ static void _init_pwm_timer(void) {
     timer_breakpara.ideloffstate       = TIMER_ROS_STATE_DISABLE;
     timer_breakpara.protectmode        = TIMER_CCHP_PROT_OFF; 
     timer_breakpara.deadtime           = _dead_time(NS_2_TCLK(PWM_DEAD_TIME_NS));
-    timer_breakpara.breakstate         = TIMER_BREAK_DISABLE;
+    timer_breakpara.breakstate         = TIMER_BREAK_ENABLE;
     timer_breakpara.breakpolarity      = TIMER_BREAK_POLARITY_LOW;
     timer_breakpara.outputautostate    = TIMER_OUTAUTO_DISABLE;
     timer_break_config(timer,&timer_breakpara);

+ 1 - 1
Applications/bsp/uart.c

@@ -4,7 +4,7 @@
 #include "libs/logger.h"
 #include "libs/utils.h"
 
-#define SHARK_UART_BAUDRATE				500000
+#define SHARK_UART_BAUDRATE				76800
 
 #ifdef DEBUG_PORT_UART1
 #define SHARK_UART0_com					USART1

+ 1 - 1
Applications/bsp/uart.h

@@ -11,7 +11,7 @@
 #define CH_ESC_END						0x06
 #define CH_ESC_ESC						0x07
 
-#define SHARK_UART_TX_MEM_SIZE			(22 * 1024)
+#define SHARK_UART_TX_MEM_SIZE			(1 * 1024)
 #define SHARK_UART_RX_MEM_SIZE			512
 #define RX_FRAME_MAX_LEN 260
 #define RX_OLD_FRAME_MAX_LEN 256

+ 16 - 1
Applications/foc/commands.c

@@ -77,6 +77,21 @@ static void process_foc_command(foc_cmd_body_t *command) {
 			
 			break;
 		}
+		case Foc_Set_Cruise_Speed:
+		{
+			u8 mode = decode_u8(command->data);
+			float rpm = (float)decode_s16((u8 *)command->data + 1);
+			if (mode == 0) {
+				rpm = PMSM_FOC_GetSpeed() + rpm;	
+			}
+			if (!PMSM_FOC_Set_CruiseSpeed(rpm)) {
+				erroCode = PMSM_FOC_GetErrCode();
+			}
+			sys_debug("Cruise RPM %d\n", (int)rpm);
+			encode_u16(response + 3, (s16)rpm);
+			len += 2;
+			break;
+		}
 		case Foc_Set_Ctrl_Mode:
 		{
 			u8 mode = decode_u8(command->data);
@@ -174,7 +189,7 @@ static void process_foc_command(foc_cmd_body_t *command) {
 		}
 	}
 	response[0] = command->cmd;
-	response[1] = command->can_src;
+	response[1] = CAN_MY_ADDRESS;
 	response[2] = erroCode;
 	can_send_response(command->can_src, response, len);
 }

+ 1 - 1
Applications/foc/commands.h

@@ -19,7 +19,7 @@ typedef enum {
 	Foc_Set_EPM_Mode,
 	Foc_Start_EPM_Move,
 	Foc_Conf_Pid,
-	Foc_Hall_Phase_Cali_Result,
+	Foc_Hall_Phase_Cali_Result = 160,
 	Foc_Hall_Offset_Cali_Result,
 	Foc_Report_Speed,
 	Foc_Report_Vbus_Current, 	//u32

+ 28 - 28
Applications/foc/core/PMSM_FOC_Core.c

@@ -16,6 +16,9 @@
 PMSM_FOC_Ctrl _gFOC_Ctrl;
 static Fir_t phase1, phase2;
 static bool g_focinit = false;
+
+static u32 PMSM_FOC_Debug_Task(void *p);
+
 static __INLINE void RevPark(DQ_t *dq, float angle, AB_t *alpha_beta) {
 	float c,s;
 #if 0
@@ -196,7 +199,8 @@ void PMSM_FOC_CoreInit(void) {
 
 	if (!g_focinit) {
 		PMSM_FOC_UserInit();
-		g_focinit = false;
+		shark_task_create(PMSM_FOC_Debug_Task, NULL);
+		g_focinit = true;
 	}
 	_gFOC_Ctrl.params.n_modulation = nv_get_foc_params()->n_modulation;//SVM_Modulation;
 	_gFOC_Ctrl.params.n_PhaseFilterCeof = nv_get_foc_params()->n_PhaseFilterCeof;//(0.2f);
@@ -287,28 +291,12 @@ static __INLINE void PMSM_FOC_Update_PI_Idq(void) {
 	}	
 }
 
-static __INLINE void PMSM_FOC_Plot_Debug(void) {
-	if (_gFOC_Ctrl.ctrl_count % 4 == 0) {
-		//plot_1data16(_gFOC_Ctrl.out.test_sample);
-		//plot_1data16(FtoS16x1000(PMSM_FOC_Get_iDC()));
-		//plot_3data16(_gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
-		//plot_2data16(FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.d), FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.q));
-		//plot_2data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x1000(_gFOC_Ctrl.in.s_targetTorque));
-		//plot_2data16(FtoS16(_gFOC_Ctrl.in.s_hallAngle), FtoS16(_gFOC_Ctrl.in.s_motAngle));
-		//plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x1000(_gFOC_Ctrl.out.s_OutVdq.d), FtoS16x1000(_gFOC_Ctrl.out.s_OutVdq.q));
-		//plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.d), FtoS16x1000(_gFOC_Ctrl.out.s_RealIdq.q));
-		//if (jtag_plot == 2) {
-			//plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x10(_gFOC_Ctrl.out.s_RealIdq.d), FtoS16x10(_gFOC_Ctrl.out.s_RealIdq.q));
-			//plot_3data16(_gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
-			//plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x10(_gFOC_Ctrl.in.s_iABC[1]), FtoS16x10(_gFOC_Ctrl.out.s_RealIdq.q));
-			//plot_2data16(FtoS16x10(_gFOC_Ctrl.in.s_iABC[0]), FtoS16x10(_gFOC_Ctrl.in.s_iABCFilter[0]));
-			//plot_3data16(_gFOC_Ctrl.in.s_motRPM, _gFOC_Ctrl.idq_ctl[1].s_Cp * 10, FtoS16x10(_gFOC_Ctrl.out.s_RealIdq.q));
-			//plot_3data16(_gFOC_Ctrl.in.s_motRPM, FtoS16x10(_gFOC_Ctrl.in.s_vDC), FtoS16x10(get_throttle_float()));
+
+static u32 PMSM_FOC_Debug_Task(void *p) {
+	if (_gFOC_Ctrl.in.b_motEnable) {
 		plot_3data16(FtoS16x10(_gFOC_Ctrl.in.s_vABC[1]), FtoS16x10(_gFOC_Ctrl.out.s_RealVdq.q), _gFOC_Ctrl.in.s_motRPM);
-		//}
-		//plot_1data16(FtoS16(_gFOC_Ctrl.in.s_hallAngle));
-		//plot_1data16(_gFOC_Ctrl.in.s_motRPM);
 	}
+	return 0;
 }
 
 void PMSM_FOC_Schedule(void) {
@@ -351,7 +339,6 @@ void PMSM_FOC_Schedule(void) {
 	LowPass_Filter(_gFOC_Ctrl.out.s_FilterIdq.d, _gFOC_Ctrl.out.s_RealIdq.d, 0.01f);
 	LowPass_Filter(_gFOC_Ctrl.out.s_FilterIdq.q, _gFOC_Ctrl.out.s_RealIdq.q, 0.01f);
 #endif
-	PMSM_FOC_Plot_Debug();
 }
 
 void PMSM_FOC_LogDebug(void) {
@@ -392,9 +379,13 @@ u8 PMSM_FOC_CtrlMode(void) {
 
 /* MPTA, 弱磁, 功率限制,主要是分配DQ轴电流 */
 static __INLINE float PMSM_FOC_Limit_Power(float maxTrq) {
+#if 0
 	PI_Ctrl_Power.max = maxTrq;
 	float errRef = _gFOC_Ctrl.userLim.s_iDCLim - _gFOC_Ctrl.out.s_FilteriDC;
 	return PI_Controller_run(_gFOC_Ctrl.pi_ctl_power, errRef);
+#else
+	return maxTrq;
+#endif
 }
 static __INLINE void PMSM_FOC_idq_Assign(void) {
 	if (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_CURRENT || _gFOC_Ctrl.out.n_RunMode == CTRL_MODE_CURRENT_BRK) {
@@ -448,10 +439,11 @@ void PMSM_FOC_idqCalc(void) {
 		float refSpeed = eCtrl_get_RefSpeed();
 		if (_gFOC_Ctrl.in.b_cruiseEna) {
 			refSpeed = _gFOC_Ctrl.in.s_cruiseRPM;
-		}
-		if ((eCtrl_get_FinalSpeed() == 0) && (_gFOC_Ctrl.in.s_motRPM < MIN_RPM_EXIT_EBRAKE)) {
-			_gFOC_Ctrl.pi_ctl_spd->max = 0;
-			_gFOC_Ctrl.pi_ctl_spd->min = 0; //防止倒转
+		}else {
+			if ((eCtrl_get_FinalSpeed() == 0) && (_gFOC_Ctrl.in.s_motRPM < MIN_RPM_EXIT_EBRAKE)) {
+				_gFOC_Ctrl.pi_ctl_spd->max = 0;
+				_gFOC_Ctrl.pi_ctl_spd->min = 0; //防止倒转
+			}
 		}
 		float errRef = refSpeed - _gFOC_Ctrl.in.s_motRPM;
 		float maxTrq = PI_Controller_RunSat(_gFOC_Ctrl.pi_ctl_spd, errRef);
@@ -519,8 +511,16 @@ float PMSM_FOC_GeteBrkPhaseCurrent(void) {
 	return _gFOC_Ctrl.userLim.s_PhaseCurreBrkLim ;
 }
 
-void PMSM_FOC_VbusVoltage(float vbusVol) {
-	_gFOC_Ctrl.in.s_vDC = vbusVol;
+float PMSM_FOC_GetVbusVoltage(void) {
+	return _gFOC_Ctrl.in.s_vDC;
+}
+
+float PMSM_FOC_GetVbusCurrent(void) {
+	return _gFOC_Ctrl.out.s_FilteriDC;
+}
+
+DQ_t* PMSM_FOC_GetDQCurrent(void) {
+	return &_gFOC_Ctrl.out.s_RealIdq;
 }
 
 bool PMSM_FOC_SetCtrlMode(u8 mode) {

+ 3 - 1
Applications/foc/core/PMSM_FOC_Core.h

@@ -195,7 +195,9 @@ void PMSM_FOC_Stop(void);
 void PMSM_FOC_iBusLimit(float ibusLimit);
 void PMSM_FOC_SpeedLimit(float speedLimit);
 float PMSM_FOC_GetSpeedLimit(void);
-void PMSM_FOC_VbusVoltage(float vbusVol);
+float PMSM_FOC_GetVbusVoltage(void);
+float PMSM_FOC_GetVbusCurrent(void);
+DQ_t  *PMSM_FOC_GetDQCurrent(void);
 bool PMSM_FOC_SetCtrlMode(u8 mode);
 u8 PMSM_FOC_GetCtrlMode(void);
 void PMSM_FOC_SetOpenVdq(float vd, float vq);

+ 1 - 1
Applications/foc/motor/motor.c

@@ -83,7 +83,7 @@ bool mc_start(u8 mode) {
 		return false;
 	}
 	motor.mode = mode;
-	eCtrl_init(200, 3000);
+	eCtrl_init(300, 3000);
 	motor_encoder_start(motor.s_direction);
 	PMSM_FOC_Start(mode);
 	pwm_turn_on_low_side();

+ 5 - 3
Applications/prot/can_foc_msg.c

@@ -10,12 +10,14 @@ void can_report_speed(u8 can, s16 rpm) {
 	can_send_message(get_indicator_can_id(can), data, sizeof(data), 0);
 }
 
-void can_report_power(u8 can, s16 rpm, s16 vDC, s16 iDC) {
+void can_report_power(u8 can, s16 rpm, float vDC, float iDC) {
 	u8 data[8];
+	s16 v = (s16)(vDC * 10.0f);
+	s16 i = (s16)(iDC * 10.0f);
 	encoder_can_key(data, CMD_2_CAN_KEY(Foc_Report_Power));
 	encode_s16(data + 2, rpm);
-	encode_s16(data + 4, vDC);
-	encode_s16(data + 6, iDC);
+	encode_s16(data + 4, v);
+	encode_s16(data + 6, i);
 	can_send_message(get_indicator_can_id(can), data, sizeof(data), 0);
 }
 

+ 1 - 1
Applications/prot/can_foc_msg.h

@@ -7,7 +7,7 @@ void can_report_phase_current(u8 can, float iA, float iB, float iC);
 void can_report_phase_voltage(u8 can, float vA, float vB, float vC);
 void can_report_dq_current(u8 can, float id, float iq);
 void can_response_hall_offset(u8 can, int offset);
-void can_report_power(u8 can, s16 rpm, s16 vDC, s16 iDC);
+void can_report_power(u8 can, s16 rpm, float vDC, float iDC);
 
 #endif	/*_Can_Foc_Msg_H__ */