This commit is contained in:
2026-03-20 21:19:53 +08:00
parent 9d3b4b836f
commit 6a749331db
125 changed files with 29972 additions and 23051 deletions

View File

@@ -1,241 +0,0 @@
#ifndef __D9V2FR_DP2006V1000_h__
#define __D9V2FR_DP2006V1000_h__
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
#define SamplingTimer pTIM1
#define StartSamplingTimerInterval(uploadCounter) StartTimer1_CC1(uploadCounter)
#define ResetSamplingTimerInterval(uploadCounter) ResetTimer1_CC1(uploadCounter)
#define StopSamplingTimerInterval() StopTimer1()
//ADCת<43><D7AA><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD>ʱ<EFBFBD><CAB1>
#define ConversionTimer pTIM2
#define StartConversionTimerInterval(uploadCounter) StartTimer2_UIE(uploadCounter)
#define ResetConversionTimerInterval(uploadCounter) ResetTimer2_UIE(uploadCounter)
#define StopConversionTimerInterval() StopTimer2()
// <20>ӱ<EFBFBD>׼<EFBFBD><D7BC>λ <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
#define ONE_PA_TO_MBAR 0.01f // 1 Pa = 0.01 mbar
#define ONE_PA_TO_TORR (1.0f / 133.322f) // 1 Pa = 1 / 133.322 Torr
#define ONE_PA_TO_MICRONS (1000.0f / 133.322f) // 1 Pa = 1000 / 133.322 Microns
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ <20><> <20><>׼<EFBFBD><D7BC>λ
#define ONE_MBAR_TO_PA 100.0f // 1 mbar = 100 Pa
#define ONE_TORR_TO_PA 133.322f // 1 Torr = 133.322 Pa
#define ONE_MICRONS_TO_PA (133.322f / 1000.0f) // 1 Microns = 133.322 / 1000 Pa
// ѹ<><D1B9><EFBFBD><EFBFBD>λö<CEBB><C3B6>
typedef enum {
PRESSURE_UNIT_PA, // <20><>˹<EFBFBD><CBB9>
PRESSURE_UNIT_MICRONS, // ΢<>׹<EFBFBD><D7B9><EFBFBD> (<28><>mHg)
PRESSURE_UNIT_TORR, // <20><>
PRESSURE_UNIT_MBAR // <20><><EFBFBD><EFBFBD>
} PressureUnitType;
// ѹ<><D1B9>ֵ<EFBFBD><D6B5>׼ (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Pa Ϊ<><CEAA>λ<EFBFBD>洢)
#if(DP2006V1000)
//for GPIO START==============================================================================
// for soft I2C
#define I2C_SDA GPIO_PIN_4
#define I2C_SDA_PINPOS GPIO_PinPos_4
#define I2C_SDA_GPIO GPIO1
#define I2C_SCL GPIO_PIN_0
#define I2C_SCL_PINPOS GPIO_PinPos_0
#define I2C_SCL_GPIO GPIO2
//for eeprom
#define EEPROM_WP_PIN GPIO_PIN_5
#define EEPROM_WP_PINPOS GPIO_PinPos_5
#define EEPROM_WP_GPIO GPIO1
#define PARA_EEPROM BIT1
#define DATA_EEPROM BIT2
#define FROCK_EEPROM BIT1+BIT2+BIT3
//// for FRAM
//#define FRAM_WP_PIN GPIO_PIN_6
//#define FRAM_WP_PINPOS GPIO_PinPos_6
//#define FRAM_WP_GPIO GPIO2
//#define FRAM_CS_PIN GPIO_PIN_5
//#define FRAM_CS_PINPOS GPIO_PINPos_5
//#define FRAM_CS_GPIO GPIO2
//// for SPI
//#define SCLK_PIN GPIO_PIN_5
//#define SCLK_PINPOS GPIO_PinPos_5
//#define SCLK_PIN_SOURCE GPIO_PinSource5
//#define SCLK_PIN_CONFIG GPIO1_5_AF_SCLK0
//#define SCLK_GPIO GPIO1
//#define SOMI_PIN GPIO_PIN_4
//#define SOMI_PINPOS GPIO_PinPos_4
//#define SOMI_PIN_SOURCE GPIO_PinSource4
//#define SOMI_PIN_CONFIG GPIO1_4_AF_MISO0
//#define SOMI_GPIO GPIO1
//#define SIMO_PIN GPIO_PIN_6
//#define SIMO_PINPOS GPIO_PinPos_6
//#define SIMO_PIN_SOURCE GPIO_PinSource6
//#define SIMO_PIN_CONFIG GPIO1_6_AF_MOSI0
//#define SIMO_GPIO GPIO1
//// for IO
//#define TDU_SET_PIN GPIO_PIN_5
//#define TDU_SET_PINPOS GPIO_PinPos_5
//#define TDU_SET_GPIO GPIO1
//#define TDU_SET_PIN_OUT() EnableOutput(TDU_SET_GPIO, TDU_SET_PINPOS)
//#define CLR_TDU_SET_PIN() CLR_PIN(TDU_SET_GPIO,TDU_SET_PIN)
//#define SET_TDU_SET_PIN() SET_PIN(TDU_SET_GPIO,TDU_SET_PIN)
//#define HEATING_PIN GPIO_PIN_6
//#define HEATING_PINPOS GPIO_PinPos_6
//#define HEATING_GPIO GPIO1
//#define HEATING_PIN_OUT() EnableOutput(HEATING_GPIO, HEATING_PINPOS)
//#define CLR_HEATING_PIN() CLR_PIN(HEATING_GPIO,HEATING_PIN)
//#define SET_HEATING_PIN() SET_PIN(HEATING_GPIO,HEATING_PIN)
//#define HP_CON_PIN GPIO_PIN_0
//#define HP_CON_PINPOS GPIO_PinPos_0
//#define HP_CON_GPIO GPIO0
//#define HP_CON_PIN_OUT() EnableOutput(HP_CON_GPIO, HP_CON_PINPOS)
//#define CLR_HP_CON_PIN() CLR_PIN(HP_CON_GPIO,HP_CON_PIN)
//#define SET_HP_CON_PIN() SET_PIN(HP_CON_GPIO,HP_CON_PIN)
//#define TEST_PIN GPIO_PIN_5
//#define TEST_PIN_PINPOS GPIO_PinPos_5
//#define TEST_PIN_GPIO GPIO0
//#define TEST_PIN_OUT() EnableOutput(TEST_PIN_GPIO, TEST_PIN_PINPOS)
#define LED_PIN GPIO_PIN_5
#define LED_PIN_PINPOS GPIO_PinPos_5
#define LED_PIN_GPIO GPIO0
#define LED_PIN_OUT() EnableOutput(LED_PIN_GPIO, LED_PIN)
#define SET_LED_PIN() SET_PIN(LED_PIN_GPIO,LED_PIN)
#define CLR_LED_PIN() CLR_PIN(LED_PIN_GPIO,LED_PIN)
//for GPIO END===============================================================================\
//=============================================================================================================================================================================================
//for ADC START==============================================================================/
#define SIGNAL0 0x00
#define SIGNAL1 0x01
#define SIGNAL2 0x02
#define SIGNAL3 0x03
#define SIGNAL4 0x04
#define SIGNAL5 0x05
#define SIGNAL6 0x06
//......
typedef struct //__SAMPLE_STATUS_BIT_TypeDef
{
u16 DisplayZero : 1; // 1
u16 Mode: 2; // 3
u16 CType: 2; // 5
u16 AType: 1; // 7
u16 RType: 1; // 7
u16 HType: 2; // 9
u16 PreSampling: 1; // 10
u16 AutoDetectOffset: 1; // 11
u16 AutoDetectProcess: 2; // 13
u16 EnableRHTest : 1; // 14
u16 EnableRoughTest: 1; // 15
} __SAMPLE_STATUS_BIT_TypeDef;
//for ADC END==============================================================================\
//======================================================================================================================================================================================
//for FLOWMETER START======================================================================/
// *****************************************************************************
#define CURVE_1ST 0
#define CURVE_2ND 1
#define CURVE_3RD 2
#define CTYPE_FR CURVE_1ST
#define ATYPE_VH CURVE_2ND
#define MICRO_FR CURVE_3RD
#define FRIDX CTYPE_FR // 0
#define RGIDX ATYPE_VH // 1
#define GAINX MICRO_FR // 2
#define VDUX 3 // *From ADC CTcode
#define VDUGX 4 // * CTcode
#define RIDX 5 //
#define NIDX 6 // NORMAL_VL - LOW_VL (TD INDEX) * VDUX
#define TPCB 7 // PCB temperature *From eeprom
#define TGAS 8 // GAS temperature *From IIC dev TPCB
#define TRH 9 // RH temperature *From eeprom
#define BATT 10 // Battery volatge
#define IVHDX 11 // IRH CODE test VHH By TD Control *From ADC HTcode
#define VRHX 12 // VRH CODE *From ADC ATcode
#define IVHUX 13 // IRH CODE test VHH By TU Control
#define VRRX 14 // VRR CODE *From ADC RTcode
#define RHVOL 15 // RH VOLATAGE * VRHX
#define RRVOL 16 // RR VOLATAGE * VRRX
#define RHRES 17 // RH resistance * IVHDX
#define RRRES 18 // RR resistance * VRRX
#define PORH 19 // RH Power * IVHDX
#define PDRH 20 // RH current Power
#define CVHHX 21 //
#define DVHHX 22 //
#define VHPA 23 //
#define RATO 24 // RR:RH NRH--RRRES--VRRX---ADC RTcode
#define SDT 25 // ATYPE OFFSET
#define DIVHX 26 // IVHH(TD) - IVHH(TU) *Ŀǰδʹ<CEB4><CAB9>
#define TCOE 27 // * TGAS
#define TVDUX 28 // * TGAS
#define TVDUGX 29 // * TGAS
#define FR_H 30 //
#define FR_L 31 //
#define ANX 32 //
#define ANX_MASK (ANX-1)
//*****************************************************************************
#define CODE1 FR_H // 8300 FIDX
#define CODE2 FR_L // 8301 FIDX
#define CODE3 FRIDX // 8302 FIDX
#define CODE4 NIDX // 8303
#define CODE5 VRHX // 8304
#define CODE6 IVHDX // 8305
#define CODE7 RHVOL // 8306
#define CODE8 VDUGX // 8307
#define CODE9 TPCB // 8308
#define CODE10 RHVOL // 8309
#define CODE11 VDUX // 830A
#define CODE12 VDUGX // 830B
#define CODE13 NIDX // 830C
#define CODE14 BATT // 830D
#define CODE15 IVHDX // 830E
#define CODE16 VRHX // 830F
//for FLOWMETER END==============================================================================\
//===============================================================================================================================================================================================
//for Device Start===============================================================================/
extern __SAMPLE_STATUS_BIT_TypeDef sampleState;
extern u16 FRType;
extern u32 voltageANX;
extern u16 voltageDetected[], adcGain;
extern u16 processNextTime, processIndex;
//for Device END==============================================================================\
//===============================================================================================================================================================================================
//for func Start==============================================================================/
void FlowRateDealAndOuputSub(void);
void ComputeFlowRateIndexAndFlowRate(void);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u16 WordSubFunction(u16 minuend, u16 subtractor);
void StartNormolFlowMeasurement(void);//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void SetSystemForADCSample(u16 SampleSiagnl);//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
static void SetNextProcess(void);//<2F><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void FlowProcessManagement(void);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̹<EFBFBD><CCB9><EFBFBD>
double ConvertPressure(double value, PressureUnitType targetUnit, PressureUnitType originalUnit);
void SwitchPressureUnit(void);
static u8 GetDigitCount(u32 num);
void Update_Pressure_Display(void);
void My_Timer2_Callback(void);//<2F><><EFBFBD>Կ<EFBFBD><D4BF>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><EFBFBD><E8BCB0>λ<EFBFBD>л<EFBFBD><D0BB><EFBFBD><EFBFBD><EFBFBD>ɨ<EFBFBD><C9A8>
#endif
#endif

View File

