|
@@ -6,6 +6,7 @@
|
|
|
#include "crc16.h"
|
|
|
#include "string.h"
|
|
|
#include "math.h"
|
|
|
+#include "cfg.h"
|
|
|
|
|
|
|
|
|
uint16_t g_blinkLedTime; /*RUN LED闪烁频率控制时间*/
|
|
@@ -40,13 +41,8 @@ static int16_t acc_x = 0;
|
|
|
static int16_t acc_y = 0;
|
|
|
static int16_t acc_z = 0;
|
|
|
|
|
|
-//static float acc_fx = 0;
|
|
|
-//static float acc_fy = 0;
|
|
|
-//static float acc_fz = 0;
|
|
|
-
|
|
|
-//static float fx_sum = 0;
|
|
|
-//static float fy_sum = 0;
|
|
|
-//static float fz_sum = 0;
|
|
|
+uint8_t g_autocalibration = 0;
|
|
|
+uint16_t g_samplecount = 0;
|
|
|
|
|
|
uint8_t g_send_raw = 0;
|
|
|
uint8_t g_send_filtered = 0;
|
|
@@ -142,6 +138,9 @@ void Process_Init(void)
|
|
|
cbuffer.write_index = 0;
|
|
|
|
|
|
filter_avg.count = 0;
|
|
|
+
|
|
|
+ g_autocalibration=0;
|
|
|
+ g_samplecount = 0;
|
|
|
|
|
|
|
|
|
}
|
|
@@ -240,6 +239,66 @@ int cbuffer_popdata(int16_t* acc_x, int16_t* acc_y, int16_t* acc_z)
|
|
|
}
|
|
|
|
|
|
|
|
|
+void autocaculate_mtnoise(axis_info_t* paxis_info)
|
|
|
+{
|
|
|
+ //复用测速 buffer
|
|
|
+ // 以防精度不够用 double 类型
|
|
|
+ double accx_average = 0.0;
|
|
|
+ double accy_average = 0.0;
|
|
|
+ double accz_average = 0.0;
|
|
|
+
|
|
|
+ double accx_sd = 0.0;
|
|
|
+ double accy_sd = 0.0;
|
|
|
+ double accz_sd = 0.0;
|
|
|
+
|
|
|
+ uint16_t i=0;
|
|
|
+
|
|
|
+ detect_info.info[g_samplecount].x = paxis_info->x;
|
|
|
+ detect_info.info[g_samplecount].y = paxis_info->y;
|
|
|
+ detect_info.info[g_samplecount].z = paxis_info->z;
|
|
|
+
|
|
|
+ g_samplecount++;
|
|
|
+ if(DETECT_CNT == g_samplecount){
|
|
|
+
|
|
|
+ for(i=0; i < DETECT_CNT; i++){
|
|
|
+ accx_average += detect_info.info[i].x;
|
|
|
+ accy_average += detect_info.info[i].y;
|
|
|
+ accz_average += detect_info.info[i].z;
|
|
|
+ }
|
|
|
+
|
|
|
+ accx_average = accx_average/DETECT_CNT;
|
|
|
+ accy_average = accy_average/DETECT_CNT;
|
|
|
+ accz_average = accz_average/DETECT_CNT;
|
|
|
+
|
|
|
+ for(i=0; i < DETECT_CNT; i++){
|
|
|
+ accx_sd += pow(detect_info.info[i].x - accx_average, 2)/DETECT_CNT;
|
|
|
+ accy_sd += pow(detect_info.info[i].y - accy_average, 2)/DETECT_CNT;
|
|
|
+ accz_sd += pow(detect_info.info[i].z - accz_average, 2)/DETECT_CNT;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+ accx_sd = pow(accx_sd, 0.5);
|
|
|
+ accy_sd = pow(accy_sd, 0.5);
|
|
|
+ accz_sd = pow(accz_sd, 0.5);
|
|
|
+
|
|
|
+ //3 sigma
|
|
|
+ //设备内参, 不加入出厂设置
|
|
|
+ config->xaxis_threshold = 3*fabs(accx_sd);
|
|
|
+ config->yaxis_threshold = 3*fabs(accy_sd);
|
|
|
+ config->zaxis_threshold = 3*fabs(accz_sd);
|
|
|
+ SaveConfig();
|
|
|
+
|
|
|
+ g_samplecount=0;
|
|
|
+ g_autocalibration=0;
|
|
|
+
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
void alg_PreProcess(void)
|
|
|
{
|
|
|
static uint8_t _bvopen = BV_CLOSE;
|
|
@@ -329,13 +388,13 @@ void alg_detect(axis_info_t* paxis_info)
|
|
|
paxis_info->z -= g_alg_context.axis_offset.z;
|
|
|
|
|
|
//机械滤波
|
|
|
- if(fabs(paxis_info->x) <= MECHANICAL_NOISE_THRESHOLD){
|
|
|
+ if(fabs(paxis_info->x) <= config->xaxis_threshold){
|
|
|
paxis_info->x = 0.0;
|
|
|
}
|
|
|
- if(fabs(paxis_info->y) <= MECHANICAL_NOISE_THRESHOLD){
|
|
|
+ if(fabs(paxis_info->y) <= config->yaxis_threshold){
|
|
|
paxis_info->y = 0.0;
|
|
|
}
|
|
|
- if(fabs(paxis_info->z) <= MECHANICAL_NOISE_THRESHOLD){
|
|
|
+ if(fabs(paxis_info->z) <= config->zaxis_threshold){
|
|
|
paxis_info->z = 0.0;
|
|
|
}
|
|
|
|
|
@@ -554,29 +613,34 @@ void Process_Alg(void)
|
|
|
uint32_t start = OSIF_GetMilliseconds();
|
|
|
|
|
|
//printf("alg:%d ms st: %d \r", start, g_alg_context.state);
|
|
|
+ if(1 == g_autocalibration ){
|
|
|
+ autocaculate_mtnoise(&axis_info);
|
|
|
+
|
|
|
+ }else{
|
|
|
|
|
|
- switch(g_alg_context.state){
|
|
|
- case ALG_Start:
|
|
|
- alg_start();
|
|
|
- break;
|
|
|
- case ALG_Calibrate:
|
|
|
- alg_calibrate(&axis_info);
|
|
|
- break;
|
|
|
- case ALG_Detecting:
|
|
|
- alg_detect(&axis_info);
|
|
|
- break;
|
|
|
- case ALG_Triggering:
|
|
|
- alg_Triggering();
|
|
|
- break;
|
|
|
- case ALG_Finished:
|
|
|
- alg_Finished();
|
|
|
- break;
|
|
|
- default:
|
|
|
- break;
|
|
|
+ switch(g_alg_context.state){
|
|
|
+ case ALG_Start:
|
|
|
+ alg_start();
|
|
|
+ break;
|
|
|
+ case ALG_Calibrate:
|
|
|
+ alg_calibrate(&axis_info);
|
|
|
+ break;
|
|
|
+ case ALG_Detecting:
|
|
|
+ alg_detect(&axis_info);
|
|
|
+ break;
|
|
|
+ case ALG_Triggering:
|
|
|
+ alg_Triggering();
|
|
|
+ break;
|
|
|
+ case ALG_Finished:
|
|
|
+ alg_Finished();
|
|
|
+ break;
|
|
|
+ default:
|
|
|
+ break;
|
|
|
+ }
|
|
|
+
|
|
|
}
|
|
|
|
|
|
- #if 1
|
|
|
-
|
|
|
+ #if 1
|
|
|
if(g_send_raw){
|
|
|
|
|
|
d_buffer[0] = 0xAA;
|