113 lines
2.6 KiB
C
113 lines
2.6 KiB
C
#include "linear.h"
|
||
#include <stdlib.h>
|
||
|
||
int point_v[1024] = {0};
|
||
int point_l[1024] = {0};
|
||
int point_cnt = 0;
|
||
float k = 0;
|
||
float b = 0;
|
||
float theory_point[300] = {0};
|
||
float linearity = 0;
|
||
int test_cnt = 1;
|
||
uint8_t save_data[101];
|
||
uint8_t vol_loc_data[2000];
|
||
|
||
int point_v_max,max_point,point_v_min,min_point;
|
||
float bias_local = 0;
|
||
|
||
extern double fabs(double __x);
|
||
|
||
/// <LinearFit>
|
||
/// 利用两点法进行线性拟合 y = kx + b,
|
||
/// <x,y—存放长度与电压的数组>
|
||
void linear_fit()
|
||
{
|
||
// Ax+By+C=0
|
||
float A = 0;
|
||
float B = 0;
|
||
float C = 0;
|
||
|
||
point_v_max = -9999;
|
||
point_v_min = 9999;
|
||
|
||
for (int i = 0; i < point_cnt; i++)
|
||
{
|
||
if(point_v[i] > point_v_max)
|
||
{
|
||
point_v_max = point_v[i];
|
||
max_point = i;
|
||
}
|
||
if(point_v[i] < point_v_min)
|
||
{
|
||
point_v_min = point_v[i];
|
||
min_point = i;
|
||
}
|
||
}
|
||
|
||
A = point_v[max_point] - point_v[min_point];
|
||
B = point_l[min_point] - point_l[max_point];
|
||
C = point_l[max_point] * point_v[min_point] - point_l[min_point] * point_v[max_point];
|
||
|
||
k = -(A / B);
|
||
b = -(C / B);
|
||
}
|
||
|
||
/// <summary>
|
||
/// 更新数组y,替换为电压理论值
|
||
void linear_val()
|
||
{
|
||
for (int i = 0; i < point_cnt; i++)
|
||
{
|
||
theory_point[i] = k * point_l[i] + b;
|
||
}
|
||
}
|
||
|
||
int write_start_addr = 0;
|
||
|
||
void get_linearity()
|
||
{
|
||
float max_bias = 0;
|
||
|
||
linear_fit();
|
||
linear_val();
|
||
for (int i = 0; i < point_cnt; i++)
|
||
{
|
||
if(fabs(max_bias) < fabs(point_v[i] - theory_point[i]))
|
||
{
|
||
max_bias = point_v[i] - theory_point[i];
|
||
bias_local = point_l[i];
|
||
}
|
||
|
||
//
|
||
vol_loc_data[0 + 2*i] = ((uint16_t)point_v[i] >> 8) & 0xFF;
|
||
vol_loc_data[1 + 2*i] = (uint16_t)point_v[i] & 0xFF;
|
||
vol_loc_data[1000 + 2*i] = ((uint16_t)point_l[i] >> 8) & 0xFF;
|
||
vol_loc_data[1001 + 2*i] = (uint16_t)point_l[i] & 0xFF;
|
||
//
|
||
}
|
||
linearity = fabs(max_bias / (point_v_max - point_v_min));
|
||
|
||
//
|
||
test_cnt++;
|
||
if(test_cnt > 10)
|
||
test_cnt = 1;
|
||
|
||
save_data[0 + (test_cnt-1)*10] = ((uint16_t)(linearity * 10000) >> 8) & 0xFF;
|
||
save_data[1 + (test_cnt-1)*10] = (uint16_t)(linearity * 10000) & 0xFF;
|
||
save_data[2 + (test_cnt-1)*10] = ((uint16_t)(bias_local) >> 8) & 0xFF;
|
||
save_data[3 + (test_cnt-1)*10] = (uint16_t)(bias_local) & 0xFF;
|
||
save_data[4 + (test_cnt-1)*10] = ((uint16_t)(point_cnt) >> 8) & 0xFF;
|
||
save_data[5 + (test_cnt-1)*10] = (uint16_t)(point_cnt) & 0xFF;
|
||
save_data[6 + (test_cnt-1)*10] = ((uint16_t)(point_v_min) >> 8) & 0xFF;
|
||
save_data[7 + (test_cnt-1)*10] = (uint16_t)(point_v_min) & 0xFF;
|
||
save_data[8 + (test_cnt-1)*10] = ((uint16_t)(point_v_max) >> 8) & 0xFF;
|
||
save_data[9 + (test_cnt-1)*10] = (uint16_t)(point_v_max) & 0xFF;
|
||
save_data[100] = test_cnt;
|
||
|
||
at24cxx_write(write_start_addr,save_data,101);
|
||
at24cxx_write(1000 * (2 * test_cnt - 1),vol_loc_data,2000);
|
||
//
|
||
}
|
||
|
||
|