@@ -1,16 +1,19 @@
#include "../main/SystemInclude.h"
/**************************************************************************************/
/**
* @brief
* @note IO
*/
#if(DP2006V1000)
__SAMPLE_STATUS_BIT_TypeDef sampleState;
u16 offsetRType, offsetGCFX;
//##############################################################################
#if(DP2006_VM1000)
//##############################################################################
//__SAMPLE_STATUS_BIT_TypeDef sampleState;
TypeSample sampleProcess;
u16 processNextTime, processIndex;
u16 voltageDetected[ANX], adcGain;
// 当前显示单位
static PressureUnitType current_unit = PRESSURE_UNIT_PA; // 默认显示Pa
float pressure_value;
@@ -23,162 +26,258 @@ u8 typecflag=0;
extern uint8_t g_auto_shutdown_flag;
// 全局变量,用于标记蓝牙是否已经初始化
static uint8_t g_ble_init_done = 0;
/******数据处理部分***************************************************************************************************************************************************************************************************************/
static uint32_t led_timer = 0;
static uint32_t shutdown_timer = 0;
/******采集部分***************************************************************************************************************************************************************************************************************/
void FlowRateDealAndOuputSub(void)
{
ComputeFlowRateIndexAndFlowRate();//计算内码 转换成流量
}
void ComputeFlowRateIndexAndFlowRate(void)
{
voltageDetected[NIDX ]= (u16)sampleData.TCode[IRHCode]; // 强转只保留低16位数据//IRH 0X8303
voltageDetected[VRHX ]= (u16)sampleData.TCode[IRRCode]; // 强转只保留低16位数据//IRR 0X8304
voltageDetected[IVHDX]= (u16)sampleData.TCode[URUCode]; // 强转只保留低16位数据//URU 0X8305
voltageDetected[RHVOL]= (u16)sampleData.TCode[URHCode]; // 强转只保留低16位数据//URH 0X8306
voltageDetected[VDUGX]= (u16)sampleData.TCode[BASCode]; // 强转只保留低16位数据//URU 0X8307 ADC基准电压/2
voltageDetected[TPCB]= (u16)sampleData.TCode[BATCode]; // 强转只保留低16位数据//URH 0X8308 电池电压/3
voltageDetected[NIDX ]=(u16)sampleProcess.IRHResult; // 强转只保留低16位数据//IRH 0X8303
voltageDetected[VRHX ]= (u16)sampleProcess.RHypeResult; // 强转只保留低16位数据//IRR 0X8304
voltageDetected[IVHDX]=(u16) sampleProcess.RDResult; // 强转只保留低16位数据//URU 0X8305
voltageDetected[RHVOL]= (u16)sampleProcess.BLypeResult; // 强转只保留低16位数据//URH 0X8306 电池电压/3
voltageDetected[RHVOL]=voltageDetected[RHVOL]-32768;
pressure_value=GetFlowRate(voltageDetected[RHVOL],CURVE_1ST);
voltageDetected[VRHX]=voltageDetected[VRHX]-32768;
pressure_value=GetFlowRate(voltageDetected[VRHX],CURVE_1ST);
display_update_flag = 1;
if( voltageDetected[TPCB]>50000)
if( voltageDetected[RHVOL]>50000)
{
typecflag=1;
}
}
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();
}
void StartNormolFlowMeasurement(void)//每125ms调用一次
{
}
u16 GetAdcGain(u16 gianX)
{
switch(gianX)
{
case 1: return GAIN1;
case 2: return GAIN2;
case 4: return GAIN4;
case 8: return GAIN8;
case 16: return GAIN16;
case 32: return GAIN32;
case 64: return GAIN64;
case 128: return GAIN128;
default:
return GetAdcGain(ADC_GAIN_DEFAULT);
}
}
/******采集部分***************************************************************************************************************************************************************************************************************/
void AnalogCircuitInit(void)
{
sampleProcess.CTypeGain = GetAdcGain(adcGain); //默认采样系数
SampingADCInit();
DisableSamplingInterrupt();
}
//void ProcessTimerInterruptCallBack(void)
//{
// FlowProcessManagement();
//
//}
//采样进程中断
void ProcessTimerInterruptCallBack(void)
{
DisableProcessTimerInterrupt();
HWState.ProcessTimerOut = 1;
}
//void StartNormolFlowMeasurement(void)//每125ms调用一次
//{
// AnalogCircuitInit();//初始化ADC
// HWState.SampledOver = 0;//采样结束标志重置
// StartProcessTimer(32768); //启动比较定时器,开始从0递增计数
// Timer_register_irq_callback(ProcessTimer,ProcessTimerIT, ProcessTimerInterruptCallBack );//注册中断回调函数
// processIndex = 0; //
// processNextTime = 0;
// FlowProcessManagement();//每个周期运行,开启采样过程
//}
void StartNormolFlowMeasurement(void)//开始常规流量测量
{
AnalogCircuitInit();
HWState.SampledOver = 0;//采样结束标志重置
StartSamplingTimerInterval(32768); //启动比较定时器,开始从0递增计数
Timer_register_irq_callback(SamplingTimer,SamplingTimer_IRQ_Callback );//注册中断回调函数
StartProcessTimer(64000); // 启动比较定时器,开始从0递增计数
Timer_register_irq_callback(ProcessTimer,ProcessTimerIT, ProcessTimerInterruptCallBack );//注册中断回调函数
sampleProcess.NextRun = 0;
sampleProcess.NextTime= 0;
processIndex = 0; //
processNextTime = 0;
FlowProcessManagement();//每个周期运行,开启采样过程
FlowProcessManagement();//每个周期运行,开启采样过程
}
//static void SetNextProcess(void)//设置采样定时器的下一个进程
//{
// if(processIndex == 0){
// StopProcessTimer();//关闭采集时钟
// return;
// }
// u32 currentTAR = pTIM1->CNT;//定时器当前计数值
// if(currentTAR > processNextTime) processNextTime = currentTAR + 5;
// ResetProcessTimer(processNextTime);
//}
static void SetSystemForADCSample(u16 SampleSiagnl)//设置采样通道与采样次数
void SetNextProcess(void)//设置采样定时器的下一个进程
{
switch(SampleSiagnl)
{
case SIGNAL0:{
sampleData.adcConfig.Gain0 = ADC_PGA_GAIN_1;
sampleData.adcConfig.PChan0 = ADC0_AINP_AIN0;
sampleData.adcConfig.NChan0 = ADC0_AINM_AVSS;//IRH
sampleData.adcConfig.Gain1 = ADC_PGA_GAIN_1;
sampleData.adcConfig.PChan1 = ADC1_AINP_AIN2;
sampleData.adcConfig.NChan1 = ADC1_AINM_AVSS;//URU
sampleData.adcConfig.SPS=SPS_488;
}break;
case SIGNAL1: {
sampleData.adcConfig.Gain0 = ADC_PGA_GAIN_1;
sampleData.adcConfig.PChan0 = ADC0_AINP_AIN1;
sampleData.adcConfig.NChan0 = ADC0_AINM_AVSS;//IRR
sampleData.adcConfig.Gain1 = ADC_PGA_GAIN_1;
sampleData.adcConfig.PChan1 = ADC1_AINP_AIN3;
sampleData.adcConfig.NChan1 = ADC1_AINM_AVSS;//URH
sampleData.adcConfig.SPS=SPS_488;
}break;
case SIGNAL2: {
sampleData.adcConfig.Gain0 = ADC_PGA_GAIN_1;
sampleData.adcConfig.PChan0 = ADC0_AINP_AIN4;
sampleData.adcConfig.NChan0 = ADC0_AINM_AVSS;
sampleData.adcConfig.Gain1 = ADC_PGA_GAIN_1;
sampleData.adcConfig.PChan1 = ADC1_AINP_AIN7;
sampleData.adcConfig.NChan1 = ADC1_AINM_AVSS;//电池电压/3.2
sampleData.adcConfig.SPS=SPS_488;
}break;
}
}
static void SetNextProcess(void)//设置采样定时器的下一个进程
{
if(processIndex == 0){
StopSamplingTimerInterval();//关闭采集时钟
if(sampleProcess.NextRun == 0){
StopProcessTimer();//关闭采集时钟
return;
}
u32 currentTAR = pTIM1->CNT;//定时器当前计数值
if(currentTAR > processNextTime) processNextTime = currentTAR + 5;
ResetSamplingTimerInterval(processNextTime);
// u32 currentTAR = ProcessTimer->CNT;//定时器当前计数值
// if(currentTAR > sampleProcess.NextTime) sampleProcess.NextTime = currentTAR + 5;
// ResetProcessTimer(sampleProcess.NextTime);
StartProcessTimer(sampleProcess.NextTime);
}
void SetSystemForADCSample(u16 sampleNum)
{
sampleProcess.Counter = 0;
sampleProcess.CounterMax = sampleNum;
StartSamplingADC();
}
void ComputeSampleData(u16 sampleNum, u16 sampleShift)
{
u32 I;
sampleProcess.ADC0Result = 0;
sampleProcess.ADC1Result = 0;
for(I = 0; I<sampleNum; I++)
{
sampleProcess.ADC0Result += ((sampleProcess.ADC0Buffer[I] >> 8) + 32768) & 0xFFFF;
sampleProcess.ADC1Result += ((sampleProcess.ADC1Buffer[I] >> 8) + 32768) & 0xFFFF;
}
sampleProcess.ADC0Result >>= sampleShift;
sampleProcess.ADC1Result >>= sampleShift;
}
/******************************************************************************/
void TurnOffAnalogCircuit(void)
{
StopSamplingADC();
DisableSamplingInterrupt();
}
//void FlowProcessManagement(void)//采样过程管理状态机
//{
// switch(processIndex)
// {
// case 0:
// {
// HWState.SampledOver = 0;//采样开始
// SetupRHChannle();
// SetupIRHypeChannle();
// SetSystemForADCSample(16); //开启ADC
// processNextTime += 20 * COUNT_VALUE_PER_MS; //20ms 计数值=65535/4000*t =
// processIndex=1;
// }break;
// case 1:
// {
// TurnOffAnalogCircuit();
// ComputeSampleData(16, 4);//计算样本数据
// sampleProcess.RHypeResult = sampleProcess.ADC0Result;//放入缓存
// sampleProcess.IRHResult = sampleProcess.ADC1Result;//放入缓存
// SetupBLChannle();//设置SIGNAL1
// SetupRDChannle();
// SetSystemForADCSample(16);
// processNextTime += 20 * COUNT_VALUE_PER_MS;//20ms
// processIndex=2;
// }break;
// case 2:
// {
// TurnOffAnalogCircuit();
// ComputeSampleData(16, 4);//计算样本数据; //计算样本数据
// sampleProcess.BLypeResult = sampleProcess.ADC0Result;//放入缓存
// sampleProcess.RDResult = sampleProcess.ADC1Result;//放入缓存
//
// HWState.SampledOver = 1; //采样结束
// StopProcessTimer();
// processIndex=3;
// }break;
// default : processIndex = 0; break;
// }
// SetNextProcess();
//}
void FlowProcessManagement(void)//采样过程管理状态机
{
switch(processIndex)
switch(sampleProcess.NextRun)
{
case 0:
{
HWState.SampledOver = 0;//采样开始
SetSystemForADCSample(SIGNAL0);//设置SIGNAL0
StartADCSyncSampingData();//开始采集
processNextTime += 327; //20ms 计数值=65535/4000*t =
processIndex=1;
}break;
SetupBLChannle();
SetupRDChannle();
SetSystemForADCSample(SAMPLING_TIMES_IN_DETECT_STAGE);//设置采样个数并开始采样
sampleProcess.NextTime = 20*COUNT_VALUE_PER_MS;
sampleProcess.NextRun = 1;
}break;
case 1:
{
ComputeSampleData(); //计算样本数据
sampleData.TCode[IRHCode] = sampleData.ADCBuffer[0];//放入缓存
sampleData.TCode[URUCode] = sampleData.ADCBuffer[1];//放入缓存
SetSystemForADCSample(SIGNAL1);//设置SIGNAL1
StartADCSyncSampingData();//开始采集
processNextTime += 327;//20ms
processIndex=2;
TurnOffAnalogCircuit();
ComputeSampleData(SAMPLING_TIMES_IN_DETECT_STAGE, SHIFT_IN_DETECT_STAGE);
sampleProcess.BLypeResult = sampleProcess.ADC0Result;//放入缓存
sampleProcess.RDResult = sampleProcess.ADC1Result;//放入缓存
// SetupVRHChannle();//设置SIGNAL1
// SetSystemForADCSample(PRESAMPLING_TIMES_IN_1ST_STAGE);//设置采样个数并开始采样
// sampleProcess.NextTime = 20*COUNT_VALUE_PER_MS;//20ms
sampleProcess.NextRun = 3;
}break;
case 2:
case 2:
{
ComputeSampleData(); //计算样本数据
sampleData.TCode[IRRCode] = sampleData.ADCBuffer[0];//放入缓存
sampleData.TCode[URHCode] = sampleData.ADCBuffer[1];//放入缓存
SetSystemForADCSample(SIGNAL2);//设置SIGNAL1
StartADCSyncSampingData();//开始采集
processNextTime += 327;//20ms
processIndex=3;
TurnOffAnalogCircuit();
ComputeSampleData(PRESAMPLING_TIMES_IN_1ST_STAGE, SHIFT_IN_PRESAMPLING_1ST_STAGE);
}break;
case 3:
{
ComputeSampleData(); //计算样本数据
sampleData.TCode[BASCode] = sampleData.ADCBuffer[0];//放入缓存
sampleData.TCode[BATCode] = sampleData.ADCBuffer[1];//放入缓存
HWState.SampledOver = 1; //采样结束
StopSamplingTimerInterval();//关闭采集时钟
processIndex=4;
}break;
default : processIndex = 0; break;
case 4:
{
}break;
case 5:
{
}break;
case 6:
{
}break;
default : sampleProcess.NextRun = 0; break;
}
SetNextProcess();
}
//******************************************************************************/
void CoreInit(void)
{
SystemGPIOInit();
// ExternCalibratinInput();
TurnOffAnalogCircuit();
}
//主程序中断------------------------------------------------------------
//void PrimaryTimer_IRQ_Callback()
//{
//// HWState.MainTimerOut = 1;
// StartNormolFlowMeasurement();
//}
void PrimaryTimer_IRQ_Callback()
{
HWState.MainTimerOut = 1;
// StartNormolFlowMeasurement();
}
/******显示部分***************************************************************************************************************************************************************************************************************/
void SwitchPressureUnit(void)
{
@@ -337,7 +436,7 @@ void Update_Pressure_Display(void)
}
// --- 5. 电量显示逻辑---
battery_adc = voltageDetected[TPCB];
battery_adc = voltageDetected[RHVOL];
if(battery_adc >= 44761) battery_level = 4;
else if(battery_adc >= 43646) battery_level = 3;
@@ -402,17 +501,16 @@ void OLED_DrawRect_Cache(u8 x, u8 y, u8 w, u8 h)
OLED_DrawLine(x + w - 1, y, x + w - 1, y + h - 1, 1);
}
// 定义一个你自己的函数比如用来给LED闪烁计时的
static uint32_t led_timer = 0;
static uint32_t shutdown_timer = 0;
void My_Timer2_Callback(void)
void My_Timer2_Callback(void)//每10ms进一次中断
{
// LED 逻辑
led_timer++;
if(led_timer >= 10) // 500ms
if(led_timer >= 10)
{
led_timer = 0;
LHL_GPIO_TogglePin(LED_PIN_GPIO, LED_PIN);
TOGGLE_PIN(LED_PIN_GPIO, LED_PIN);
}
// 关机逻辑 (独立计数)
@@ -429,16 +527,14 @@ void My_Timer2_Callback(void)
void SystemPolling(void)
{
static uint8_t power_off_screen_cleared = 0;
/* 1. 处理数据接收与存储 (优先级最高,与显示逻辑分离) */
if(mucSaveParams == PARAMS_READY)
{
SaveSysParams(); // 参数保存通常涉及Flash擦写耗时较长确认这里不会阻塞太久
}
if(HWState.SampledOver)
{
FlowRateDealAndOuputSub(); // 计算流量
}
static uint8_t power_off_screen_cleared = 0;
if(HWState.MainTimerOut == 1 ) {
ManagePrimaryTimeInterval(); // 判断下阶段的工作模式
ModeExitCount(); // 判断各种模式退出
Clear_WDT();
StartNormolFlowMeasurement();
HWState.MainTimerOut = 0;
}
if(comState.state.ReceivedData)
{
ReceivedDataProcessing();
@@ -481,4 +577,5 @@ void SystemPolling(void)
}
#endif
#endif
/****************************************************************************/

477
user/Core/DP2006_VM1000.h Normal file
View File

@@ -0,0 +1,477 @@
#ifndef __D9V2FR_DP2006V1000_h__
#define __D9V2FR_DP2006V1000_h__
//File Start--------------------------------------------------------------------
#if (DP2006_VM1000)
//**************************************************************************
// for flow compute
//==============================================================================
#define LED_PIN GPIO_PIN_5
#define LED_PIN_PINPOS GPIO_PinPos_5
#define LED_PIN_GPIO GPIO0
#define LED_PIN_OUT() EnableOutput(LED_PIN_GPIO, LED_PIN)
#define SET_LED_PIN() SET_PIN(LED_PIN_GPIO,LED_PIN)
#define CLR_LED_PIN() CLR_PIN(LED_PIN_GPIO,LED_PIN)
//==============================================================================
//// key_pin select pin
// <20><><EFBFBD>Ŷ<EFBFBD><C5B6><EFBFBD>
#define KEY1_PIN GPIO_PIN_1 // PA0<41><30>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>ػ<EFBFBD><D8BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define KEY1_PORT pGPIO1
#define POWER_CTRL_PIN GPIO_PIN_0 // PA1<41><31><EFBFBD><EFBFBD>Դ<EFBFBD><D4B4><EFBFBD>ƽ<EFBFBD>
#define POWER_CTRL_PORT pGPIO1
#define UnitKEY_PIN GPIO_PIN_0 // <20><>λ<EFBFBD>л<EFBFBD><D0BB><EFBFBD>
#define UnitKEY_PORT pGPIO0
//------------------------------------------------------------------------------
// OLED I2C<32>ӿ<EFBFBD><D3BF><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
#define I2C_SDA GPIO_PIN_4
#define I2C_SDA_PINPOS GPIO_PinPos_4
#define I2C_SDA_GPIO GPIO1
#define I2C_SCL GPIO_PIN_0
#define I2C_SCL_PINPOS GPIO_PinPos_0
#define I2C_SCL_GPIO GPIO2
#define I2C_RES GPIO_PIN_6
#define I2C_RES_PINPOS GPIO_PinPos_1
#define I2C_RES_GPIO GPIO1
//------------------------------------------------------------------------------
// for eeprom
#define EEPROM_WP_PIN GPIO_PIN_5
#define EEPROM_WP_PINPOS GPIO_PinPos_5
#define EEPROM_WP_GPIO GPIO1
#define PARA_EEPROM BIT1
#define DATA_EEPROM BIT2
#define FROCK_EEPROM BIT1+BIT2+BIT3
//------------------------------------------------------------------------------
// for BLE
#define BLE_CTS_PIN GPIO_PIN_3
#define BLE_CTS_GPIO pGPIO0
#define BLE_RST_PIN GPIO_PIN_4
#define BLE_RST_GPIO pGPIO0
//------------------------------------------------------------------------------
// for SPI
//#define SCLK_PIN GPIO_PIN_5
//#define SCLK_PINPOS GPIO_PinPos_5
//#define SCLK_PIN_SOURCE GPIO_PinSource5
//#define SCLK_PIN_CONFIG GPIO1_5_AF_SCLK
//#define SCLK_GPIO GPIO1
//#define SOMI_PIN GPIO_PIN_4
//#define SOMI_PINPOS GPIO_PinPos_4
//#define SOMI_PIN_SOURCE GPIO_PinSource4
//#define SOMI_PIN_CONFIG GPIO1_4_AF_MISO
//#define SOMI_GPIO GPIO1
//#define SIMO_PIN GPIO_PIN_6
//#define SIMO_PINPOS GPIO_PinPos_6
//#define SIMO_PIN_SOURCE GPIO_PinSource6
//#define SIMO_PIN_CONFIG GPIO1_6_AF_MOSI
//#define SIMO_GPIO GPIO1
////------------------------------------------------------------------------------
//#define EXT_CALIB_PIN GPIO_PIN_7
//#define EXT_CALIB_PINPOS GPIO_PinPos_7
//#define EXT_CALIB_GPIO GPIO1
//#define RS485DE_PIN GPIO_PIN_1
//#define RS485DE_PINPOS GPIO_PinPos_1
//#define RS485DE_GPIO GPIO1
//#define RS485DE_OUTPUT() EnableOutput(RS485DE_GPIO, RS485DE_PINPOS)
//#define ENABLE_TXD() SET_PIN(RS485DE_GPIO, RS485DE_PIN)
//#define ENABLE_RXD() CLR_PIN(RS485DE_GPIO, RS485DE_PIN)
// *****************************************************************************
// 'X' <20><>׺<EFBFBD><D7BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// *****************************************************************************
#define CTYPE_FR CURVE_1ST
#define ATYPE_VH CURVE_2ND
#define MICRO_FR CURVE_3RD
#define FRIDX CTYPE_FR // 0
#define RGIDX ATYPE_VH // 1
#define GAINX MICRO_FR // 2
#define VDUX 3 //
#define VDUGX 4 //
#define RIDX 5 //
#define NIDX 6 // NORMAL_VL - LOW_VL (TD INDEX)
#define TPCB 7 // PCB temperature
#define TGAS 8 // GAS temperature
#define TRH 9 // RH temperature
#define BATT 10 // Battery volatge
#define IVHDX 11 // IRH CODE test VHH By TD Control
#define VRHX 12 // VRH CODE
#define IVHUX 13 // IRH CODE test VHH By TU Control
#define VRRX 14 // VRR CODE
#define RHVOL 15 // RH VOLATAGE
#define RRVOL 16 // RR VOLATAGE
#define RHRES 17 // RH resistance
#define RRRES 18 // RR resistance
#define PORH 19 // RH Power
#define PDRH 20 // RH current Power
#define CVHHX 21 //
#define DVHHX 22 //
#define VHPA 23 //
#define RATO 24 // RR:RH
#define SDT 25 // ATYPE OFFSET
#define DIVHX 26 // IVHH(TD) - IVHH(TU)
#define TCOE 27 //
#define TVDUX 28 //
#define TVDUGX 29 //
#define FR_H 30 //
#define FR_L 31 //
#define ANX 32 //
#define ANX_MASK (ANX-1)
//------------------------------------------------------------------------------
#define NRH RRRES
#define NVHH IVHDX
#define CVHH CVHHX //
#define DVHH DVHHX //
#define NVDU VDUX
#define LRH RHRES
#define LVOL RHVOL
#define LVHH IVHDX
//------------------------------------------------------------------------------
#define GCFX NVDU //
#define GIDX LCDE //
#define FIDX FRIDX
#define RAOOM RATO
#define ATYPE_FR CURVE_2ND
#define REG_INDEX RGIDX
//------------------------------------------------------------------------------
#define CODE1 FR_H // 8300 FIDX
#define CODE2 FR_L // 8301 FIDX
#define CODE3 FRIDX // 8302 FIDX
#define CODE4 NIDX // 8303
#define CODE5 VRHX // 8304
#define CODE6 IVHDX // 8305
#define CODE7 RHVOL // 8306
#define CODE8 VDUGX // 8307
#define CODE9 TPCB // 8308
#define CODE10 RHVOL // 8309
#define CODE11 VDUX // 830A
#define CODE12 VDUGX // 830B
#define CODE13 NIDX // 830C
#define CODE14 BATT // 830D
#define CODE15 IVHDX // 830E
#define CODE16 VRHX // 830F
// *****************************************************************************
// 1S = 16384
// Circuit preparation process
#define START_SAMPLING_STAGE_0 0
#define START_SAMPLING_STAGE_1 1
#define START_SAMPLING_STAGE_2 2
#define START_SAMPLING_STAGE_3 3
//------------------------------------------------------------------------------
#define FR_UPDATE 0x0A
#define FR_UPDATE_PULSE_TIME 16 // 1ms
//------------------------------------------------------------------------------
#define CIRCUIT_SETUP_TIME 82 // 5ms
//------------------------------------------------------------------------------
#define SET_UP_TIME_FROM_DETECT_TO_1ST_STAGE 1638 // 100ms
//------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̣<EFBFBD>
//------------------------------------------------------------------------------
#define COUNT_VALUE_PER_MS 16 //10
#define SET_UP_TIME_OF_DETECT_STAGE (20 * COUNT_VALUE_PER_MS) ///20ms
#define SAMPLING_TIMES_IN_DETECT_STAGE 16 //
#define SHIFT_IN_DETECT_STAGE 4 //
//
#define SET_UP_TIME_OF_1ST_STAGE (40 * COUNT_VALUE_PER_MS) //40ms <20><>Ӧ<EFBFBD><D3A6>΢<EFBFBD><CEA2><EFBFBD><EFBFBD>ADC 977SRS DMA<4D><41><EFBFBD><EFBFBD>32<33><32>ʱ<EFBFBD><CAB1>
#define PRESAMPLING_TIMES_IN_1ST_STAGE 32 //
#define SHIFT_IN_PRESAMPLING_1ST_STAGE 5 //
//
#define SAMPLING_TIME_OF_1ST_STAGE (70 * COUNT_VALUE_PER_MS) //70ms <20><>Ӧ<EFBFBD><D3A6>΢<EFBFBD><CEA2><EFBFBD><EFBFBD>ADC 977SRS DMA<4D><41><EFBFBD><EFBFBD>64<36><34>ʱ<EFBFBD><CAB1>
#define SAMPLING_TIMES_IN_1ST_STAGE 64 //
#define SHIFT_IN_1ST_STAGE 6 //
//******************************************************************************
#define STATIC_HIGH_CODE 50
#define STATIC_LOW_CODE 50
// *****************************************************************************
//#define VHH_GAIN GAIN16
#define NIDX_GAIN GAIN32
#define GIDX_GAIN GAIN128 //GAIN_64
#define GIDX_SHIFT 4
//#define VRR_GAIN GAIN16
//#define VRH_GAIN GAIN1
#define SAMPLE_NORMOL_MODE 0
#define SAMPLE_TRACK_ZERO_MODE 1
#define SAMPLE_FAST_MODE 2
#define SAMPLE_MODE_MAX SAMPLE_TRACK_ZERO_MODE //SAMPLE_VDU_VRH_MODE
#define SAMPLE_DEFAULT_MODE SAMPLE_NORMOL_MODE //SAMPLE_VDU_VRR_MODE
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ÿ<><C3BF>
#define SAMPLE_VDU 0
#define SAMPLE_GVDU 1
#define SAMPLE_VRH 0
#define SAMPLE_IRH 1
#define SWITCH_GAIN_THRESHOLD 0x36768
#define CAL_VDUX CTYPE_FR
#define CAL_ATYPE ATYPE_VH
#define CAL_VDUGX MICRO_FR
// *****************************************************************************
#if (DP2006_VM1000)
//---------------------------------------------------------------------------------
#define VCOM 0.0
#define VREF_PER_CODE (ADC_VREF/32768)
#define VRR_BRIDGE_VOL (ADC_VREF - VCOM)
#define VRR_RA 33000.0
#define VRR_RB 2800.0
#define VRR_RDC (VRR_RB/(VRR_RA + VRR_RB))
#define VRR_VDC (VRR_BRIDGE_VOL*VRR_RDC)
#define VRR_ADC_GAIN 16.0
#define VRR_VREF ( VREF_PER_CODE/VRR_ADC_GAIN )
#define VRR_PER_CODE ( ADC_VREF/((ADC_VREF-VCOM)*GAIN*32768))
#define SampingADCInit() ADC_REF_Init(REF_INTERNAL_2P5V, REF_INTERNAL_1P25V)
#define SetupRHChannle() ADC_Init(ADC_0, SPS_977, GAIN1,ADC0_AIN3,ADC0_AVSS) //VRH
#define SetupIRHypeChannle() ADC_Init(ADC_1, SPS_977, GAIN1,ADC1_AIN0,ADC1_AVSS)//IRH
#define SetupBLChannle() ADC_Init(ADC_0, SPS_977, GAIN1,ADC0_AIN7,ADC0_AVSS)//<2F><><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>
#define SetupRDChannle() ADC_Init(ADC_1, SPS_977, GAIN1,ADC1_AIN2,ADC1_AVSS)//VRU
#endif
//---------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------
#define StartSamplingADC() { \
ADC_SyncCmd(ENABLE); \
DMA_ADC_Init(ADC_0, sampleProcess.ADC0Buffer, sampleProcess.CounterMax); \
DMA_ADC_Init(ADC_1, sampleProcess.ADC1Buffer, sampleProcess.CounterMax); \
DMA_StartADC(ADC_0); \
DMA_StartADC(ADC_1); \
}
#define StopSamplingADC() { \
DMA_StopADC(ADC_0); \
DMA_StopADC(ADC_1); \
}
//---------------------------------------------------------------------------------------
#define sampleCTypeValue sampleProcess.ADC0Result
#define sampleATypeValue sampleProcess.ADC1Result
#define sampleRTypeValue sampleProcess.ADC1Result
#define ReadADCData()
//---------------------------------------------------------------------------------------
// 125ms/250ms/500ms/1000ms/2000ms/4000ms <20><><EFBFBD>ڶ<EFBFBD>ʱ uploadCounter: <20><><EFBFBD><EFBFBD>ֵ(>32.768)<29><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ֵ=(32768/1000)*t t(ms)Ϊ<><CEAA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
//#define USE_LPTIMER0
#define PrimaryTimer LPTIM1
#define StartPrimaryTimer( uploadCounter ) StartLPTimer1( uploadCounter )
#define ResetPrimaryTimer( uploadCounter ) ResetLPTimer1( uploadCounter )
#define EnablePrimaryTimerInterrupt() EnableLPTimer1Interrupt()
#define DisablePrimaryTimerInterrupt() DisableTimer1Interrupt()
#define StopPrimaryTimer() StopLPTimer1()
//#define PrimaryTimer_IRQ_Callback PrimaryTimer_IRQ_Callback// ManagePrimaryTimeInterval
//---------------------------------------------------------------------------------------
// 1ms<6D><73>׼<EFBFBD><D7BC>ʱ uploadCounter: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Χ:(1~4000)
//#define USE_TIMER2
#define ProcessTimer TIM1
#define ProcessTimerIT TIM_IT_CC1
#define StartProcessTimer(uploadCounter) StartTimer1_CC1(uploadCounter)
#define ResetProcessTimer(uploadCounter) ResetTimer1_CC1(uploadCounter)
#define StopProcessTimer() StopTimer1()
#define EnableProcessTimerInterrupt() NVIC_EnableIRQ(TIM1_IRQn); // EnableTimer2Interrupt()
#define DisableProcessTimerInterrupt() NVIC_DisableIRQ(TIM1_IRQn); // DisableTimer2Interrupt()
//#define Timer2InterruptCallBack()
//#define ProcessTimer_IRQ_Callback ProcessTimerInterruptCallBack
//---------------------------------------------------------------------------------------
//<2F>Ƚ϶<C8BD>ʱ uploadCounter: <20><><EFBFBD><EFBFBD>ֵ(1~65535)<29><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ֵ=(65535/4000)*t t(ms)Ϊ<><CEAA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
//#define USE_TIMER1
//#define SamplingTimer TIM1
//#define StartSamplingTimer(uploadCounter) StartTimer1_CC1(uploadCounter)
//#define ResetSamplingTimer(uploadCounter) ResetTimer1_CC1(uploadCounter)
//#define StopSamplingTimer() StopTimer1()
//#define EnableSamplingInterrupt() NVIC_EnableIRQ(TIM1_IRQn); // EnableTimer1Interrupt()
//#define DisableSamplingInterrupt() NVIC_DisableIRQ(TIM1_IRQn); // DisableTimer1Interrupt()
//#define SamplingTimer_IRQ_Callback ProcessTimerInterruptCallBack
#define TEMP_SENSOR_RESULT RESULT_0_25_BIT
// *****************************************************************************
// <20>ӱ<EFBFBD>׼<EFBFBD><D7BC>λ <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
#define ONE_PA_TO_MBAR 0.01f // 1 Pa = 0.01 mbar
#define ONE_PA_TO_TORR (1.0f / 133.322f) // 1 Pa = 1 / 133.322 Torr
#define ONE_PA_TO_MICRONS (1000.0f / 133.322f) // 1 Pa = 1000 / 133.322 Microns
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ <20><> <20><>׼<EFBFBD><D7BC>λ
#define ONE_MBAR_TO_PA 100.0f // 1 mbar = 100 Pa
#define ONE_TORR_TO_PA 133.322f // 1 Torr = 133.322 Pa
#define ONE_MICRONS_TO_PA (133.322f / 1000.0f) // 1 Microns = 133.322 / 1000 Pa
// ѹ<><D1B9><EFBFBD><EFBFBD>λö<CEBB><C3B6>
typedef enum {
PRESSURE_UNIT_PA, // <20><>˹<EFBFBD><CBB9>
PRESSURE_UNIT_MICRONS, // ΢<>׹<EFBFBD><D7B9><EFBFBD> (<28><>mHg)
PRESSURE_UNIT_TORR, // <20><>
PRESSURE_UNIT_MBAR // <20><><EFBFBD><EFBFBD>
} PressureUnitType;
// ѹ<><D1B9>ֵ<EFBFBD><D6B5>׼ (<28><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> Pa Ϊ<><CEAA>λ<EFBFBD>洢)
typedef struct
{
u16 DisplayZero : 1; // 1
u16 Mode: 2; // 3
u16 CType: 1; // 5
u16 AType: 2; // 7
u16 PreSampling: 1; // 10
u16 AutoDetectOffset: 1; // 11
u16 AutoDetectProcess: 2; // 13
u16 EnableRHTest : 1; // 14
u16 EnableRoughTest: 1; // 15
} __SAMPLE_STATUS_BIT_TypeDef;
typedef struct
{
__SAMPLE_STATUS_BIT_TypeDef State;
u16 NextRun;
u16 NextTime;
u16 Counter;
u16 CounterMax;
u16 CTypeGain;
u32 BLypeResult;//<2F><><EFBFBD>ص<EFBFBD><D8B5><EFBFBD>
u32 RDResult;//VRD
u32 RHypeResult;//VRH
u32 IRHResult;//IRH
u32 ADC0Result;
u32 ADC1Result;
u32 ADC0Buffer[70];
u32 ADC1Buffer[70];
} TypeSample;
typedef struct
{
unsigned int CalTA;
unsigned int Value[3];
unsigned int DeltaVHH;
unsigned int TUVHH;
unsigned int TDVHH;
unsigned int TUIndex;
unsigned int TDIndex;
} TypeCalibOffset;
// *****************************************************************************
extern unsigned short int FRType;
//==========================================================
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̿<EFBFBD><CCBF><EFBFBD>
//==========================================================
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ӳ<EFBFBD><D3B3><EFBFBD>
*/
void FlowRateDealAndOuputSub(void);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>벢ת<EBB2A2><D7AA>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>
*/
void ComputeFlowRateIndexAndFlowRate(void);
/**
* @brief <20>ּ<EFBFBD><D6BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
u16 WordSubFunction(u16 minuend, u16 subtractor);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>жϻص<CFBB>
*/
void SamplingTimer_IRQ_Callback(void);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> (125ms<6D><73><EFBFBD><EFBFBD>)
*/
void StartNormolFlowMeasurement(void);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
static void SetNextProcess(void);
/**
* @brief <20><><EFBFBD><EFBFBD>ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param sampleNum <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
*/
void SetSystemForADCSample(u16 sampleNum);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>ֵ
* @param sampleNum <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
* @param sampleShift <20><><EFBFBD><EFBFBD>λ<EFBFBD><CEBB> (<28><><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>ֵ<EFBFBD><D6B5>)
*/
void ComputeSampleData(u16 sampleNum, u16 sampleShift);
/**
* @brief <20>ر<EFBFBD>ģ<EFBFBD><C4A3><EFBFBD><EFBFBD>·
*/
void TurnOffAnalogCircuit(void);
/**
* @brief <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̹<EFBFBD><CCB9><EFBFBD>״̬<D7B4><CCAC>
*/
void FlowProcessManagement(void);
//==========================================================
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - ϵͳ<CFB5><CDB3>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
//==========================================================
/**
* @brief <20><><EFBFBD><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>
*/
void CoreInit(void);
/**
* @brief <20><><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD>жϻص<CFBB>
*/
void PrimaryTimer_IRQ_Callback(void);
/**
* @brief Timer2 <20>Զ<EFBFBD><D4B6><EFBFBD><EFBFBD>ص<EFBFBD> (<28>ػ<EFBFBD><D8BB>߼<EFBFBD>/<2F><><EFBFBD><EFBFBD>)
*/
void My_Timer2_Callback(void);
//==========================================================
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><>ʾ<EFBFBD><CABE>UI
//==========================================================
/**
* @brief <20>л<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>λ
*/
void SwitchPressureUnit(void);
/**
* @brief ѹ<><D1B9><EFBFBD><EFBFBD>λת<CEBB><D7AA>
* @param value ԭʼֵ
* @param targetUnit Ŀ<>굥λ
* @param originalUnit ԭʼ<D4AD><CABC>λ
* @return ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֵ
*/
double ConvertPressure(double value, PressureUnitType targetUnit, PressureUnitType originalUnit);
/**
* @brief <20><><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD><EFBFBD>
*/
void Update_Pressure_Display(void);
/**
* @brief <20><><EFBFBD>ƾ<EFBFBD><C6BE>α߿<CEB1> (<28><><EFBFBD><EFBFBD>ģʽ)
*/
void OLED_DrawRect_Cache(u8 x, u8 y, u8 w, u8 h);
//==========================================================
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> - <20><>ѭ<EFBFBD><D1AD>
//==========================================================
/**
* @brief ϵͳ<CFB5><CDB3>ѯ<EFBFBD><D1AF>ѭ<EFBFBD><D1AD>
*/
void SystemPolling(void);
//File End------------------------------------------------------------------
#endif
//.h End--------------------------------------------------------------------
#endif

