#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>= 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++; } }