Files
CHJ/user/Core/FS5001_H2.c
2026-03-20 21:16:58 +08:00

299 lines
9.2 KiB
C
Executable File
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 "../main/SystemInclude.h"
#if(DP0000_FS5001_H2)
__SAMPLE_STATUS_BIT_TypeDef sampleState;
u16 offsetRType, offsetGCFX;
u16 processNextTime, processIndex;
u16 voltageDetected[ANX], adcGain;
/*==========================================================================================
//外部传感器设备
==========================================================================================*/
void TestTemperatureInit(void)//温度测试初始化
{
WriteWordRegister(CONFIG, CONVERSION);
WriteByteRegister(RREG, RESULT_0_25_BIT);
HWState.EnableTempInit = 0;
}
u32 tempLongInt;
void TestTemperature(void)//温度测试/测量获取TPCB
{
if(!HWState.EnableTempTest) return;
if(HWState.EnableTempInit) return;
voltageDetected[TPCB] = ReadWordRegister(TA);//获取传感器原始值
WriteWordRegister(CONFIG, SHUT_DOWN);//温度传感器禁用
voltageDetected[TPCB] &= 0x1fff;
tempLongInt = (u32)(voltageDetected[TPCB] & 0xFFF);
if(voltageDetected[TPCB] >= 0x1000) tempLongInt = 0xFFF - tempLongInt;
tempLongInt *= 6400; // 0.0625*1024*100
tempLongInt >>= 10; // /1024
PCBTemperature = (u16)tempLongInt; // Temperature*100
voltageDetected[TPCB] =PCBTemperature;
__NOP();
}
/*==========================================================================================
//数据采样
==========================================================================================*/
/*********************************************************************/
//采样数据处理阶段
/*********************************************************************/
void FlowRateDealAndOuputSub(void)
{
ComputeFlowRateIndexAndFlowRate();//计算内码 转换成流量
TestTemperature();//计算PCB温度
}
void ComputeFlowRateIndexAndFlowRate(void)
{
voltageDetected[NIDX ]= (u16)sampleData.TCode[CTCode]; ///gain=32 VDU
voltageDetected[VRHX ]= (u16)sampleData.TCode[HTCode]; ///gain=128 VDU
voltageDetected[IVHDX]= (u16)sampleData.TCode[RTCode]; ///gain=1 VRH
voltageDetected[RHVOL]= (u16)sampleData.TCode[ATCode]; ///gain=8 VRR
voltageDetected[VDUGX]= (u16)sampleData.TCode[BTCode]; ///gain=8 VIH
//voltageDetected[FRIDX]=voltageDetected[NIDX]- offsetGas;
//判断气体类型
//1---根据VRH原始值判断
// if(voltageDetected[IVHDX]<56000) voltageDetected[FRIDX]=voltageDetected[NIDX ]- offsetAir; //Air
// else voltageDetected[FRIDX]=voltageDetected[VRHX ]- offsetAir; //H2
if(offsetAir)voltageDetected[FRIDX]=voltageDetected[NIDX ]- offsetGas; //Air
else voltageDetected[FRIDX]=voltageDetected[VRHX ]- offsetGas; //H2
currentFlowRate = GetFlowRate(voltageDetected[FRIDX],CURVE_1ST);
// flowRateH
// flowRateL
voltageDetected[FR_H] = currentFlowRate >> 16;
voltageDetected[FR_L] = currentFlowRate&0xFFFF;
// voltageDetected[VDUGX]= AirflowSensor_Read();
// voltageDetected[TPCB]= (u16)(Get_AirflowSensor_SCCM());
}
u16 WordSubFunction(u16 minuend, u16 subtractor)
{
u16 subResult;
subResult = minuend - subtractor;
if(minuend >= subtractor)
{
if(subResult < 32768) subResult += 32768;
else subResult = 65535;
}
else
{
if(subResult < 32768) subResult = 0;
else subResult -= 32768;
}
return subResult;
}
/********************************************************************/
//采样阶段
/********************************************************************/
//采样中断
void SamplingTimer_IRQ_Callback(void)
{
FlowProcessManagement();
// LHL_GPIO_TogglePin(pGPIO1, GPIO_PIN_7);
}
void StartNormolFlowMeasurement(void)//开始常规流量测量
{
HWState.SampledOver = 0;//采样结束标志重置
StartSamplingTimerInterval(32768); //启动比较定时器,开始从0递增计数
Timer_register_irq_callback(SamplingTimer,SamplingTimer_IRQ_Callback );//注册中断回调函数
processIndex = 0;
processNextTime = 0;
FlowProcessManagement();//每个周期运行,开启采样过程
}
static void SetSystemForADCSample(u16 SampleSiagnl)//设置采样通道与采样次数
{
switch(SampleSiagnl)
{
case SIGNAL0:{
sampleData.adcConfig.Gain0 = GAIN32;
sampleData.adcConfig.PChan0 = ADC0_AIN0;
sampleData.adcConfig.NChan0 = ADC0_AIN1; //CTCODE
sampleData.adcConfig.Gain1 = GAIN1;
sampleData.adcConfig.PChan1 = ADC1_AIN2; //RTCODE
sampleData.adcConfig.NChan1 = ADC1_AVSS;
sampleData.adcConfig.SPS = SPS_977;
}break;
case SIGNAL1: {
sampleData.adcConfig.Gain0 = GAIN128;
sampleData.adcConfig.PChan0 = ADC0_AIN0;
sampleData.adcConfig.NChan0 = ADC0_AIN1; //HTCODE
sampleData.adcConfig.Gain1 = GAIN1;
sampleData.adcConfig.PChan1 = ADC1_AIN5; //ATCODE
sampleData.adcConfig.NChan1 = ADC1_AVSS;
sampleData.adcConfig.SPS = SPS_977;
}break;
case SIGNAL2: {
sampleData.adcConfig.Gain0 = GAIN32;
sampleData.adcConfig.PChan0 = ADC0_AIN0;//CTCODE
sampleData.adcConfig.NChan0 = ADC0_AIN1;
sampleData.adcConfig.Gain1 = GAIN1;
sampleData.adcConfig.PChan1 = ADC1_AIN3;//BTCODE
sampleData.adcConfig.NChan1 = ADC1_AVSS;
sampleData.adcConfig.SPS = SPS_977;
}break;
case SIGNAL3: {
sampleData.adcConfig.Gain0 = GAIN128;
sampleData.adcConfig.PChan0 = ADC0_AIN0;//HTCODE
sampleData.adcConfig.NChan0 = ADC0_AIN1;
sampleData.adcConfig.Gain1 = GAIN1;
sampleData.adcConfig.PChan1 = ADC1_AIN2;//RTCODE
sampleData.adcConfig.NChan1 = ADC1_AVSS;
sampleData.adcConfig.SPS = SPS_977;
}break;
case SIGNAL4: {
sampleData.adcConfig.Gain0 = GAIN32;
sampleData.adcConfig.PChan0 = ADC0_AIN0;//CTCODE
sampleData.adcConfig.NChan0 = ADC0_AIN1;
sampleData.adcConfig.Gain1 = GAIN1;
sampleData.adcConfig.PChan1 = ADC1_AIN5;//ATCODE
sampleData.adcConfig.NChan1 = ADC1_AVSS;
sampleData.adcConfig.SPS = SPS_977;
}break;
case SIGNAL5: {
sampleData.adcConfig.Gain0 = GAIN128;
sampleData.adcConfig.PChan0 = ADC0_AIN0;//HTCODE
sampleData.adcConfig.NChan0 = ADC0_AIN1;
sampleData.adcConfig.Gain1 = GAIN1;
sampleData.adcConfig.PChan1 = ADC1_AIN3;//BTCODE
sampleData.adcConfig.NChan1 = ADC1_AVSS;
sampleData.adcConfig.SPS = SPS_977;
}break;
}
}
static void SetNextProcess(void)//设置采样定时器的下一个进程
{
if(processIndex == 0){
StopSamplingTimerInterval();//关闭采集时钟
return;
}
u32 currentTAR = SamplingTimer->CNT;//定时器当前计数值
if(currentTAR > processNextTime) processNextTime = currentTAR + 5;
ResetSamplingTimerInterval(processNextTime);
}
void FlowProcessManagement(void)//采样过程管理状态机
{
switch(processIndex)
{
case 0:
{
HWState.SampledOver = 0;//采样开始
SetSystemForADCSample(SIGNAL0);//设置SIGNAL0
StartADCSyncSampingData();//开始采集
processNextTime += 327; //20ms 计数值=65535/4000*t = 327
processIndex = 1;
}break;
case 1:
{
ComputeSampleData(); //计算样本数据
sampleData.TCode[CTCode] = sampleData.ADCBuffer[0];//放入缓存
sampleData.TCode[RTCode] = sampleData.ADCBuffer[1];//放入缓存
SetSystemForADCSample(SIGNAL1);//设置SIGNAL1
StartADCSyncSampingData();//开始采集
processNextTime += 327;//20ms
processIndex = 2;
}break;
case 2:
{
ComputeSampleData(); //计算样本数据
sampleData.TCode[HTCode] = sampleData.ADCBuffer[0];//放入缓存
sampleData.TCode[ATCode] = sampleData.ADCBuffer[1];//放入缓存
SetSystemForADCSample(SIGNAL2);//设置SIGNAL2
StartADCSyncSampingData();//开始采集
processNextTime += 327;//20ms
processIndex = 3;
}break;
case 3:
{
ComputeSampleData(); //计算样本数据
sampleData.TCode[CTCode] += sampleData.ADCBuffer[0];//放入缓存
sampleData.TCode[BTCode] = sampleData.ADCBuffer[1];//放入缓存
SetSystemForADCSample(SIGNAL3);//设置SIGNAL3
StartADCSyncSampingData();//开始采集
processNextTime += 327;//20ms
processIndex = 4;
}break;
case 4:
{
ComputeSampleData(); //计算样本数据
sampleData.TCode[HTCode] += sampleData.ADCBuffer[0];//放入缓存
sampleData.TCode[RTCode] += sampleData.ADCBuffer[1];//放入缓存
SetSystemForADCSample(SIGNAL4);//设置SIGNAL4
StartADCSyncSampingData();//开始采集
processNextTime += 327;//20ms
processIndex = 5;
}break;
case 5:
{
ComputeSampleData(); //计算样本数据
sampleData.TCode[CTCode] += sampleData.ADCBuffer[0];//放入缓存
sampleData.TCode[ATCode] += sampleData.ADCBuffer[1];//放入缓存
SetSystemForADCSample(SIGNAL5);//设置SIGNAL5
StartADCSyncSampingData();//开始采集
processNextTime += 327;//20ms
processIndex = 6;
}break;
case 6:
{
ComputeSampleData(); //计算样本数据
sampleData.TCode[HTCode] += sampleData.ADCBuffer[0];//放入缓存
sampleData.TCode[BTCode] += sampleData.ADCBuffer[1];//放入缓存
sampleData.TCode[CTCode] /= 3 ;//gain=32 VDU
sampleData.TCode[HTCode] /= 3 ;//gain=128 VDU
sampleData.TCode[RTCode] /= 2 ;//gain=1 VRH
sampleData.TCode[ATCode] /= 2 ;//gain=8 VRR
sampleData.TCode[BTCode] /= 2 ;//gain=8 VIH
HWState.SampledOver = 1; //采样结束
StopSamplingTimerInterval();//关闭采集时钟
processIndex = 7;
}break;
default : processIndex = 0; break;
}
SetNextProcess();
}
#endif