View File

@@ -0,0 +1,479 @@
/********************************************************************************************************
** DP1902 MFXXGD FLANGE IO<49><4F><EFBFBD><EFBFBD>ͷ<EFBFBD>ļ<EFBFBD>
**
** Copyright (c) Siargo, Ltd. 2011
** All Rights Reserved.
**
**-------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#ifndef __DP2006_VM1000_Header_h__
#define __DP2006_VM1000_Header_h__
//==============================================16================================
#define PROGRAM_I2C_DEBUG 0
//==============================================================================
#define PRODUCT_MOD "TFS36200"
#define VER_MV 5
#define VER_SV 2
#define VER_RV 0
#define VER_BV 0
#define BUILD_DATE "20260107" //build日期
#define VERSION "2025.250901" //软件版本
//#define SOFT_VERSION 2025 //软件版本
/*******************************************************************************
*******************************************************************************/
// Microcontroller operating frequency
#define FREQ 4000000//((8000000/32768))*32768 // system frequency definition
#define TIMER_FREQ 32768
#define ACLK_DIV DIVA__1
#define SMCLK_DIV DIVS__2
#define MCLK_DIV DIVM__1
//******************************************************************************
// Function selection
//******************************************************************************
//******************************************************************************
#define DP2006_VM1000 1
//------------------------------------------------------------------------------
#define ENABLE_DCOEF 1 //?
#define ENABLE_LOWPOWER_MODE 1
//------------------------------------------------------------------------------
#define ENABLE_AUTO_CALIB_ATYPE_OFFSET 1 //?
//------------------------------------------------------------------------------
// for ACC Compute
#define REC_ACC_PER 0 // Acc flowrate save enable bit
#define ENABLE_ACCPULSE 0 // <20><><EFBFBD><EFBFBD>ܺ<EFBFBD><DCBA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>㲥ͬʱʹ<CAB1><CAB9>
#define ENABLE_PULSE_USE_CALIB_SETUP 0
//------------------------------------------------------------------------------
// For data storage
#define REC_ALARM_DATA 0 // for alarm data save enable bit
#define REC_DATE_DATA 0 // for date acc data save enable bit
#define REC_HISTORY_DATA 0 // for history data save enable bit
//------------------------------------------------------------------------------
// For Display
#define ENABLE_LCD_DISPLAY 0
// for GDT0136 LCD
#define ENABLE_DISPLAY_FR_FLAG 0
#define ENABLE_DISPLAY_ACC 0
//------------------------------------------------------------------------------
// For KEY SETUP
#define ENABLE_KEY 0
//------------------------------------------------------------------------------
#define ENABLE_EXT_RTC 0
#define ENABLE_EXT_CRYSTAL 1
//------------------------------------------------------------------------------
// For User UART & I2C
#define ENABLE_USER_I2C 0
#define ENABLE_USER_UART 1
#define ENABLE_USE_TXD_EN 0
#define ENABLE_TURN_OFF_RS485 0
#define ENABLE_DIGITAL_OUTPUT 0
#define ENABLE_FACTORY_PROTOCOL 0
//------------------------------------------------------------------------------
// for bluetooth beacon mode
#define BLUETOOTH_MODE 0
#define ENABLE_BLUETOOTH_BEACON (BLUETOOTH_MODE & (!ENABLE_ACCPULSE))
//------------------------------------------------------------------------------
#define ENABLE_NBIOT 0
//------------------------------------------------------------------------------
#define ENABLE_RF_UART (ENABLE_NBIOT | ENABLE_BLUETOOTH_BEACON) // RF Uart: NBIOT, Blue
#define ENABLE_RF_RX 0
#define ENABLE_AUTO_FOR_RF_TX 0 // for : INTER-NBIOT MOD
#define ENABLE_AUTO_USER_UART_TX 0
#define ENABLE_ERROR_USE_RF_TXDPIN 0
#define ENABLE_ERROR_PIN_FOR_VALVE_CONTROL 0
#define ENABLE_LEAK_DETECT 0
#define ENABLE_AT_FOR_MASTER_UART (ENABLE_RF_UART)
#define ENABLE_DENSITY_DETECT 0
#define ENABLE_ACC_GAIN 0
//------------------------------------------------------------------------------
// For A-Type FlowRate Compute
#define ENABLE_A_TYPE_FLOWRATE 0
#define ENABLE_PLUG_IN_FLOWRATE 0
//------------------------------------------------------------------------------
// For Temperature test
#define ENABLE_USE_MCP9808 1
//------------------------------------------------------------------------------
// For Temperature correction
#define ENABLE_OFFSET_TRACK 0 //track<63><6B><EFBFBD><EFBFBD>
#define ENABLE_OFFSET_CORRECT 1 //ƫ<><C6AB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define ENABLE_AUTO_ZERO_TRACK 0
#define ENABLE_TD_TU_SWITCH_CONTROL 0
#define ENABLE_MULTI_PONIT_TA_CORR 1
// For D9V2 if TEMP_CORR_USE_TA = 0 & TEMP_CORR_USE_RR = 0, use TGAS
#define TEMP_CORR_USE_TA 0 // TPCB
#define TEMP_CORR_USE_RR 0
//------------------------------------------------------------------------------
#define ENABLE_GAS_RECOGNITION 1
#define ENABLE_GAS_RECOGNITION_TABLE 1
#define ENABLE_RR_CALIBRATION ENABLE_GAS_RECOGNITION
#define ENABLE_ONE_TABLE 0
#define ENABLE_ONE_TABLE_NAME INTCMD_1ST_TABLE
//------------------------------------------------------------------------------
// for calibration data У׼<D0A3><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// 如果ENABLE_2ND_CURVE 和 ENABLE_3RD_CURVE 有1则ENABLE_ONE_CURVE必须为0
#define ENABLE_ONE_CURVE 0
#define ENABLE_2ND_CURVE 0
#define ENABLE_3RD_CURVE 1
//------------------------------------------------------------------------------
#define ENABLE_HALT_IN_OPERATE_CURVE 1
//------------------------------------------------------------------------------
// For ADC Calibration
#define ENABLE_CALIB_ATYPE_ADC 0
//------------------------------------------------------------------------------
#define ENABLE_EXTPOWER_DETECT 0
#define DISABLE_BAT_ALARM_IN_EXPOWER 0
#define DISABLE_BAT_ALARM 1
#define ENABLE_DEBUG_PIN 0 // if Not<6F><74>use for RF Control pin
#define ENABLE_ZERO_CALIB 1
#define ENABLE_ZERO_CALIB_PIN 0 // if Not<6F><74>use for RF Control pin
#define ENABLE_ZERO_CALIB_CMD 1
#define ENABLE_CALPIN_FOR_UPDATE_FR 1
//------------------------------------------------------------------------------
// for internal modbus
#define ENABLE_READ_CODE_INTO_CALIB 0
//------------------------------------------------------------------------------
// for SELECT BAT
#define ENABLE_BAT_SEL_PIN 0 // use for RF Control pin
//------------------------------------------------------------------------------
// FOR FLOWRATE UNIT
#define ENABLE_SCCM_SL 0
#define ENABLE_SLPM_NM3 1
#define ENABLE_NCMH_NM3 1
#define ENABLE_SCFM_SCF 0
#define ENABLE_PPM_PPM 0
#define ENABLE_KGH_KG 0
#define ENABLE_SLPM_SL 0
#define ENABLE_SCFH_SCF 1
#define ENABLE_FIXED_UART_FR 0
#define FLOW_UNIT_DEFAULT SLPM_NM3 // SCFH_SCF
#define FR_STD_UNIT SLPM // NCMH
//------------------------------------------------------------------------------
#define ACC_INT_8BIT 1
#define ACC_INT_7BIT 0
#define ACC_INT_6BIT (ENABLE_USE_GDT0136 | ENABLE_EDC20021HDC1P8)
#define ENABLE_ACC_DEC_COMPUTE 0
//------------------------------------------------------------------------------
#define ENABLE_SAMPLE_GREATER_GAIN 1
//------------------------------------------------------------------------------
#define ENABLE_FLOW_GAIN 1
#define FLOW_GAIN_DEFAULT 100
#define FLOW_GAIN_MAX 1000
//------------------------------------------------------------------------------
// for user protocol
#define ENABLE_USER_WP 1 // Write protect
#define ENABLE_USER_GCF 1
#define ENABLE_USER_OFFSET 1
#define ENABLE_USER_WRITE_ACC 1
#define ENABLE_USER_RESET_CORR 1
#define ENABLE_USER_SET_UNIT 1
#define ENABLE_ALARM_ACC 0
//------------------------------------------------------------------------------
#define ENABLE_ADJUST_ADC_GAIN 1
//******************************************************************************
#define TURN_OFF_SYSTEM 245 // 2.45V
//******************************************************************************
// Parameter default
//******************************************************************************
// FOR MODBUS Define
// MODBUS Operation password
#define COM_PASSWORD1 0x53495244 //0x53495244 "SIRD"
#define COM_PASSWORD2 0x32303133
#define COM_PASSWORD3 0x53494152
// for MODBUS Default
#define MAP1_DEFAULT STD_PROTOCOL
#define MAP2_DEFAULT STD_SLAVER_ADDR
#define MAP3_DEFAULT STD_FLOWRATE
#define MAP4_DEFAULT (STD_FLOWRATE+1)
#define MAP5_DEFAULT STD_ACC_INT
#define MAP6_DEFAULT (STD_ACC_INT+1)
#define MAP7_DEFAULT STD_ACC_DOT
#define MAP8_DEFAULT (STD_METER_SN)
#define MAP9_DEFAULT (STD_METER_SN+1)
#define MAP10_DEFAULT (STD_METER_SN+2)
#define MAP11_DEFAULT (STD_METER_SN+3)
#define MAP12_DEFAULT (STD_METER_SN+4)
#define MAP13_DEFAULT (STD_METER_SN+5)
#define MAP14_DEFAULT STD_ALARM_1
#define MAP15_DEFAULT STD_BAT1_V
#define MAP16_DEFAULT STD_OUT_MAX_FLOW
#define MAP17_DEFAULT (STD_OUT_MAX_FLOW+1)
#define MAP18_DEFAULT STD_OUT_MIN_FLOW
#define MAP19_DEFAULT (STD_OUT_MIN_FLOW+1)
#define MAP20_DEFAULT STD_GAS_OFFSET_C
#define MAP21_DEFAULT STD_GAS_OFFSET_A
#define MAP22_DEFAULT STD_TA
#define MAP23_DEFAULT STD_TGAS
#define MAP24_DEFAULT STD_GAS_FACTOR
#define MAP25_DEFAULT STD_AIR_FACTOR
#define MAP26_DEFAULT STD_FACTOR_VTH
#define MAP27_DEFAULT 0
#define MAP28_DEFAULT 0
#define MAP29_DEFAULT 0
#define MAP30_DEFAULT 0
#define MAP31_DEFAULT 0
#define MAP32_DEFAULT 0
#define MAP33_DEFAULT 0
#define MAP34_DEFAULT 0
#define MAP35_DEFAULT 0
#define MAP36_DEFAULT 0
#define MAP37_DEFAULT 0
#define MAP38_DEFAULT 0
#define MAP39_DEFAULT 0
#define MAP40_DEFAULT 0
#define MAP41_DEFAULT 0
#define MAP42_DEFAULT 0
#define MAP43_DEFAULT 0
#define MAP44_DEFAULT 0
#define MAP45_DEFAULT 0
#define MAP46_DEFAULT 0
#define MAP47_DEFAULT 0
#define MAP48_DEFAULT 0
//------------------------------------------------------------------------------
// FOR AUTO TXD DATA
#define TIMING_TXD_START_DEFAULT STD_METER_SN
#define TIMING_TXD_LEN_DEFAULT (STD_BAT1_V - STD_METER_SN)+1
#define TIMING_TXD_TIME_DEFAULT 0
//------------------------------------------------------------------------------
#define DIS_LANGUAGE_DEFAULT CHINESE
//------------------------------------------------------------------------------
#define KEY_PASSWORD_DEFAULT 11111
//******************************************************************************
//------------------------------------------------------------------------------
#define MAX_ALRAM_FR_DEFAULT 160 // 1.25*128
//------------------------------------------------------------------------------
// INSTRUMENT_FACTOR = 1 ERROR_CORRECT = 0
#define CORRECT_METHOD ERROR_CORRECT
#define ENABLE_GCF_POWER_CORR 0
//------------------------------------------------------------------------------
#define METER_PARAMETER_STD 1000
#define METER_PARAMETER_DEFAULT 1000
#define METER_PARAMETER_MAX 6500
#define METER_PARAMETER_MIN 112
//------------------------------------------------------------------------------
#define GCF_PARAMETER_STD 1000
#define GCF_PARAMETER_MAX 5500
#define GCF_PARAMETER_MIN 250
#define GCF_ATYPE_DEFAULT 850
//------------------------------------------------------------------------------
#if(ENABLE_GCF_POWER_CORR)
//------------------------------------------------------------------------------
#define GCF_DEFAULT 889
#define GCF_A_DEFAULT -46
#define GCF_C_DEFAULT 226
#define GCF_A_DOT 1000
#define GCF_B_DOT 1000
#define GCF_C_DOT 1000000 // for mm2 No dot bit
//------------------------------------------------------------------------------
#else
//------------------------------------------------------------------------------
#if(DP1902COREV0134)
#define GCF_DEFAULT 850
#else
#define GCF_DEFAULT 1030
#endif
//----------------------------------------------------------------------------
#define GCF_A_DEFAULT 0
#define GCF_C_DEFAULT 0
#define GCF_A_DOT 10000000000
#define GCF_B_DOT 1000
#define GCF_C_DOT 10000
//------------------------------------------------------------------------------
#endif
//------------------------------------------------------------------------------
#define TIMING_TXD_START_MAX STD_WRITE_START
#define TIMING_TXD_START_MIN STD_REG_START
#define TIMING_TXD_LEN_MAX 40
#define TIMING_TXD_LEN_MIN 1
#define TIMING_TXD_TIME_MAX 45000 //
//------------------------------------------------------------------------------
#define SAMPLE_PERIOD_DEFAULT RESP_250MS // RESP_4000MS
#define EXT_POWER_PERIOD_TIME RESP_250MS // RESP_500MS //<2F>ⲿ<EFBFBD><E2B2BF>Դ
//------------------------------------------------------------------------------
#define RESPONSE_TIME_DEFAULT RESP_2000MS // 125, 250, 500, 1000, 2000, 4000
#define ENABLE_DISPLAY_FILTER 1
#define DISPLAY_FILTER_DEFAULT RESP_1000MS // 1S
#define FLOWRATE_UPDATE_SCALE 18 // 50/1024= 5%
#define FRINDEX_UPDATE_SCALE 8 // 50/1024= 5%
//------------------------------------------------------------------------------
#define CALIB_PULSE_DEFAULT PULSE_1ML
#define CALIB_PULSE_UNIT_MIN PULSE_1ML
#define CALIB_PULSE_UNIT_MAX PULSE_1000L
#define PULSE_LEVEL_DEFAULT LOW
#define PULSE_UNIT_DEFAULT PULSE_1000L
#define PULSE_UNIT_MIN PULSE_100ML
#define PULSE_UNIT_MAX PULSE_1000L
//for key setup
#define PULSE_UNIT_INDEX_MIN PULSE_100ML_INDEX
#define PULSE_UNIT_INDEX_MAX PULSE_1000L_INDEX
//------------------------------------------------------------------------------
#define COM_DECIMAL_POINT_DEFAULT 3
//------------------------------------------------------------------------------
#define MAX_FR_DEFAULT 600000
#define MIN_FR_DEFAULT 0
#define CLIAB_STD_FR_GIAN 1 // <20><>ԭ<EFBFBD><D4AD>1000<30>Ļ<EFBFBD><C4BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//------------------------------------------------------------------------------
#define ADC_GAIN_DEFAULT 32
//------------------------------------------------------------------------------
// for AType FlowRate Compute
#define SDT_ZERO_OFFSET 20000
#define OFFSET_A_MAX 30000
#define OFFSET_A_MIN 10000
#define AUTO_OFFSET_NIDX 150
#define AUTO_OFFSET_NVHH 5000
#define SWITCH_FR_DEFAULT 20000
#define SWITCH_FR_INDEX_MAX 30000
#define SWITCH_FR_INDEX_MIN 1000
#define ATYPE_INDEX_GAIN_DEFAULT 30
#define ATYPE_INDEX_GAIN_MAX 100
#define ATYPE_INDEX_GAIN_MIN 10
//------------------------------------------------------------------------------
#define TEMPRETURE_OFFSET 10000 // 2bit
#define FR_TEMPERATURE_DEAULT 2000
#define TEMPERATURE_K_STD 27315
#define FR_TEMPERATURE_STD 29315 // 273.15 + 20.00
//------------------------------------------------------------------------------
#define ENABLE_WRITE_TA_HIGH (TEMPRETURE_OFFSET+4750)
#define ENABLE_WRITE_TA_LOW (TEMPRETURE_OFFSET+150)
#define ENABLE_WRITE_TA_SCALE 150 // 1.5<EFBFBD><EFBFBD>C
#define TEMP_FACTOR_MAX 50 // 0.005
#define TEMP_FACTOR_MIN 0 //-0.005
#define TEMP_FACTOR_DEFAULT 25 //-0.0025
//------------------------------------------------------------------------------
#define STATIC_LOW_TA_MAX 11000 // 10<31><30>C
#define STATIC_LOW_TA_MIN 8000 // -20<32><30>C
#define STATIC_HIGH_TA_MAX 17000 // 70<37><30>C
#define STATIC_HIGH_TA_MIN 14000 // 40<34><30>C
//------------------------------------------------------------------------------
#define TGAS_ALARM_MAX 17000 // 70<37><30>C
#define TGAS_ALARM_MIN 5000 // -50<35><30>C
//------------------------------------------------------------------------------
#define CALIB_TEMPRETURE_MAX 13500
#define CALIB_TEMPRETURE_MIN 11500
//------------------------------------------------------------------------------
#define ZERO_SUPPRESSION_DEFAULT 150
#define ZERO_SUPPRESSION_MAX 2000
#define ZERO_SUPPRESSION_MIN 0
//------------------------------------------------------------------------------
#define OFFSET_MAX 36768
#define OFFSET_MIN 28768
//------------------------------------------------------------------------------
#define REVERSE_SCALE_DEFAULT 3000
#define REVERSE_SCALE_MAX 16000
#define REVERSE_SCALE_MIN 300
//------------------------------------------------------------------------------
#define CURVE_DATA_MAX 36
#define TACURVE_NUM_DEFAULT 0
#define CURVE_NUM_MAX CURVE_DATA_MAX
#define CURVE_NUM_MIN 0
#define ATYPECURVE_NUM_DEFAULT 0
#define ATYPECURVE_NUM_MAX CURVE_DATA_MAX
#define ATYPECURVE_NUM_MIN 0
//------------------------------------------------------------------------------
#define RR_GAINRES_DEFAULT 7500
#define RR_GAINRES_MAX 62000
#define RR_GAINRES_MIN 10000
#define RR_OPGAIN_RES 33000.0
//------------------------------------------------------------------------------
#define AIR_FACTOR_DEFAULT 32768
#define AIR_FACTOR_MAX 50768
#define AIR_FACTOR_MIN 14768
#define FACTOR_VTH_DEFAULT 1000
#define FACTOR_VT_MAX 10000
#define FACTOR_VT_MIN 100
//------------------------------------------------------------------------------
#define SLAVER_ADDR_DEFAULT 1
//------------------------------------------------------------------------------
#define RECORD_TIME_DEFAULT 60 // HISTORY_PERIOD
//------------------------------------------------------------------------------
#define BATTEST_PERIOD_DEFAULT 120
//------------------------------------------------------------------------------
#define RH_GAINRES_DEFAULT 25
//------------------------------------------------------------------------------
#define DAC8760 0
#define AD5420 1
#define SYS_LOOP_CHIP_DEFAULT DAC8760
#define SYS_LOOP_CHIP_MIN DAC8760
#define SYS_LOOP_CHIP_MAX AD5420
//------------------------------------------------------------------------------
#define EDM779106D 0
#define EDM779103D 1
#define SYS_LCD_DEFAULT EDM779106D
#define SYS_LCD_MIN EDM779106D
#define SYS_LCD_MAX EDM779103D
//******************************************************************************
#define CALIB_WIDTH 100 //帧宽 Flash的话4096的余数 (通讯用)
#define MEMORY_BLOCK_WIDTH 128
#define CALIB_COMP_FAC 3 //压缩比
#define CALIB_MAX_INDEX 24000 //最大内码
#define CALIB_DEPTH ((CALIB_MAX_INDEX / CALIB_WIDTH) * 3) // 必须为整数,(Index * 3)/CALIB_WIDTH 校准数据帧数(通讯用)
#define CALIB_MAX_SIZE ((CALIB_MAX_INDEX / CALIB_COMP_FAC)* 3) // 必须为整数
#define CALIB_REAL_SIZE (((CALIB_MAX_SIZE / MEMORY_BLOCK_WIDTH)+1)*MEMORY_BLOCK_WIDTH)
#define MAX_OPERATE_DEPTH (CALIB_DEPTH / CALIB_COMP_FAC)
//for calibration VHH
#define CALIB_COMP_FAC2 3 //压缩比
#define CALIB_MAX_INDEX2 0 //最大内码
#define CALIB_DEPTH2 ((CALIB_MAX_INDEX2 / CALIB_WIDTH) * 3) // 必须为整数,(Index * 3)/CALIB_WIDTH 校准数据帧数(通讯用)
#define CALIB_MAX_SIZE2 ((CALIB_MAX_INDEX2 / CALIB_COMP_FAC2)* 3) // 必须为整数
#define CALIB_REAL_SIZE2 (((CALIB_MAX_SIZE2 / MEMORY_BLOCK_WIDTH)+1)*MEMORY_BLOCK_WIDTH)
#define MAX_OPERATE_DEPTH2 (CALIB_DEPTH2 / CALIB_COMP_FAC2)
// for calibration A Type FlowRate
#define CALIB_COMP_FAC3 8 //压缩比
#define CALIB_MAX_INDEX3 24000 //最大内码
#define CALIB_DEPTH3 ((CALIB_MAX_INDEX3 / CALIB_WIDTH) * 3) // 必须为整数,(Index * 3)/CALIB_WIDTH 校准数据帧数(通讯用)
#define CALIB_MAX_SIZE3 ((CALIB_MAX_INDEX3 / CALIB_COMP_FAC3)* 3) // 必须为整数
#define CALIB_REAL_SIZE3 (((CALIB_MAX_SIZE3 / MEMORY_BLOCK_WIDTH)+1)*MEMORY_BLOCK_WIDTH)
#define MAX_OPERATE_DEPTH3 (CALIB_DEPTH3/CALIB_COMP_FAC3)
#define CALI_DATA1_ADDR CALI_DATA_ADDR
#define CALI_DATA2_ADDR CALI_DATA_ADDR + CALIB_REAL_SIZE //曲线1的地址 + 曲线1存储大小
#define CALI_DATA3_ADDR CALI_DATA2_ADDR + CALIB_REAL_SIZE2 //曲线2的地址 + 曲线2存储大小
//******************************************************************************
#define CTYPE_FR CURVE_1ST
#define ATYPE_VH CURVE_2ND
#define CTYPE_GAINX CURVE_3RD
#define INT_2ND_CURVE_CMD INTCMD_ATYPE_CURVE
#define INT_3RD_CURVE_CMD INTCMD_MICROFR_CURVE
//==============================================================================
//******************************************************************************
#endif

