Files
secs2-bootloader/usr/app/laser.c

132 lines
3.3 KiB
C
Raw 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 "laser.h"
#include "algo_Laser.h"
#include "stdio.h"
#include "string.h"
#include "bsp_DriveWave.h"
#include "bsp_ADS8864.h"
#include "dsp_Demod.h"
#include "wk_usart.h"
#include "algo_Calib.h"
#include "algo_Filter.h"
#include "GasData.h"
#include "proto_Transform.h"
/*采集次数 为2的指数倍方便求平均*/
#define LASER_SAMPLE_LSH (3U)
#define LASER_SAMPLE_NUM (8)
/*采集到的波形*/
static u32 Laser_WaveSample[DRIVEWAVE_VALID_NUM];
static void Laser_Task(void);
static void Laser_WaveIO_Int(void);
static void Laser_Init(void);
Laser_t Laser =
{
.pWaveSample = Laser_WaveSample,
.Init = Laser_Init,
.WaveIO_Int = Laser_WaveIO_Int,
.Task = Laser_Task,
};
/*开始采样*/
void Laser_Sample_Start(void)
{
tmr_counter_value_set(TMR1,0);
tmr_interrupt_enable(TMR1,TMR_OVF_INT,TRUE);
tmr_counter_enable(TMR1,TRUE);
}
static void Laser_Init(void)
{
Laser_Sample_Start();
}
/*停止采样*/
void Laser_Sample_Stop(void)
{
tmr_counter_enable(TMR1,FALSE);
tmr_interrupt_enable(TMR1,TMR_OVF_INT,FALSE);
}
static void Laser_Task(void)
{
/*采集完成*/
if(DriveWave.DriveCount >= LASER_SAMPLE_NUM)
{
u16 i;
float x;
/*数据滤波*/
for(i=0;i<DRIVEWAVE_VALID_NUM;i++)
{
Laser_WaveSample[i] >>= LASER_SAMPLE_LSH;
Demod.inWave[i] = Laser_WaveSample[i];
}
/*信号解调处理*/
Demod.Task();
/*二次谐波相关参数计算*/
LaserSensor.Calculate();
/*数据滤波*/
GasData.Gas_1.R_AD = LaserSensor.SHG.PP_Ori;
GasData.Gas_1.R_AD_Cal = LaserSensor.SHG.PP_CalLight;
LaserSensor.SHG.PP_MeasurAvg = FilterMeasur.FastFilter(&FilterMeasur,LaserSensor.SHG.PP_CalLight);
GasData.Gas_1.Measur_AD = LaserSensor.SHG.PP_MeasurAvg;
LaserSensor.SHG.PP_CalibAvg = FilterCalib.FastFilter(&FilterCalib,LaserSensor.SHG.PP_CalLight);
GasData.Gas_1.Cali_AD = LaserSensor.SHG.PP_CalibAvg;
/*浓度计算*/
x = LaserSensor.SHG.PP_CalLight;
GasData.Gas_1.R_Value = Calib.FacCalibCoeff[3] * x * x * x + Calib.FacCalibCoeff[2] * x * x + Calib.FacCalibCoeff[1] * x + Calib.FacCalibCoeff[0];
x = LaserSensor.SHG.PP_MeasurAvg;
GasData.Gas_1.Fac_Value = Calib.FacCalibCoeff[3] * x * x * x + Calib.FacCalibCoeff[2] * x * x + Calib.FacCalibCoeff[1] * x + Calib.FacCalibCoeff[0];
x = GasData.Gas_1.Fac_Value;
GasData.Gas_1.Usr_Value = Calib.UsrCalibCoeff[0] * (x + Calib.UsrCalibCoeff[1]);
GasData.Task();
proto_Transform_Task();
memset(Laser_WaveSample,0,sizeof(Laser_WaveSample));
/*数据解调完成,开始采样*/
DriveWave.DriveCount = 0;
Laser_Sample_Start();
}
}
/*探测器采样、驱动波形输出、放入80k中断*/
static void Laser_WaveIO_Int(void)
{
static u16 AD_index;
u16 AD;
DriveWave.DacOut(AD_index);
if(AD_index < DRIVEWAVE_VALID_NUM)
{
AD = ADS8864.ADRead();
Laser_WaveSample[AD_index] += AD;
}
if(DRIVEWAVE_NUM - 1 == AD_index)
{
AD_index = 0;
DriveWave.DriveCount++;
if(DriveWave.DriveCount >= LASER_SAMPLE_NUM)
{
/*停止采样*/
Laser_Sample_Stop();
}
}
else
{
AD_index++;
}
}