micro_climate/App/Src/collect_data.c

144 lines
3.1 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "collect_data.h"
#include <string.h>
#include "math.h"
#include "pdebug.h"
tagSmpValueBuffer g_smpValueBuffer;
tagAnlgeValue g_AnlgeValue;
#if 0
/**
* @brief fir滤波更新数据
* @param
* @retval
*/
void FirFilter_RenewData(int16_t iXValue,int16_t iYValue,int16_t iZValue)
{
//X
writeIP = gs_FirFilterParam[0].WriteIP;
gs_FirFilterParam[0].pDataBuf[writeIP] = iXValue;
gs_FirFilterParam[0].WriteIP = (writeIP + 1) % gs_FirFilterParam[0].BufLen;
//Y
writeIP = gs_FirFilterParam[1].WriteIP;
gs_FirFilterParam[1].pDataBuf[writeIP] = iYValue;
gs_FirFilterParam[1].WriteIP = (writeIP + 1) % gs_FirFilterParam[1].BufLen;
}
#endif
/**
* @brief 读取采样值
* @param
* @retval
*/
void GetSmpValue()
{
int16_t X_Value = 0,Y_Value = 0,Z_Value;
for(int i=0; i<SMPVALUE_BUFFER_LEN; i++){
//采集数据
Lsm6ds3_ReadAccelerationRaw(&X_Value, &Y_Value, &Z_Value);
g_smpValueBuffer.XValueBuffer[i].iValue = X_Value;
g_smpValueBuffer.YValueBuffer[i].iValue = Y_Value;
}
//x轴采样值
g_smpValueBuffer.XValue.iValue = f_Middle((U_DataType*)g_smpValueBuffer.XValueBuffer);
//y轴采样值
g_smpValueBuffer.YValue.iValue= f_Middle((U_DataType*)g_smpValueBuffer.YValueBuffer);
}
/**
* @brief 计算角度值
* @param
* @retval
*/
#define LSB 16393.44
#define PI (180/3.1415926)
void AD_ComputeAngle(int SmpValue_X,int SmpValue_Y,float *pAngle_X,float *pAngle_Y)
{
float x_value = (float)SmpValue_X / LSB;
float y_value = (float)SmpValue_Y / LSB;
if(x_value >= 1)
x_value=1;
if(x_value <= -1)
x_value=-1;
if(y_value >= 1)
y_value=1;
if(y_value <= -1)
y_value=-1;
*pAngle_X = asinf(x_value)*PI;
*pAngle_Y = asinf(y_value)*PI;
}
/**
* @brief 获取角度值
* @param
* @retval
*/
void ComputeAngle()
{
int16_t X_SmpValue_New,Y_SmpValue_New;
float angle_x_m = 0,angle_y_m = 0; //测量值
//当前采样值
X_SmpValue_New = g_smpValueBuffer.XValue.iValue;
Y_SmpValue_New = g_smpValueBuffer.YValue.iValue;
#ifdef FILTER_MIDDLE_ENABLE
u_int16_t f_Middle(int16_t *ArrDataBuffer);
#endif
#ifdef FILTER_FIR_ENABLE
FirFilter_RenewData(X_SmpValue_New,Y_SmpValue_New,Z_SmpValue_New);
X_SmpValue_New = filter_fir_plus(&gs_FirFilterParam[0],gs_FirFilterHParam);
Y_SmpValue_New = filter_fir_plus(&gs_FirFilterParam[1],gs_FirFilterHParam);
#endif
AD_ComputeAngle(X_SmpValue_New,Y_SmpValue_New,&angle_x_m,&angle_y_m);
if(angle_x_m > 60)
angle_x_m = 60;
if(angle_x_m < -60)
angle_x_m = -60;
if(angle_y_m > 60)
angle_y_m = 60;
if(angle_y_m < -60)
angle_y_m = -60;
g_AnlgeValue.Angle_X = angle_x_m;
g_AnlgeValue.Angle_Y = angle_y_m;
//term_printf("x_angele: %.2f, y_angle: %.2f\r\n",g_AnlgeValue.Angle_X,g_AnlgeValue.Angle_Y);
//g_AnlgeValue.isReady = SD_TRUE;
}
/**
* @brief 获取角度值
* @param
* @retval
*/
void GetAngleValue()
{
//if(SD_TRUE == g_ReadSmpIP)
//{
GetSmpValue();
ComputeAngle();
//SaveRealTimeData();
//g_ReadSmpIP = SD_FALSE;
//}
}