View File

@@ -0,0 +1,168 @@
#ifndef __DP2006_VM1000_PARAMETER_h__
#define __DP2006_VM1000_PARAMETER_h__
//##############################################################################
#if DP2006_VM1000
// <20><>Ҫ<EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//#define INT_PROTOCOL 0x8210 // MODBUS Slaver Addr
//#define INT_SLAVER_ADDR 0x8211 // MODBUS Slaver Addr
#define MeterFactor WordReg[REG_0X8212]
#undef REG_0X8212_VALUE
#define REG_0X8212_VALUE {10000,0,1000}
//#define INT_GDCF 0x8213
//#define INT_MAX_FLOW 0x8214
//#define INT_OFFSET_GAS 0x8216
#define offsetAir WordReg[REG_0X8217]
#define factoryInterval WordReg[REG_0X8218]
#undef REG_0X8218_VALUE
#define REG_0X8218_VALUE { RESP_4000MS, RESP_125MS, SAMPLE_PERIOD_DEFAULT }
//#define INT_HISTORY_PERIOD 0x8219
//#define INT_PULSE_UNIT 0x821A
//#define INT_MAX_LOOP_FR 0x821B
#define SensorSN0 WordReg[REG_0X821D]
#define SensorSN1 WordReg[REG_0X821E]
#define SensorSN2 WordReg[REG_0X821F]
//#define INT_TOTAL_ACC 0x8220 // 0x8220-0x8225
#define calibTemperature WordReg[REG_0X8226]
#undef REG_0X8226_VALUE
#define REG_0X8226_VALUE {13500 ,10500, 12500} // 0x8226
//#define INT_OFFSET_A_GAS 0x8227
//#define INT_OFFSET_A_AIR 0x8228
//#define INT_ATYPE_INDEX_GAIN 0x8229
//#define INT_GDCF_ATYPE 0x822A
//#define INT_GDCF_CTYPE 0x822B
//#define INT_CALIB_PIPE 0x822C
//#define INT_WORK_PIPE 0x822D
//#define INT_WORK_UNIT 0x822E
#define language WordReg[REG_0X822F]
#undef REG_0X822F_VALUE
#define REG_0X822F_VALUE {LANGUAGE_MAX, LANGUAGE_MIN, DIS_LANGUAGE_DEFAULT}
//#define INT_ACC_OUT_BIT 0x8230
#define reverseScale WordReg[REG_0X8231]
#undef REG_0X8231_VALUE
#define REG_0X8231_VALUE {16000,100, 3000}
#define VHHHigh WordReg[REG_0X8232]
#define VHHRoom WordReg[REG_0X8233]
#define VHHLow WordReg[REG_0X8234]
#define RHHighTa WordReg[REG_0X8235]
//#define RHHighTa WordReg[REG_0X8236]
#define RHLowTa WordReg[REG_0X8237]
#define RRHigh WordReg[REG_0X8238]
#define RRRoom WordReg[REG_0X8239]
#define RRLow WordReg[REG_0X823A]
//#define INT_GCF_A 0x823B
//#define INT_GCF_B 0x823D
//#define INT_GCF_C 0x823E
//#define INT_RH_GAINRES 0x8240
//#define INT_RR_GAINRES 0x8241
#define zeroSuppression WordReg[REG_0X8244]
#undef REG_0X8244_VALUE
#define REG_0X8244_VALUE { 2000, 10, 100}
#define staticLowTemperature WordReg[REG_0X8245]
#undef REG_0X8245_VALUE
#define REG_0X8245_VALUE {11000, 7500,10000}
#define staticHighTemperature WordReg[REG_0X8246]
#undef REG_0X8246_VALUE
#define REG_0X8246_VALUE {17000,14500,15000}
//#define INT_PULSE_COUNTER 0x8247 // byte = 4
//#define INT_ATYPE_RC 0x8249 //
//#define INT_ATYPE_WIPER 0x824A //
//#define INT_CTYPE_WIPER 0x824B //
//#define INT_CTYPE_ADC 0x824C /
#define OffsetHigh WordReg[REG_0X824D]
#undef REG_0X824D_VALUE
#define REG_0X824D_VALUE {60000, 5000,32768}
#define OffsetLow WordReg[REG_0X824E]
#undef REG_0X824E_VALUE
#define REG_0X824E_VALUE {60000, 5000,32768}
//
//#define INT_TRH_HIGH 0x824F //
//#define INT_TRH_LOW 0x8250 //
//#define INT_MEMS_RATIO 0x8251 //
//#define INT_SYS_LCD 0x8252 //
//#define INT_SYS_CHIP 0x8253
#define temperatureFactor WordReg[REG_0X8254]
#undef REG_0X8254_VALUE
#define REG_0X8254_VALUE { 100, 0, 25}
//
#define offsetGasGainx WordReg[REG_0X8255]
#define offsetAirGainx WordReg[REG_0X8256]
//#define INT_OFFSET_RGINX 0x8257
#define P0RhHigh WordReg[REG_0X8258]
#define P0RhLow WordReg[REG_0X8259]
#define adcGain WordReg[REG_0X825A]
#undef REG_0X825A_VALUE
#define REG_0X825A_VALUE { 128, 1, 32}
#define resFactor WordReg[REG_0X825B]
#undef REG_0X825B_VALUE
#define REG_0X825B_VALUE { 100, 0, 30}
//#define INT_BATTEST_PERIOD 0x825C
//#define INT_FR_SWITCH_POINT 0x825D
#define calibFlowGain WordReg[REG_0X825F]
#undef REG_0X825F_VALUE
#define REG_0X825F_VALUE { 1000, 1, 1} // У׼<D0A3><D7BC><EFBFBD><EFBFBD><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD>
//#define INT_AUTO_CALIB_ATYPE 0x8260
//#define INT_USER_INIT_INDEX 0x8261
//#define INT_DIVHX_HIGH 0x8262
//#define INT_DIVHX_ROOM 0x8263
//#define INT_DIVHX_LOW 0x8264
#define VDUGXHigh WordReg[REG_0X8265]
//#define INT_VDUGX_ROOM 0x8266
#define VDUGXLow WordReg[REG_0X8267]
#define sampleSwitchThreshold WordReg[REG_0X8268]
#undef REG_0X8268_VALUE
#define REG_0X8268_VALUE { 4000, 0, 2500}
/*******************************************************************************/
#define keyPassWord DWordReg[REG_0X8280]
#undef REG_0X8280_VALUE
#define REG_0X8280_VALUE {0xFFFFFFFF, 0, 11111}
/*******************************************************************************/
#define ReadShortParameterFromMemory(parameterAdr, parameterDefault) ReadShortParameterFromEEPROM(parameterAdr, parameterDefault)
#define ReadLongParameterFromMemory(parameterAdr, parameterDefault) ReadLongParameterFromEEPROM(parameterAdr, parameterDefault)
#define WriteShortParameterToMemory(WRAddr) WriteShortParameterToEEPROM(WRAddr)
#define WriteLongParameterToMemory(WRAddr) WriteLongParameterToEEPROM(WRAddr)
#define ReadMultiByteFromMemory(address, wrtData, dataLenth) ReadMultiByteFromEEPROM(address, wrtData, dataLenth, PARA_EEPROM)
#define WriteMultiByteToMemory(address, wrtData, dataLenth) WriteMultiByteToEEPROM(address, wrtData, dataLenth, PARA_EEPROM)
#define ReadCalbrationDataFromMemory(address, wrtData, dataLenth) ReadMultiByteFromEEPROM(address, wrtData, dataLenth, PARA_EEPROM)
#define WriteCalbrationDataToMemory(address, wrtData, dataLenth) WriteMultiByteToEEPROM(address, wrtData, dataLenth, PARA_EEPROM)
#define ReadMultiByteFromFRAM(address, wrtData, dataLenth) ReadMultiByteFromEEPROM(address, wrtData, dataLenth, PARA_EEPROM)
#define WriteMultiByteToFRAM(address, wrtData, dataLenth) WriteMultiByteToEEPROM(address, wrtData, dataLenth, PARA_EEPROM)
/*******************************************************************************/
//#define ReadShortParameterFromMemory(parameterAdr, parameterDefault) ReadShortParameterFromFlash(parameterAdr, parameterDefault)
//#define ReadLongParameterFromMemory(parameterAdr, parameterDefault) ReadLongParameterFromFlash(parameterAdr, parameterDefault)
//#define WriteShortParameterToMemory(WRAddr) WriteShortParameterToFlash(WRAddr)
//#define WriteLongParameterToMemory(WRAddr) WriteLongParameterToFlash(WRAddr)
//#define ReadMultiByteFromMemory(address, wrtData, dataLenth, flashAdr) ReadMultiByteFromFlash(address, wrtData, dataLenth, flashAdr)
//#define WriteMultiByteToMemory(address, wrtData, dataLenth, flashAdr) WriteMultiByteToFlash(address, wrtData, dataLenth, flashAdr)
#define DisableSamplingInterrupt();
#endif
#endif

View File

