Browse Source

调整最小二乘的线性结构体

Signed-off-by: huhui <huhui@sharkgulf.com>
huhui 5 năm trước cách đây
mục cha
commit
a433add4fd

+ 8 - 8
Application/app/sox/Least_Square.c

@@ -1,12 +1,12 @@
 #include <stdio.h>
 #include "Least_Square.h"
 
-//y = Cbx + Ka
+//y = Kax + Cb
 void least_square_init(least_square_t *ls, int samples){
 	ls->max_samples = samples;
 	ls->num_samples = 0;
-	ls->Cb = 0;
-	ls->Ka = 0;
+	ls->coeff.Ka = 1.0f;
+	ls->coeff.Cb = 0.0f;
 	ls->mul_xx = 0;
 	ls->mul_xy = 0;
 	ls->sum_x = 0;
@@ -24,8 +24,8 @@ int least_square_put(least_square_t *ls, double x, double y){
 		ls->sum_y += y;
 		return 0;
 	}else {
-		ls->Cb = (ls->max_samples * ls->mul_xy - ls->sum_x * ls->sum_y) / (ls->max_samples * ls->mul_xx - ls->sum_x * ls->sum_x);
-		ls->Ka = ls->sum_y / ls->max_samples - ls->Cb * ls->sum_x / ls->max_samples;
+		ls->coeff.Ka = (ls->max_samples * ls->mul_xy - ls->sum_x * ls->sum_y) / (ls->max_samples * ls->mul_xx - ls->sum_x * ls->sum_x);
+		ls->coeff.Cb = ls->sum_y / ls->max_samples - ls->coeff.Ka * ls->sum_x / ls->max_samples;
 		ls->mul_xx += x * x;
 		ls->mul_xy += x * y;
 		ls->sum_x += x;
@@ -43,14 +43,14 @@ int least_square_put(least_square_t *ls, double x, double y){
 }
 
 double get_y_by_x(least_square_t *ls, double x){
-	return ls->Cb * x + ls->Ka;
+	return ls->coeff.Ka * x + ls->coeff.Cb;
 }
 
 int get_x_by_y(least_square_t *ls, double y) {
-	if (ls->Cb == 0){
+	if (ls->coeff.Ka == 0){
 		return -1; 
 	}
-	int x = (y - ls->Ka)/ls->Cb;
+	int x = (y - ls->coeff.Cb)/ls->coeff.Ka;
 	return  (x >= 0) ? x : -1;
 }
 

+ 6 - 2
Application/app/sox/Least_Square.h

@@ -1,5 +1,10 @@
 #pragma once
 
+typedef struct {
+	double Ka;
+	double Cb;
+}linear_ceoff_t;
+
 typedef struct {
 	int max_samples;
 	int num_samples;
@@ -9,8 +14,7 @@ typedef struct {
 	double mul_xy;
 	double sum_x;
 	double sum_y;
-	double Ka;
-	double Cb;
+	linear_ceoff_t coeff;
 	int finished;
 }least_square_t;
 

+ 17 - 21
Application/app/sox/measure.c

@@ -30,17 +30,13 @@ static float imon_gain_now;
 static float vim0_10x = 0.0f;
 static float vim0_50x = 0.0f;
 static float vim0_now;
-static float ml5238_10x_a = 1.0f;
-static float ml5238_50x_a = 1.0f;
 
-static float ml5238_10x_b = 0.0f;
-static float ml5238_50x_b = 0.0f;
+static linear_ceoff_t ml5238_10x_ceoff = {.Ka = 1.0f, .Cb = 0.0f};
+static linear_ceoff_t ml5238_50x_ceoff = {.Ka = 1.0f, .Cb = 0.0f};
+static linear_ceoff_t ml5238_now_ceoff;
 
-static float ml5238_now_a = 1.0f;
-static float ml5238_now_b = 0.0f;
+static linear_ceoff_t cs1180_ceoff = {.Ka = 1.0f, .Cb = 0.0f};
 
-static float cs1180_a = 1.0f;
-static float cs1180_b = 0.0f;
 
 #define gain_default_50x 1
 #define CS1180_MAX_CURRENT 4500 //MA, cs1180的最大电流,超过这个使用ML5238
@@ -60,14 +56,13 @@ static void __inline__ select_gain_10x(int select){
 		ML5238_IMON_OUT_10X();
 		imon_gain_now = imon_gain_10x;
 		vim0_now = vim0_10x;
-		ml5238_now_a = ml5238_10x_a;
-		ml5238_now_b = ml5238_10x_b;
+		ml5238_now_ceoff = ml5238_10x_ceoff;
+
 	}else {
 		ML5238_IMON_OUT_50X();
 		imon_gain_now = imon_gain_50x;
 		vim0_now = vim0_50x;
-		ml5238_now_a = ml5238_50x_a;
-		ml5238_now_b = ml5238_50x_b;
+		ml5238_now_ceoff = ml5238_50x_ceoff;
 	}
 }
 
@@ -163,9 +158,13 @@ static float get_pack_current_by_cs1180(int *valid){
 	return (vol / r_sense) * 1000 - 5.0f;//板子固定5MA,cs1180无法测量到
 }
 
+static __inline__ float get_caliberated_current(linear_ceoff_t *cof, float x) {
+	return (x * cof->Ka) + cof->Cb;
+}
+
 float get_pack_current(int *current_5238){
 	float current = get_pack_current_by_gd();
-	current = ml5238_now_a * current + ml5238_now_b;
+	current = get_caliberated_current(&ml5238_now_ceoff, current);
 	if (current_5238 != NULL){
 		*current_5238 = (int)current;
 	}
@@ -173,7 +172,7 @@ float get_pack_current(int *current_5238){
 		int valid = 1;
 		float cs1180_current = get_pack_current_by_cs1180(&valid);
 		if (valid == 1) {
-			current = cs1180_current * cs1180_a + cs1180_b;
+			current = get_caliberated_current(&cs1180_ceoff, cs1180_current);
 		}
 	}
 	return current;
@@ -258,17 +257,14 @@ int measure_stop_cali(uint8_t adc, uint8_t gain){
 	if (adc_cali[adc].finished ) {
 		if (adc == GD32_ADC) {
 			if (gain == 10) {
-				ml5238_10x_a = adc_cali[adc].Cb;
-				ml5238_10x_b = adc_cali[adc].Ka;
+				ml5238_10x_ceoff = adc_cali[adc].coeff;
 			}else if (gain == 50) {
-				ml5238_50x_a = adc_cali[adc].Cb;
-				ml5238_50x_b = adc_cali[adc].Ka;
+				ml5238_50x_ceoff = adc_cali[adc].coeff;
 			}
 		}else {
-			cs1180_a = adc_cali[adc].Cb;
-			cs1180_b = adc_cali[adc].Ka;
+			cs1180_ceoff = adc_cali[adc].coeff;
 		}
-		sys_debug("stop %f, %f\n", adc_cali[adc].Cb, adc_cali[adc].Ka);
+		sys_debug("stop %f, %f\n", adc_cali[adc].coeff.Ka, adc_cali[adc].coeff.Cb);
 	}
 	select_gain_10x(0);
 	return adc_cali[adc].finished;

+ 2 - 1
Application/app/sox/measure_task.c

@@ -1,4 +1,5 @@
 #include "bsp/gpio.h"
+#include "bsp/cs1180.h"
 #include "app/sox/measure.h"
 #include "app/sox/health.h"
 #include "libs/shark_task.h"
@@ -93,7 +94,7 @@ static void init_temp_task(void){
 	shark_task_add(&_temp_task._task);
 }
 static u32 temp_task_handler(void){
-	_measure_value.pack_temp[_temp_task.index] = 25;//get_pack_temperature(_temp_task.index);
+	_measure_value.pack_temp[_temp_task.index] = get_pack_temperature(_temp_task.index);
 	_temp_task.index = (_temp_task.index + 1) % (PACK_TEMPS_NUM);
 	_temperature_notify();//֪ͨbms state ÓÐеÄζÈÊý¾Ý
 	return _temp_task.delay;

+ 0 - 1
Application/bsp/bsp.c

@@ -56,7 +56,6 @@ void bsp_init(void){
 	wdog_start(4);
 	shark_rtc_init();
 	enable_mcu_power();
-	delay_us(100);
 	system_clock_config(); //after dcdc open, MCU can run on full speed
 	SystemCoreClockUpdate();
 	gpio_init();