Initial commit: my SECS2 project
This commit is contained in:
@@ -0,0 +1,96 @@
|
||||
#include "GasData.h"
|
||||
#include "stdio.h"
|
||||
#include "bsp_Print.h"
|
||||
|
||||
#include "dsp_Demod.h"
|
||||
|
||||
#include "bsp_TEC.h"
|
||||
#include "bsp_ADC.h"
|
||||
#include "laser.h"
|
||||
#include "algo_Laser.h"
|
||||
#include "bsp_Uart.h"
|
||||
#include "algo_Calib.h"
|
||||
#include "GasData.h"
|
||||
#include "algo_Filter.h"
|
||||
#include "dsp_Demod.h"
|
||||
#include "app.h"
|
||||
#include "bsp_Flash.h"
|
||||
#include "bsp_print.h"
|
||||
|
||||
|
||||
|
||||
static void GasData_Task(void);
|
||||
static char *GasData_GetName(u8 GasType);
|
||||
static char *GasData_GetUnit(u8 Unit);
|
||||
|
||||
GasData_t GasData=
|
||||
{
|
||||
.Task = GasData_Task,
|
||||
.GetName = GasData_GetName,
|
||||
.GetUnit = GasData_GetUnit,
|
||||
};
|
||||
|
||||
GasData_t *pGasData = &GasData;
|
||||
|
||||
static void GasData_Task(void)
|
||||
{
|
||||
// if(BSP_PRINT_CURDATA == bsp_Print_DataTyppe)
|
||||
// {
|
||||
// printf("R_AD,%u,Cal_AD,%u,M_AD,%u,C_AD,%u,C_Val,%d,Val,%d\n",
|
||||
// pGasData->Gas_1.R_AD,pGasData->Gas_1.R_AD_Cal,pGasData->Gas_1.Measur_AD,pGasData->Gas_1.Cali_AD,pGasData->Gas_1.Fac_Value,pGasData->Gas_1.Usr_Value);
|
||||
// }
|
||||
pGasData->Gas_1.Left = LaserSensor.SHG.Pix_Light_Max;
|
||||
pGasData->Gas_1.Mid = LaserSensor.SHG.Pix_Light_Min;
|
||||
pGasData->Gas_1.Light_AD = LaserSensor.ORI.Light_AD;
|
||||
pGasData->Gas_1.TempAD = ADC.AD[ADC_BOARD];
|
||||
pGasData->Gas_1.Temp = ADC.Value[ADC_BOARD] * 100;
|
||||
pGasData->Gas_1.TECAD = ADC.AD[ADC_TEC];
|
||||
pGasData->Gas_1.TECTemp = ADC.Value[ADC_TEC] * 100;
|
||||
pGasData->Gas_1.Slope = FilterMeasur.Slope;
|
||||
pGasData->Gas_1.FastFlag = FilterMeasur.FastFlag;
|
||||
|
||||
|
||||
if(BSP_PRINT_CURDATA == bsp_Print_DataTyppe)
|
||||
{
|
||||
printf("f2pp=%u,caliAD=%u,RRtestAD=%u,cr=%d,con=%d,Cz=%d,left=%u,mid=%u,light_AD=%u,T=%d,TAD=%u,TECTemp=%d,TECAD=%u,Slope=%f,Fast=%d\n",
|
||||
pGasData->Gas_1.Measur_AD, pGasData->Gas_1.Cali_AD, pGasData->Gas_1.R_AD_Cal,
|
||||
pGasData->Gas_1.R_Value, pGasData->Gas_1.Fac_Value, pGasData->Gas_1.Usr_Value,
|
||||
pGasData->Gas_1.Left, pGasData->Gas_1.Mid, pGasData->Gas_1.Light_AD,
|
||||
pGasData->Gas_1.Temp, pGasData->Gas_1.TempAD, pGasData->Gas_1.TECTemp, pGasData->Gas_1.TECAD,
|
||||
pGasData->Gas_1.Slope, pGasData->Gas_1.FastFlag
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static char *GasData_GetName(u8 GasType)
|
||||
{
|
||||
switch(GasType)
|
||||
{
|
||||
case GASDATA_TYPE_CH4 : return "CH4 ";
|
||||
case GASDATA_TYPE_CO2 : return "CO2 ";
|
||||
case GASDATA_TYPE_CO : return "CO2 ";
|
||||
case GASDATA_TYPE_CnHm: return "CnHm";
|
||||
case GASDATA_TYPE_SO2 : return "SO2 ";
|
||||
case GASDATA_TYPE_H2S : return "H2S ";
|
||||
case GASDATA_TYPE_H2 : return "H2 ";
|
||||
case GASDATA_TYPE_O2 : return "O2 ";
|
||||
case GASDATA_TYPE_HF : return "HF ";
|
||||
case GASDATA_TYPE_NH3 : return "NH3 ";
|
||||
default : return "unknow";
|
||||
}
|
||||
}
|
||||
|
||||
static char *GasData_GetUnit(u8 Unit)
|
||||
{
|
||||
switch(Unit)
|
||||
{
|
||||
case GASDATA_UNIT_PPM : return "ppm ";
|
||||
case GASDATA_UNIT_MG_M3 : return "mg/m3";
|
||||
case GASDATA_UNIT_PERCENT : return "% ";
|
||||
case GASDATA_UNIT_M_S : return "m/s ";
|
||||
case GASDATA_UNIT_M3_H : return "m3/h ";
|
||||
default : return "unknow";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
#ifndef _GASDATA_H_
|
||||
#define _GASDATA_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#define GASDATA_TYPE_CH4 (0x00)
|
||||
#define GASDATA_TYPE_CO2 (0x01)
|
||||
#define GASDATA_TYPE_CO (0x02)
|
||||
#define GASDATA_TYPE_CnHm (0x03)
|
||||
#define GASDATA_TYPE_SO2 (0x04)
|
||||
#define GASDATA_TYPE_H2S (0x05)
|
||||
#define GASDATA_TYPE_H2 (0x06)
|
||||
#define GASDATA_TYPE_O2 (0x07)
|
||||
#define GASDATA_TYPE_HF (0x1C)
|
||||
#define GASDATA_TYPE_NH3 (0x1D)
|
||||
|
||||
|
||||
#define GASDATA_UNIT_PPM (0)
|
||||
#define GASDATA_UNIT_MG_M3 (1)
|
||||
#define GASDATA_UNIT_PERCENT (2)
|
||||
#define GASDATA_UNIT_M_S (3)
|
||||
#define GASDATA_UNIT_M3_H (4)
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 GasType;
|
||||
u8 Uint;
|
||||
u8 Point;
|
||||
u16 Range;
|
||||
}GasData_Flash_t;
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GasData_Flash_t FlashData; /*气体组分相关信息*/
|
||||
float Slope; /*斜率*/
|
||||
|
||||
u8 FastFlag; /*快速响应标志位*/
|
||||
u16 Left,Mid; /*找峰*/
|
||||
u16 Light_AD; /*光功率*/
|
||||
u16 TempAD; /*温度AD*/
|
||||
s16 Temp; /*温度*/
|
||||
u16 TECAD; /*TEC AD*/
|
||||
s16 TECTemp; /*TEC 温度*/
|
||||
|
||||
|
||||
|
||||
u16 R_AD; /*原始AD值*/
|
||||
u16 R_AD_Cal; /*原始AD值*/
|
||||
u16 Cali_AD; /*校准时的滤波AD值*/
|
||||
u16 Measur_AD; /*正常测量时的滤波AD值*/
|
||||
|
||||
s16 R_Value; /*滤波前拟合浓度*/
|
||||
s16 Fac_Value; /*厂家拟合的浓度*/
|
||||
s16 Usr_Value; /*用户校准后的浓度*/
|
||||
}GasDataClass_t;
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
GasDataClass_t Gas_1,Gas_2;
|
||||
void (*Task)(void);
|
||||
char *(*GetName)(u8);
|
||||
char *(*GetUnit)(u8);
|
||||
}GasData_t;
|
||||
|
||||
extern GasData_t GasData;
|
||||
#endif
|
||||
@@ -0,0 +1,62 @@
|
||||
#include "app.h"
|
||||
#include "os_timer.h"
|
||||
#include "stdio.h"
|
||||
#include "bsp_Uart.h"
|
||||
#include "bsp_iap.h"
|
||||
|
||||
/*协议转换程序*/
|
||||
const char SwVersion[20] = "V0.001.0";
|
||||
|
||||
void TASK_Idle(void);
|
||||
void Task_10ms(void);
|
||||
void Task_50ms(void);
|
||||
void Task_100ms(void);
|
||||
void Task_200ms(void);
|
||||
void Task_500ms(void);
|
||||
void Task_1s(void);
|
||||
void Task_2s(void);
|
||||
|
||||
/******************************************
|
||||
* 函数: AppInit
|
||||
* 功能: 初始化
|
||||
* 参数: 无
|
||||
* 返回: 无
|
||||
* 描述: 无
|
||||
******************************************/
|
||||
void App_Init(void)
|
||||
{
|
||||
OsTimer_Init(); /*分时复用*/
|
||||
|
||||
// COM_Uart1.Init(&COM_Uart1);
|
||||
COM_Uart2.Init(&COM_Uart2);
|
||||
iap.init();
|
||||
}
|
||||
|
||||
/******************************************
|
||||
* 函数: App_Task
|
||||
* 功能: 分时复用
|
||||
* 参数: 无
|
||||
* 返回: 无
|
||||
* 描述: 主循环中调用
|
||||
******************************************/
|
||||
void App_Task(void)
|
||||
{
|
||||
if (TIME_TRUE == OsTimer_CheckTimeOut(OsTimeTick_10ms, osTime_MSecTick, 10))
|
||||
{
|
||||
OsTimeTick_10ms = osTime_MSecTick;
|
||||
Task_10ms();
|
||||
}
|
||||
TASK_Idle();
|
||||
}
|
||||
/*空闲执行的函数*/
|
||||
void TASK_Idle(void)
|
||||
{
|
||||
COM_Uart1.Rx_Task(&COM_Uart1);
|
||||
COM_Uart2.Rx_Task(&COM_Uart2);
|
||||
iap.task();
|
||||
}
|
||||
|
||||
void Task_10ms(void)
|
||||
{
|
||||
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
#ifndef _APP_H_
|
||||
#define _APP_H_
|
||||
|
||||
extern const char SwVersion[20];
|
||||
|
||||
void App_Init(void);
|
||||
void App_Task(void);
|
||||
|
||||
#endif
|
||||
+131
@@ -0,0 +1,131 @@
|
||||
#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++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,18 @@
|
||||
#ifndef _LASER_H_
|
||||
#define _LASER_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
|
||||
typedef struct
|
||||
{
|
||||
u8 SampleCompleteFlag;
|
||||
u32 *pWaveSample;
|
||||
void (*Init)(void);
|
||||
void (*WaveIO_Int)(void);
|
||||
void (*Task)(void);
|
||||
|
||||
}Laser_t;
|
||||
|
||||
extern Laser_t Laser;
|
||||
#endif
|
||||
@@ -0,0 +1,121 @@
|
||||
#include "os_timer.h"
|
||||
|
||||
unsigned short osTime_MSecTick = 0; /*滴答时钟*/
|
||||
unsigned short osTime_SecTick = 0;
|
||||
unsigned short osTime_10SecTick = 0; /*10s记一次 用于自动调零周期时间记录*/
|
||||
|
||||
static unsigned short osTimer_MSec1 = 0;
|
||||
static unsigned short osTimer_MSec2 = 0;
|
||||
|
||||
unsigned short OsTimeTick_10ms;
|
||||
unsigned short OsTimeTick_50ms;
|
||||
unsigned short OsTimeTick_100ms;
|
||||
unsigned short OsTimeTick_200ms;
|
||||
unsigned short OsTimeTick_500ms;
|
||||
unsigned short OsTimeTick_1s;
|
||||
unsigned short OsTimeTick_2s;
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: OsTimer_Init
|
||||
* CALLED BY: Application
|
||||
* PRECONDITIONS:
|
||||
* INPUT PARAMETERS: None
|
||||
* RETURN VALUES: None
|
||||
* DESCRIPTION: OsTimer initialization
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
void OsTimer_Init(void)
|
||||
{
|
||||
osTimer_MSec1 = 0;
|
||||
osTimer_MSec2 = 0;
|
||||
osTime_SecTick = 0;
|
||||
osTime_MSecTick = 0;
|
||||
|
||||
OsTimeTick_10ms = osTime_MSecTick;
|
||||
OsTimeTick_50ms = osTime_MSecTick;
|
||||
OsTimeTick_100ms = osTime_MSecTick;
|
||||
OsTimeTick_200ms = osTime_MSecTick;
|
||||
OsTimeTick_500ms = osTime_MSecTick;
|
||||
OsTimeTick_1s = osTime_MSecTick;
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: OsTimer_Increment
|
||||
* CALLED BY: ISR
|
||||
* PRECONDITIONS:
|
||||
* INPUT PARAMETERS: msec - millisecond to increase
|
||||
* RETURN VALUES: None
|
||||
* DESCRIPTION: Increase the Timer
|
||||
*
|
||||
****************************************************************************/
|
||||
void OsTimer_Increment(unsigned short msec)
|
||||
{
|
||||
osTime_MSecTick += msec;
|
||||
osTimer_MSec1 += msec;
|
||||
osTimer_MSec2 += msec;
|
||||
if (osTimer_MSec1 >= 1000U) /*1s*/
|
||||
{
|
||||
osTimer_MSec1 = 0U;
|
||||
osTime_SecTick++;
|
||||
}
|
||||
if (osTimer_MSec2 >= 10000U) /*10s*/
|
||||
{
|
||||
osTimer_MSec2 = 0U;
|
||||
osTime_10SecTick++;
|
||||
}
|
||||
}
|
||||
|
||||
/****************************************************************************
|
||||
* NAME: OsTimer_CheckTimeOut
|
||||
* CALLED BY: Application
|
||||
* PRECONDITIONS:
|
||||
* INPUT PARAMETERS: timeStart - start tick
|
||||
* timeNow - current tick
|
||||
* timeOut - expired tick
|
||||
* RETURN VALUES: whether timer is expired
|
||||
* DESCRIPTION: check if specified time is expired
|
||||
*
|
||||
****************************************************************************/
|
||||
unsigned char OsTimer_CheckTimeOut(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut)
|
||||
{
|
||||
unsigned short timerActivateVal;
|
||||
timerActivateVal = timeOut + timeStart;
|
||||
|
||||
if (timerActivateVal > timeStart)
|
||||
{
|
||||
if ((timeNow >= timerActivateVal) || (timeNow < timeStart))
|
||||
{
|
||||
return TIME_TRUE;
|
||||
}
|
||||
}
|
||||
else if ((timeNow >= timerActivateVal) && (timeNow < timeStart))
|
||||
{
|
||||
return TIME_TRUE;
|
||||
}
|
||||
return TIME_FALSE;
|
||||
}
|
||||
|
||||
/*
|
||||
离结束运行还有多少时间 配合OsTimer_CheckTimeOut函数使用
|
||||
*/
|
||||
unsigned short OsTimer_CheckRunTime(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut)
|
||||
{
|
||||
unsigned short timerActivateVal;
|
||||
timerActivateVal = timeOut + timeStart;
|
||||
|
||||
if (timerActivateVal > timeStart)
|
||||
{
|
||||
return (timerActivateVal - timeNow);
|
||||
}
|
||||
else
|
||||
{
|
||||
return (65535U - timeNow + timerActivateVal);
|
||||
}
|
||||
}
|
||||
|
||||
/*阻塞式延时*/
|
||||
void Delay_ms(unsigned short delay)
|
||||
{
|
||||
HAL_Delay(delay);
|
||||
}
|
||||
@@ -0,0 +1,29 @@
|
||||
#ifndef _OSTIMER_H_
|
||||
#define _OSTIMER_H_
|
||||
|
||||
#include "main.h"
|
||||
|
||||
#define TIME_TRUE 1U
|
||||
#define TIME_FALSE 0U
|
||||
|
||||
|
||||
extern unsigned short osTime_MSecTick;
|
||||
extern unsigned short osTime_SecTick;
|
||||
extern unsigned short osTime_10SecTick; // 10s记一次 用于自动调零周期时间记录
|
||||
|
||||
extern unsigned short OsTimeTick_10ms;
|
||||
extern unsigned short OsTimeTick_50ms;
|
||||
extern unsigned short OsTimeTick_100ms;
|
||||
extern unsigned short OsTimeTick_200ms;
|
||||
extern unsigned short OsTimeTick_500ms;
|
||||
extern unsigned short OsTimeTick_1s;
|
||||
extern unsigned short OsTimeTick_2s;
|
||||
|
||||
void OsTimer_Init(void);
|
||||
void OsTimer_Increment(unsigned short msec);
|
||||
unsigned char OsTimer_CheckTimeOut(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut);
|
||||
unsigned short OsTimer_CheckRunTime(unsigned short timeStart, unsigned short timeNow, unsigned short timeOut);
|
||||
|
||||
void Delay_ms(unsigned short delay);
|
||||
|
||||
#endif
|
||||
@@ -0,0 +1,14 @@
|
||||
#ifndef _USR_CONFIG_H_
|
||||
#define _USR_CONFIG_H_
|
||||
|
||||
#define USR_TRUE (1U)
|
||||
#define USR_FALSE (0U)
|
||||
|
||||
#define USR_ENABLE (1U)
|
||||
#define USR_DISENABLE (0U)
|
||||
|
||||
|
||||
#define U64_MAX (0xffffffffffffffff)
|
||||
#define U32_MAX (0xffffffff)
|
||||
#define U16_MAX (0xffff)
|
||||
#endif
|
||||
Reference in New Issue
Block a user