@@ -12,6 +12,17 @@ u16 offsetRType, offsetGCFX;
u16 voltageDetected[ANX], adcGain;
void SystemPolling(void) //<2F><>ѯ
{
// if(mcuModeSleeping) LowPowerModeProcess();//<2F><><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>ģʽ
if(mucSaveParams==PARAMS_READY) SaveSysParams();//<2F><><EFBFBD><EFBFBD>׼<EFBFBD><D7BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Flash
if(HWState.SampledOver) FlowRateDealAndOuputSub(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(comState.state.ReceivedData) ReceivedDataProcessing(); //һ֡<D2BB><D6A1><EFBFBD>ݽ<EFBFBD><DDBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
/*==========================================================================================
//<2F>ⲿ<EFBFBD><E2B2BF><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@@ -55,12 +66,34 @@ void TestTemperature(void)//
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݴ<EFBFBD><DDB4><EFBFBD><EFBFBD>׶<EFBFBD>
/*********************************************************************/
uint32_t data_array[64];
uint32_t sum = 0;
uint32_t average = 0;
void FlowRateDealAndOuputSub(void)
{
HWState.SampledOver = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE><EFBFBD><EFBFBD>
ComputeFlowRateIndexAndFlowRate();//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TestTemperature();//<2F><><EFBFBD><EFBFBD>PCB<43><EFBFBD>
// for (int i = 0; i < 64; i++) {
// data_array[i] = rand();
// }
// u32 *p=data_array;
// TEST_PIN_TOGGLE();
// for (int i = 0; i < 64; i++) {
// sum += *p++;
// }
// average = sum >> 6;
}
/*sampleData.TCode[CTCode]//VDU
sampleData.TCode[RTCode]//VRR
@@ -68,6 +101,8 @@ void FlowRateDealAndOuputSub(void)
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
@@ -92,7 +127,8 @@ void ComputeFlowRateIndexAndFlowRate(void)
voltageDetected[FR_L] = currentFlowRate&0xFFFF;
// voltageDetected[VDUGX]= AirflowSensor_Read();
// voltageDetected[TPCB]= (u16)(Get_AirflowSensor_SCCM());
}
u16 WordSubFunction(u16 minuend, u16 subtractor)
{
@@ -154,8 +190,226 @@ void SetNextProcess(void)//
/*-----------------------------------------------------------------------------------------------------*/
__Samp_Buf_TypeDef sampleData;
static void ADC0_Conversion_Init(ADC_BaseConfig_TypeDef* adc_config)
{
ADC_REF_Init(REF_INTERNAL_2P5V,REF_INTERNAL_2P5V);/* 1. <20><>ʼ<EFBFBD><CABC><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>׼Դ */
ADC_Init(ADC_0, adc_config->SPS, adc_config->Gain, adc_config->PChan, adc_config->NChan); /* 2. <20><>ʼ<EFBFBD><CABC>ADC0 */
}
//ADC1<43><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>----------------------------------------------------------
static void ADC1_Conversion_Init(ADC_BaseConfig_TypeDef* adc_config)
{
ADC_REF_Init(REF_INTERNAL_2P5V,REF_INTERNAL_2P5V);/* 1. <20><>ʼ<EFBFBD><CABC><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>׼Դ */
ADC_Init(ADC_1, adc_config->SPS, adc_config->Gain, adc_config->PChan, adc_config->NChan); /* 2. <20><>ʼ<EFBFBD><CABC>ADC1 */
}
void SetSampleSiagnlForSingleADC(const ADC_BaseConfig_TypeDef* adc_cfg)
{
sampleData.adcBaseCfg.Gain = adc_cfg->Gain;
sampleData.adcBaseCfg.PChan = adc_cfg->PChan;
sampleData.adcBaseCfg.NChan = adc_cfg->NChan;
sampleData.adcBaseCfg.SPS = adc_cfg->SPS;
}
//ADCͬ<43><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ<EFBFBD><CABC>----------------------------------------------------------
static void ADC0_1_SyncConversion_Init(ADC_SyncConfig_TypeDef* adc_config)
{
// ADC_REF_Init(REF_INTERNAL_2P5V,REF_INTERNAL_2P5V);/* 1. <20><>ʼ<EFBFBD><CABC><EFBFBD>ڲ<EFBFBD><DAB2><EFBFBD>׼Դ */
REF_InitTypeDef REF_InitStructure;
REF_InitStructure.VREF = REF_INTERNAL_2P5V; // <20>ڲ<EFBFBD><DAB2><EFBFBD>׼<EFBFBD><D7BC>ѹ
REF_InitStructure.VDRIVE = REF_INTERNAL_2P5V; // VDrive<76><65><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ
REF_InitStructure.VREF_Boost = DISABLE;
LHL_REF_Init(&REF_InitStructure);
// LHL_ADC_SetVREF(REF_INTERNAL_2P5V, ENABLE);
// LHL_ADC_SetVDRIVE(REF_INTERNAL_2P5V, ENABLE);
ADC_Init(ADC_0, adc_config->SPS, adc_config->Gain0, adc_config->PChan0, adc_config->NChan0); /* 2. <20><>ʼ<EFBFBD><CABC>ADC0 */
ADC_Init(ADC_1, adc_config->SPS, adc_config->Gain1, adc_config->PChan1, adc_config->NChan1); /* 3. <20><>ʼ<EFBFBD><CABC>ADC1 */
ADC_SyncCmd(ENABLE);/* 4. ADCͬ<43><CDAC>ʹ<EFBFBD><CAB9> */
}
void SetSampleSiagnlForSyncADC(const ADC_SyncConfig_TypeDef* adc_cfg)
{
sampleData.adcSyncCfg.Gain0 = adc_cfg->Gain0;
sampleData.adcSyncCfg.PChan0 = adc_cfg->PChan0;
sampleData.adcSyncCfg.NChan0 = adc_cfg->NChan0;
sampleData.adcSyncCfg.Gain1 = adc_cfg->Gain1;
sampleData.adcSyncCfg.PChan1 = adc_cfg->PChan1;
sampleData.adcSyncCfg.NChan1 = adc_cfg->NChan1;
sampleData.adcSyncCfg.SPS = adc_cfg->SPS;
}
/* ======================================================================================================
adc<64>жϲ<D0B6><CFB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
1.<2E><><EFBFBD>ã<EFBFBD>SetSampleSiagnlForSingleADC SetSampleSiagnlForSyncADC
2.<2E><>ʼ<EFBFBD><CABC>StartADC0SampingData StartADC1SampingData StartADCSyncSampingData
3.<2E><>ȡ<EFBFBD><C8A1>IRQ ReadSamplingData
4.<2E><><EFBFBD>㣺ComputeSampleData
======================================================================================================*/
//ת<><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ж<EFBFBD>
void ConversionIRQ_Callback(void)
{
if(sampleData.SkipSampNum) {sampleData.SkipSampNum -- ; return; }
ReadSamplingData(); //<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
//<2F><>ʼת<CABC><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>---------------------------------------------------------------
void StartADC0SampingData(void)
{
sampleData.ADCBuffer[0]=0;
sampleData.Counter=0;
sampleData.SkipSampNum = 3 ;
ADC0_Conversion_Init(&sampleData.adcBaseCfg);
ADC_register_irq_callback(ADC_0,ConversionIRQ_Callback);
StartADC(ADC_0);
}
void StartADC1SampingData(void)
{
sampleData.ADCBuffer[1]=0;
sampleData.Counter=0;
sampleData.SkipSampNum = 3 ;
ADC1_Conversion_Init(&sampleData.adcBaseCfg);
ADC_register_irq_callback(ADC_1,ConversionIRQ_Callback);
StartADC(ADC_1);
}
void StartADCSyncSampingData(void)
{
sampleData.ADCBuffer[0]=0;
sampleData.ADCBuffer[1]=0;
sampleData.Counter=0;
sampleData.SkipSampNum = 3 ;
#if 1
ADC0_1_SyncConversion_Init(&sampleData.adcSyncCfg);
ADC_register_irq_callback(ADC_0,ConversionIRQ_Callback);
StartADC(ADC_0);//ֻ<><EFBFBD><E8BFAA>ADC_0
#else
NVIC_DisableIRQ(ADC0_IRQn);
StartConversionTimerInterval(1);//1ms <20><>ʱ<EFBFBD><CAB1><EFBFBD>ж϶<D0B6>ȡadcת<63><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Timer_register_irq_callback(ConversionTimer,ConversionIRQ_Callback );//ע<><D7A2>timer2<72>жϻص<CFBB><D8B5><EFBFBD><EFBFBD><EFBFBD>
#endif
}
void ReadSamplingData(void)//ADC<44>ж϶<D0B6>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> BPS
{
sampleData.ADCBuffer[0] += ADC_ReadData(ADC_0); //<2F><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD>ۼ<EFBFBD>
sampleData.ADCBuffer[1] += ADC_ReadData(ADC_1); //<2F><><EFBFBD>ز<EFBFBD><D8B2><EFBFBD><EFBFBD>ۼ<EFBFBD>
sampleData.Counter++; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
}
void ComputeSampleData(void) //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
StopADC(ADC_0);
StopADC(ADC_1);
if(sampleData.Counter != 0)//<2F>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ƽ<EFBFBD><C6BD>
{
sampleData.ADCBuffer[0] /= (u32)sampleData.Counter;
sampleData.ADCBuffer[1] /= (u32)sampleData.Counter;
}
}
/* ======================================================================================================
adc dma<6D><61><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>˵<EFBFBD><CBB5><EFBFBD><EFBFBD>
1.<2E><><EFBFBD>ã<EFBFBD> SetSampleSiagnlForSingleADC SetSampleSiagnlForSyncADC
2.<2E><>ʼ<EFBFBD><CABC> StartDMAForADC0SampingData StartDMAForADC1SampingData StartDMAForADCSyncSampingData
3.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>: IRQ <20><>־λ
4.<2E><><EFBFBD>㣺 DMA_ComputeSampleData_ADC0 DMA_ComputeSampleData_ADC1
======================================================================================================*/
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>жϱ<D0B6>־λ
void DMAForADC0_Callback()
{
sampleData.DMA_ADC_adcflag[0] = 1;
}
void DMAForADC1_Callback()
{
sampleData.DMA_ADC_adcflag[1] = 1;
}
//<2F><>ʼת<CABC><D7AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>---------------------------------------------------------------
void StartDMAForADC0SampingData(void)
{
ADC0_Conversion_Init(&sampleData.adcBaseCfg);
DMA_ADC_Init(ADC_0,sampleData.DMA_ADC_Buffer[0],sampleData.DMA_ADC_SampLen+sampleData.SkipSampNum);
DMA_register_irq_callback(DMA_CHANNEL_ADC_0,NULL,DMAForADC0_Callback);
DMA_StartADC(ADC_0);
}
void StartDMAForADC1SampingData(void)
{
ADC0_Conversion_Init(&sampleData.adcBaseCfg);
DMA_ADC_Init(ADC_1, sampleData.DMA_ADC_Buffer[1],sampleData.DMA_ADC_SampLen+sampleData.SkipSampNum);
DMA_register_irq_callback(DMA_CHANNEL_ADC_1,NULL,DMAForADC1_Callback);
DMA_StartADC(ADC_1);
}
/*<2A>û<EFBFBD><C3BB>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
void StartDMAForADCSyncSampingData(void)
{
ADC0_1_SyncConversion_Init(&sampleData.adcSyncCfg);
DMA_ADC_Init(ADC_0,sampleData.DMA_ADC_Buffer[0],sampleData.DMA_ADC_SampLen+sampleData.SkipSampNum);
DMA_ADC_Init(ADC_1,sampleData.DMA_ADC_Buffer[1],sampleData.DMA_ADC_SampLen+sampleData.SkipSampNum);
DMA_register_irq_callback(DMA_CHANNEL_ADC_0,NULL,DMAForADC0_Callback);
DMA_register_irq_callback(DMA_CHANNEL_ADC_1,NULL,DMAForADC1_Callback);
DMA_StartADC(ADC_0);
DMA_StartADC(ADC_1);
}
u16 DMA_ComputeSampleData_ADC0(void)
{
u16 adcCode;
u32 adcCount;
u8 i ;
for(i = sampleData.SkipSampNum ; i < sampleData.DMA_ADC_SampLen ;i++)
{
adcCode = ((((sampleData.DMA_ADC_Buffer[0][i] & 0xFFFFFF) | ((sampleData.DMA_ADC_Buffer[0][i] & 0x800000) ? 0xFF000000 : 0)) >> 8) + 32768) & 0xFFFF;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16λ<36><CEBB><EFBFBD><EFBFBD>
adcCount += adcCode ;
}
adcCode = adcCount>>sampleData.DMA_ADC_Exponent;
return adcCode;
}
u16 DMA_ComputeSampleData_ADC1(void)
{
u16 adcCode;
u32 adcCount;
u8 i ;
for(u8 i = sampleData.SkipSampNum ; i < sampleData.DMA_ADC_SampLen ;i++)
{
adcCode = ((((sampleData.DMA_ADC_Buffer[1][i] & 0xFFFFFF) | ((sampleData.DMA_ADC_Buffer[1][i] & 0x800000) ? 0xFF000000 : 0)) >> 8) + 32768) & 0xFFFF;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>16λ<36><CEBB><EFBFBD><EFBFBD>
adcCount += adcCode ;
}
adcCode = adcCount>>sampleData.DMA_ADC_Exponent;
return adcCode;
}
/*<2A>û<EFBFBD>ͬ<EFBFBD><CDAC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ź<EFBFBD><C5BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>*/
typedef enum {
Signal_VDU_VRR,
Signal_VDU1_VRH,
@@ -165,18 +419,21 @@ typedef enum {
//......
Signals_Count,
}ADC_CFG_Index_TypeDef;
static const ADC_Config_TypeDef signal_cfgs[Signals_Count] = {
static const ADC_SyncConfig_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 },
[Signal_VDU1_IRH] = { GAIN64, ADC0_AIN0, ADC0_AIN1, GAIN8, ADC1_AIN5, ADC1_AIN4 ,SPS_977 },
[Signal_VDU2_IRH] = { GAIN128, ADC0_AIN0, ADC0_AIN1, GAIN8, ADC1_AIN5, ADC1_AIN4 ,SPS_977 },
//......
};
/*sampleData.TCode[CTCode]//VDU
sampleData.TCode[RTCode]//VRR
sampleData.TCode[HTCode]//VRH
sampleData.TCode[ATCode]//IRH*/
#define CLIBMODE 1
void FlowProcessManagement(void)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̹<EFBFBD><CCB9><EFBFBD>״̬<D7B4><CCAC>
{
switch(flowProcess.Index)
@@ -185,7 +442,7 @@ void FlowProcessManagement(void)//
{
HWState.SampledOver = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ
SetSampleSiagnlForADC(signal_cfgs[Signal_VDU_VRR]);
SetSampleSiagnlForSyncADC(&signal_cfgs[Signal_VDU_VRR]);
StartADCSyncSampingData();//<2F><>ʼ<EFBFBD>ɼ<EFBFBD>
flowProcess.NextTime += 653; //40ms <20><><EFBFBD><EFBFBD>ֵ= 65535/4000*t<><74>t=40<34><30> = 653
@@ -196,19 +453,32 @@ void FlowProcessManagement(void)//
{
ComputeSampleData(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sampleData.TCode[RTCode] = sampleData.ADCBuffer[1];//VRR <20><><EFBFBD><EFBFBD><EBBBBA>
#if CLIBMODE
if(flowProcess.State == 0) //<2F><>һ<EFBFBD><D2BB>ȥPart2 VDU_VRH
{
SetSampleSiagnlForSyncADC(&signal_cfgs[Signal_VDU1_VRH]);//ʹ<><CAB9>VDU1<55><31><EFBFBD>вɼ<D0B2>
}
else //<2F><>һ<EFBFBD><D2BB>ȥPart4 VDU_IRH
{
SetSampleSiagnlForSyncADC(&signal_cfgs[Signal_VDU2_IRH]);//ʹ<><CAB9>VDU2<55><32><EFBFBD>вɼ<D0B2>
}
#else
u16 currt_vdu = sampleData.ADCBuffer[0];//Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(flowProcess.State == 0) //<2F><>һ<EFBFBD><D2BB>ȥPart2 VDU_VRH
{
if(currt_vdu)SetSampleSiagnlForADC(&signal_cfgs[Signal_VDU1_VRH]);//<2F><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else SetSampleSiagnlForADC(&signal_cfgs[Signal_VDU2_VRH]);
}
else //<2F><>һ<EFBFBD><D2BB>ȥPart4 VDU_IRH
{
if(currt_vdu)SetSampleSiagnlForADC(&signal_cfgs[Signal_VDU1_IRH]);//<2F><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else SetSampleSiagnlForADC(&signal_cfgs[Signal_VDU2_IRH]);
}
#endif
u16 currt_vdu = sampleData.ADCBuffer[0];//Ԥ<><D4A4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(flowProcess.State == 0) //<2F><>һ<EFBFBD><D2BB>ȥPart2 VDU_VRH
{
if(currt_vdu)SetSampleSiagnlForADC(signal_cfgs[Signal_VDU1_VRH]);//<2F><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else SetSampleSiagnlForADC(signal_cfgs[Signal_VDU2_VRH]);
}
else //<2F><>һ<EFBFBD><D2BB>ȥPart4 VDU_IRH
{
if(currt_vdu)SetSampleSiagnlForADC(signal_cfgs[Signal_VDU1_IRH]);//<2F><><EFBFBD>ݲ<EFBFBD><DDB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
else SetSampleSiagnlForADC(signal_cfgs[Signal_VDU2_IRH]);
}
StartADCSyncSampingData();//<2F><>ʼ<EFBFBD>ɼ<EFBFBD>
flowProcess.NextTime += 1048;//64ms
@@ -218,77 +488,24 @@ void FlowProcessManagement(void)//
case 2: //Part3
{
ComputeSampleData(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sampleData.TCode[CTCode] = sampleData.ADCBuffer[0];//VDU <20><><EFBFBD><EFBFBD><EBBBBA>
//Part2 Part4<74><34>֧
if(flowProcess.State == 0)sampleData.TCode[HTCode] = sampleData.ADCBuffer[1];//VRH <20><><EFBFBD><EFBFBD><EBBBBA>
else sampleData.TCode[ATCode] = sampleData.ADCBuffer[1];//IRH <20><><EFBFBD><EFBFBD><EBBBBA>
HWState.SampledOver = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
StopSamplingTimerInterval();//<2F>رղɼ<D5B2>ʱ<EFBFBD><CAB1> <20><><EFBFBD><EFBFBD>Part3
if(flowProcess.State) flowProcess.State = 0 ;//<2F>л<EFBFBD>Part2 Part4
else flowProcess.State = 1 ;
flowProcess.Index = 0;
}break;
default : flowProcess.Index = 0; break;
}
SetNextProcess();
}
//У׼ģʽ<C4A3><CABD>״̬<D7B4><CCAC>
void FlowProcessManagement_Calib(void)//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̹<EFBFBD><CCB9><EFBFBD>״̬<D7B4><CCAC>
{
switch(flowProcess.Index)
{
case 0: //Part1<74><31><EFBFBD><EFBFBD> VDU<44><55>VRR<52><52><EFBFBD><EFBFBD>
{
HWState.SampledOver = 0;//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ
SetSampleSiagnlForADC(signal_cfgs[Signal_VDU_VRR]);
StartADCSyncSampingData();//<2F><>ʼ<EFBFBD>ɼ<EFBFBD>
flowProcess.NextTime += 653; //40ms <20><><EFBFBD><EFBFBD>ֵ= 65535/4000*t<><74>t=40<34><30> = 653
flowProcess.Index = 1;
}break;
case 1: //Part2 Part4<74><34>֧
{
ComputeSampleData(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sampleData.TCode[RTCode] = sampleData.ADCBuffer[1];//VRR <20><><EFBFBD><EFBFBD><EBBBBA>
if(flowProcess.State == 0) //<2F><>һ<EFBFBD><D2BB>ȥPart2 VDU_VRH
{
SetSampleSiagnlForADC(signal_cfgs[Signal_VDU1_VRH]);//ʹ<><CAB9>VDU1<55><31><EFBFBD>вɼ<D0B2>
}
else //<2F><>һ<EFBFBD><D2BB>ȥPart4 VDU_IRH
{
SetSampleSiagnlForADC(signal_cfgs[Signal_VDU2_IRH]);//ʹ<><CAB9>VDU2<55><32><EFBFBD>вɼ<D0B2>
}
StartADCSyncSampingData();//<2F><>ʼ<EFBFBD>ɼ<EFBFBD>
flowProcess.NextTime += 1048;//64ms
flowProcess.Index = 2;
}break;
case 2: //Part3
{
ComputeSampleData(); //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//Part2 Part4<74><34>֧
if(flowProcess.State == 0)
#if CLIBMODE
if(flowProcess.State == 0)//Part2
{
sampleData.TCode[CTCode] = sampleData.ADCBuffer[0];//VDU1 <20><><EFBFBD><EFBFBD><EBBBBA>
sampleData.TCode[HTCode] = sampleData.ADCBuffer[1];//VRH <20><><EFBFBD><EFBFBD><EBBBBA>
}
else
else //Part4
{
sampleData.TCode[BTCode] = sampleData.ADCBuffer[0];//VDU2 <20><><EFBFBD><EFBFBD><EBBBBA>
sampleData.TCode[ATCode] = sampleData.ADCBuffer[1];//IRH <20><><EFBFBD><EFBFBD><EBBBBA>
}
#else
sampleData.TCode[CTCode] = sampleData.ADCBuffer[0];//VDU <20><><EFBFBD><EFBFBD><EBBBBA>
if(flowProcess.State == 0)sampleData.TCode[HTCode] = sampleData.ADCBuffer[1];//VRH <20><><EFBFBD><EFBFBD><EBBBBA>
else sampleData.TCode[ATCode] = sampleData.ADCBuffer[1];//IRH <20><><EFBFBD><EFBFBD><EBBBBA>
#endif
HWState.SampledOver = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
StopSamplingTimerInterval();//<2F>رղɼ<D5B2>ʱ<EFBFBD><CAB1> <20><><EFBFBD><EFBFBD>Part3
@@ -296,15 +513,84 @@ void FlowProcessManagement_Calib(void)//
else flowProcess.State = 1 ;
flowProcess.Index = 0;
}break;
}break;
default : flowProcess.Index = 0; break;
}
SetNextProcess();
}
//mcuModeSleeping = 1 ; //<2F><><EFBFBD><EFBFBD><EFBFBD>͹<EFBFBD><CDB9><EFBFBD>ģʽ
//
void DMA_sampleMainProcess(void)//DMA<4D><41><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̹<EFBFBD><CCB9><EFBFBD>״̬<D7B4><CCAC>
{
volatile u8 DMA_State_Index;
switch(DMA_State_Index)
{
case 0 : //67.68ms sps=977
if(HWState.SampledOver) return;
HWState.SampledOver = 0; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʼ
sampleData.SkipSampNum = 0 ;
sampleData.DMA_ADC_SampLen = 16 ;
sampleData.DMA_ADC_Exponent= 4;
SetSampleSiagnlForSyncADC(&signal_cfgs[Signal_VDU_VRR]);// <20><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD>ź<EFBFBD>
StartDMAForADCSyncSampingData(); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
DMA_State_Index++;
//TEST_PIN_TOGGLE();
break;
case 1 :
if(!sampleData.DMA_ADC_adcflag[0]) return;
if(!sampleData.DMA_ADC_adcflag[1]) return;
sampleData.DMA_ADC_adcflag[0]= 0;
sampleData.DMA_ADC_adcflag[1]= 0;
//TEST_PIN_TOGGLE();
sampleData.TCode[CTCode] = DMA_ComputeSampleData_ADC0();
sampleData.TCode[RTCode] = DMA_ComputeSampleData_ADC1();
sampleData.SkipSampNum = 0 ;
sampleData.DMA_ADC_SampLen = 32 ;
sampleData.DMA_ADC_Exponent= 5;
SetSampleSiagnlForSyncADC(&signal_cfgs[Signal_VDU2_VRH]);// <20><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD>ź<EFBFBD>
StartDMAForADCSyncSampingData(); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
DMA_State_Index++;
break;
case 2 :
if(!sampleData.DMA_ADC_adcflag[0]) return;
if(!sampleData.DMA_ADC_adcflag[1]) return;
sampleData.DMA_ADC_adcflag[0]= 0;
sampleData.DMA_ADC_adcflag[1]= 0;
sampleData.TCode[BTCode] = DMA_ComputeSampleData_ADC0();
sampleData.TCode[HTCode] = DMA_ComputeSampleData_ADC1();
sampleData.SkipSampNum = 0 ;
sampleData.DMA_ADC_SampLen = 32 ;
sampleData.DMA_ADC_Exponent= 5;
SetSampleSiagnlForSyncADC(&signal_cfgs[Signal_VDU2_IRH]);// <20><><EFBFBD>ò<EFBFBD><C3B2><EFBFBD><EFBFBD>ź<EFBFBD>
StartDMAForADCSyncSampingData(); // <20><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
DMA_State_Index++;
break;
case 3 :
if(!sampleData.DMA_ADC_adcflag[0]) return;
if(!sampleData.DMA_ADC_adcflag[1]) return;
sampleData.DMA_ADC_adcflag[0]= 0;
sampleData.DMA_ADC_adcflag[1]= 0;
sampleData.TCode[ATCode] = DMA_ComputeSampleData_ADC1();
HWState.SampledOver = 1; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DMA_State_Index = 0 ;
break;
default : DMA_State_Index = 0 ;
}
}
/*================================================================================*/

View File

@@ -13,11 +13,6 @@
#define ResetSamplingTimerInterval(uploadCounter) ResetTimer1_CC1(uploadCounter)
#define StopSamplingTimerInterval() StopTimer1()
//ADCת<43><D7AA><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD>ʱ<EFBFBD><CAB1>
#define ConversionTimer TIM2
#define StartConversionTimerInterval(uploadCounter) StartTimer2_UIE(uploadCounter)
#define ResetConversionTimerInterval(uploadCounter) ResetTimer2_UIE(uploadCounter)
#define StopConversionTimerInterval() StopTimer2()
//for GPIO START==============================================================================
// for soft I2C
@@ -98,7 +93,7 @@
//
// ReadParameterFromEEPROM
//for GPIO END===============================================================================\
//=============================================================================================================================================================================================
@@ -131,6 +126,99 @@ void FlowProcessManagement(void);//
void StartNormolFlowMeasurement(void);//<2F><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void ComputeFlowRateIndexAndFlowRate(void);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void FlowRateDealAndOuputSub(void);
//======================================================================================================================================================================================
typedef struct {
u8 Gain; //ADC<44><43><EFBFBD><EFBFBD><EFBFBD>Ŵ<EFBFBD>ϵ<EFBFBD><CFB5>
u8 PChan; //ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
u8 NChan; //ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
u8 SPS; //ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} ADC_BaseConfig_TypeDef;
typedef struct {
u8 Gain0; //ADC_0<5F><30><EFBFBD><EFBFBD><EFBFBD>Ŵ<EFBFBD>ϵ<EFBFBD><CFB5>
u8 PChan0; //ADC_0<5F><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
u8 NChan0; //ADC_0<5F><30><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
u8 Gain1; //ADC_1<5F><31><EFBFBD><EFBFBD><EFBFBD>Ŵ<EFBFBD>ϵ<EFBFBD><CFB5>
u8 PChan1; //ADC_1<5F><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
u8 NChan1; //ADC_1<5F><31><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
u8 SPS; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
} ADC_SyncConfig_TypeDef;
enum
{
CTCode,
RTCode,
HTCode,
ATCode,
BTCode,
DTCode,
ETCode,
FTCode,
TCode_Count
};
typedef struct
{
ADC_BaseConfig_TypeDef adcBaseCfg;
ADC_SyncConfig_TypeDef adcSyncCfg; //ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u32 TCode[TCode_Count]; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><EFBFBD><E6B4A2>
u8 SkipSampNum ; //<2F><><EFBFBD><EFBFBD>ǰ<EFBFBD><C7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/*<2A>жϷ<D0B6>ʽ<EFBFBD><CABD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>*/
// u8 CounterMax; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u8 Counter; //<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
u32 ADCBuffer[2]; //<2F><><EFBFBD><EFBFBD>ֵ
/*DMA<4D><41>ʽ<EFBFBD><CABD><EFBFBD>ݶ<EFBFBD><DDB6><EFBFBD>*/
u32 DMA_ADC_Buffer[2][64];
u8 DMA_ADC_adcflag[2];
u8 DMA_ADC_SampLen;
u8 DMA_ADC_Exponent;
}__Samp_Buf_TypeDef;//<2F><><EFBFBD><EFBFBD>
extern __Samp_Buf_TypeDef sampleData;
/*ADC<44><43><EFBFBD>ó<EFBFBD>ʼ<EFBFBD><CABC>*/
void SetSampleSiagnlForSingleADC(const ADC_BaseConfig_TypeDef* adc_cfg);
void SetSampleSiagnlForSyncADC(const ADC_SyncConfig_TypeDef* adc_cfg);
/*<2A>жϷ<D0B6>ʽ*/
void StartADC0SampingData(void);
void StartADC1SampingData(void);
void StartADCSyncSampingData(void);
void ReadSamplingData(void);//<2F><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void ComputeSampleData(void);//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
/*DMA<4D><41>ʽ*/
void StartDMAForADC0SampingData(void);
void StartDMAForADC1SampingData(void);
void StartDMAForADCSyncSampingData(void);
u16 DMA_ComputeSampleData_ADC0(void);
u16 DMA_ComputeSampleData_ADC1(void);
void DMA_sampleMainProcess(void);
//for ADC END==============================================================================\
//======================================================================================================================================================================================
//for FLOWMETER START======================================================================/

View File

@@ -0,0 +1,804 @@
#include "../main/SystemInclude.h"
/**************************************************************************************/
/**
* @brief 低功耗定时器初始化函数
* @note 需要定义与硬件相关的函数和IO
* // 数据采样定时器以ms位单位1ms采样一次数据
* StartSamplingTimer(): 1ms 定时为基值
* StopSamplingTimer()
* EnableSamplingInterrupt()、 DisableSamplingInterrupt()
* SamplingInterruptCallBack()
*
* // 加热流程控制定时器以ms位单位
* StartProcessTimer()、 StopProcessTimer()、
* ProcessTimerInterruptCallBack();
* EnableProcessTimerInterrupt();
*/
//##############################################################################
#if(DP2201_CORE_V5000)
//##############################################################################
//__SAMPLE_STATUS_BIT_TypeDef sampleState;
TypeSample sampleProcess;
TypeCalibOffset calibOffset;
u16 FRType;
u16 dynamicOffset,rapidOffsetGas;
u32 roughTestCounter, MEMSErrorCounter;
//ADC放大倍数值与索引转换--------------------------------------------------
u16 GetAdcGain(u16 gianX)
{
switch(gianX)
{
case 1: return GAIN1;
case 2: return GAIN2;
case 4: return GAIN4;
case 8: return GAIN8;
case 16: return GAIN16;
case 32: return GAIN32;
case 64: return GAIN64;
case 128: return GAIN128;
default:
return GetAdcGain(ADC_GAIN_DEFAULT);
}
}
/******************************************************************************/
void SetNextProcess(void)
{
if(sampleProcess.NextRun == 0) {
StopProcessTimer(); //关闭采集时钟
return;
}
// u32 currentTAR = ProcessTimer->CNT; //定时器当前计数值
// if(currentTAR >= sampleProcess.NextTime) {
// sampleProcess.NextTime = currentTAR;
// FlowProcessManagement();
// }
//else ResetProcessTimer(sampleProcess.NextTime);
StartProcessTimer(sampleProcess.NextTime);
}
/******************************************************************************/
void AnalogCircuitInit(void)
{
RH_CON_OUTPUT();
TURN_ON_RH_POWER();
sampleProcess.CTypeGain = GetAdcGain(adcGain); //默认采样系数
SampingADCInit();
DisableSamplingInterrupt();
}
/******************************************************************************/
void EnableRHControlByTD(void)
{
RH_CON_OUTPUT();
TURN_ON_RH_POWER();
SELECT_TD_CON();
HEATING_OUTPUT();
TURN_OFF_HEATING();
}
/******************************************************************************/
void EnableRHControlByTU(void)
{
RH_CON_OUTPUT();
TURN_ON_RH_POWER();
// SELECT_TU_CON();
HEATING_OUTPUT();
TURN_OFF_HEATING();
}
/******************************************************************************/
void TurnOffAnalogCircuit(void)
{
TURN_OFF_HEATING();
TURN_OFF_RH_POWER();
CLR_HEATING();
StopSamplingADC();
DisableSamplingInterrupt();
}
/******************************************************************************/
void RapidHeating(void)
{
DisableSamplingInterrupt();
RH_CON_OUTPUT();
TURN_ON_RH_POWER();
SELECT_TD_CON();
//----------------------------------------------------------------------------
SELECT_VREF_CON();
// TURN_ON_LOW_HEAT();
}
/******************************************************************************/
void FirstStageHeating(void)
{
// RH controled by TD
HWState.EnableTempTest = 1;
HWState.EnableTempInit = 1;
systemProcessing.Bit.TempHandle = 1;
EnableRHControlByTD();
}
/******************************************************************************/
void StartNormolFlowMeasurement(void)
{
//--------------------------------------------------------------------------
// 校准引脚控制(通过宏开关控制)
// 如果定义了 ENABLE_CALPIN_FOR_UPDATE_FR则拉低校准引脚
//--------------------------------------------------------------------------
#ifndef ENABLE_CALPIN_FOR_UPDATE_FR
#pragma message("[undefined] ENABLE_CALPIN_FOR_UPDATE_FR")
#elif(ENABLE_CALPIN_FOR_UPDATE_FR)
EXT_CALIB_OUTPUT(); // 配置引脚为输出模式
CLR_CALIB_PIN(); // 拉低引脚
#endif
//--------------------------------------------------------------------------
HWState.SampledOver = 0; // 清除“采样完成”标志,表示测量开始,数据尚未就绪
AnalogCircuitInit();// 初始化模拟电路如运放偏置、ADC配置等
// 根据全局状态决定起始状态
// EnableRoughTest 为真:进入“粗检模式”(低功耗检测是否有流量)
// EnableRoughTest 为假:直接进入“正常测量模式”(第一级加热)
if(sampleProcess.State.EnableRoughTest) sampleProcess.NextRun = START_DETECT_STAGE_HEATING;
else sampleProcess.NextRun = START_1ST_STAGE_HEATING;
sampleProcess.NextTime = 0; // 定时器计数基准清零
//--------------------------------------------------------------------------
StartProcessTimer(64000); // 启动比较定时器,开始从0递增计数
Timer_register_irq_callback(ProcessTimer,ProcessTimerIT, ProcessTimerInterruptCallBack );//注册中断回调函数
// 立即执行一次流程管理,处理初始状态(如进入加热阶段)
FlowProcessManagement();
}
/******************************************************************************/
s16 ComputeOffsetCorrectValue(unsigned int offsetHigh, unsigned int offsetLow)
{
tmpSLA = (u32)voltageDetected[TGAS];
tmpSLA -= (u32)calibTemperature;
tmpSLB = (u32)offsetHigh;
tmpSLB -= (u32)offsetLow;
tmpSLA *= tmpSLB;
tmpSLB = (u32)staticHighTemperature;
tmpSLB -= (u32)staticLowTemperature;
tmpSLA /= tmpSLB;
return (s16)tmpSLA;
}
/******************************************************************************/
bool JudgmentFlowRate(void)
{
u16 tempIndex;
sampleProcess.NextRun = 0;
sampleProcess.State.EnableRoughTest = 0;
if(currentMode.Bit.CalibMode) return 0;
tempIndex = abs(voltageDetected[RIDX] - rapidOffsetGas);
rapidOffsetGas = voltageDetected[RIDX];
if(tempIndex > STATIC_HIGH_CODE) return 0;
systemProcessing.Bit.FRHandle = 1;
samplingInterval = factoryInterval;
flowRate = 0;
roughTestCounter++;
if(roughTestCounter >= 150)
{
roughTestCounter = 0;
sampleProcess.State.EnableRoughTest = 0;
}
else sampleProcess.State.EnableRoughTest = 1;
Clear_WDT();
return 1;
}
/******************************************************************************/
void CheckATypeSensor(void)
{
if((voltageDetected[RHVOL] < 500) || (voltageDetected[RHVOL] > 2600)) MEMSErrorCounter += 0x10;
else MEMSErrorCounter &= 0x0f;
}
/******************************************************************************/
// Check sensor error
bool CheckSensor(u16 voltageIndex)
{
u16 I=0;
if((voltageIndex < 2000) || (voltageIndex > 65000)) MEMSErrorCounter += 0x01;
else MEMSErrorCounter &= 0xf0;
I = MEMSErrorCounter & 0x0f;
I += MEMSErrorCounter >> 4;
if(I > 4) {
MEMSErrorCounter = 0x55;
systemAlarm.Bit.SensorErr = 1;
return 1;
}
else {
systemAlarm.Bit.SensorErr = 0;
return 0;
}
}
/******************************************************************************/
u16 ComputeCTypeIndex(u16 detectIndex, u16 indexOffset)
{
if(detectIndex > indexOffset) {
detectIndex -= indexOffset;
}
else {
detectIndex = indexOffset - detectIndex;
if(detectIndex > reverseScale) {
systemAlarm.Bit.Pollution = 1;
}
detectIndex = 0;
}
return detectIndex;
}
/******************************************************************************/
void ComputeFlowRateIndexAndFlowRate(void)
{
disable_interrupts();
//===========================================================================
currentFlowRate = 0;
displayUpdate = 0;
FRType = CTYPE_FR;
GetFilterDepth(responseTimeIndex);
//============================================================================
rapidOffsetGas = voltageDetected[RIDX];
systemAlarm.Bit.Pollution = 0;
systemAlarm.Bit.FRAlarm = 0;
// Compute offset
//============================================================================
if(currentMode.Bit.CalibMode) {
calibOffset.Value[CAL_VDUX] = offsetAir;
calibOffset.Value[CAL_VDUGX] = offsetAirGainx;
}
//----------------------------------------------------------------------------
#ifndef ENABLE_GAS_RECOGNITION
#pragma message("[undefined] ENABLE_GAS_RECOGNITION")
#elif(ENABLE_GAS_RECOGNITION)
else if(systemAlarm.Bit.GasChange = 1) {
calibOffset.Value[CAL_VDUX] = offsetGas;
calibOffset.Value[CAL_VDUGX] = offsetGasGainx;
}
#endif
//----------------------------------------------------------------------------
else {
calibOffset.Value[CAL_VDUX] = offsetGas;
calibOffset.Value[CAL_VDUGX] = offsetGasGainx;
}
calibOffset.CalTA = calibTemperature;
//----------------------------------------------------------------------------
//Compute RR Parameter
voltageDetected[VRRX] = sampleProcess.RTypeResult;
ComputeRRParameter();
voltageDetected[RRRES] = MovingAverage(voltageDetected[RRRES], 10, RRRES);
StaticTGasCompute();
if(sampleProcess.State.AType == SAMPLE_VRH) {
voltageDetected[VRHX] = sampleProcess.ATypeResult;
ComputeRHParameter();
CheckATypeSensor();
}
else {
voltageDetected[IVHDX] = sampleProcess.ATypeResult;
voltageDetected[IVHDX] = MovingAverage(voltageDetected[IVHDX], 10, IVHDX);
}
//----------------------------------------------------------------------------
// Compute TD-TU parameter
if(sampleProcess.State.CType == SAMPLE_GVDU) {
voltageDetected[VDUGX] = sampleProcess.CTypeResult;
voltageDetected[VDUGX] = MovingAverage(voltageDetected[VDUGX], 10, VDUGX);
//-------------------------------------------------------------------------
CheckSensor(voltageDetected[VDUGX]);
//-------------------------------------------------------------------------
#ifndef ENABLE_OFFSET_CORRECT
#pragma message("[undefined] ENABLE_OFFSET_CORRECT")
#elif(ENABLE_OFFSET_CORRECT)
tmpSLA = (s32)ComputeOffsetCorrectValue(VDUGXHigh, VDUGXLow);
voltageDetected[TVDUGX] = tmpSLA;
tmpSLA += (u32)voltageDetected[VDUGX];
voltageDetected[MICRO_FR] = (u16)tmpSLA;
#else
voltageDetected[MICRO_FR] = voltageDetected[VDUGX];
#endif
//-------------------------------------------------------------------------
// 转换成气体识别所用的内码
voltageDetected[MICRO_FR] = ComputeCTypeIndex(voltageDetected[MICRO_FR], calibOffset.Value[CAL_VDUGX]);
voltageDetected[REG_INDEX] = 128/adcGain;
voltageDetected[REG_INDEX] = voltageDetected[MICRO_FR] / voltageDetected[REG_INDEX];
if(voltageDetected[MICRO_FR] > CALIB_MAX_INDEX) voltageDetected[MICRO_FR] = CALIB_MAX_INDEX;
FRType = MICRO_FR;
}
else {
voltageDetected[VDUX] = sampleProcess.CTypeResult;
voltageDetected[VDUX] = MovingAverage(voltageDetected[VDUX], 10, VDUX);
//-------------------------------------------------------------------------
CheckSensor(voltageDetected[VDUX]);
//-------------------------------------------------------------------------
#ifndef ENABLE_OFFSET_CORRECT
#pragma message("[undefined] ENABLE_OFFSET_CORRECT")
#elif(ENABLE_OFFSET_CORRECT)
tmpSLA = (signed long int)ComputeOffsetCorrectValue(OffsetHigh, OffsetLow);
voltageDetected[TVDUX] = tmpSLA;
tmpSLA += (u32)voltageDetected[VDUX];
voltageDetected[CTYPE_FR] = (u16)tmpSLA;
#else
voltageDetected[CTYPE_FR] = voltageDetected[VDUX];
#endif
//-------------------------------------------------------------------------
voltageDetected[CTYPE_FR] = ComputeCTypeIndex(voltageDetected[CTYPE_FR], calibOffset.Value[CAL_VDUX]);
voltageDetected[REG_INDEX] = voltageDetected[CTYPE_FR];
FRType = CTYPE_FR;
}
//============================================================================
voltageDetected[NIDX] = voltageDetected[VDUX];
//----------------------------------------------------------------------------
//气体识别
GasAnasisCompute();
SaveVHHAndNRHInTempretureMode();
//----------------------------------------------------------------------------
//当前流量计算
currentFlowRate = GetFlowRate(voltageDetected[FRType], FRType);
//----------------------------------------------------------------------------
PCBTemperature = TestTemperature(); // 测试环境温度
TemperatureLowPower(); // 温度传感器低功耗
voltageDetected[TPCB] = MovingAverage((u16)(TEMPRETURE_OFFSET + PCBTemperature), 100, TPCB);
PCBTemperature = (u16)voltageDetected[TPCB];
PCBTemperature -= (u16)TEMPRETURE_OFFSET;
TemperatureCorrection();
//----------------------------------------------------------------------------
GCFCorrection();
//----------------------------------------------------------------------------
if( systemAlarm.Bit.SensorErr | systemAlarm.Bit.Pollution ) currentFlowRate = 0;
//----------------------------------------------------------------------------
// JudgeflowUnit, for com and compute ACC
currentFlowRate = ConvertFlowrate(currentFlowRate, flowComUnit, FR_STD_UNIT);
FlowRateSecondaryCorrection();
FlowRateAlarmJudgment();
//----------------------------------------------------------------------------
disable_interrupts();
//----------------------------------------------------------------------------
flowRate = currentFlowRate;
FlowRateMoving();
tempL.DWord = flowRate;
voltageDetected[FR_H] = tempL.Word[1];
voltageDetected[FR_L] = tempL.Word[0];
//----------------------------------------------------------------------------
//¼ÆËã×ÜÁ÷Á¿
#ifndef REC_ACC_PER
#pragma message("[undefined] REC_ACC_PER")
#elif(REC_ACC_PER)
ComputeFlowRateToTotal();
ReleaseTotalToDisArray();
#endif
//----------------------------------------------------------------------------
//Êä³öÓû§Á÷Á¿
#ifndef ENABLE_FLOW_GAIN
#pragma message("[undefined] ENABLE_FLOW_GAIN")
#elif(ENABLE_FLOW_GAIN)
flowRate /= calibFlowGain;
#endif
//---------------------------------------------------------------------------
enable_interrupts();
//---------------------------------------------------------------------------
if(flowRate > 0) {
roughTestCounter = 0;
return;
}
else if(samplingInterval <= RESP_2000MS) return; // Èç¹ûÁ÷Á¿Îª0£¬½øÈë×Ô¶¯Áãµã¸ú×Ù
else if(MEMSErrorCounter > 0) return;
roughTestCounter++;
if(roughTestCounter >= 4) {
roughTestCounter = 0;
sampleProcess.State.EnableRoughTest = 1;
}
}
/******************************************************************************/
void FlowRateDealAndOuputSub(void)
{
// disable_interrupts();
//===========================================================================
ComputeFlowRateIndexAndFlowRate();
ReleaseToIntAndDecimalBufForUart();
//---------------------------------------------------------------------------
flowRateL = (u16)flowRate;
flowRateH = flowRate >> 16;
HWState.SampledOver = 0;
systemProcessing.Bit.FRHandle = 0;
sampleProcess.NextRun = 0;
Clear_WDT();
enable_interrupts();
//----------------------------------------------------------------------------
// Update 2024/01/29
#ifndef ENABLE_CALPIN_FOR_UPDATE_FR
#pragma message("[undefined] ENABLE_CALPIN_FOR_UPDATE_FR")
#elif(ENABLE_CALPIN_FOR_UPDATE_FR)
// EXT_CALIB_OUTPUT();
// SET_CALIB_PIN();
// sampleProcess.NextRun = FR_UPDATE;
// sampleProcess.NextTime = MAINTAR;
// sampleProcess.NextTime += FR_UPDATE_PULSE_TIME;
// SetNextProcess();
#endif
}
///******************************************************************************/
void ComputeSampleData(u16 sampleNum, u16 sampleShift)
{
u32 I;
sampleProcess.ADC0Result = 0;
sampleProcess.ADC1Result = 0;
// if(sampleProcess.CounterMax < sampleNum) return;
// disable_interrupts();
// for(I = sampleProcess.CounterMax - sampleNum; I<sampleProcess.CounterMax; I++)
for(I = 0; I<sampleNum; I++)
{
sampleProcess.ADC0Result += ((sampleProcess.ADC0Buffer[I] >> 8) + 32768) & 0xFFFF;
sampleProcess.ADC1Result += ((sampleProcess.ADC1Buffer[I] >> 8) + 32768) & 0xFFFF;
//sampleProcess.ADC0Result += ((((sampleProcess.ADC0Buffer[I] & 0xFFFFFF) | ((sampleProcess.ADC0Buffer[I] & 0x800000) ? 0xFF000000 : 0)) >> 8) + 32768) & 0xFFFF;//处理成16位数据 //sampleProcess.ADC0Buffer[I];
//sampleProcess.ADC1Result += ((((sampleProcess.ADC1Buffer[I] & 0xFFFFFF) | ((sampleProcess.ADC1Buffer[I] & 0x800000) ? 0xFF000000 : 0)) >> 8) + 32768) & 0xFFFF;//处理成16位数据 //sampleProcess.ADC1Buffer[I];
}
sampleProcess.ADC0Result >>= sampleShift;
sampleProcess.ADC1Result >>= sampleShift;
// enable_interrupts();
}
///******************************************************************************/
void ComputeSampleDataForSingle(u16 sampleNum, u16 sampleShift)
{
u32 I;
sampleProcess.ADC0Result = 0;
for(I = 0; I<sampleNum; I++)
{
sampleProcess.ADC0Result += ((sampleProcess.ADC0Buffer[I] >> 8) + 32768) & 0xFFFF;
//sampleProcess.ADC0Result += ((((sampleProcess.ADC0Buffer[I] & 0xFFFFFF) | ((sampleProcess.ADC0Buffer[I] & 0x800000) ? 0xFF000000 : 0)) >> 8) + 32768) & 0xFFFF;//处理成16位数据 //sampleProcess.ADC0Buffer[I];
}
sampleProcess.ADC0Result >>= sampleShift;
}
/******************************************************************************/
void SetSystemForADCSample(u16 sampleNum)
{
sampleProcess.Counter = 0;
sampleProcess.CounterMax = sampleNum;
StartSamplingADC();
}
/******************************************************************************/
void FlowProcessManagement(void)
{
// 进入流程
switch(sampleProcess.NextRun)
{
//-------
//-------------------------------------------------------------------------
// 状态 1: 粗检阶段 - 加热
// 场景:低功耗模式,快速判断管道内是否有流体流动
//-------------------------------------------------------------------------------------------------------------------------------------------
// In low power consumption mode, judge whether there is flow?
case START_DETECT_STAGE_HEATING:
RapidHeating(); // 快速加热传感器
SetupCTypeChannle(sampleProcess.CTypeGain); // 配置测量通道
SetSystemForADCSample(SAMPLING_TIMES_IN_DETECT_STAGE);// 配置ADC采样次数
// 状态流转:设定下一步要做什么,以及多久后做
sampleProcess.NextRun = START_DETECT_STAGE_PROCESSING; // 下一状态:处理粗检数据
sampleProcess.NextTime += SET_UP_TIME_OF_DETECT_STAGE;// 累加时间:加热稳定时间
break;
//-------------------------------------------------------------------------
// 状态 2: 粗检阶段 - 数据处理与判断
// 场景读取ADC值判断是否有流量
//-------------------------------------------------------------------------
case START_DETECT_STAGE_PROCESSING:
TurnOffAnalogCircuit(); // 省电:关闭模拟电路电源
// 计算粗检阶段的采样数据
ComputeSampleData(SAMPLING_TIMES_IN_DETECT_STAGE, SHIFT_IN_DETECT_STAGE);
voltageDetected[RIDX] = sampleCTypeValue;// 保存检测值
// 核心逻辑:判断是否有流量
// JudgmentFlowRate() 返回 1 表示检测到有流量,直接 break等待后续正常测量
if(JudgmentFlowRate()) break;
// 若无流量,则需要进入正常测量流程(或是误触发)
AnalogCircuitInit();
HWState.SampledOver = 0;
sampleProcess.NextTime = 1638; // TimeVaule[0];
sampleProcess.NextRun = START_1ST_STAGE_HEATING;
FlowProcessManagement();
return;
//-------------------------------------------------------------------------
// normal check flowrate
// start First stage heating
case START_1ST_STAGE_HEATING:
FirstStageHeating();
// 如果不是检定模式,则启动预采样
if(currentMode.Bit.IntCalibMode) sampleProcess.State.PreSampling = 0;
else sampleProcess.State.PreSampling = 1;
SetupCTypeChannle(sampleProcess.CTypeGain); //设置VDU
SetupRTypeChannle(); //设置VRR
SetSystemForADCSample(PRESAMPLING_TIMES_IN_1ST_STAGE); //(PRESAMPLING_TIMES_MAX_IN_1ST_STAGE);
TestTemperatureInit(TEMP_SENSOR_RESULT); // 温度传感器初始化
// sampleProcess.NextTime += SET_UP_TIME_OF_1ST_STAGE;
sampleProcess.NextTime = SET_UP_TIME_OF_1ST_STAGE;
sampleProcess.NextRun = START_1ST_STAGE_SAMPLING;
break;
//------------------------------------------------------------------------
// 1ST: normal SAMPLING
// start sampling data
case START_1ST_STAGE_SAMPLING:
ComputeSampleData(PRESAMPLING_TIMES_IN_1ST_STAGE, SHIFT_IN_PRESAMPLING_1ST_STAGE);
sampleProcess.RTypeResult = sampleRTypeValue; //VRR 8304 sampleProcess.ADC1Result
// 通过预采样确定CTYPE放大倍数
// Setup CType Channel -----------------------------------------------------
if(sampleProcess.State.PreSampling) {
tmpIA = ComputeCTypeIndex((u16)sampleCTypeValue, calibOffset.Value[CAL_VDUX]); // |采样内码-零点内码| 预采样内码值结果
if(sampleSwitchThreshold < 500) sampleProcess.State.CType = SAMPLE_VDU; // 小于500禁止使用变增益功能
else if(tmpIA > sampleSwitchThreshold + 500) sampleProcess.State.CType = SAMPLE_VDU; //
else if(tmpIA < sampleSwitchThreshold) sampleProcess.State.CType = SAMPLE_GVDU;
}
else sampleProcess.State.CType++; // 该值为一个 1 位宽的无符号位域,++操作会在0 1之间切换
if(sampleProcess.State.CType == SAMPLE_VDU) SetupCTypeChannle(sampleProcess.CTypeGain); // Gain=32 128
else SetupCTypeChannle( GIDX_GAIN ); // GAIN = 128
// Setup AType Channel --------------------------------------------------------
if(sampleProcess.State.AType == SAMPLE_VRH) {
sampleProcess.State.AType = SAMPLE_IRH;
SetupIRHChannle();
}
else {
sampleProcess.State.AType = SAMPLE_VRH;
SetupVRHChannle();
}
// Start ADC --------------------------------------------------------
SetSystemForADCSample(SAMPLING_TIMES_IN_1ST_STAGE);
// sampleProcess.NextTime += SAMPLING_TIME_OF_1ST_STAGE;
sampleProcess.NextTime = SAMPLING_TIME_OF_1ST_STAGE;
sampleProcess.NextRun = START_1ST_STAGE_PROCESSING;
//CLR_TEST_PIN();
break;
//------------------------------------------------------------------------
case START_1ST_STAGE_PROCESSING:
CLR_TEST_PIN();
if(samplingInterval > RESP_125MS) TurnOffAnalogCircuit();
ComputeSampleData(SAMPLING_TIMES_IN_1ST_STAGE, SHIFT_IN_1ST_STAGE);
sampleProcess.CTypeResult = sampleCTypeValue;
sampleProcess.ATypeResult = sampleATypeValue;
//End Sampling
sampleProcess.NextRun = 0;
HWState.SampledOver = 1;
systemProcessing.Bit.FRHandle = 1;
break;
//------------------------------------------------------------------------
// Update 2024/01/29
case FR_UPDATE:
EXT_CALIB_OUTPUT();
CLR_CALIB_PIN();
sampleProcess.NextRun = 0;
break;
//------------------------------------------------------------------------
default:
TurnOffAnalogCircuit(); // into lowpower mode
sampleProcess.NextRun = 0;
systemProcessing.Bit.FRHandle = 0;
break;
}
// 设置下一个流程定时
SetNextProcess();
// if(sampleProcess.NextRun == 0) {
// StopProcessTimer();//关闭采集时钟
// return;
// }
// else {
// u32 currentTAR = SamplingTimer->CNT; //定时器当前计数值
// if(currentTAR >= sampleProcess.NextTime) {
// sampleProcess.NextTime = currentTAR;
// FlowProcessManagement();
// }
// else ResetSamplingTimer(sampleProcess.NextTime);
//}
}
//******************************************************************************/
void CoreInit(void)
{
SystemGPIOInit();
// ExternCalibratinInput();
TurnOffAnalogCircuit();
}
//******************************************************************************/
void CoreColdStartProcessing(void)
{
//----------------------------------------------------------------------------
// check cold start
if(systmeState != 0xAA55)
{
// if(CodeCRC == 0) alarmState &= ~BL_CRC_ERROR;
// else alarmState |= BL_CRC_ERROR;
//// CodeCheckCRC();
// if(CodeCRC == 0) alarmState &= ~AP_CRC_ERROR;
// else alarmState |= AP_CRC_ERROR;
SystemHardWareAutoCheck();
#ifndef ENABLE_ZERO_CALIB_CMD
#pragma message("[undefined] ENABLE_ZERO_CALIB_CMD")
#elif(ENABLE_ZERO_CALIB_CMD)
tempL.Word[0] = ReadShortParameterFromMemory(SYS_COMMAND, 0);
currentMode.Word = tempL.Word[0];
if(currentMode.Bit.ZeroCalib) EnterZeroCalibMode();
else EnterUserMode();
#else
EnterUserMode();
#endif
}
//----------------------------------------------------------------------------
Clear_WDT();
//----------------------------------------------------------------------------
// Interface Init
SystemInterfaceInit();
//----------------------------------------------------------------------------
enable_interrupts();
}
//----------------------------------------------------------------------------
void ProcessTimerInterruptCallBack(void)
{
DisableProcessTimerInterrupt();
HWState.ProcessTimerOut = 1;
//FlowProcessManagement();
//enable_interrupts();
}
//采样中断--------------------------------------------------------------------
//void SamplingTimer_IRQ_Callback(void)
//{
// FlowProcessManagement();
//// LHL_GPIO_TogglePin(pGPIO1, GPIO_PIN_7); MEMSErrorCounter
//}
//主程序中断------------------------------------------------------------
void PrimaryTimer_IRQ_Callback()
{
SET_TEST_PIN();
//TEST_PIN_TOGGLE();
HWState.MainTimerOut = 1;
}
//系统轮询----------------------------------------------------------------------
void SystemPolling(void)
{
while(1) {
//--------------------------------------------------------------------------
//test flowrate
if(HWState.MainTimerOut == 1 ) {
ManagePrimaryTimeInterval(); // 判断下阶段的工作模式
ModeExitCount(); // 判断各种模式退出
Clear_WDT();
StartNormolFlowMeasurement();
HWState.MainTimerOut = 0;
}
else if(HWState.ProcessTimerOut == 1 ) {
FlowProcessManagement();
HWState.ProcessTimerOut = 0;
}
if(HWState.SampledOver) {
FlowRateDealAndOuputSub();
//------------------------------------------------------------------------
#if ENABLE_USE_AVANT_PROTOCOL
if(urrentMode.Bit.DigitOutput) AvantGardeAutoUploadData();
#endif
}
//----------------------------------------------------------------------------
#ifndef ENABLE_USER_UART
#pragma message("[undefined] ENABLE_USER_UART")
#elif(ENABLE_USER_UART)
if(comState.state.ReceivedData ) {
ReceivedDataProcessing();
continue;
}
#endif
//--------------------------------------------------------------------------
#ifndef ENABLE_USER_I2C
#pragma message("[undefined] ENABLE_USER_I2C")
#elif(ENABLE_USER_I2C)
if(comState.I2CReceivedData) {
DoneI2CComm();
continue;
}
#endif
//--------------------------------------------------------------------------
if(HWState.EnableSaveData) DataStorageManagement();
alarmState = systemAlarm.Word;
//--------------------------------------------------------------------------
}
}
/* File end *****************************************************************/
#endif
/****************************************************************************/

View File

@@ -0,0 +1,406 @@
#include "../main/SystemInclude.h"
//##############################################################################
#if(DP2201_CORE_V5000)
//##############################################################################
// for compute buffer
u32 compareBaseCounter;
u16 compareBaseValue;
//u16 VDUGXHigh, VDUGXRoom, VDUGXLow, sampleSwitchThreshold;
float RhExtGain, RRExtGain;
/**************************************************************************************/
/**
* @brief 电路计算参数初始化
* @note
* @warning
*/
void RHCircuitParameterInit(void)
{
// A type external gain res
// RhExtGainRes = ReadShortParameterFromEEPROM(RH_GAINRES, RH_GAINRES_WIDTH, RH_GAINRES_DEFAULT);
// RhExtGain = 1.0/(float)RhExtGainRes;
//RRExtGainRes = ReadShortParameterFromEEPROM(RR_GAINRES, RR_GAINRES_WIDTH, RR_GAINRES_DEFAULT);
// RRExtGain = (float)RRExtGainRes;
// RRExtGain *= (float)VREF_VDC;
//sampleSwitchThreshold = ReadShortParameterFromEEPROM(SAMPLE_THRESHOLD, SAMPLE_THRESHOLD_WIDTH, SAMPLE_THRESHOLD_DEFAULT);
}
/**************************************************************************************/
/**
* @brief 校准零点
* @note
* @warning
*/
void CalibrateOffset(void)
{
tempL.Word[0] = voltageDetected[NIDX];
offsetAir = WriteShortParameterToMemory(GET_WORD_ADDR(offsetAir));
//tempL.Word[0] += 30;
offsetGas = WriteShortParameterToMemory(GET_MBWORD_ADDR(offsetGas));
tempL.Word[0] = voltageDetected[VDUGX];
offsetAirGainx = WriteShortParameterToMemory(GET_WORD_ADDR(offsetAirGainx));
offsetGasGainx = WriteShortParameterToMemory(GET_WORD_ADDR(offsetGasGainx));
}
/**************************************************************************************/
/**
* @brief 校准曲线前需要进行的操作:如校零及必要的参数保存等
* @note
* @warning
*/
void PreCalibrationParameterWriting(void)
{
//===========================================================================
tempL.Word[0] = voltageDetected[NIDX];
offsetAir = WriteShortParameterToMemory(GET_WORD_ADDR(offsetAir));
//tempL.Word[0] += 30;
offsetGas = WriteShortParameterToMemory(GAS_OFFSET);
tempL.Word[0] = voltageDetected[VDUGX];
offsetAirGainx = WriteShortParameterToMemory(GET_WORD_ADDR(offsetAirGainx));
offsetGasGainx = WriteShortParameterToMemory(GET_WORD_ADDR(offsetGasGainx));
//---------------------------------------------------------------------------
tempL.Word[0] = voltageDetected[RRRES];
RRRoom = WriteShortParameterToMemory(GET_WORD_ADDR(RRRoom));
tempL.Word[0] = voltageDetected[IVHDX];
VHHRoom = WriteShortParameterToMemory(GET_WORD_ADDR(VHHRoom));
//---------------------------------------------------------------------------
#ifndef TEMP_CORR_USE_TA
#pragma message("[undefined] TEMP_CORR_USE_TA")
#elif(TEMP_CORR_USE_TA)
tempL.Word[0] = voltageDetected[TPCB];
#else
#ifndef ENABLE_GAS_RECOGNITION
#pragma message("[undefined] ENABLE_GAS_RECOGNITION")
#elif(ENABLE_GAS_RECOGNITION)
tempL.Word[0] = voltageDetected[TGAS];
#else
tempL.Word[0] = voltageDetected[TPCB];
#endif
#endif
//---------------------------------------------------------------------------
calibTemperature = WriteShortParameterToMemory(GET_WORD_ADDR(calibTemperature));
//---------------------------------------------------------------------------
currentMode.Bit.PreCalibEnd = 1;
}
/**************************************************************************************/
/**
* @brief 高低温标定程序:低温参数保存功能
* @note
* @warning
*/
void LowTemperatureParameterWriting(void)
{
if(voltageDetected[TPCB] >= ENABLE_WRITE_TA_LOW)
{
// calibType = ('E'<<8)+'R';
return;
}
tempL.Word[0] = voltageDetected[TPCB];
staticLowTemperature = WriteShortParameterToMemory(GET_WORD_ADDR(staticLowTemperature));
tempL.Word[0] = voltageDetected[RRRES];
RRLow = WriteShortParameterToMemory(GET_WORD_ADDR(RRLow));
tempL.Word[0] = voltageDetected[IVHDX];
VHHLow = WriteShortParameterToMemory(GET_WORD_ADDR(VHHLow));
// for AType FlowRate Compute
//tempL.Word[0] = ReadDataFromMovingAverage(PDRH);
//---------------------------------------------------------------------------
tempL.Word[0] = voltageDetected[PORH];
P0RhLow = WriteShortParameterToMemory(GET_WORD_ADDR(P0RhLow));
tempL.Word[0] = voltageDetected[RHRES];
RHLowTa = WriteShortParameterToMemory(GET_WORD_ADDR(RHLowTa));
//---------------------------------------------------------------------------
tempL.Word[0] = voltageDetected[NIDX];
OffsetLow = WriteShortParameterToMemory(GET_WORD_ADDR(OffsetLow));
tempL.Word[0] = voltageDetected[VDUGX];
VDUGXLow = WriteShortParameterToMemory(GET_WORD_ADDR(VDUGXLow));
//---------------------------------------------------------------------------
// tempL.Word[0] = ReadShortParameterFromMemory(ZEROCAL_STATE, 0);
// tempL.Word[0] &= 0xff00;
// tempL.Word[0] |= 'L';
// WriteShortParameterToMemory(ZEROCAL_STATE);
// currentMode.Bit.LowCalibEnd = 1;
// if(tempL.Word[0] == INTCMD_CALIB_TEMP_END) EnterUserMode();
// tempL.Word[0] = ReadShortParameterFromMemory(SYS_COMMAND, SYS_COMMAND_WIDTH, 0);
// if(tempL.Word[0] == INTCMD_ZERO_CALIB_MODE) EnterZeroCalibMode();
// else EnterUserMode();
currentMode.Bit.LowCalibEnd = 1;
if( currentMode.Bit.HighCalibEnd && currentMode.Bit.LowCalibEnd ) EnterUserMode();
tempL.Word[0] = currentMode.Word;
WriteShortParameterToMemory(SYS_COMMAND);
//calibType = ('L'<<8)+'D';
// calibType &= 0xff00;
// calibType |= 'L';
//
// zeroCalibType &= 0xff00;
// zeroCalibType |= 'L';
// currentMode.Bit.LowCalibEnd = 1;
// if(zeroCalibType == (('H'<<8)+'L'))
// {
// tempL.Word[0] = 0;
// // tempL.Word[0] = WriteShortParameterToMemory(GET_WORD_ADDR());
// EnterUserMode();
// }
}
/**************************************************************************************/
/**
* @brief 高低温标定程序:高温参数保存功能
* @note
* @warning
*/
void HighTemperatureParameterWriting(void)
{
if(voltageDetected[TPCB] <= ENABLE_WRITE_TA_HIGH)
{
// calibType = ('E'<<8)+'R';
return;
}
//------------------------------------------------------------------------------------------------------
tempL.Word[0] = voltageDetected[TPCB];
staticHighTemperature = WriteShortParameterToMemory(GET_WORD_ADDR(staticHighTemperature));
tempL.Word[0] = voltageDetected[RRRES];
RRHigh = WriteShortParameterToMemory(GET_WORD_ADDR(RRHigh));
tempL.Word[0] = voltageDetected[IVHDX];
VHHHigh = WriteShortParameterToMemory(GET_WORD_ADDR(VHHHigh));
// for AType FlowRate Compute
tempL.Word[0] = voltageDetected[PORH];
P0RhHigh = WriteShortParameterToMemory(GET_WORD_ADDR(P0RhHigh));
tempL.Word[0] = voltageDetected[RHRES];
RHHighTa = WriteShortParameterToMemory(GET_WORD_ADDR(RHHighTa));
//------------------------------------------------------------------------------------------------------
tempL.Word[0] = voltageDetected[NIDX];
OffsetHigh = WriteShortParameterToMemory(GET_WORD_ADDR(OffsetHigh));
tempL.Word[0] = voltageDetected[VDUGX];
VDUGXHigh = WriteShortParameterToMemory(GET_WORD_ADDR(VDUGXHigh));
//calibType = ('H'<<8)+'D';
// calibType &= 0x00ff;
// calibType |= ('H'<<8);
// zeroCalibType &= 0x00ff;
// zeroCalibType |= 'H'<<8;
//------------------------------------------------------------------------------------------------------
// tempL.Word[0] = ReadShortParameterFromMemory(ZEROCAL_STATE, 0);
// tempL.Word[0] &= 0x00ff;
// tempL.Word[0] |= ('H'<<8);
// WriteShortParameterToMemory(ZEROCAL_STATE);
currentMode.Bit.HighCalibEnd = 1;
if( currentMode.Bit.HighCalibEnd && currentMode.Bit.LowCalibEnd ) EnterUserMode();
tempL.Word[0] = currentMode.Word;
WriteShortParameterToMemory(SYS_COMMAND);
// if(tempL.Word[0] == INTCMD_CALIB_TEMP_END) EnterUserMode();
//currentMode.Bit.ZeroCalib
// if(zeroCalibType == (('H'<<8)+'L'))
// {
// tempL.Word[0] = 0;
// tempL.Word[0] = WriteShortParameterToMemory(GET_WORD_ADDR());
// EnterUserMode();
// }
}
/**************************************************************************************/
/**
* @brief 高低温标定程序,判断温度是否稳定,是否可以进行参数保存
* @note
* @warning
*/
void SaveVHHAndNRHInTempretureMode(void)
{
if(!currentMode.Bit.ZeroCalib) return;
if(samplingInterval > EXT_POWER_PERIOD_TIME) return;
if((voltageDetected[TPCB] > ENABLE_WRITE_TA_LOW) && (voltageDetected[TPCB] < ENABLE_WRITE_TA_HIGH))
{
compareBaseCounter = 0;
compareBaseValue = voltageDetected[TPCB];
return;
}
compareBaseCounter += (u32)timePeriod;
if((voltageDetected[TPCB] > compareBaseValue + ENABLE_WRITE_TA_SCALE) || (voltageDetected[TPCB] < compareBaseValue - ENABLE_WRITE_TA_SCALE))
{
compareBaseCounter = 0;
compareBaseValue = voltageDetected[TPCB];
}
else
{
//compareBaseCounter += (unsigned long int)timePeriod;
if(compareBaseCounter < (unsigned long int)EXIT_5400S) return; // 1hours // 1hours
if(voltageDetected[TPCB] >= ENABLE_WRITE_TA_HIGH) HighTemperatureParameterWriting();
else if(voltageDetected[TPCB] <= ENABLE_WRITE_TA_LOW) LowTemperatureParameterWriting();
compareBaseCounter=0;
}
}
/**************************************************************************************/
/**
* @brief RH参数计算函数
* @note
* @warning
*/
void ComputeRHParameter(void)
{
float tmpIH, tmpRH;
s32 tempCode;
// comput normal RH
//==============================================================================
// compute RH Voltage
tempCode = (s32)voltageDetected[VRHX];
tempCode -= 32768;
tmpRH = (float)tempCode;
tmpRH *= (float)VRH_VREF;
voltageDetected[RHVOL] = (u16)tmpRH;
// compute IRH
//===========================================================================
tempCode = (s32)voltageDetected[IVHDX];
tempCode -= 32768;
tmpIH = (float)tempCode;
tmpIH = tmpIH * (float)IRH_VREF + (float)IRH_VDC;
tmpIH /= (float)IRH_RC;
tmpRH = tmpRH /tmpIH - (float)IRH_RC;
tmpRH *= 10;
voltageDetected[RHRES] = (u16)tmpRH;
// compute RH power
//===========================================================================
tmpIH *= tmpIH;
tmpIH *= tmpRH;
voltageDetected[PORH] = (u16)tmpIH;
//==============================================================================
//voltageDetected[PORH] = MovingAverage(computePower, 5, PORH);
}
/**************************************************************************************/
/**
* @brief RR参数计算函数
* @note
* @warning
*/
void ComputeRRParameter(void)
{
float tmpVol;
s32 tempCode;
disable_interrupts();
// comput normal (VRR)
//==============================================================================
tempCode = (s32)voltageDetected[VRRX];
tempCode -= 32768;
tmpVol = (float)tempCode;
tmpVol *= (float)VRR_VREF;
tmpVol += (float)VRR_VDC;
voltageDetected[RRVOL] = (u16)(tmpVol + VCOM);
// comput normal RR resistance
//==============================================================================
tmpVol = VRR_BRIDGE_VOL/tmpVol - 1.0;
tmpVol = VRR_RA/tmpVol;
voltageDetected[RRRES] = (u16)tmpVol;
}
/**************************************************************************************/
/**
* @brief InterCurveProcess
* @note
* @warning
*/
void InterCurveProcess(void)
{
calibType = 0;
if(tempL.Word[0] == INTCMD_PRESET_OFFSET) PreCalibrationParameterWriting();
else if(tempL.Word[0] == INTCMD_CALIB_HTEMP) HighTemperatureParameterWriting();
else if(tempL.Word[0] == INTCMD_CALIB_LTEMP) LowTemperatureParameterWriting();
else if(tempL.Word[0] == INTCMD_CTYPE_CURVE) calibType = INTCMD_CTYPE_CURVE;
else if(tempL.Word[0] == INT_2ND_CURVE_CMD) calibType = INT_2ND_CURVE_CMD;
else if(tempL.Word[0] == INT_3RD_CURVE_CMD) calibType = INT_3RD_CURVE_CMD;
else if(tempL.Word[0] == INTCMD_1ST_TABLE) calibType = INTCMD_1ST_TABLE;
else if(tempL.Word[0] == INTCMD_2ND_TABLE) calibType = INTCMD_2ND_TABLE;
else MBBuf.BusError = SLAVE_DEVICE_FAILURE;
}
/**************************************************************************************/
/**
* @brief InterControlProcess
* @note
* @warning
*/
void InterControlProcess(void)
{
if(tempL.Word[0] == INTCMD_USER_MODE) EnterUserMode();
//else if(tempL.Word[0] == INTCMD_EXCALIB_MODE) EnterExtCalibMode(); // calibration mode
else if(tempL.Word[0] == INTCMD_CALIB_MODE) EnterCalibMode(); // calibration mode
else if(tempL.Word[0] == INTCMD_ZERO_CALIB_MODE) {
EnterZeroCalibMode(); // calibration mode
tempL.Word[0] = currentMode.Word;
WriteShortParameterToMemory(SYS_COMMAND);
tempL.Word[0] = INTCMD_ZERO_CALIB_MODE;
}
//------------------------------------------------------------------------
else if(tempL.Word[0] == INTCMD_DEBUG_MODE) EnterDebugMode(); // debug mode
else if(tempL.Word[0] == INTCMD_BATTERY_MODE) EnterBatteryMode(); // battery mode
else if(tempL.Word[0] == INTCMD_GCF_TEST_MODE) EnterGcfTestMode(); // GCF 测试 mode
//else if(tempL.Word[0] == INTCMD_SAVE_SETUP) SaveFactorySetting(); // Save the factory setting
//else if(tempL.Word[0] == INTCMD_RESTORE) RestoreFactorySetting(); // Restore factory settings
else if(tempL.Word[0] == INTCMD_RESET_CORR) DefaultDevCoef(); // Restore
else MBBuf.BusError = SLAVE_DEVICE_FAILURE;
}
/**************************************************************************************/
/**
* @brief InterControlProcess
* @note
* @warning
*/
void InterClearProcess(void)
{
if(tempL.Word[0] == ('B'<<8)+'J') ClearAlarmRecord();
else if(tempL.Word[0] == ('L'<<8)+'S') ClearHistoryRecord();
else if(tempL.Word[0] == ('R'<<8)+'Z') ClearDateRecord();
}
/**************************************************************************************/
/**
* @brief InterControlProcess
* @note
* @warning
*/
void CalibSystemOffset(void )
{
tempL.Word[0] = voltageDetected[NIDX]; // ReadDataFromMovingAverage(NIDX);
if(CMDComPassword == ('K'<<8)+'Q') offsetAir = WriteShortParameterToMemory(GET_WORD_ADDR(offsetAir));
else if(CMDComPassword == ('J'<<8)+'Z') offsetGas = WriteShortParameterToMemory(GAS_OFFSET);
}
//##############################################################################
#endif
//##############################################################################

View File

@@ -0,0 +1,60 @@
#ifndef __D9V2FR_DP2201V5000_h__
#define __D9V2FR_DP2201V5000_h__
//##############################################################################
#if DP2201_CORE_V5000
//##############################################################################
// CODE = [(VREF-VREFN)*RR/(RA+RR) - (VREF-VREFN)*RB/(RA+RB)]*Gain / VREF*32768 + 32768
// CODE -32768 = (VREF-VREFN)/VREF*[ RR/(RA+RR) - RB/(RA+RB)]*GAIN / VREF*32768
// (CODE -32768) * VREF/32768 = (VREF-VREFN)*[ RR/(RA+RR) - RB/(RA+RB)]*GAIN
// VREF_PER_CODE: VREF/32768
// (CODE -32768) * VREF_PER_CODE / GAIN = (VREF-VREFN)*[ RR/(RA+RR) - RB/(RA+RB)]
// VRR_VREF: VREF_PER_CODE/GAIN
// VRR_VDC:(VREF-VREFN)*RB/(RA+RB)
// (CODE -32768) * VRR_VREF = (VREF-VREFN)*[ RR/(RA+RR) - RB/(RA+RB)]
// (CODE -32768) * VRR_VREF + VRR_VDC = (VREF-VREFN)*RR/(RA+RR) // VRR
// CODE = [(VREF-VREFN)*RR/(RA+RR) - (VREF-VREFN)*RB/(RA+RB)]*Gain / VREF*32768 + 32768
// (CODE-32768) = (VREF-VREFN)*[RR/(RA+RR) - RB/(RA+RB)]*GAIN*32768/VREF
// (CODE-32768)*VREF/[(VREF-VREFN)*GAIN*32768] = RR/(RA+RR) - RB/(RA+RB)
// VRR_PER_CODE: VREF/[(VREF-VREFN)*GAIN*32768]
// VRR_RDC: RB/(RA+RB)
// 1) (CODE-32768)*VRR_PER_CODE
// 2) 1)+VRR_RDC
// 3) 1/2)
// 4) 3)-1
// 5) RA/4)
#define ADC_VREF 2500.0
//-----------------------------------------------------------------------------
#define IRH_RA 33000.0
#define IRH_RB 2800.0
#define IRH_VDC (ADC_VREF*IRH_RB/(IRH_RA + IRH_RB))
#define IRH_ADC_GAIN 16.0
#define IRH_VREF (VREF_PER_CODE/IRH_ADC_GAIN)
#define IRH_RC 56.0
#define VRH_VREF VREF_PER_CODE
void RHCircuitParameterInit(void);
void CalibrateOffset(void);
void PreCalibrationParameterWriting(void);
void LowTemperatureParameterWriting(void);
void HighTemperatureParameterWriting(void);
void SaveVHHAndNRHInTempretureMode(void);
void ComputeRHParameter(void);
void ComputeRRParameter(void);
// for internal modbus
void InterCurveProcess(void);
void InterControlProcess(void);
void InterClearProcess(void);
//##############################################################################
#endif
//##############################################################################
#endif

437
user/Core/DP2201_V5000_IO.h Normal file
View File

@@ -0,0 +1,437 @@
#ifndef __DP2201_V5000_IO_h__
#define __DP2201_V5000_IO_h__
//.h Start--------------------------------------------------------------------
//------------------------------------------------------------------------------
#if ((DP2201_CORE_V5020) || (DP2201_CORE_V5002))
#define DP2201_CORE_V5000 1
#endif
//File Start--------------------------------------------------------------------
#if (DP2201_CORE_V5000)
//**************************************************************************
// for flow compute
//==============================================================================
#define TEST_PIN GPIO_PIN_5
#define TEST_PIN_PINPOS GPIO_PinPos_5
#define TEST_PIN_GPIO GPIO0
#define TEST_PIN_OUT() EnableOutput(TEST_PIN_GPIO, TEST_PIN_PINPOS)
#define TEST_PIN_TOGGLE() TOGGLE_PIN(TEST_PIN_GPIO, TEST_PIN)
#define CLR_TEST_PIN() CLR_PIN(TEST_PIN_GPIO,TEST_PIN)
#define SET_TEST_PIN() SET_PIN(TEST_PIN_GPIO,TEST_PIN)
//------------------------------------------------------------------------------
// RH power control pin
#define RH_CON_PIN GPIO_PIN_0
#define RH_CON_PINPOS GPIO_PinPos_0
#define RH_GPIO GPIO0
#define RH_CON_OUTPUT() EnableOutput(RH_GPIO, RH_CON_PINPOS)
#define TURN_OFF_RH_POWER() SET_PIN(RH_GPIO,RH_CON_PIN)
#define TURN_ON_RH_POWER() CLR_PIN(RH_GPIO,RH_CON_PIN)
//------------------------------------------------------------------------------
// Heating control pin
#define HEATING_PIN GPIO_PIN_6
#define HEATING_PINPOS GPIO_PinPos_6
#define HEATING_GPIO GPIO1
#define HEATING_OUTPUT() EnableOutput(HEATING_GPIO, HEATING_PINPOS)
#define CLR_HEATING() CLR_PIN(HEATING_GPIO,HEATING_PIN)
#define SET_HEATING() SET_PIN(HEATING_GPIO,HEATING_PIN)
#define TURN_ON_HEATING() SET_HEATING()
#define TURN_OFF_HEATING() CLR_HEATING() // CLR_HEATING()
#define SELECT_VREF_CON() SET_HEATING()
#define SELECT_MEMS_CON() CLR_HEATING()
//------------------------------------------------------------------------------
// RH Heating control select pin
#define TD_CON_PIN GPIO_PIN_5
#define TD_CON_PINPOS GPIO_PinPos_5
#define TD_CON_GPIO GPIO1
#define TD_CON_OUTPUT() EnableOutput(TD_CON_GPIO, TD_CON_PINPOS)
#define CLR_TD_CON() CLR_PIN(TD_CON_GPIO,TD_CON_PIN)
#define SET_TD_CON() SET_PIN(TD_CON_GPIO,TD_CON_PIN)
#define SELECT_TD_CON() CLR_TD_CON()
#define SELECT_TU_CON() SET_TD_CON()
#define CALIB_PIN GPIO_PIN_7
#define CALIB_PINPOS GPIO_PinPos_7
#define CALIB_GPIO GPIO1
#define EXT_CALIB_OUTPUT() EnableOutput(CALIB_GPIO, CALIB_PINPOS)
#define CLR_CALIB_PIN() CLR_PIN(CALIB_GPIO,CALIB_PIN)
//------------------------------------------------------------------------------
// for soft I2C
#define I2C_SDA GPIO_PIN_0
#define I2C_SDA_PINPOS GPIO_PinPos_0
#define I2C_SDA_GPIO GPIO1
#define I2C_SCL GPIO_PIN_1
#define I2C_SCL_PINPOS GPIO_PinPos_1
#define I2C_SCL_GPIO GPIO1
//------------------------------------------------------------------------------
// for eeprom
#define EEPROM_WP_PIN GPIO_PIN_4
#define EEPROM_WP_PINPOS GPIO_PinPos_4
#define EEPROM_WP_GPIO GPIO1
#define PARA_EEPROM BIT1
#define DATA_EEPROM BIT2
#define FROCK_EEPROM BIT1+BIT2+BIT3
//------------------------------------------------------------------------------
// for FRAM
#define FRAM_WP_PIN GPIO_PIN_4
#define FRAM_WP_PINPOS GPIO_PinPos_4
#define FRAM_WP_GPIO GPIO1
#define FRAM_CS_PIN GPIO_PIN_5
#define FRAM_CS_PINPOS GPIO_PinPos_5
#define FRAM_CS_GPIO GPIO0
//------------------------------------------------------------------------------
// for SPI
#define SCLK_PIN GPIO_PIN_5
#define SCLK_PINPOS GPIO_PinPos_5
#define SCLK_PIN_SOURCE GPIO_PinSource5
#define SCLK_PIN_CONFIG GPIO1_5_AF_SCLK
#define SCLK_GPIO GPIO1
#define SOMI_PIN GPIO_PIN_4
#define SOMI_PINPOS GPIO_PinPos_4
#define SOMI_PIN_SOURCE GPIO_PinSource4
#define SOMI_PIN_CONFIG GPIO1_4_AF_MISO
#define SOMI_GPIO GPIO1
#define SIMO_PIN GPIO_PIN_6
#define SIMO_PINPOS GPIO_PinPos_6
#define SIMO_PIN_SOURCE GPIO_PinSource6
#define SIMO_PIN_CONFIG GPIO1_6_AF_MOSI
#define SIMO_GPIO GPIO1
//------------------------------------------------------------------------------
#define EXT_CALIB_PIN GPIO_PIN_7
#define EXT_CALIB_PINPOS GPIO_PinPos_7
#define EXT_CALIB_GPIO GPIO1
#define RS485DE_PIN GPIO_PIN_1
#define RS485DE_PINPOS GPIO_PinPos_1
#define RS485DE_GPIO GPIO1
#define RS485DE_OUTPUT() EnableOutput(RS485DE_GPIO, RS485DE_PINPOS)
#define ENABLE_TXD() SET_PIN(RS485DE_GPIO, RS485DE_PIN)
#define ENABLE_RXD() CLR_PIN(RS485DE_GPIO, RS485DE_PIN)
// *****************************************************************************
// 'X' <20><>׺<EFBFBD><D7BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// *****************************************************************************
#define CTYPE_FR CURVE_1ST
#define ATYPE_VH CURVE_2ND
#define MICRO_FR CURVE_3RD
#define FRIDX CTYPE_FR // 0
#define RGIDX ATYPE_VH // 1
#define GAINX MICRO_FR // 2
#define VDUX 3 //
#define VDUGX 4 //
#define RIDX 5 //
#define NIDX 6 // NORMAL_VL - LOW_VL (TD INDEX)
#define TPCB 7 // PCB temperature
#define TGAS 8 // GAS temperature
#define TRH 9 // RH temperature
#define BATT 10 // Battery volatge
#define IVHDX 11 // IRH CODE test VHH By TD Control
#define VRHX 12 // VRH CODE
#define IVHUX 13 // IRH CODE test VHH By TU Control
#define VRRX 14 // VRR CODE
#define RHVOL 15 // RH VOLATAGE
#define RRVOL 16 // RR VOLATAGE
#define RHRES 17 // RH resistance
#define RRRES 18 // RR resistance
#define PORH 19 // RH Power
#define PDRH 20 // RH current Power
#define CVHHX 21 //
#define DVHHX 22 //
#define VHPA 23 //
#define RATO 24 // RR:RH
#define SDT 25 // ATYPE OFFSET
#define DIVHX 26 // IVHH(TD) - IVHH(TU)
#define TCOE 27 //
#define TVDUX 28 //
#define TVDUGX 29 //
#define FR_H 30 //
#define FR_L 31 //
#define ANX 32 //
#define ANX_MASK (ANX-1)
//------------------------------------------------------------------------------
#define NRH RRRES
#define NVHH IVHDX
#define CVHH CVHHX //
#define DVHH DVHHX //
#define NVDU VDUX
#define LRH RHRES
#define LVOL RHVOL
#define LVHH IVHDX
//------------------------------------------------------------------------------
#define GCFX NVDU //
#define GIDX LCDE //
#define FIDX FRIDX
#define RAOOM RATO
#define ATYPE_FR CURVE_2ND
#define REG_INDEX RGIDX
//------------------------------------------------------------------------------
#define CODE1 FR_H // 8300 FIDX
#define CODE2 FR_L // 8301 FIDX
#define CODE3 FRIDX // 8302 FIDX
#if(TEMP_CORR_USE_RR)
#define CODE4 RRRES // MICRO_FR // 8303 TEMP
#else
#define CODE4 TGAS // MICRO_FR // 8303
#endif
#define CODE5 MICRO_FR // 8304 С<><D0A1><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> С<><D0A1><EFBFBD><EFBFBD>
#define CODE6 DVHHX // 8305 С<><D0A1><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> DVHH
#define CODE7 RHVOL // 8306 С<><D0A1><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> LVOL // VRH
#define CODE8 RRVOL // 8307 С<><D0A1><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> NVOL // VRR
#define CODE9 VHPA // 8308 С<><D0A1><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9> VHPA
#define CODE10 TPCB // 8309 С<><D0A1><EFBFBD><EFBFBD>ʹ<EFBFBD><CAB9>
#define CODE11 VDUX // 830A
#define CODE12 IVHDX // 830B
#define CODE13 DIVHX // 830C
#define CODE14 VRHX // 830D
#define CODE15 VDUGX // 830E
#define CODE16 RHRES // 830F
// *****************************************************************************
// 1S = 16384
// Circuit preparation process
#define START_CIRCUIT_SETUP 0
#define START_DETECT_STAGE_HEATING 1
#define START_DETECT_STAGE_PROCESSING 2
#define START_1ST_STAGE_HEATING 3
#define START_1ST_STAGE_SAMPLING 4
#define START_1ST_STAGE_PROCESSING 5
//------------------------------------------------------------------------------
#define FR_UPDATE 0x0A
#define FR_UPDATE_PULSE_TIME 16 // 1ms
//------------------------------------------------------------------------------
#define CIRCUIT_SETUP_TIME 82 // 5ms
//------------------------------------------------------------------------------
#define SET_UP_TIME_FROM_DETECT_TO_1ST_STAGE 1638 // 100ms
//------------------------------------------------------------------------------
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>̣<EFBFBD>
//------------------------------------------------------------------------------
#define COUNT_VALUE_PER_MS 16 //10
#define SET_UP_TIME_OF_DETECT_STAGE (20 * COUNT_VALUE_PER_MS) ///20ms
#define SAMPLING_TIMES_IN_DETECT_STAGE 16 //
#define SHIFT_IN_DETECT_STAGE 4 //
//
#define SET_UP_TIME_OF_1ST_STAGE (40 * COUNT_VALUE_PER_MS) //40ms <20><>Ӧ<EFBFBD><D3A6>΢<EFBFBD><CEA2><EFBFBD><EFBFBD>ADC 977SRS DMA<4D><41><EFBFBD><EFBFBD>32<33><32>ʱ<EFBFBD><CAB1>
#define PRESAMPLING_TIMES_IN_1ST_STAGE 32 //
#define SHIFT_IN_PRESAMPLING_1ST_STAGE 5 //
//
#define SAMPLING_TIME_OF_1ST_STAGE (70 * COUNT_VALUE_PER_MS) //70ms <20><>Ӧ<EFBFBD><D3A6>΢<EFBFBD><CEA2><EFBFBD><EFBFBD>ADC 977SRS DMA<4D><41><EFBFBD><EFBFBD>64<36><34>ʱ<EFBFBD><CAB1>
#define SAMPLING_TIMES_IN_1ST_STAGE 64 //
#define SHIFT_IN_1ST_STAGE 6 //
//******************************************************************************
#define STATIC_HIGH_CODE 50
#define STATIC_LOW_CODE 50
// *****************************************************************************
//#define VHH_GAIN GAIN16
#define NIDX_GAIN GAIN32
#define GIDX_GAIN GAIN128 //GAIN_64
#define GIDX_SHIFT 4
//#define VRR_GAIN GAIN16
//#define VRH_GAIN GAIN1
#define SAMPLE_NORMOL_MODE 0
#define SAMPLE_TRACK_ZERO_MODE 1
#define SAMPLE_FAST_MODE 2
#define SAMPLE_MODE_MAX SAMPLE_TRACK_ZERO_MODE //SAMPLE_VDU_VRH_MODE
#define SAMPLE_DEFAULT_MODE SAMPLE_NORMOL_MODE //SAMPLE_VDU_VRR_MODE
//<2F><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> ÿ<><C3BF>
#define SAMPLE_VDU 0
#define SAMPLE_GVDU 1
#define SAMPLE_VRH 0
#define SAMPLE_IRH 1
#define SWITCH_GAIN_THRESHOLD 0x36768
#define CAL_VDUX CTYPE_FR
#define CAL_ATYPE ATYPE_VH
#define CAL_VDUGX MICRO_FR
// *****************************************************************************
#if (DP2201_CORE_V5002)
//---------------------------------------------------------------------------------
#define VCOM 0.0
#define VREF_PER_CODE (ADC_VREF/32768)
#define VRR_BRIDGE_VOL (ADC_VREF - VCOM)
#define VRR_RA 33000.0
#define VRR_RB 2800.0
#define VRR_RDC (VRR_RB/(VRR_RA + VRR_RB))
#define VRR_VDC (VRR_BRIDGE_VOL*VRR_RDC)
#define VRR_ADC_GAIN 16.0
#define VRR_VREF ( VREF_PER_CODE/VRR_ADC_GAIN )
#define VRR_PER_CODE ( ADC_VREF/((ADC_VREF-VCOM)*GAIN*32768))
#define SampingADCInit() ADC_REF_Init(REF_INTERNAL_2P5V, REF_INTERNAL_1P25V)
#define SetupCTypeChannle(gain) ADC_Init(ADC_0, SPS_977, gain, ADC0_AIN0, ADC0_AIN1)
#define SetupRTypeChannle() ADC_Init(ADC_1, SPS_977, GAIN32, ADC0_AIN3,ADC1_AIN4)
#define SetupATypeChannle() ADC_Init(ADC_1, SPS_977, GAIN16, ADC1_AIN3,ADC1_AIN4)
#define SetupVRHChannle() ADC_Init(ADC_1, SPS_977, GAIN1, ADC0_AIN2,ADC1_AVSS)
#define SetupIRHChannle() ADC_Init(ADC_1, SPS_977, GAIN16, ADC0_AIN5,ADC1_AIN4)
//---------------------------------------------------------------------------------
#else if (DP2201_CORE_V5020)
//---------------------------------------------------------------------------------
#define VCOM 1261.0
#define VREF_PER_CODE (ADC_VREF/32768)
#define VRR_BRIDGE_VOL (ADC_VREF - VCOM)
#define VRR_RA 33000.0
#define VRR_RB 7500.0
#define VRR_RDC (VRR_RB/(VRR_RA + VRR_RB))
#define VRR_VDC (VRR_BRIDGE_VOL*VRR_RDC)
#define VRR_ADC_GAIN 32.0
#define VRR_VREF ( VREF_PER_CODE/VRR_ADC_GAIN )
#define VRR_PER_CODE ( ADC_VREF/((ADC_VREF-VCOM)*GAIN*32768))
#define SampingADCInit() ADC_REF_Init(REF_INTERNAL_2P5V, REF_INTERNAL_1P25V)
#define SetupCTypeChannle(gain) ADC_Init(ADC_0, SPS_977, gain, ADC0_AIN0, ADC0_AIN1)
#define SetupRTypeChannle() ADC_Init(ADC_1, SPS_977, GAIN32, ADC1_AIN3,ADC1_AIN5)
#define SetupVRHChannle() ADC_Init(ADC_1, SPS_977, GAIN1, ADC1_AIN2,ADC1_AVSS)
#define SetupIRHChannle() ADC_Init(ADC_1, SPS_977, GAIN16, ADC1_AIN7,ADC1_AIN4)
#define SetupRTypeVDCChannle() ADC_Init(ADC_1, SPS_977, GAIN1, ADC1_REFP,ADC1_AIN5)
#define SetupRTypeVREFChannle() ADC_Init(ADC_0, SPS_977, GAIN1, ADC0_REFP,ADC0_AIN5)
//---------------------------------------------------------------------------------
#endif
//---------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------
#define StartSamplingADC() { \
ADC_SyncCmd(ENABLE); \
DMA_ADC_Init(ADC_0, sampleProcess.ADC0Buffer, sampleProcess.CounterMax); \
DMA_ADC_Init(ADC_1, sampleProcess.ADC1Buffer, sampleProcess.CounterMax); \
DMA_StartADC(ADC_0); \
DMA_StartADC(ADC_1); \
}
#define StopSamplingADC() { \
DMA_StopADC(ADC_0); \
DMA_StopADC(ADC_1); \
}
//---------------------------------------------------------------------------------------
#define sampleCTypeValue sampleProcess.ADC0Result
#define sampleATypeValue sampleProcess.ADC1Result
#define sampleRTypeValue sampleProcess.ADC1Result
#define ReadADCData()
//---------------------------------------------------------------------------------------
// 125ms/250ms/500ms/1000ms/2000ms/4000ms <20><><EFBFBD>ڶ<EFBFBD>ʱ uploadCounter: <20><><EFBFBD><EFBFBD>ֵ(>32.768)<29><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ֵ=(32768/1000)*t t(ms)Ϊ<><CEAA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
//#define USE_LPTIMER0
#define PrimaryTimer LPTIM1
#define StartPrimaryTimer( uploadCounter ) StartLPTimer1( uploadCounter )
#define ResetPrimaryTimer( uploadCounter ) ResetLPTimer1( uploadCounter )
#define EnablePrimaryTimerInterrupt() EnableLPTimer1Interrupt()
#define DisablePrimaryTimerInterrupt() DisableTimer1Interrupt()
#define StopPrimaryTimer() StopLPTimer1()
//#define PrimaryTimer_IRQ_Callback PrimaryTimer_IRQ_Callback// ManagePrimaryTimeInterval
//---------------------------------------------------------------------------------------
// 1ms<6D><73>׼<EFBFBD><D7BC>ʱ uploadCounter: <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ڣ<EFBFBD><DAA3><EFBFBD>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><>Χ:(1~4000)
//#define USE_TIMER2
#define ProcessTimer TIM1
#define ProcessTimerIT TIM_IT_CC1
#define StartProcessTimer(uploadCounter) StartTimer1_CC1(uploadCounter)
#define ResetProcessTimer(uploadCounter) ResetTimer1_CC1(uploadCounter)
#define StopProcessTimer() StopTimer1()
#define EnableProcessTimerInterrupt() NVIC_EnableIRQ(TIM1_IRQn); // EnableTimer2Interrupt()
#define DisableProcessTimerInterrupt() NVIC_DisableIRQ(TIM1_IRQn); // DisableTimer2Interrupt()
//#define Timer2InterruptCallBack()
//#define ProcessTimer_IRQ_Callback ProcessTimerInterruptCallBack
//---------------------------------------------------------------------------------------
//<2F>Ƚ϶<C8BD>ʱ uploadCounter: <20><><EFBFBD><EFBFBD>ֵ(1~65535)<29><><EFBFBD><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD>ֵ=(65535/4000)*t t(ms)Ϊ<><CEAA><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
//#define USE_TIMER1
//#define SamplingTimer TIM1
//#define StartSamplingTimer(uploadCounter) StartTimer1_CC1(uploadCounter)
//#define ResetSamplingTimer(uploadCounter) ResetTimer1_CC1(uploadCounter)
//#define StopSamplingTimer() StopTimer1()
//#define EnableSamplingInterrupt() NVIC_EnableIRQ(TIM1_IRQn); // EnableTimer1Interrupt()
//#define DisableSamplingInterrupt() NVIC_DisableIRQ(TIM1_IRQn); // DisableTimer1Interrupt()
//#define SamplingTimer_IRQ_Callback ProcessTimerInterruptCallBack
#define TEMP_SENSOR_RESULT RESULT_0_25_BIT
// *****************************************************************************
typedef struct
{
u16 DisplayZero : 1; // 1
u16 Mode: 2; // 3
u16 CType: 1; // 5
u16 AType: 2; // 7
u16 PreSampling: 1; // 10
u16 AutoDetectOffset: 1; // 11
u16 AutoDetectProcess: 2; // 13
u16 EnableRHTest : 1; // 14
u16 EnableRoughTest: 1; // 15
} __SAMPLE_STATUS_BIT_TypeDef;
typedef struct
{
__SAMPLE_STATUS_BIT_TypeDef State;
u16 NextRun;
u16 NextTime;
u16 Counter;
u16 CounterMax;
u16 CTypeGain;
u16 CTypeResult;
u16 ATypeResult;
u16 RTypeResult;
u32 ADC0Result;
u32 ADC1Result;
u32 ADC0Buffer[70];
u32 ADC1Buffer[70];
} TypeSample;
typedef struct
{
unsigned int CalTA;
unsigned int Value[3];
unsigned int DeltaVHH;
unsigned int TUVHH;
unsigned int TDVHH;
unsigned int TUIndex;
unsigned int TDIndex;
} TypeCalibOffset;
// *****************************************************************************
extern unsigned short int FRType;
// *****************************************************************************
void SetNextProcess(void);
void AnalogCircuitInit(void);
void EnableRHControlByTD(void);
void EnableRHControlByTU(void);
void TurnOffAnalogCircuit(void);
void RapidHeating(void);
void FirstStageHeating(void);
void StartNormolFlowMeasurement(void);
bool JudgmentFlowRate(void);
void CheckATypeSensor(void);
bool CheckSensor(u16 voltageIndex);
//void TemperatureCorrection(void)
u16 ComputeCTypeIndex(u16 detectIndex, u16 indexOffset);;
void ComputeFlowRateIndexAndFlowRate(void);
void FlowRateDealAndOuputSub(void);
void ComputeSampleData(u16 sampleNum, u16 sampleShift);
void SetSystemForADCSample(u16 sampleNum);
void ProcessTimerInterruptCallBack(void);
void FlowProcessManagement(void);
void CoreInit(void);
void CoreColdStartProcessing(void);
//void SamplingTimer_IRQ_Callback(void)
void PrimaryTimer_IRQ_Callback();
void SystemPolling(void);
//**************************************************************************
//File End------------------------------------------------------------------
#endif
//.h End--------------------------------------------------------------------
#endif

View File

@@ -0,0 +1,168 @@
#ifndef __DP2201_V5000_PARAMETER_h__
#define __DP2201_V5000_PARAMETER_h__
//##############################################################################
#if DP2201_CORE_V5000
// <20><>Ҫ<EFBFBD><EFBFBD><E6B4A2><EFBFBD><EFBFBD><EFBFBD>õ<EFBFBD><C3B5>ڲ<EFBFBD><DAB2><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
//#define INT_PROTOCOL 0x8210 // MODBUS Slaver Addr
//#define INT_SLAVER_ADDR 0x8211 // MODBUS Slaver Addr
#define MeterFactor WordReg[REG_0X8212]
#undef REG_0X8212_VALUE
#define REG_0X8212_VALUE {10000,0,1000}
//#define INT_GDCF 0x8213
//#define INT_MAX_FLOW 0x8214
//#define INT_OFFSET_GAS 0x8216
#define offsetAir WordReg[REG_0X8217]
#define factoryInterval WordReg[REG_0X8218]
#undef REG_0X8218_VALUE
#define REG_0X8218_VALUE { RESP_4000MS, RESP_125MS, SAMPLE_PERIOD_DEFAULT }
//#define INT_HISTORY_PERIOD 0x8219
//#define INT_PULSE_UNIT 0x821A
//#define INT_MAX_LOOP_FR 0x821B
#define SensorSN0 WordReg[REG_0X821D]
#define SensorSN1 WordReg[REG_0X821E]
#define SensorSN2 WordReg[REG_0X821F]
//#define INT_TOTAL_ACC 0x8220 // 0x8220-0x8225
#define calibTemperature WordReg[REG_0X8226]
#undef REG_0X8226_VALUE
#define REG_0X8226_VALUE {13500 ,10500, 12500} // 0x8226
//#define INT_OFFSET_A_GAS 0x8227
//#define INT_OFFSET_A_AIR 0x8228
//#define INT_ATYPE_INDEX_GAIN 0x8229
//#define INT_GDCF_ATYPE 0x822A
//#define INT_GDCF_CTYPE 0x822B
//#define INT_CALIB_PIPE 0x822C
//#define INT_WORK_PIPE 0x822D
//#define INT_WORK_UNIT 0x822E
#define language WordReg[REG_0X822F]
#undef REG_0X822F_VALUE
#define REG_0X822F_VALUE {LANGUAGE_MAX, LANGUAGE_MIN, DIS_LANGUAGE_DEFAULT}
//#define INT_ACC_OUT_BIT 0x8230
#define reverseScale WordReg[REG_0X8231]
#undef REG_0X8231_VALUE
#define REG_0X8231_VALUE {16000,100, 3000}
#define VHHHigh WordReg[REG_0X8232]
#define VHHRoom WordReg[REG_0X8233]
#define VHHLow WordReg[REG_0X8234]
#define RHHighTa WordReg[REG_0X8235]
//#define RHHighTa WordReg[REG_0X8236]
#define RHLowTa WordReg[REG_0X8237]
#define RRHigh WordReg[REG_0X8238]
#define RRRoom WordReg[REG_0X8239]
#define RRLow WordReg[REG_0X823A]
//#define INT_GCF_A 0x823B
//#define INT_GCF_B 0x823D
//#define INT_GCF_C 0x823E
//#define INT_RH_GAINRES 0x8240
//#define INT_RR_GAINRES 0x8241
#define zeroSuppression WordReg[REG_0X8244]
#undef REG_0X8244_VALUE
#define REG_0X8244_VALUE { 2000, 10, 100}
#define staticLowTemperature WordReg[REG_0X8245]
#undef REG_0X8245_VALUE
#define REG_0X8245_VALUE {11000, 7500,10000}
#define staticHighTemperature WordReg[REG_0X8246]
#undef REG_0X8246_VALUE
#define REG_0X8246_VALUE {17000,14500,15000}
//#define INT_PULSE_COUNTER 0x8247 // byte = 4
//#define INT_ATYPE_RC 0x8249 //
//#define INT_ATYPE_WIPER 0x824A //
//#define INT_CTYPE_WIPER 0x824B //
//#define INT_CTYPE_ADC 0x824C /
#define OffsetHigh WordReg[REG_0X824D]
#undef REG_0X824D_VALUE
#define REG_0X824D_VALUE {60000, 5000,32768}
#define OffsetLow WordReg[REG_0X824E]
#undef REG_0X824E_VALUE
#define REG_0X824E_VALUE {60000, 5000,32768}
//
//#define INT_TRH_HIGH 0x824F //
//#define INT_TRH_LOW 0x8250 //
//#define INT_MEMS_RATIO 0x8251 //
//#define INT_SYS_LCD 0x8252 //
//#define INT_SYS_CHIP 0x8253
#define temperatureFactor WordReg[REG_0X8254]
#undef REG_0X8254_VALUE
#define REG_0X8254_VALUE { 100, 0, 25}
//
#define offsetGasGainx WordReg[REG_0X8255]
#define offsetAirGainx WordReg[REG_0X8256]
//#define INT_OFFSET_RGINX 0x8257
#define P0RhHigh WordReg[REG_0X8258]
#define P0RhLow WordReg[REG_0X8259]
#define adcGain WordReg[REG_0X825A]
#undef REG_0X825A_VALUE
#define REG_0X825A_VALUE { 128, 1, 32}
#define resFactor WordReg[REG_0X825B]
#undef REG_0X825B_VALUE
#define REG_0X825B_VALUE { 100, 0, 30}
//#define INT_BATTEST_PERIOD 0x825C
//#define INT_FR_SWITCH_POINT 0x825D
#define calibFlowGain WordReg[REG_0X825F]
#undef REG_0X825F_VALUE
#define REG_0X825F_VALUE { 1000, 1, 1} // У׼<D0A3><D7BC><EFBFBD><EFBFBD><EFBFBD>Ŵ<EFBFBD><C5B4><EFBFBD><EFBFBD><EFBFBD>
//#define INT_AUTO_CALIB_ATYPE 0x8260
//#define INT_USER_INIT_INDEX 0x8261
//#define INT_DIVHX_HIGH 0x8262
//#define INT_DIVHX_ROOM 0x8263
//#define INT_DIVHX_LOW 0x8264
#define VDUGXHigh WordReg[REG_0X8265]
//#define INT_VDUGX_ROOM 0x8266
#define VDUGXLow WordReg[REG_0X8267]
#define sampleSwitchThreshold WordReg[REG_0X8268]
#undef REG_0X8268_VALUE
#define REG_0X8268_VALUE { 4000, 0, 2500}
/*******************************************************************************/
#define keyPassWord DWordReg[REG_0X8280]
#undef REG_0X8280_VALUE
#define REG_0X8280_VALUE {0xFFFFFFFF, 0, 11111}
/*******************************************************************************/
#define ReadShortParameterFromMemory(parameterAdr, parameterDefault) ReadShortParameterFromEEPROM(parameterAdr, parameterDefault)
#define ReadLongParameterFromMemory(parameterAdr, parameterDefault) ReadLongParameterFromEEPROM(parameterAdr, parameterDefault)
#define WriteShortParameterToMemory(WRAddr) WriteShortParameterToEEPROM(WRAddr)
#define WriteLongParameterToMemory(WRAddr) WriteLongParameterToEEPROM(WRAddr)
#define ReadMultiByteFromMemory(address, wrtData, dataLenth) ReadMultiByteFromEEPROM(address, wrtData, dataLenth, PARA_EEPROM)
#define WriteMultiByteToMemory(address, wrtData, dataLenth) WriteMultiByteToEEPROM(address, wrtData, dataLenth, PARA_EEPROM)
#define ReadCalbrationDataFromMemory(address, wrtData, dataLenth) ReadMultiByteFromEEPROM(address, wrtData, dataLenth, PARA_EEPROM)
#define WriteCalbrationDataToMemory(address, wrtData, dataLenth) WriteMultiByteToEEPROM(address, wrtData, dataLenth, PARA_EEPROM)
#define ReadMultiByteFromFRAM(address, wrtData, dataLenth) ReadMultiByteFromEEPROM(address, wrtData, dataLenth, PARA_EEPROM)
#define WriteMultiByteToFRAM(address, wrtData, dataLenth) WriteMultiByteToEEPROM(address, wrtData, dataLenth, PARA_EEPROM)
/*******************************************************************************/
//#define ReadShortParameterFromMemory(parameterAdr, parameterDefault) ReadShortParameterFromFlash(parameterAdr, parameterDefault)
//#define ReadLongParameterFromMemory(parameterAdr, parameterDefault) ReadLongParameterFromFlash(parameterAdr, parameterDefault)
//#define WriteShortParameterToMemory(WRAddr) WriteShortParameterToFlash(WRAddr)
//#define WriteLongParameterToMemory(WRAddr) WriteLongParameterToFlash(WRAddr)
//#define ReadMultiByteFromMemory(address, wrtData, dataLenth, flashAdr) ReadMultiByteFromFlash(address, wrtData, dataLenth, flashAdr)
//#define WriteMultiByteToMemory(address, wrtData, dataLenth, flashAdr) WriteMultiByteToFlash(address, wrtData, dataLenth, flashAdr)
#define DisableSamplingInterrupt();
#endif
#endif