Эх сурвалжийг харах

update code

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 4 жил өмнө
parent
commit
e3c35d4d18

+ 1 - 1
Application/App/app.c

@@ -8,7 +8,7 @@ void app_init(void){
 void start_stop_handler(void) {
 	FOCState s = FOC_STM_State();
 	if (s == IDLE) {
-		Foc_Set_StartRamp(10.0f, 200);
+		Foc_Set_StartRamp(23.0f, 200);
 		foc_start_motor();
 	}else {
 		foc_stop_motor();

+ 26 - 0
Application/App/communication.h

@@ -1,5 +1,31 @@
 #ifndef _COMMUNICATION_H__
 #define _COMMUNICATION_H__
 
+typedef enum {
+	Cmd_Start = 0x1, //start/stop
+	Cmd_Ready,       //ready / unready
+	Cmd_Hall_Cali,
+}motor_cmd_t;
+
+#pragma  pack (push,1) 
+typedef struct {
+	u8 start; //0x1=start, 0x00=stop
+	u16 speed; //目标速度
+	s16 current;//启动电流
+	u16 ramp_time;//斜波时间
+}cmd_start_t;
+
+typedef struct {
+	u8 ready; //0x1=ready, 0x00=unready
+}cmd_ready_t;
+
+typedef struct {
+	u8  start;
+	s16 current;
+}cmd_hall_cali_t;
+
+#pragma pack(pop)
+
+
 #endif /* _COMMUNICATION_H__ */
 

+ 1 - 1
Application/Bsp/bsp.c

@@ -6,7 +6,7 @@ void system_init(void){
 	SystemClock_Config();
 	HAL_GPIO_init();
 	HAL_NVIC_Init();
-	HAL_PWM_Init(FOC_FS);
+	HAL_PWM_Init();
 	HAL_ADC1_Init();
 	HAL_EXIT_Enable();
 	serial_init();

+ 2 - 1
Application/Bsp/serial.c

@@ -3,7 +3,8 @@
 #include "serial.h"
 
 static c_buffer_t c_buff;
-static u8 _tx_buf[256];
+static u8 _tx_buf[512];
+static u8 _rx_buf[256];
 
 void serial_init(void){
 	UART2_Init();

+ 22 - 2
Application/FOC/foc.c

@@ -13,7 +13,16 @@
 static u32 foc_measure_task(void);
 static void foc_defulat_value(void);
 
-static motor_foc_t mFOC;
+static motor_foc_t mFOC = {
+	.motor_p = {
+		.poles = 2,
+		.ld = 0.578477f,
+		.lq = 5.78477f,
+		.rs = 1.088f,
+		.inertia = 3.319367f,
+		.b_emf = 4.332566f,
+	},
+};
 
 void foc_init(void) {
 	foc_defulat_value();	
@@ -29,7 +38,7 @@ void foc_init(void) {
 	
 	task_start(foc_measure_task, 0);
 
-	//hall_sensor_calibrate(8.0f, mFOC.hall_table);
+	///hall_sensor_calibrate(8.0f, mFOC.hall_table);
 }
 
 static void foc_defulat_value(void){
@@ -52,6 +61,10 @@ FOCState FOC_STM_State(void){
 	return mFOC.state;
 }
 
+u32 foc_get_speed(void) {
+	return abs(hall_sensor_get_speed()/mFOC.motor_p.poles);
+}
+
 FError FOC_STM_NextState(FOCState state) {
 	bool changed = false;
 	if (state == mFOC.state) {
@@ -168,6 +181,13 @@ void foc_pwm_up_handler(void){
 	phase_current_adc_triger(&mFOC.current_samp);
 }
 
+#if defined (CCMRAM)
+#if defined (__ICCARM__)
+#pragma location = ".ccmram"
+#elif defined (__CC_ARM)
+__attribute__( ( section ( ".ccmram" ) ) )
+#endif
+#endif
 
 void current_sample_handler(void) {
 	if (mFOC.current_samp.is_calibrating) {

+ 1 - 0
Application/FOC/foc.h

@@ -18,6 +18,7 @@ FError FOC_STM_NextState(FOCState s);
 void Foc_Set_StartRamp(float final, u32 duration_ms);
 FOCState FOC_STM_State(void);
 void foc_current_calibrate(void);
+u32 foc_get_speed(void);
 
 #endif /* _FOC_H__ */
 

+ 27 - 8
Application/FOC/foc_task.c

@@ -17,7 +17,7 @@ static void __inline foc_update_theta(motor_foc_t *foc) {
 		angle = hall_sensor_get_theta();
 	}
 	foc->motor_s.angle = angle;
-	foc->motor_s.theta = degree_2_pi(angle);
+	foc->motor_s.theta = degree_2_pi(foc->motor_s.angle);
 }
 
 #else
@@ -28,7 +28,7 @@ static void __inline foc_update_theta(motor_foc_t *foc) {
 		first_s = true;
 		angle = hall_sensor_get_theta();
 	}else {
-		angle += 1;
+		angle += 0.5f;
 	}
 	fast_norm_angle(&angle);
 	foc->motor_s.angle = angle;
@@ -52,7 +52,7 @@ static void __inline Foc_Dq_PI_Contrl(motor_foc_t *foc, dq_t *sampled, dq_t *ref
 }
 
 static void __inline DeadTime_Compensation(current_samp_t *c_sample, phase_time_t *time) {
-#if 0	
+#if 0
     /* Dead time compensation */
     if ( c_sample->Ia > 0)
     {
@@ -84,16 +84,33 @@ static void __inline DeadTime_Compensation(current_samp_t *c_sample, phase_time_
 }
 
 static void __inline Debug_Log(motor_foc_t *foc){
-#if 1
+#if 0
 	static int count;
-	if (count++ % 5== 0) {
-		printf("$%d %d %d;",(int)(foc->current_samp.Ia * 1000.0f), (int)(foc->current_samp.Ib * 1000.0f),
-			(int)(foc->current_samp.Ic * 1000.0f));
-		//printf("$%d;", (int)hall_sensor_get_speed());
+	if (count++ % 10 == 0) {
+		//printf("$%d %d %d %d %d;",(int)(foc->current_samp.Ia * 1000.0f), (int)(foc->current_samp.Ib * 1000.0f),
+		//	(int)(foc->current_samp.Ic * 1000.0f), (int)foc->sector * 100, (int)foc->motor_s.angle);
+		printf("$%d;", (int)hall_sensor_get_speed());
 	}
 #endif	
 }
 
+static void __inline Debug_dq(dq_t *dq){
+#if 0
+	static int count;
+	if (count++ % 10 == 0) {
+		printf("$%d %d;",(int)(dq->d * 1000.0f), (int)(dq->q * 1000.0f));
+	}
+#endif	
+}
+
+#if defined (CCMRAM)
+#if defined (__ICCARM__)
+#pragma location = ".ccmram"
+#elif defined (__CC_ARM)
+__attribute__( ( section ( ".ccmram" ) ) )
+#endif
+#endif
+
 /* FOC 主控制逻辑 */
 void FOC_Fast_Task(motor_foc_t *foc){
 	current_samp_t *c_sample = &foc->current_samp;
@@ -124,6 +141,8 @@ void FOC_Fast_Task(motor_foc_t *foc){
 	PWM_UpdateDuty(phase_time.A, phase_time.B, phase_time.C, sample_point);
 
 	Debug_Log(foc);
+
+	Debug_dq(&sample_dq);
 }
 
 //输出dq电流,给电流环

+ 15 - 6
Application/FOC/foc_type.h

@@ -16,10 +16,12 @@ typedef struct _dqaix {
 
 typedef struct _motor_p {
 	u8   poles; //极对数
-	int  ld;    //q 轴电感
-	int  lq;    //d 轴电感
-	int  r;     //内阻
-	int  flux_linkage; //磁链
+	float  ld;    //q 轴电感
+	float  lq;    //d 轴电感
+	float  rs;     //内阻
+	float  flux_linkage; //磁链
+	float  inertia; //转动惯量
+	float  b_emf;
 }motor_param_t;
 
 typedef struct _motor_s {
@@ -107,13 +109,20 @@ typedef enum {
 
 #define degree_2_pi(d) ((float)d * M_PI / 180.0f)
 #define pi_2_degree(d) ((float)d * 180.0f / M_PI)
-
+#if 1
 #define SECTOR_1  0u
 #define SECTOR_2  1u
 #define SECTOR_3  2u
 #define SECTOR_4  3u
 #define SECTOR_5  4u
 #define SECTOR_6  5u
-
+#else
+#define SECTOR_1  3u
+#define SECTOR_2  4u
+#define SECTOR_3  5u
+#define SECTOR_4  0u
+#define SECTOR_5  1u
+#define SECTOR_6  2u
+#endif
 #endif /* _FOC_TYPE_H__ */
 

+ 3 - 3
Application/FOC/hall_sensor.c

@@ -14,7 +14,7 @@
 * 从0开始增加,每增加1度观察电机电流(看直流电源),
 * 找到一个电机平稳转动并且电流最小的角度作为HALL_PLACE_OFFSET
 */
-#define HALL_PLACE_OFFSET 207.0f
+#define HALL_PLACE_OFFSET 213.0f
 /* 
 100
 101
@@ -80,7 +80,7 @@ float hall_sensor_get_theta(void){
 	}
 	_hall.est_theta = tick_2_s(delta_ticks(_hall.ticks)) * _hall.degree_per_s + _hall.theta;
 	if (_hall.est_theta > _hall.theta + 60.0f) {
-		_hall.est_theta = _hall.theta + 60.0f;
+		//_hall.est_theta = _hall.theta + 60.0f;
 	}
 	
 	float angle = _hall.est_theta;
@@ -239,7 +239,7 @@ void hall_sensor_handler(void) {
 	if (delta_time == 0.0f) { //may be errors ???
 		return;
 	}
-	float delta_theta = 60.0f;
+	float delta_theta = (_hall.direction == POSITIVE)?60.0f : -60.0f;
 	_hall_put_sample(delta_theta, delta_ticks(_hall.ticks));
 	if (!h_samples.full) {
 		_hall.degree_per_s = delta_theta / delta_time;

+ 1 - 1
Application/FOC/hall_sensor.h

@@ -29,7 +29,7 @@ typedef struct {
 	float phase_offset;
 }hall_t;
 
-#define SAMPLE_MAX_COUNT 12
+#define SAMPLE_MAX_COUNT 6
 
 typedef struct {
 	float angle[SAMPLE_MAX_COUNT];

+ 5 - 1
Application/FOC/park_clark.h

@@ -7,9 +7,13 @@
 static __INLINE void Rev_Park(dq_t *dq, float angle, alpha_beta_t *alpha_bata) {
 	float c,s;
 	normal_sincosf(angle, &s, &c);
-
+#if 1
 	alpha_bata->alpha = dq->d * c - dq->q * s;
 	alpha_bata->beta = dq->d * s + dq->q * c;
+#else
+	alpha_bata->alpha = dq->d * s + dq->q * c;
+	alpha_bata->beta = dq->d * c - dq->q * s;
+#endif
 }
 
 static __INLINE void Clark(float phaseU, float phaseV, float phaseW, alpha_beta_t *alpha_bata){

+ 14 - 14
Application/FOC/phase_current.c

@@ -26,16 +26,16 @@ void phase_current_offset(current_samp_t *cs) {
 		cs->offset_sample_count--;
 		if (cs->sector == SECTOR_5 && cs->offset_sample_count >= 0) {
 			cs->adc_offset_a += phase_current1;
-			cs->adc_offset_b += phase_current2;
+			cs->adc_offset_c += phase_current2;
 			if (cs->offset_sample_count == 0) {
 				cs->adc_offset_a = cs->adc_offset_a / NB_OFFSET_SAMPLES;
-				cs->adc_offset_b = cs->adc_offset_b / NB_OFFSET_SAMPLES;
+				cs->adc_offset_c = cs->adc_offset_c / NB_OFFSET_SAMPLES;
 			}
 		}
 		if (cs->sector == SECTOR_1 && cs->offset_sample_count >= 0) {
-			cs->adc_offset_c += phase_current2;
+			cs->adc_offset_b += phase_current1;
 			if (cs->offset_sample_count == 0) {
-				cs->adc_offset_c = cs->adc_offset_c / NB_OFFSET_SAMPLES;
+				cs->adc_offset_b = cs->adc_offset_b / NB_OFFSET_SAMPLES;
 			}
 		}
 	}
@@ -44,23 +44,23 @@ void phase_current_offset(current_samp_t *cs) {
 void phase_current_sample(current_samp_t *cs){
 	u32 phase_current1, phase_current2;
 	HAL_ADC1_Inject_Read(cs->sector, &phase_current1, &phase_current2);
-	if (cs->sector == SECTOR_4 || cs->sector == SECTOR_5) {
+	if (cs->sector == SECTOR_1 || cs->sector == SECTOR_2) {
 		/* Current on Phase C is not accessible */
       	/* Ia = PhaseAOffset - ADC converted value) */
-		cs->Ia = -adc_to_current((int)phase_current1 - (int)cs->adc_offset_a);
-		cs->Ib = -adc_to_current((int)phase_current2 - (int)cs->adc_offset_b);
+		cs->Ib = adc_to_current((int)phase_current1 - (int)cs->adc_offset_b);
+		cs->Ia = adc_to_current((int)phase_current2 - (int)cs->adc_offset_a);
 		cs->Ic = -(cs->Ia + cs->Ib);
-	}else if (cs->sector == SECTOR_1 || cs->sector == SECTOR_6) {
+	}else if (cs->sector == SECTOR_3 || cs->sector == SECTOR_4) {
 		/* Current on Phase A is not accessible 	*/
 		/* Ib = PhaseBOffset - ADC converted value) */
-		cs->Ib = -adc_to_current((int)phase_current1 - (int)cs->adc_offset_b);
-		cs->Ic = -adc_to_current((int)phase_current2 - (int)cs->adc_offset_c);
+		cs->Ic = adc_to_current((int)phase_current1 - (int)cs->adc_offset_c);
+		cs->Ib = adc_to_current((int)phase_current2 - (int)cs->adc_offset_b);
 		cs->Ia = -(cs->Ib + cs->Ic);
-	}else if (cs->sector == SECTOR_2 || cs->sector == SECTOR_3) {
+	}else if (cs->sector == SECTOR_5 || cs->sector == SECTOR_6) {
 		/* Current on Phase B is not accessible 	*/
 		/* Ia = PhaseAOffset - ADC converted value) */
-		cs->Ia = -adc_to_current((int)phase_current1 - (int)cs->adc_offset_a);
-		cs->Ic = -adc_to_current((int)phase_current2 - (int)cs->adc_offset_c);
+		cs->Ia = adc_to_current((int)phase_current1 - (int)cs->adc_offset_a);
+		cs->Ic = adc_to_current((int)phase_current2 - (int)cs->adc_offset_c);
 		cs->Ib = -(cs->Ia + cs->Ic);
 	}
 #if 0
@@ -77,7 +77,7 @@ u32 get_phase_sample_point(current_samp_t *cs, phase_time_t *time, u8 sector){
 	cs->sector = sector;
 	//duty > deadtime + max(Rise time, Noise time)
 	if (low_side_low_duty > (TDead + MAX(TRise, TNoise))) {
-		cs->sector = SECTOR_5;
+		cs->sector = SECTOR_1;
 		return FOC_PWM_Half_Period - 1;
 	}else {
 		u32 low_side_mid_duty = FOC_PWM_Half_Period - time->midle;

+ 86 - 14
Application/FOC/svpwm.c

@@ -179,7 +179,79 @@ static void __inline ModuleTime(u32 *T4, u32 *T6, u32 PWM_Period) {
 		*T6 *= ration;
 	}
 }
-
+void SVPWM_ST(alpha_beta_t *alpha_beta, float vbus, u32 PWM_half_period, phase_time_t *phase_out, u8 *sector_out){
+	u32 PWM_Period = PWM_half_period * 2;
+	float wAlpha = SQRT3 * alpha_beta->alpha * 2.0f;
+	float wBeta = -alpha_beta->beta * 2.0f;
+	float X = wBeta * PWM_Period/vbus;
+	float Y = (wBeta + wAlpha)*PWM_Period/vbus/2.0f;
+	float Z = (wBeta - wAlpha)*PWM_Period/vbus/2.0f;	
+	s32 tA, tB, tC;
+	s32 low, midle, high;
+	if (Y < 0) {
+    	if (Z < 0) {
+        	*sector_out = 5;
+        	tA = PWM_Period/4 + (Y - Z)/4;
+        	tB = tA + Z/2;
+        	tC = tA - Y/2;
+      		low = tC;
+      		midle = tA;
+      		high = tB;			
+    	}else {
+        	if (X <= 0 ) {
+            	*sector_out = 4;
+            	tA = PWM_Period/4 + (X - Z)/4;
+            	tB = tA + Z/2;
+            	tC = tB - X/2;
+				low = tC;
+      			midle = tB;
+      			high = tA;
+        	}else {
+            	*sector_out = 3;
+            	tA = PWM_Period/4 + (Y - X)/4;
+            	tC = tA - Y/2;
+            	tB = tC + X/2;
+      			low = tB;
+      			midle = tC;
+      			high = tA;				
+        	}
+    	}
+	}else {
+    	if (Z >= 0) {
+        	*sector_out = 2;
+        	tA = PWM_Period/4 + (Y - Z)/4;
+        	tB= tA + Z/2;
+        	tC = tA - Y/2;
+      		low = tB;
+      		midle = tC;
+      		high = tA;			
+    	}else {
+        	if (X <= 0 ) {
+            	*sector_out = 6;
+            	tA = PWM_Period/4 + (Y - X)/4;
+            	tC = tA - Y/2;    
+            	tB = tC + X/2;
+	      		low = tA;
+      			midle = tC;
+      			high = tB;			
+        	} else {
+            	*sector_out = 1;
+            	tA = PWM_Period/4 + (X - Z)/4;
+            	tB = tA + Z/2;
+            	tC = tB - X/2;
+	      		low = tA;
+      			midle = tB;
+      			high = tC;
+        	}
+    	}
+	}
+	phase_out->A = ( uint16_t )tA;
+	phase_out->B = ( uint16_t )tB;
+	phase_out->C = ( uint16_t )tC;
+	phase_out->low = low;
+	phase_out->midle = midle;
+	phase_out->high = high;	
+}
 /* 7段式SVPWM 
  * 返回设置3相PWM的3个CCR寄存器的值
  * 这里使用的是stm32的PWM mode1,在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平
@@ -273,54 +345,54 @@ void SVPWM_7(alpha_beta_t *alpha_beta, float vbus, u32 PWM_half_period, phase_ti
 			B_duty = A_duty + T1;
 			C_duty = B_duty + T2;
 
-			low = A_duty;
+			low = C_duty;
 			midle = B_duty;
-			high = C_duty;
+			high = A_duty;
 			break;		
 		case SECTOR_2: // 1
 			B_duty = (PWM_half_period - T1 - T2) / 2;
 			A_duty = B_duty + T1;
 			C_duty = A_duty + T2;
 
-			low = B_duty;
+			low = C_duty;
 			midle = A_duty;
-			high = C_duty;			
+			high = B_duty;			
 			break;
 		case SECTOR_3: // 5
 			B_duty = (PWM_half_period - T1 - T2) / 2;
 			C_duty = B_duty + T1;
 			A_duty = C_duty + T2;
 
-			low = B_duty;
+			low = A_duty;
 			midle = C_duty;
-			high = A_duty;			
+			high = B_duty;			
 			break;
 		case SECTOR_4: // 4
 			C_duty = (PWM_half_period - T1 - T2) / 2;
 			B_duty = C_duty + T1;
 			A_duty = B_duty + T2;
 
-			low = C_duty;
+			low = A_duty;
 			midle = B_duty;
-			high = A_duty;			
+			high = C_duty;			
 			break;
 		case SECTOR_5: // 6
 			C_duty = (PWM_half_period - T1 - T2) / 2;
 			A_duty = C_duty + T1;
 			B_duty = A_duty + T2;
 
-			low = C_duty;
+			low = B_duty;
 			midle = A_duty;
-			high = B_duty;			
+			high = C_duty;			
 			break;			
 		case SECTOR_6: // 2
 			A_duty = (PWM_half_period - T1 - T2) / 2;
 			C_duty = A_duty + T1;
 			B_duty = C_duty + T2;
 
-			low = A_duty;
+			low = B_duty;
 			midle = C_duty;
-			high = B_duty;			
+			high = A_duty;			
 			break;
 		default:
 			break;
@@ -335,7 +407,7 @@ void SVPWM_7(alpha_beta_t *alpha_beta, float vbus, u32 PWM_half_period, phase_ti
 	*sector_out = sector;
 #if 0
 	static int tet_p = 0;
-	if (tet_p++ % 5 == 0) {
+	if (tet_p++ % 10 == 0) {
 		printf("$%d %d %d;", A_duty, B_duty, C_duty);
 	}
 #endif		

+ 1 - 2
Application/FOC/svpwm.h

@@ -4,7 +4,6 @@
 
 void svpwm(alpha_beta_t *alpha_beta, float vbus, u32 PWW_half_period, phase_time_t *phase_out, u8 *sector_out);
 void SVPWM_7(alpha_beta_t *alpha_beta, float vbus, u32 PWM_half_period, phase_time_t *phase_out, u8 *sector_out);
-
-
+void SVPWM_ST(alpha_beta_t *alpha_beta, float vbus, u32 PWM_half_period, phase_time_t *phase_out, u8 *sector_out);
 #endif /* _SVPWM_H__ */
 

+ 13 - 13
Application/Hal/adc.h

@@ -17,29 +17,29 @@ typedef struct _R3_f3_1_adc_config {
 static const R3_F30x_8_ADC_Config_t adc_config = {
 	.ADCx = ADC1,
 	.TIMx = TIM1,
-	.ADCConfig = {
-				CURRENT_V_ADC_CHANNAL<<ADC_JSQR_JSQ1_Pos | CURRENT_W_ADC_CHANNAL<<ADC_JSQR_JSQ2_Pos | 1<<ADC_JSQR_JL_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT),
-				CURRENT_U_ADC_CHANNAL<<ADC_JSQR_JSQ1_Pos | CURRENT_W_ADC_CHANNAL<<ADC_JSQR_JSQ2_Pos | 1<<ADC_JSQR_JL_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT),
-				CURRENT_W_ADC_CHANNAL<<ADC_JSQR_JSQ1_Pos | CURRENT_U_ADC_CHANNAL<<ADC_JSQR_JSQ2_Pos | 1<<ADC_JSQR_JL_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT),
+	.ADCConfig = {//A ->U, B->V, C->W
 				CURRENT_V_ADC_CHANNAL<<ADC_JSQR_JSQ1_Pos | CURRENT_U_ADC_CHANNAL<<ADC_JSQR_JSQ2_Pos | 1<<ADC_JSQR_JL_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT),
 				CURRENT_U_ADC_CHANNAL<<ADC_JSQR_JSQ1_Pos | CURRENT_V_ADC_CHANNAL<<ADC_JSQR_JSQ2_Pos | 1<<ADC_JSQR_JL_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT),
 				CURRENT_W_ADC_CHANNAL<<ADC_JSQR_JSQ1_Pos | CURRENT_V_ADC_CHANNAL<<ADC_JSQR_JSQ2_Pos | 1<<ADC_JSQR_JL_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT),
+				CURRENT_V_ADC_CHANNAL<<ADC_JSQR_JSQ1_Pos | CURRENT_W_ADC_CHANNAL<<ADC_JSQR_JSQ2_Pos | 1<<ADC_JSQR_JL_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT),
+				CURRENT_U_ADC_CHANNAL<<ADC_JSQR_JSQ1_Pos | CURRENT_W_ADC_CHANNAL<<ADC_JSQR_JSQ2_Pos | 1<<ADC_JSQR_JL_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT),
+				CURRENT_W_ADC_CHANNAL<<ADC_JSQR_JSQ1_Pos | CURRENT_U_ADC_CHANNAL<<ADC_JSQR_JSQ2_Pos | 1<<ADC_JSQR_JL_Pos | (LL_ADC_INJ_TRIG_EXT_TIM1_TRGO & ~ADC_INJ_TRIG_EXT_EDGE_DEFAULT),
 	},
-		
+
 	.ADCDataReg1 = {
 				&ADC1->JDR1,//V
-				&ADC1->JDR1,//U
-				&ADC1->JDR2,//U  
-				&ADC1->JDR2,//U 
-				&ADC1->JDR1,//U
 				&ADC1->JDR2,//V
+				&ADC1->JDR1,//W  
+				&ADC1->JDR2,//W 
+				&ADC1->JDR1,//U
+				&ADC1->JDR2,//U
 	},
 	.ADCDataReg2 = {
-				&ADC1->JDR2, //W
-				&ADC1->JDR2, //W
-				&ADC1->JDR1, //W
-				&ADC1->JDR1, //V
+				&ADC1->JDR2, //U
+				&ADC1->JDR1, //U
 				&ADC1->JDR2, //V
+				&ADC1->JDR1, //V
+				&ADC1->JDR2, //W
 				&ADC1->JDR1, //W
 	},
 };

+ 3 - 3
Application/Hal/hal.h

@@ -67,8 +67,8 @@
 #define ADC_CLOCK_MHz (72)
 #define NS_PER_TCLK (7) /* (1/144000000 * 1000000000) */
 #define NS_2_TCLK(ns) ((ns/NS_PER_TCLK) + 1) //ns 转为pwm使用的那个TIM的clk count
-#define FOC_FS (20 * 1000)
-#define FOC_PWM_period (TIM_CLOCK/FOC_FS)
+#define FOC_PWM_FS (30 * 1000)
+#define FOC_PWM_period (TIM_CLOCK/FOC_PWM_FS)
 #define FOC_PWM_Half_Period (FOC_PWM_period/2)
 #define MAX_VBUS (12.f) //12v
 
@@ -79,7 +79,7 @@
 #define HW_DEAD_TIME_NS  800
 #define HW_RISE_TIME_NS  50
 #define HW_NOISE_TIME_NS 50
-#define TDead NS_2_TCLK(HW_DEAD_TIME_NS)/* 死区时间 */ 
+#define TDead NS_2_TCLK(HW_DEAD_TIME_NS/2)/* 死区时间 */ 
 #define TRise NS_2_TCLK(HW_RISE_TIME_NS)/* MOS 开关时间*/
 #define TNoise NS_2_TCLK(HW_NOISE_TIME_NS)/* MOS开关引入的开关噪声时间 */
 #define TADC   ((uint16_t)((ADC_TRIG_CONV_LATENCY_CYCLES + ADC_SAMPLING_CYCLES) * 2 * TIM_CLOCK_MHz) / ADC_CLOCK_MHz + 1u)/* ADC 采样时间 */

+ 4 - 4
Application/Hal/pwm.c

@@ -12,7 +12,7 @@
 static TIM_HandleTypeDef htim1;
 static void HAL_TIM1_Pin_Init(void);
 
-void HAL_PWM_Init(int fs) {
+void HAL_PWM_Init() {
 	TIM_SlaveConfigTypeDef sSlaveConfig = {0};
 	TIM_MasterConfigTypeDef sMasterConfig = {0};
 	TIM_OC_InitTypeDef sConfigOC = {0};
@@ -21,7 +21,7 @@ void HAL_PWM_Init(int fs) {
 	htim1.Instance = TIM1;
 	htim1.Init.Prescaler = 0;
 	htim1.Init.CounterMode = TIM_COUNTERMODE_CENTERALIGNED1;
-	htim1.Init.Period = (TIM_CLOCK / fs / 2);
+	htim1.Init.Period = (TIM_CLOCK / FOC_PWM_FS / 2);
 	htim1.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;
 	htim1.Init.RepetitionCounter = 0;
 	htim1.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;
@@ -47,7 +47,7 @@ void HAL_PWM_Init(int fs) {
 	  Error_Handler();
 	}
 	sConfigOC.OCMode = TIM_OCMODE_PWM1;
-	sConfigOC.Pulse = (TIM_CLOCK / fs) / 4; //运行后,根据svpwm重新设置
+	sConfigOC.Pulse = (TIM_CLOCK / FOC_PWM_FS) / 4; //运行后,根据svpwm重新设置
 	sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;
 	sConfigOC.OCNPolarity = TIM_OCNPOLARITY_HIGH;
 	sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;
@@ -67,7 +67,7 @@ void HAL_PWM_Init(int fs) {
 	}
 	/* 触发ADC采样的配置 */
   	sConfigOC.OCMode = TIM_OCMODE_PWM2;
-  	sConfigOC.Pulse = (TIM_CLOCK / fs) / 2 - 5; //运行后,根据pwm,sector信息,重新设置采样点
+  	sConfigOC.Pulse = (TIM_CLOCK / FOC_PWM_FS) / 2 - 5; //运行后,根据pwm,sector信息,重新设置采样点
   	if (HAL_TIM_PWM_ConfigChannel(&htim1, &sConfigOC, TIM_CHANNEL_4) != HAL_OK)
   	{
     	Error_Handler();

+ 1 - 1
Application/Hal/pwm.h

@@ -2,7 +2,7 @@
 #define _PWM_H__
 #include "libs/types.h"
 
-void HAL_PWM_Init(int fs);
+void HAL_PWM_Init(void);
 void PWM_UpdateDuty(u32 duty1, u32 duty2, u32 duty3, u32 sample_point);
 void PWM_Start(void);
 void PWM_Stop(void);