#include "linear.h" #include 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); /// /// 利用两点法进行线性拟合 y = kx + b, /// 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); } /// /// 更新数组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); // }