Просмотр исходного кода

部分使用nv_storage 中的参数

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 3 лет назад
Родитель
Сommit
71598e2045

+ 3 - 2
Applications/app/nv_storage.c

@@ -2,7 +2,7 @@
 #include "bsp/fmc_flash.h"
 #include "libs/crc16.h"
 #include "foc/motor/motor_param.h"
-
+#include "foc/foc_config.h"
 
 static motor_params_t m_params;
 static foc_params_t   foc_params;
@@ -31,7 +31,7 @@ static void nv_default_motor_params(void) {
 	m_params.r = MOTOR_R;
 	m_params.ld = MOTOR_Ld;
 	m_params.lq = MOTOR_Lq;
-	m_params.encoder_cpr = 4096;
+	m_params.encoder_offset = -50;
 	m_params.est_pll_band = 200;
 	m_params.flux_linkage = 0.0f;
 	m_params.hall_offset = 0;
@@ -44,6 +44,7 @@ static void nv_default_foc_params(void) {
 	foc_params.s_minIdq = -20;
 	foc_params.s_maxRPM = 8200;
 	foc_params.s_maxTorque = 15;
+	foc_params.s_maxBrkCurrent = 2.0f;
 	foc_params.n_currentBand = 500;
 	foc_params.n_modulation = 1.0f;
 	foc_params.n_PhaseFilterCeof = 0.2f;

+ 3 - 2
Applications/app/nv_storage.h

@@ -11,6 +11,7 @@ typedef struct {
 	float s_maxvDC;
 	float s_maxRPM;
 	float s_maxTorque;
+	float s_maxBrkCurrent;
 	float n_modulation;
 	float n_PhaseFilterCeof;
 	float n_currentBand; //电流环带宽
@@ -32,8 +33,8 @@ typedef struct {
 	float flux_linkage;
 	float back_emf;
 	s16   hall_offset;
-	s32 hall_table[8];
-	u16   encoder_cpr;
+	s32   hall_table[8];
+	float encoder_offset;
 	float est_pll_band;
 	u16   crc16;
 }motor_params_t;

+ 19 - 17
Applications/foc/core/PMSM_FOC_Core.c

@@ -9,6 +9,7 @@
 #include "foc/core/svpwm.h"
 #include "foc/core/torque.h"
 #include "foc/samples.h"
+#include "app/nv_storage.h"
 #include "bsp/pwm.h"
 #include "libs/logger.h"
 
@@ -122,23 +123,23 @@ void PMSM_FOC_CoreInit(void) {
 	
 	memset(&_gFOC_Ctrl.in, 0, sizeof(_gFOC_Ctrl.in));
 	memset(&_gFOC_Ctrl.out, 0, sizeof(_gFOC_Ctrl.out));
-	_gFOC_Ctrl.params.s_maxiDC = (MAX_iDQ);
-	_gFOC_Ctrl.params.s_maxiDC = (MAX_iDC);
-	_gFOC_Ctrl.params.s_maxRPM = (MAX_SPEED);
-	_gFOC_Ctrl.params.s_maxTorque = MAX_TORQUE;
-	_gFOC_Ctrl.params.n_modulation = SVM_Modulation;
-	_gFOC_Ctrl.params.n_PhaseFilterCeof = (0.2f);
-	_gFOC_Ctrl.params.maxvDQ.d = MAX_vDC;
-	_gFOC_Ctrl.params.minvDQ.d = -MAX_vDC;
-	_gFOC_Ctrl.params.maxvDQ.q = MAX_vDC;
-	_gFOC_Ctrl.params.minvDQ.q = -MAX_vDC;
-	_gFOC_Ctrl.params.s_maxIdq = MAX_iDQ;
-	_gFOC_Ctrl.params.s_minIdq = -MAX_iDQ;
-	_gFOC_Ctrl.params.n_poles = MOTOR_POLES;
+	_gFOC_Ctrl.params.s_maxiDC = nv_get_foc_params()->s_maxiDC;//(MAX_iDQ);
+	_gFOC_Ctrl.params.s_maxRPM = nv_get_foc_params()->s_maxRPM;//(MAX_SPEED);
+	_gFOC_Ctrl.params.s_maxTorque = nv_get_foc_params()->s_maxTorque;//MAX_TORQUE;
+	_gFOC_Ctrl.in.s_vDC = nv_get_foc_params()->s_maxvDC;//(MAX_vDC);
+	_gFOC_Ctrl.params.maxvDQ.d = _gFOC_Ctrl.in.s_vDC;//MAX_vDC;
+	_gFOC_Ctrl.params.minvDQ.d = -_gFOC_Ctrl.in.s_vDC;//MAX_vDC;
+	_gFOC_Ctrl.params.maxvDQ.q = _gFOC_Ctrl.in.s_vDC;//MAX_vDC;
+	_gFOC_Ctrl.params.minvDQ.q = -_gFOC_Ctrl.in.s_vDC;//MAX_vDC;
+	_gFOC_Ctrl.params.s_maxIdq = nv_get_foc_params()->s_maxIdq;//MAX_iDQ;
+	_gFOC_Ctrl.params.s_minIdq = nv_get_foc_params()->s_minIdq;//-MAX_iDQ;	
+	_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);
+	_gFOC_Ctrl.params.n_poles = nv_get_motor_params()->poles;//MOTOR_POLES;
 	_gFOC_Ctrl.out.n_RunMode = CTRL_MODE_OPEN;
 	_gFOC_Ctrl.out.f_vdqRation = 0;
 	_gFOC_Ctrl.in.s_manualAngle = INVALID_ANGLE;
-	_gFOC_Ctrl.in.s_vDC = (MAX_vDC);
+	
 	
 	FOC_DqRamp_init(&_gFOC_Ctrl.idq_ctl[0], 1);
 	FOC_DqRamp_init(&_gFOC_Ctrl.idq_ctl[1], 1);
@@ -317,7 +318,7 @@ void PMSM_FOC_idqCalc(void) {
 	if (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_CURRENT || _gFOC_Ctrl.out.n_RunMode == CTRL_MODE_CURRENT_BRK) {
 		_gFOC_Ctrl.in.s_targetCurrent = eCtrl_get_RefCurrent();
 		if (_gFOC_Ctrl.out.n_RunMode == CTRL_MODE_CURRENT_BRK) {
-			if (eCtrl_get_FinalCurrent() < 0.0001f && _gFOC_Ctrl.in.s_motRPM < 100) {
+			if (eCtrl_get_FinalCurrent() < 0.0001f && _gFOC_Ctrl.in.s_motRPM < MIN_RPM_EXIT_EBRAKE) {
 				_gFOC_Ctrl.in.s_targetCurrent = 0.0f;
 				eCtrl_enable_eBrake(false);
 			}
@@ -326,7 +327,7 @@ void PMSM_FOC_idqCalc(void) {
 		float refTorque = eCtrl_get_RefTorque();
 		_gFOC_Ctrl.pi_ctl_trq->max = refTorque;
 		_gFOC_Ctrl.pi_ctl_trq->min = -refTorque;
-		if ((eCtrl_get_FinalTorque() <= 0.0001f) && _gFOC_Ctrl.in.s_motRPM < 100) {
+		if ((eCtrl_get_FinalTorque() <= 0.0001f) && _gFOC_Ctrl.in.s_motRPM < MIN_RPM_EXIT_EBRAKE) {
 			_gFOC_Ctrl.pi_ctl_trq->max = 0;
 			_gFOC_Ctrl.pi_ctl_trq->min = 0; //防止倒转
 		}
@@ -339,7 +340,8 @@ void PMSM_FOC_idqCalc(void) {
 		if (_gFOC_Ctrl.in.b_cruiseEna) {
 			refSpeed = _gFOC_Ctrl.in.s_cruiseRPM;
 		}
-		if ((eCtrl_get_FinalSpeed() == 0) && _gFOC_Ctrl.in.s_motRPM < 10) {
+		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;

+ 3 - 3
Applications/foc/core/e_ctrl.c

@@ -2,7 +2,7 @@
 #include "foc/foc_config.h"
 #include "math/fix_math.h"
 #include "foc/core/PMSM_FOC_Core.h"
-
+#include "app/nv_storage.h"
 #include "libs/logger.h"
 
 e_Ctrl g_eCtrl;
@@ -47,7 +47,7 @@ void eCtrl_set_TgtSpeed(float s) {
 }
 
 void eCtrl_enable_eBrake(bool enable) {
-	if (enable && PMSM_FOC_GetSpeed() > 1000.0f) {
+	if (enable && PMSM_FOC_GetSpeed() > MIN_RPM_FOR_EBRAKE) {
 		g_eCtrl.is_ebrake_shadow = true;
 	}else if (!enable){
 		g_eCtrl.is_ebrake_shadow = false;
@@ -60,7 +60,7 @@ void _eCtrl_process_eBrake(void) {
 		eRamp_init(&g_eCtrl.speed);
 		eRamp_init(&g_eCtrl.torque);
 		PMSM_FOC_SetCtrlMode(CTRL_MODE_CURRENT_BRK);
-		eCtrl_set_TgtCurrent(-2.0f);
+		eCtrl_set_TgtCurrent(-nv_get_foc_params()->s_maxBrkCurrent);
 	}else {
 		PMSM_FOC_SetCtrlMode(CTRL_MODE_TRQ);
 	}

+ 4 - 0
Applications/foc/core/torque.c

@@ -52,6 +52,10 @@ void torque_speed_target(u8 run_mode, float f_throttle) {
 			eCtrl_enable_eBrake(false);
 			PMSM_FOC_Set_Torque(torque);
 		}
+	}else if (run_mode == CTRL_MODE_CURRENT_BRK) {
+		if (!mc_throttle_released()) {
+			eCtrl_enable_eBrake(false);
+		}
 	}
 }
 

+ 4 - 0
Applications/foc/foc_config.h

@@ -20,6 +20,10 @@
 #define MAX_vDC (50)   /* 母线最大电压 V*/
 #endif
 
+#define MAX_EBRAKE_CURRENT 2.0f
+#define MIN_RPM_FOR_EBRAKE 1000 //进入电流回收的最小转速
+#define MIN_RPM_EXIT_EBRAKE 100 //推出电流回收的最小转速
+
 #define IDQ_CTRL_TS FOC_PWM_FS
 #define SPD_CTRL_TS 1000
 #define SPD_CTRL_MS (1000/SPD_CTRL_TS * 1000)

+ 7 - 5
Applications/foc/motor/encoder.c

@@ -4,6 +4,7 @@
 #include "foc/motor/encoder.h"
 #include "foc/motor/motor_param.h"
 #include "libs/logger.h"
+#include "app/nv_storage.h"
 
 #define ANGLE_OFFSET (-50.0f)//133.0f
 /* 磁编码器使用一对极的磁铁,所以编码器获取的角度和机械角度相同需要转为电角度*/
@@ -25,7 +26,7 @@ static void _init_pll(void) {
 	g_encoder.est_pll.DT = FOC_CTRL_US;
 	g_encoder.est_pll.max_wp = g_encoder.cpr;
 	g_encoder.pll_bandwidth = 0;
-	g_encoder.pll_bandwidth_shadow = PLL_BANDWIDTH;
+	g_encoder.pll_bandwidth_shadow = nv_get_motor_params()->est_pll_band;
 	encoder_pll_update_gain();
 	PLL_Reset(&g_encoder.est_pll);
 }
@@ -47,7 +48,8 @@ void encoder_set_bandwidth(float bandwidth) {
 void encoder_init_clear(s8 diretcion) {
 	_init_pll();
 	g_encoder.cpr = ENC_MAX_RES;
-	g_encoder.enc_offset = ANGLE_OFFSET;
+	g_encoder.enc_offset = nv_get_motor_params()->encoder_offset;
+	g_encoder.motor_poles = nv_get_motor_params()->poles;
 	g_encoder.b_index_found = false;
 	g_encoder.direction = diretcion;
 	g_encoder.abi_angle = 0.0f;
@@ -94,7 +96,7 @@ float encoder_get_theta(void) {
 	}else {
 		g_encoder.interpolation = 0.0f;
 	}
-	g_encoder.abi_angle = ENC_Pluse_Nr_2_angle((float)cnt + g_encoder.interpolation) * MOTOR_POLES + g_encoder.enc_offset;
+	g_encoder.abi_angle = ENC_Pluse_Nr_2_angle((float)cnt + g_encoder.interpolation) * g_encoder.motor_poles + g_encoder.enc_offset;
 	rand_angle(g_encoder.abi_angle);
 
 	encoder_run_pll((float)(cnt));
@@ -105,7 +107,7 @@ float encoder_get_theta(void) {
 }
 
 float encoder_get_speed(void) {
-	return (g_encoder.est_vel_counts/g_encoder.cpr) * 60.0f * MOTOR_POLES;
+	return (g_encoder.est_vel_counts/g_encoder.cpr) * 60.0f * g_encoder.motor_poles;
 }
 
 void encoder_detect_offset(float angle){
@@ -141,7 +143,7 @@ void ENC_PWM_Duty_Handler(float t, float d) {
 		return;
 	}
 	g_encoder.pwm_count = (u32)Nr;
-	g_encoder.pwm_angle = ENC_Pluse_Nr_2_angle(Nr) * MOTOR_POLES + g_encoder.enc_offset;	
+	g_encoder.pwm_angle = ENC_Pluse_Nr_2_angle(Nr) * g_encoder.motor_poles + g_encoder.enc_offset;	
 	rand_angle(g_encoder.pwm_angle);
 	if (!g_encoder.b_index_found) {
 		ENC_COUNT = g_encoder.pwm_count;

+ 1 - 0
Applications/foc/motor/encoder.h

@@ -5,6 +5,7 @@
 typedef struct {
 	bool  b_index_found; //I 对齐
 	float enc_offset;
+	u8    motor_poles;
 	float pwm_angle;
 	u32   pwm_count;
 	float abi_angle;

+ 1 - 1
Applications/os/heap_4.c

@@ -38,7 +38,7 @@
 
 #define portBYTE_ALIGNMENT			8
 #define portBYTE_ALIGNMENT_MASK 	0x0007
-#define configTOTAL_HEAP_SIZE    (16*1024)
+#define configTOTAL_HEAP_SIZE    (10*1024)
 #define configASSERT(x)
 /* Block sizes must not get too small. */
 #define heapMINIMUM_BLOCK_SIZE	( ( size_t ) ( xHeapStructSize << 1 ) )

+ 2 - 1
Project/GD32_DEMO.uvoptx

@@ -120,6 +120,7 @@
         <SetRegEntry>
           <Number>0</Number>
           <Key>DLGUARM</Key>
+          <Name>?</Name>
         </SetRegEntry>
         <SetRegEntry>
           <Number>0</Number>
@@ -889,7 +890,7 @@
 
   <Group>
     <GroupName>OS</GroupName>
-    <tvExp>0</tvExp>
+    <tvExp>1</tvExp>
     <tvExpOptDlg>0</tvExpOptDlg>
     <cbSel>0</cbSel>
     <RteFlg>0</RteFlg>