132 lines
3.3 KiB
C
132 lines
3.3 KiB
C
#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++;
|
||
}
|
||
}
|
||
|