Sfoglia il codice sorgente

支持bootloader

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 3 anni fa
parent
commit
3a1cf0a42d

+ 1 - 3
Applications/app/app.c

@@ -64,8 +64,6 @@ void fetch_jtag_cmd(void){
 #endif
 
 static void mc_exec_log(void) {
-//	sys_debug("intval = %d, exec = %d, err = %d, %d, %d, count = %d\n", g_meas_foc.intval_time, g_meas_foc.exec_time, g_meas_foc.intval_time_error, g_meas_foc.intval_low_err, g_meas_foc.intval_hi_err, g_meas_foc.exec_count);
-//	sys_debug("timeup intval = %d, err = %d\n\n", g_meas_timeup.intval_time, g_meas_timeup.intval_time_error);
 	PMSM_FOC_LogDebug();
 }
 
@@ -95,6 +93,6 @@ static u32 _app_low_task(void *args) {
 	_can_report_info();
 	mc_exec_log();
 	fetch_jtag_cmd();
-	return 1000;
+	return 100;
 }
 

+ 7 - 6
Applications/app/nv_storage.c

@@ -40,17 +40,18 @@ static void nv_default_motor_params(void) {
 static void nv_default_foc_params(void) {
 	foc_params.s_maxvDC = 48;
 	foc_params.s_maxiDC = 30;
-	foc_params.s_maxIdq = 180;
-	foc_params.s_minIdq = -180;
-	foc_params.s_maxRPM = 8200;
+	//foc_params.s_maxIdq = 200;
+	//foc_params.s_minIdq = -200;
+	foc_params.s_PhaseCurrLim = 20;
+	foc_params.s_maxRPM = 2300;
 	foc_params.s_maxEpmRPM = 133;
-	foc_params.s_maxTorque = 180;
-	foc_params.s_PhaseCurreBrkLim = 10.0f;
+	foc_params.s_maxTorque = 50;
+	foc_params.s_PhaseCurreBrkLim = 0.0f;
 	foc_params.n_currentBand = 500;
 	foc_params.n_modulation = 1.0f;
 	foc_params.n_PhaseFilterCeof = 0.2f;
 	foc_params.n_brkShutPower = 1;
-	foc_params.s_LimitiDC = 20.0f;
+	foc_params.s_LimitiDC = 200.0f;
 	foc_params.s_iDCeBrkLim = 15.0f;
 	
 	foc_params.pid_conf[PID_D_id].kp = (CONFIG_CURRENT_BANDWITH * MOTOR_Ld);

+ 2 - 2
Applications/app/nv_storage.h

@@ -7,8 +7,8 @@
 
 typedef struct {
 	float s_PhaseCurrLim;
-	float s_maxIdq;
-	float s_minIdq;
+	//float s_maxIdq;
+	//float s_minIdq;
 	float s_maxiDC;
 	float s_maxvDC;
 	float s_maxRPM;

+ 3 - 1
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 200u
+#define PWM_DEAD_TIME_NS 300u
 #define HW_DEAD_TIME_NS  200u
 #define HW_RISE_TIME_NS  500u
 #define HW_NOISE_TIME_NS 300u
@@ -209,5 +209,7 @@
 
 #define DEBUG_PORT_UART1
 
+#define CONFIG_BEEP 
+
 #endif /*_BOARD_MC_V1_H__ */
 

+ 14 - 1
Applications/bsp/gpio.c

@@ -39,10 +39,23 @@ void gpio_pin_init(void){
 		if (_pins[i].group != 0) {
 			gpio_init(_pins[i].group, _pins[i].mode, _pins[i].speed, _pins[i].pin);
 		}
-	}	
+	}
+#ifdef CONFIG_BEEP
+	gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2);
+	gpio_beep(500);
+#endif
+	
 }
 
 
+void gpio_beep(u32 ms) {
+#ifdef CONFIG_BEEP
+	gpio_bit_write(GPIOB, GPIO_PIN_2, SET);
+	delay_ms(ms);
+	gpio_bit_write(GPIOB, GPIO_PIN_2, RESET);
+#endif
+}
+
 bool gpio_get_brake(void) {
 	return 0;
 }

+ 1 - 0
Applications/bsp/gpio.h

@@ -22,5 +22,6 @@ void gpio_led3_enable(bool enable);
 int gpio_startkey_value(void);
 int gpio_stopkey_value(void);
 int gpio_funckey_value(void);
+void gpio_beep(u32 ms);
 
 #endif /* _GPIO_PIN_H__ */

+ 1 - 0
Applications/foc/commands.c

@@ -54,6 +54,7 @@ static void process_foc_command(foc_cmd_body_t *command) {
 		{
 			bool success;
 			foc_start_cmd_t *scmd = (foc_start_cmd_t *)command->data;
+			sys_debug("start cmd %d\n", scmd->start_stop);
 			if (scmd->start_stop == Foc_Start) {
 				success = mc_start(CTRL_MODE_TRQ);
 			}else if (scmd->start_stop == Foc_Stop) {

+ 21 - 26
Applications/foc/core/PMSM_FOC_Core.c

@@ -220,6 +220,14 @@ void PMSM_FOC_CoreInit(void) {
 #define PHASE_LFP
 static __INLINE void PMSM_FOC_Update_Hardware(void) {
 	AB_t vAB;
+#ifdef PHASE_LFP	
+	float *iabc = _gFOC_Ctrl.in.s_iABCFilter;
+#elif defined PHASE_LFP_FIR
+	float *iabc = _gFOC_Ctrl.in.s_iABCFilter;
+#else
+	float *iabc = _gFOC_Ctrl.in.s_iABC;
+#endif
+
 	if (!_gFOC_Ctrl.in.b_MTPA_calibrate && (_gFOC_Ctrl.in.s_manualAngle != INVALID_ANGLE)) {
 		_gFOC_Ctrl.in.s_motAngle = _gFOC_Ctrl.in.s_manualAngle;
 		_gFOC_Ctrl.in.s_hallAngle = motor_encoder_get_angle();
@@ -229,14 +237,15 @@ static __INLINE void PMSM_FOC_Update_Hardware(void) {
 	}
 	SinCos_Lut(_gFOC_Ctrl.in.s_motAngle, &_gFOC_Ctrl.out.sin, &_gFOC_Ctrl.out.cos);
 	
-	_gFOC_Ctrl.in.s_motRPM = motor_encoder_get_speed() / _gFOC_Ctrl.params.n_poles;
-	_gFOC_Ctrl.in.s_vDC = get_vbus_float();
+	_gFOC_Ctrl.in.s_motRPM = motor_encoder_get_speed();
+	_gFOC_Ctrl.in.s_vDC = get_vbus_int();
 	//sample current
 	phase_current_get(_gFOC_Ctrl.in.s_iABC);
 	get_phase_vols(_gFOC_Ctrl.in.s_vABC);
 	_gFOC_Ctrl.in.s_vABC[0] -= _gFOC_Ctrl.in.s_vDC/2.0f;
 	_gFOC_Ctrl.in.s_vABC[1] -= _gFOC_Ctrl.in.s_vDC/2.0f;
-	_gFOC_Ctrl.in.s_vABC[2] -= _gFOC_Ctrl.in.s_vDC/2.0f; 
+	_gFOC_Ctrl.in.s_vABC[2] -= _gFOC_Ctrl.in.s_vDC/2.0f;
+
 	Clark(_gFOC_Ctrl.in.s_vABC[0], _gFOC_Ctrl.in.s_vABC[1], _gFOC_Ctrl.in.s_vABC[2], &vAB);
 	
 	Park(&vAB, _gFOC_Ctrl.in.s_motAngle, &_gFOC_Ctrl.out.s_RealVdq);
@@ -250,6 +259,10 @@ static __INLINE void PMSM_FOC_Update_Hardware(void) {
 	_gFOC_Ctrl.in.s_iABCFilter[2] = Fir_Filter(&phase2, _gFOC_Ctrl.in.s_iABC[2]);
 	_gFOC_Ctrl.in.s_iABCFilter[0] = -(_gFOC_Ctrl.in.s_iABCFilter[1] + _gFOC_Ctrl.in.s_iABCFilter[2]);
 #endif
+	Clark(iabc[0], iabc[1], iabc[2], &vAB);
+
+	Park(&vAB, _gFOC_Ctrl.in.s_motAngle, &_gFOC_Ctrl.out.s_RealIdq);
+
 }
 
 static __INLINE void PMSM_FOC_Update_PI_Idq(void) {
@@ -273,10 +286,9 @@ static __INLINE void PMSM_FOC_Update_PI_Idq(void) {
 		_gFOC_Ctrl.pi_ctl_iq->min = _gFOC_Ctrl.params.minvDQ.q;
 	}	
 }
-extern int jtag_plot;
-float encoder_last_offset(void);
+
 static __INLINE void PMSM_FOC_Plot_Debug(void) {
-	if (_gFOC_Ctrl.ctrl_count % 8 == 0) {
+	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]);
@@ -289,10 +301,10 @@ static __INLINE void PMSM_FOC_Plot_Debug(void) {
 			//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(_gFOC_Ctrl.in.s_iABC[0], _gFOC_Ctrl.in.s_iABCFilter[0]);
+			//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()));
-		plot_3data16(FtoS16x10(_gFOC_Ctrl.out.s_OutVdq.q), FtoS16x10(_gFOC_Ctrl.out.s_RealVdq.q), FtoS16x10(_gFOC_Ctrl.out.s_FilteriDC));
+		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);
@@ -301,13 +313,6 @@ static __INLINE void PMSM_FOC_Plot_Debug(void) {
 
 void PMSM_FOC_Schedule(void) {
 	AB_t vAB;
-#ifdef PHASE_LFP	
-	float *iabc = _gFOC_Ctrl.in.s_iABCFilter;
-#elif defined PHASE_LFP_FIR
-	float *iabc = _gFOC_Ctrl.in.s_iABCFilter;
-#else
-	float *iabc = _gFOC_Ctrl.in.s_iABC;
-#endif
 
 	_gFOC_Ctrl.ctrl_count++;
 
@@ -317,10 +322,6 @@ void PMSM_FOC_Schedule(void) {
 
 		PMSM_FOC_Update_PI_Idq();
 	
-		Clark(iabc[0], iabc[1], iabc[2], &vAB);
-
-		Park(&vAB, _gFOC_Ctrl.in.s_motAngle, &_gFOC_Ctrl.out.s_RealIdq);
-
 		float target_d = FOC_Get_DqRamp(&_gFOC_Ctrl.idq_ctl[0]);
 		float err = target_d - _gFOC_Ctrl.out.s_RealIdq.d;
 		_gFOC_Ctrl.in.s_targetVdq.d = PI_Controller_RunSerial(_gFOC_Ctrl.pi_ctl_id, err);
@@ -354,12 +355,7 @@ void PMSM_FOC_Schedule(void) {
 }
 
 void PMSM_FOC_LogDebug(void) {
-	//sys_debug("Duty %d, %d, %d\n", _gFOC_Ctrl.out.n_Duty[0], _gFOC_Ctrl.out.n_Duty[1], _gFOC_Ctrl.out.n_Duty[2]);
-	sys_debug("Vdq %f, %f-->%f, %f, %f\n", S16Q5toF(_gFOC_Ctrl.in.s_targetVdq.d), S16Q5toF(_gFOC_Ctrl.in.s_targetVdq.q), S16Q5toF(_gFOC_Ctrl.out.s_OutVdq.d), S16Q5toF(_gFOC_Ctrl.out.s_OutVdq.q), S16Q14toF(_gFOC_Ctrl.out.f_vdqRation));
-	sys_debug("VBUS: %f, %d, %d\n", S16Q5toF(get_vbus_sfix5()), _gFOC_Ctrl.out.n_Sample1, _gFOC_Ctrl.out.n_Sample2);
-	//sys_debug("iABC %f, %f, %f\n", S16Q5toF(_gFOC_Ctrl.in.s_iABC[0]), S16Q5toF(_gFOC_Ctrl.in.s_iABC[1]), S16Q5toF(_gFOC_Ctrl.in.s_iABC[2]));
-	//plot_1data16(_gFOC_Ctrl.in.s_iABC[0]);
-	//sys_debug("sample %d, %d\n", _gFOC_Ctrl.out.n_Sample1, _gFOC_Ctrl.out.n_Sample2);
+
 }
 
 /*called in media task */
@@ -421,7 +417,6 @@ static __INLINE void PMSM_FOC_idq_Assign(void) {
 
 /*called in media task */
 void PMSM_FOC_idqCalc(void) {
-	PMSM_FOC_Get_iDC();
 	if (_gFOC_Ctrl.in.b_motLock) {
 		float vel_count = motor_encoder_get_vel_count();
 		float errRef = 0 - vel_count;

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

@@ -155,7 +155,7 @@ float encoder_get_theta(void) {
 }
 
 float encoder_get_speed(void) {
-	return (g_encoder.est_vel_counts/g_encoder.cpr) * 60.0f * g_encoder.motor_poles;
+	return (g_encoder.est_vel_counts/g_encoder.cpr) * 60.0f;
 }
 
 

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

@@ -9,6 +9,7 @@
 #include "app/nv_storage.h"
 #include "bsp/timer_count32.h"
 #include "libs/time_measure.h"
+#include "app/nv_storage.h"
 #include "libs/logger.h"
 
 //#define USE_DETECTED_ANGLE 1
@@ -478,7 +479,7 @@ void HALL_IRQHandler(void) {
 	_sensor_hander.hall_stat = hall_stat_now;
 	_sensor_hander.hall_ticks = hall_ticks_now;
 	_sensor_hander.el_speed = _hall_angle_speed();	//s32q5
-	_sensor_hander.rpm = (_sensor_hander.el_speed / 360 * 60); //s32q5
+	_sensor_hander.rpm = (_sensor_hander.el_speed / 360 * 60) * nv_get_motor_params()->poles; //s32q5
 	//plot_3data16(_sensor_hander.rpm >> 5, _sensor_hander.el_speed>>5, delta_us);
 	time_measure_end(&g_meas_hall);
 

+ 5 - 0
Applications/foc/motor/motor.c

@@ -102,6 +102,7 @@ bool mc_start(u8 mode) {
 	if (mc_is_hwbrake()) {
 		PMSM_FOC_Brake(true);
 	}
+	gpio_beep(1000);
 	return true;
 }
 
@@ -111,10 +112,12 @@ bool mc_stop(void) {
 	}
 	if (PMSM_FOC_GetSpeed() > 10.0f) {
 		PMSM_FOC_SetErrCode(FOC_NowAllowed_With_Speed);
+		sys_debug("speed error\n");
 		return false;
 	}
 	if (!mc_throttle_released()) {
 		PMSM_FOC_SetErrCode(FOC_Throttle_Err);
+		sys_debug("throttle error\n");
 		return false;
 	}
 	motor.mode = CTRL_MODE_OPEN;
@@ -292,6 +295,7 @@ void MC_Protect_IRQHandler(void){
 	if (!motor.b_start) {
 		return;
 	}
+	PMSM_FOC_SetCriticalError(FOC_CRIT_Phase_Err);
 	PMSM_FOC_Stop(); //三相50%占空比输出,防止mos过压击穿
 	pwm_start();
 	adc_start_convert();
@@ -341,6 +345,7 @@ void Sched_MC_mTask(void) {
 #if ANGLE_TEST
 	_debug_angle();
 #endif
+	PMSM_FOC_Get_iDC();
 	if ((runMode != CTRL_MODE_OPEN) || (motor.mode != CTRL_MODE_OPEN)) {
 		if (motor.mode != CTRL_MODE_OPEN) {
 			u32 mask;

+ 5 - 4
Applications/foc/samples.c

@@ -10,6 +10,7 @@
 typedef struct {
 	float value;
 	float filted_value;
+	int   filted_int;
 	float lowpass;
 }samples_t;
 
@@ -58,8 +59,8 @@ float get_vbus_float(void) {
 	return (_vbus.filted_value);
 }
 
-s16 get_vbus_sfix5(void){
-	return _vbus.filted_value;
+int get_vbus_int(void){
+	return _vbus.filted_int;
 }
 
 
@@ -76,13 +77,13 @@ static u32 sample_task(void *param) {
 	sample_uvw_phase();
 	return 0;
 }
-u32 sapmple_delta;
+
 static void sample_vbus(void){
 	u32 ticks = task_ticks_abs();
 	s16 vadc = adc_get_vbus();
 	_vbus.value = (float)vadc * VBUS_VOL_CEOF;
 	LowPass_Filter(_vbus.filted_value, _vbus.value, _vbus.lowpass);
-	sapmple_delta = task_ticks_rel(ticks);
+	_vbus.filted_int = (int)_vbus.filted_value;
 }
 
 static void sample_throttle(void){

+ 1 - 1
Applications/foc/samples.h

@@ -5,7 +5,7 @@
 #define MAX_GAS_VALUE 5000.0F
 
 void samples_init(void);
-s16 get_vbus_sfix5(void);
+int get_vbus_int(void);
 float get_vbus_float(void);
 float get_throttle_sfix5(void);
 float get_throttle_float(void);

+ 5 - 4
Applications/math/Fir.c

@@ -29,10 +29,11 @@
 #include "math/fir.h"
 
 static const float Fir_Ceofs[16] = {
-  -0.002180566313,-0.009224493057, -0.01853588782, -0.01606058516,   0.0186471995,
-    0.09345125407,   0.1863618642,   0.2517603636,   0.2517603636,   0.1863618642,
-    0.09345125407,   0.0186471995, -0.01606058516, -0.01853588782,-0.009224493057,
-  -0.002180566313
+	0.007895005867,  0.01734124683,  0.03257999197,  0.05209516734,  0.07380001992,
+	 0.09460353851,   0.1110314056,   0.1201113388,   0.1201113388,   0.1110314056,
+	 0.09460353851,  0.07380001992,  0.05209516734,  0.03257999197,  0.01734124683,
+	0.007895005867
+
 };
 
 void Fir_init(Fir_t *fir) {

+ 2 - 2
Project/MC100.uvprojx

@@ -275,7 +275,7 @@
               </OCR_RVCT3>
               <OCR_RVCT4>
                 <Type>1</Type>
-                <StartAddress>0x8000000</StartAddress>
+                <StartAddress>0x8002000</StartAddress>
                 <Size>0x40000</Size>
               </OCR_RVCT4>
               <OCR_RVCT5>
@@ -337,7 +337,7 @@
             <v6Rtti>0</v6Rtti>
             <VariousControls>
               <MiscControls>--gnu</MiscControls>
-              <Define>USE_STDPERIPH_DRIVER,GD32F30X_HD,BACK_TRACE,JTAG_DEBUG,MC100_HW_V1</Define>
+              <Define>USE_STDPERIPH_DRIVER,GD32F30X_HD,BACK_TRACE,MC100_HW_V1,CONFIG_CAN_IAP</Define>
               <Undefine></Undefine>
               <IncludePath>..\Librarys\CMSIS\Include,..\Librarys\CMSIS\GD\GD32F30x\Include,..\Librarys\GD32F30x_Drivers\include,..\Applications;..\Simulink\PMSM_Controller_ert_rtw</IncludePath>
             </VariousControls>

+ 1 - 1
Project/version.cfg

@@ -1,3 +1,3 @@
 project: MC100
 version: 01
-debug: 1
+debug: 0

+ 34 - 0
Simulink/fdacoefs.h

@@ -0,0 +1,34 @@
+/*
+ * Filter Coefficients (C Source) generated by the Filter Design and Analysis Tool
+ * Generated by MATLAB(R) 9.9 and Signal Processing Toolbox 8.5.
+ * Generated on: 11-Oct-2022 16:55:54
+ */
+
+/*
+ * 离散时间 FIR 滤波器(实数)
+ * ----------------
+ * 滤波器结构  : 直接型 FIR
+ * 滤波器长度  : 16
+ * 稳定     : 是
+ * 线性相位   : 是 (Type 2)
+ */
+
+/* General type conversion for MATLAB generated C-code  */
+#include "tmwtypes.h"
+/* 
+ * Expected path to tmwtypes.h 
+ * D:\Program Files\R2020b\extern\include\tmwtypes.h 
+ */
+/*
+ * Warning - Filter coefficients were truncated to fit specified data type.  
+ *   The resulting response may not match generated theoretical response.
+ *   Use the Filter Design & Analysis Tool to design accurate
+ *   single-precision filter coefficients.
+ */
+const int BL = 16;
+const real32_T B[16] = {
+   0.007895005867,  0.01734124683,  0.03257999197,  0.05209516734,  0.07380001992,
+    0.09460353851,   0.1110314056,   0.1201113388,   0.1201113388,   0.1110314056,
+    0.09460353851,  0.07380001992,  0.05209516734,  0.03257999197,  0.01734124683,
+   0.007895005867
+};