Files
CHJ/user/Core/DP2201V01.c
2026-03-20 21:19:04 +08:00

311 lines
9.0 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 "../main/SystemInclude.h"
#if(DP2201_M0CONTROL)
__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温度
}
/*sampleData.TCode[CTCode]//VDU
sampleData.TCode[RTCode]//VRR
sampleData.TCode[HTCode]//VRH
sampleData.TCode[ATCode]//IRH*/
void ComputeFlowRateIndexAndFlowRate(void)
{
voltageDetected[NIDX ]= (u16)sampleData.TCode[CTCode]; //8303 VDU1
voltageDetected[VRHX ]= (u16)sampleData.TCode[RTCode]; //8304 VRR
voltageDetected[IVHDX]= (u16)sampleData.TCode[HTCode]; //8305 VRH
voltageDetected[RHVOL]= (u16)sampleData.TCode[ATCode]; //8306 IRH
voltageDetected[VDUGX]= (u16)sampleData.TCode[BTCode]; //8307 VDU2
//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;
}
/********************************************************************/
//采样阶段
/********************************************************************/
__Process_TypeDef flowProcess;
//采样中断
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 );//注册中断回调函数
flowProcess.Index = 0;
flowProcess.NextTime = 0;
FlowProcessManagement();//每个周期运行,开启采样过程
}
void SetNextProcess(void)//设置采样定时器的下一个进程
{
if(flowProcess.Index == 0){
StopSamplingTimerInterval();//关闭采集时钟
return;
}
u32 currentTAR = SamplingTimer->CNT;//定时器当前计数值
if(currentTAR > flowProcess.NextTime) flowProcess.NextTime = currentTAR + 5;
ResetSamplingTimerInterval(flowProcess.NextTime);
}
/*用户信号配置数组*/
typedef enum {
Signal_VDU_VRR,
Signal_VDU1_VRH,
Signal_VDU2_VRH,
Signal_VDU1_IRH,
Signal_VDU2_IRH,
//......
Signals_Count,
}ADC_CFG_Index_TypeDef;
static const ADC_Config_TypeDef signal_cfgs[Signals_Count] = {
[Signal_VDU_VRR] = { GAIN64, ADC0_AIN0, ADC0_AIN1, GAIN1, ADC1_AIN3, ADC1_AIN4 ,SPS_977 },
[Signal_VDU1_VRH] = { GAIN64, ADC0_AIN0, ADC0_AIN1, GAIN1, ADC1_AIN2, ADC1_AVSS ,SPS_977 },
[Signal_VDU2_VRH] = { GAIN128, ADC0_AIN0, ADC0_AIN1, GAIN1, ADC1_AIN2, ADC1_AVSS ,SPS_977 },
[Signal_VDU1_IRH] = { GAIN64, ADC0_AIN0, ADC0_AIN1, GAIN1, ADC1_AIN5, ADC1_AIN4 ,SPS_977 },
[Signal_VDU2_IRH] = { GAIN128, ADC0_AIN0, ADC0_AIN1, GAIN1, ADC1_AIN5, ADC1_AIN4 ,SPS_977 },
//......
};
/*sampleData.TCode[CTCode]//VDU
sampleData.TCode[RTCode]//VRR
sampleData.TCode[HTCode]//VRH
sampleData.TCode[ATCode]//IRH*/
void FlowProcessManagement(void)//采样过程管理状态机
{
switch(flowProcess.Index)
{
case 0: //Part1采样 VDU预采样与VRR采样
{
HWState.SampledOver = 0;//采样开始
SetSampleSiagnlForADC(signal_cfgs[Signal_VDU_VRR]);
StartADCSyncSampingData();//开始采集
flowProcess.NextTime += 653; //40ms 计数值= 65535/4000*tt=40 = 653
flowProcess.Index = 1;
}break;
case 1: //Part2 Part4分支 VRR 与预采样结果
{
ComputeSampleData(); //计算样本数据
sampleData.TCode[RTCode] = sampleData.ADCBuffer[1];//VRR 放入缓存
u16 currt_vdu = sampleData.ADCBuffer[0];//预采样结果
if(flowProcess.State == 0) //下一个去Part2 VDU_VRH
{
if(currt_vdu)SetSampleSiagnlForADC(signal_cfgs[Signal_VDU1_VRH]);//根据采样结果设置
else SetSampleSiagnlForADC(signal_cfgs[Signal_VDU2_VRH]);
}
else //下一个去Part4 VDU_IRH
{
if(currt_vdu)SetSampleSiagnlForADC(signal_cfgs[Signal_VDU1_IRH]);//根据采样结果设置
else SetSampleSiagnlForADC(signal_cfgs[Signal_VDU2_IRH]);
}
StartADCSyncSampingData();//开始采集
flowProcess.NextTime += 1048;//64ms
flowProcess.Index = 2;
}break;
case 2: //Part3
{
ComputeSampleData(); //计算样本数据
sampleData.TCode[CTCode] = sampleData.ADCBuffer[0];//VDU 放入缓存
//Part2 Part4分支
if(flowProcess.State == 0)sampleData.TCode[HTCode] = sampleData.ADCBuffer[1];//VRH 放入缓存
else sampleData.TCode[ATCode] = sampleData.ADCBuffer[1];//IRH 放入缓存
HWState.SampledOver = 1; //采样结束
StopSamplingTimerInterval();//关闭采集时钟 进入Part3
if(flowProcess.State) flowProcess.State = 0 ;//切换Part2 Part4
else flowProcess.State = 1 ;
flowProcess.Index = 0;
}break;
default : flowProcess.Index = 0; break;
}
SetNextProcess();
}
//校准模式下状态机
void FlowProcessManagement_Calib(void)//采样过程管理状态机
{
switch(flowProcess.Index)
{
case 0: //Part1采样 VDU与VRR采样
{
HWState.SampledOver = 0;//采样开始
SetSampleSiagnlForADC(signal_cfgs[Signal_VDU_VRR]);
StartADCSyncSampingData();//开始采集
flowProcess.NextTime += 653; //40ms 计数值= 65535/4000*tt=40 = 653
flowProcess.Index = 1;
}break;
case 1: //Part2 Part4分支
{
ComputeSampleData(); //计算样本数据
sampleData.TCode[RTCode] = sampleData.ADCBuffer[1];//VRR 放入缓存
if(flowProcess.State == 0) //下一个去Part2 VDU_VRH
{
SetSampleSiagnlForADC(signal_cfgs[Signal_VDU1_VRH]);//使用VDU1进行采集
}
else //下一个去Part4 VDU_IRH
{
SetSampleSiagnlForADC(signal_cfgs[Signal_VDU2_IRH]);//使用VDU2进行采集
}
StartADCSyncSampingData();//开始采集
flowProcess.NextTime += 1048;//64ms
flowProcess.Index = 2;
}break;
case 2: //Part3
{
ComputeSampleData(); //计算样本数据
//Part2 Part4分支
if(flowProcess.State == 0)
{
sampleData.TCode[CTCode] = sampleData.ADCBuffer[0];//VDU1 放入缓存
sampleData.TCode[HTCode] = sampleData.ADCBuffer[1];//VRH 放入缓存
}
else
{
sampleData.TCode[BTCode] = sampleData.ADCBuffer[0];//VDU2 放入缓存
sampleData.TCode[ATCode] = sampleData.ADCBuffer[1];//IRH 放入缓存
}
HWState.SampledOver = 1; //采样结束
StopSamplingTimerInterval();//关闭采集时钟 进入Part3
if(flowProcess.State) flowProcess.State = 0 ;//切换Part2 Part4
else flowProcess.State = 1 ;
flowProcess.Index = 0;
}break;
default : flowProcess.Index = 0; break;
}
SetNextProcess();
}
//mcuModeSleeping = 1 ; //进入低功耗模式
//
#endif