NANO130_H2Press/User/adc_sample.c

661 lines
20 KiB
C
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#include "includes.h"
// *** 每个通道总共采样多次,排序以后,去掉最小和最大的几个,取中间的几个值做平均
// ADC采样次数
#define ADC_SAMPLE_COUNT (24)
// ADC平均值次数
#define ADC_AVGVAL_COUNT (16)
// 采样通道数
#define SAMPLE_CHANNEL_COUNT 12
// ADC采样补偿
#define ADC_COMPENSATE 0
// 通过界面请求采集的标志
volatile uint8_t Config_Sample_Request = 0;
// 电容采集失败的标志
volatile uint8_t Capa_Sample_failed = 0;
// 电容采集结束的标志
volatile uint8_t Capa_Sample_finish = 0;
// 得到采集数据的通知
volatile uint8_t GPRS_semSampled = 0;
void PWM0_IRQHandler(void)
{
if(PWM_GetCaptureIntFlag(PWM0, 3) & PWM_RISING_LATCH_INT_FLAG) // 上升沿,脉冲开始
{
PWM_ClearPeriodIntFlag(PWM0, 3);
PWM_ClearCaptureIntFlag(PWM0, 3, PWM_RISING_LATCH_INT_FLAG);
}
if(PWM_GetCaptureIntFlag(PWM0, 3) & PWM_FALLING_LATCH_INT_FLAG) // 下降沿,脉冲结束
{
PWM_DisablePeriodInt(PWM0, 3); // 停止超时计数
PWM_ClearPeriodIntFlag(PWM0, 3);
// 发送消息
Capa_Sample_finish = 1;
PWM_ClearCaptureIntFlag(PWM0, 3, PWM_FALLING_LATCH_INT_FLAG);
}
if(PWM_GetPeriodIntFlag(PWM0, 3)) // 超时(短路)
{
Capa_Sample_failed = 1; // 测电容失败
// 发送消息
Capa_Sample_finish = 1;
PWM_DisablePeriodInt(PWM0, 3);
PWM_ClearPeriodIntFlag(PWM0, 3);
}
}
void Sample_Init()
{
/* ADC clock source is 12MHz, set divider to 6, ADC clock is 2 MHz */
CLK_SetModuleClock(ADC_MODULE, CLK_CLKSEL1_ADC_S_HXT, CLK_ADC_CLK_DIVIDER(6));
/*---------------------------------------------------------------------------------------------------------*/
/* Init I/O Multi-function */
/*---------------------------------------------------------------------------------------------------------*/
/* Configure the PA6BAT_VAL), PA5(P), PA4(DP), PA3-2(T_2), PA1-0(T_1) analog input pins. */
SYS->PA_L_MFP &= ~(SYS_PA_L_MFP_PA6_MFP_Msk | SYS_PA_L_MFP_PA5_MFP_Msk | SYS_PA_L_MFP_PA4_MFP_Msk);
SYS->PA_L_MFP |= (SYS_PA_L_MFP_PA6_MFP_ADC_CH6 | SYS_PA_L_MFP_PA5_MFP_ADC_CH5 | SYS_PA_L_MFP_PA4_MFP_ADC_CH4);
SYS->PA_L_MFP &= ~(SYS_PA_L_MFP_PA3_MFP_Msk | SYS_PA_L_MFP_PA2_MFP_Msk
| SYS_PA_L_MFP_PA1_MFP_Msk | SYS_PA_L_MFP_PA0_MFP_Msk);
SYS->PA_L_MFP |= (SYS_PA_L_MFP_PA3_MFP_ADC_CH3 | SYS_PA_L_MFP_PA2_MFP_ADC_CH2
| SYS_PA_L_MFP_PA1_MFP_ADC_CH1 | SYS_PA_L_MFP_PA0_MFP_ADC_CH0);
/* Disable the PA6~0 digital input path to avoid the leakage current. */
GPIO_DISABLE_DIGITAL_PATH(PA, 0x007Ful);
/* Enable ADC module clock */
CLK_EnableModuleClock(ADC_MODULE);
// // PA.15 as CAP_CAPTURE
// SYS->PA_H_MFP &= ~SYS_PA_H_MFP_PA15_MFP_Msk;
// SYS->PA_H_MFP |= SYS_PA_H_MFP_PA15_MFP_PWM0_CH3;
// // PB.8 as CAP_TRIGGER
// SYS->PB_H_MFP &= ~SYS_PB_H_MFP_PB8_MFP_Msk;
// SYS->PB_H_MFP |= SYS_PB_H_MFP_PB8_MFP_GPB8;
// GPIO_SetMode(PB, BIT8, GPIO_PMD_OUTPUT);
//
// /* PWM clock frequency can be set equal or double to HCLK by choosing case 1 or case 2 */
// /* case 1.PWM clock frequency is set equal to HCLK: select PWM module clock source as PCLK */
// /* case 2.PWM clock frequency is set double to HCLK: select PWM module clock source as PLL */
// CLK_SetModuleClock(PWM0_CH23_MODULE, CLK_CLKSEL1_PWM0_CH23_S_HCLK, NULL);
// /* Enable PWM module clock */
// CLK_EnableModuleClock(PWM0_CH23_MODULE);
//Enable Timer1 clock and select Timer1 clock source
CLK_EnableModuleClock(TMR1_MODULE);
CLK_SetModuleClock(TMR1_MODULE, CLK_CLKSEL1_TMR1_S_HXT, 0);
}
void Sample_Open()
{
// 设置传感器状态
dcBuff.sampleData.vacuum[0].staVacuum = VACUUM_STATUS_COMM_FAULT;
dcBuff.sampleData.leak.staLeak = LEAK_STATUS_COMM_FAULT;
/* Set the ADC internal sampling time, input mode as single-end and enable the A/D converter */
ADC_Open(ADC, ADC_INPUT_MODE_SINGLE_END, ADC_OPERATION_MODE_SINGLE, 0);
// Set reference voltage to VREF
ADC_SET_REF_VOLTAGE(ADC, ADC_REFSEL_VREF);
ADC->CALCTL &= ~0x0001; // 关掉校准
// /* Reset PWM0 module */
// SYS_ResetModule(PWM0_RST);
// /* set PWM0 channel 1 capture configurationtime unit is 166ns */
// PWM_ConfigCaptureChannel(PWM0, 3, 166, 0);
// /* Enable rising capture reload */
// PWM0->CAPCTL &= ~PWM_CAPCTL_CAPRELOADFEN3_Msk;
// PWM0->CAPCTL |= PWM_CAPCTL_CAPRELOADREN3_Msk;
// /* Enable Timer for PWM0 channel 3 */
// PWM_Start(PWM0, PWM_CH_3_MASK);
// /* Enable Capture Function for PWM0 channel 3 */
// PWM_EnableCapture(PWM0, PWM_CH_3_MASK);
// NVIC_SetPriority (PWM0_IRQn, 1);
// NVIC_EnableIRQ(PWM0_IRQn);
// 采集任务,优先级较高
NVIC_SetPriority (TMR1_IRQn, 2); /* set Priority for Sample Interrupt */
NVIC_EnableIRQ(TMR1_IRQn);
}
// ADC采集、计算
void Sample_Task(data_sample_t *sample)
{
uint8_t ch;
uint32_t oriData[ADC_SAMPLE_COUNT]; // 原始采集数据
uint32_t sampleData[SAMPLE_CHANNEL_COUNT][1];
int16_t i, j;
Calculate_Theoretical_Params();
if(dcBuff.configDisplay.op_USE_PT100_SENSOR)
PT100_Calculate_Theoretical_Params(-200, 80);
// 采集数据
memset(sampleData, 0, sizeof(sampleData));
Capa_Sample_failed = 0; // 默认测电容成功
for(ch = 0; ch < SAMPLE_CHANNEL_COUNT; ch++)
{
// 无差压
if(ch == 0)
continue;
// 扩展压力23
if(ch >= 3 && ch <= 4)
continue;
// 无扩展温度3差分
if(ch >= 9 && ch <= 10)
continue;
memset(oriData, 0, sizeof(oriData));
// 每个通道采集多次
for(i = 0; i < ADC_SAMPLE_COUNT; i++)
{
// 为了避免ADC模块的使用冲突测量电压和传感器采样在一起执行
// 因称重传感器未用故将电池电压的adc值存放在称重传感器的位置
if(ch == 1)
{
// 连接采样模块到压力通道
ADC_SET_INPUT_CHANNEL(ADC, ADC_CH_5_MASK);
}
else if(ch == 2)
{
// 连接采样模块到第二路压力通道(占用差压口子)
ADC_SET_INPUT_CHANNEL(ADC, ADC_CH_4_MASK);
}
else if(ch == 5)
{
// 连接采样模块到扩展温度1上通道
ADC_SET_INPUT_CHANNEL(ADC, ADC_CH_0_MASK);
}
else if(ch == 6)
{
// 连接采样模块到扩展温度1下通道
ADC_SET_INPUT_CHANNEL(ADC, ADC_CH_1_MASK);
}
else if(ch == 7)
{
// 连接采样模块到扩展温度2上通道
ADC_SET_INPUT_CHANNEL(ADC, ADC_CH_2_MASK);
}
else if(ch == 8)
{
// 连接采样模块到扩展温度2下通道
ADC_SET_INPUT_CHANNEL(ADC, ADC_CH_3_MASK);
}
else // ch == 11
{
// 连接采样模块到电池通道
ADC_SET_INPUT_CHANNEL(ADC, ADC_CH_6_MASK);
}
// 清除ADIF0
ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);
// 允许ADIE0
ADC_EnableInt(ADC, ADC_ADF_INT);
// 触发采样模块,开始采样
ADC_START_CONV(ADC);
while(!(ADC_GET_INT_FLAG(ADC, ADC_ADF_INT) & ADC_ADF_INT))
__NOP();
ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);
if(ch == 1)
oriData[i] = ADC_GET_CONVERSION_DATA(ADC, 5);
else if(ch == 2)
oriData[i] = ADC_GET_CONVERSION_DATA(ADC, 4);
else if(ch == 5)
oriData[i] = ADC_GET_CONVERSION_DATA(ADC, 0);
else if(ch == 6)
oriData[i] = ADC_GET_CONVERSION_DATA(ADC, 1);
else if(ch == 7)
oriData[i] = ADC_GET_CONVERSION_DATA(ADC, 2);
else if(ch == 8)
oriData[i] = ADC_GET_CONVERSION_DATA(ADC, 3);
else // ch == 11
oriData[i] = ADC_GET_CONVERSION_DATA(ADC, 6);
if(oriData[i] + ADC_COMPENSATE > 4095)
oriData[i] = 4095;
else
oriData[i] += ADC_COMPENSATE;
// 禁止ADIE0
ADC_DisableInt(ADC, ADC_ADF_INT);
}
// 排序
sort(oriData, ADC_SAMPLE_COUNT);
// if(ch == 1)
// {
// printf("\n");
// for(i = 0; i < ADC_SAMPLE_COUNT; i++)
// {
// printf("oriData[%d]: %d\n", i, oriData[i]);
// }
// printf("\n");
// }
// 去掉最小最大值,求和
for(i = 0, j = (ADC_SAMPLE_COUNT - ADC_AVGVAL_COUNT) / 2; i < ADC_AVGVAL_COUNT; i++, j++)
{
if(oriData[j] != -1)
sampleData[ch][0] += oriData[j];
else
sampleData[ch][0] = -1;
}
// 求平均值
if(sampleData[ch][0] != -1)
sampleData[ch][0] /= ADC_AVGVAL_COUNT;
}
ADC_POWER_DOWN(ADC);
printf("\n");
for(i = 0; i < SAMPLE_CHANNEL_COUNT; i++)
{
if(i == 0)
continue;
if(i >= 3 && i <= 4)
continue;
if(i >= 9 && i <= 10)
continue;
printf("sampleData[%d][0] = %d\n", i, sampleData[i][0]);
}
// 计算结果
// 液位(不支持)
#if 0
// sampleData[0][0] = dcBuff.configSensor.sensorDPress.zeroValue
// + (dcBuff.configSensor.sensorDPress.fullValue - dcBuff.configSensor.sensorDPress.zeroValue) / (1 + rand() % 10);
sample->adDPress = sampleData[0][0];
sample->staDPress.status = ADC_Validate(sampleData[0][0],
dcBuff.configSensor.sensorDPress.zeroValue, dcBuff.configSensor.sensorDPress.fullValue);
if(sample->staDPress.status == SENSOR_STATUS_NORMAL)
{
sample->diff = ADC_Calculate(sampleData[0][0],
dcBuff.configSensor.sensorDPress.zeroValue, dcBuff.configSensor.sensorDPress.fullValue,
dcBuff.configSensor.sensorDPress.lowRange, dcBuff.configSensor.sensorDPress.highRange);
}
#endif
// 压力
// sampleData[1][0] = dcBuff.configSensor.sensorPress.zeroValue
// + (dcBuff.configSensor.sensorPress.fullValue - dcBuff.configSensor.sensorPress.zeroValue) / (1 + rand() % 10);
sample->adPress = sampleData[1][0];
sample->staPress.status = ADC_Validate(sampleData[1][0],
dcBuff.configSensor.sensorPress.zeroValue, dcBuff.configSensor.sensorPress.fullValue);
if(sample->staPress.status == SENSOR_STATUS_NORMAL)
{
sample->pressure = ADC_Calculate(sampleData[1][0],
dcBuff.configSensor.sensorPress.zeroValue, dcBuff.configSensor.sensorPress.fullValue,
dcBuff.configSensor.sensorPress.lowRange, dcBuff.configSensor.sensorPress.highRange);
}
// 扩展压力1
for(i = 0; i < 1; i++)
{
// sampleData[2 + i][0] = dcBuff.configSensor.sensorEPress[i].zeroValue
// + (dcBuff.configSensor.sensorEPress[i].fullValue - dcBuff.configSensor.sensorEPress[i].zeroValue) / (1 + rand() % 10);
sample->adExtPress[i] = sampleData[2 + i][0];
sample->staExtPress[i].status = ADC_Validate(sampleData[2 + i][0],
dcBuff.configSensor.sensorEPress[i].zeroValue, dcBuff.configSensor.sensorEPress[i].fullValue);
if(sample->staExtPress[i].status == SENSOR_STATUS_NORMAL)
{
sample->extPressure[i] = ADC_Calculate(sampleData[2 + i][0],
dcBuff.configSensor.sensorEPress[i].zeroValue, dcBuff.configSensor.sensorEPress[i].fullValue,
dcBuff.configSensor.sensorEPress[i].lowRange, dcBuff.configSensor.sensorEPress[i].highRange);
}
}
if(dcBuff.configDisplay.op_DIFF_RESIST)
{
// 扩展温度2路
for(i = 0; i < 2; i++)
{
sample->adExtTempr[i] = PT100_CalResit(sampleData[5 + i * 2][0], sampleData[5 + i * 2 + 1][0]);
sample->staExtTempr[i].status = ADC_Validate(sample->adExtTempr[i],
PT100_Resis[0] * dcBuff.configDisplay.op_PT100_MULTI, PT100_Resis[sizeof(PT100_Resis) / sizeof(float) - 1] * dcBuff.configDisplay.op_PT100_MULTI);
if(sample->staExtTempr[i].status == SENSOR_STATUS_NORMAL)
{
sample->extTempr[i] = PT100_CalTempr(sampleData[5 + i * 2][0], sampleData[5 + i * 2 + 1][0],
dcBuff.configSensor.sensorPTempr[i].calibrateT, dcBuff.configSensor.sensorPTempr[i].calibrateR);
}
}
}
else
{
// 扩展温度2路
for(i = 0; i < 2; i++)
{
// sampleData[5 + i * 2][0] = dcBuff.configSensor.sensorMTempr[i].zeroValue
// + (dcBuff.configSensor.sensorMTempr[i].fullValue - dcBuff.configSensor.sensorMTempr[i].zeroValue) / (1 + rand() % 10);
sample->adExtTempr[i] = sampleData[5 + i * 2][0];
sample->staExtTempr[i].status = ADC_Validate(sampleData[5 + i * 2][0],
dcBuff.configSensor.sensorMTempr[i].zeroValue, dcBuff.configSensor.sensorMTempr[i].fullValue);
if(sample->staExtTempr[i].status == SENSOR_STATUS_NORMAL)
{
if(!dcBuff.configDisplay.op_USE_PT100_SENSOR)
sample->extTempr[i] = ADC_Calculate(sampleData[5 + i * 2][0],
dcBuff.configSensor.sensorMTempr[i].zeroValue, dcBuff.configSensor.sensorMTempr[i].fullValue,
dcBuff.configSensor.sensorMTempr[i].lowRange, dcBuff.configSensor.sensorMTempr[i].highRange);
else
sample->extTempr[i] = PT100_CalTempr(sampleData[5 + i * 2][0], 0,
dcBuff.configSensor.sensorPTempr[i].calibrateT, dcBuff.configSensor.sensorPTempr[i].calibrateR);
}
}
}
// 为了避免ADC模块的使用冲突测量电压和传感器采样在一起执行
// 因称重传感器未用故将电池电压的adc值存放在称重传感器的位置
sample->adWeight = sampleData[SAMPLE_CHANNEL_COUNT - 1][0];
// 总容积
sample->volumeTotal = Theoretical_Param.v;
// 计算标方容积,不考虑压缩因子
if(sample->staPress.status == SENSOR_STATUS_NORMAL && sample->staExtTempr[0].status == SENSOR_STATUS_NORMAL)
sample->volume = Theoretical_Param.v * (sample->pressure / 101.325) * (273.15 / (sample->extTempr[0] + 273.15));
else
sample->volume = 0;
}
void Sample_CheckWarning(data_sample_t *sample)
{
static uint16_t last_Press = 0;
static int16_t last_Tempr = -300;
static uint16_t last_Vacuum = 0;
// 判断是否压力报警
if(sample->staPress.status == SENSOR_STATUS_NORMAL)
{
if(dcBuff.configBottle.warnPress > 0 && last_Press > dcBuff.configBottle.warnPress && sample->pressure <= dcBuff.configBottle.warnPress)
sample->warnning = 1;
if(dcBuff.configBottle.warnPressH > 0 && last_Press < dcBuff.configBottle.warnPressH && sample->pressure >= dcBuff.configBottle.warnPressH)
sample->warnning = 1;
if(sample->warnning)
printf("\n*** Pressure warnning ***\n");
// 记录采集值
last_Press = sample->pressure;
}
// 判断是否温度报警
if(dcBuff.configBottle.serverVer != 3 && !dcBuff.configDisplay.op_LEVEL_SENSOR_ONLY)
{
if(sample->staExtTempr[0].status == SENSOR_STATUS_NORMAL)
{
if(dcBuff.configBottle.warnTempr > -300 && last_Tempr > dcBuff.configBottle.warnTempr && sample->extTempr[0] <= dcBuff.configBottle.warnTempr)
sample->warnning = 1;
if(dcBuff.configBottle.warnTemprH > -300 && last_Tempr < dcBuff.configBottle.warnTemprH && sample->extTempr[0] >= dcBuff.configBottle.warnTemprH)
sample->warnning = 1;
// 记录采集值
last_Tempr = sample->extTempr[0];
}
}
// 判断是否真空度报警
if(dcBuff.configBottle.serverVer != 3 && sample->vacuum[0].staVacuum == VACUUM_STATUS_OK)
{
if(dcBuff.configBottle.warnVacuumH > 0 && last_Vacuum < dcBuff.configBottle.warnVacuumH * 0.01 && sample->vacuum[0].vacuum >= dcBuff.configBottle.warnVacuumH * 0.01)
sample->warnning = 1;
// 记录采集值
last_Vacuum = sample->vacuum[0].vacuum;
}
}
void Sample_Print(data_sample_t *sample)
{
int16_t i, j;
/* Get the conversion result */
// printf("\nConversion result of diff: \t\t%02X, %.1f kPa", sample->staDPress.status, sample->diff);
// printf("\nConversion result of press: \t\t%02X, %.2f MPa", sample->staPress.status, (float) sample->pressure / 1000);
for(i = 0; i < 0; i++)
printf("\nConversion result of extPress[%d]: \t%02X, %.2f MPa", i, sample->staExtPress[i].status, (float) sample->extPressure[i] / 1000);
// for(i = 0; i < 2; i++)
// printf("\nConversion result of extTempr[%d]: \t%02X, %d ℃", i, sample->staExtTempr[i].status, sample->extTempr[i]);
// printf("\nConversion result of height: \t\t%.0f mm", sample->height);
// printf("\nConversion result of volTol: \t\t%u L", sample->volumeTotal);
// printf("\nConversion result of volume: \t\t%u L", sample->volume);
// printf("\nConversion result of volPct: \t\t%.2f %%", (float) sample->volumePct / 100);
// printf("\nConversion result of charging: \t\t%d", sample->charging);
//
// printf("\nConversion result of staVacuum: \t%u", sample->vacuum[0].staVacuum);
// printf("\nConversion result of lifeVacuum: \t%u Months", sample->vacuum[0].lifeVacuum);
// printf("\nConversion result of vacuum: \t\t%.2f Pa", sample->vacuum[0].vacuum);
// printf("\nConversion result of rateVacuum: \t%.2f Pa.M3/s", sample->vacuum[0].rateVacuum);
// printf("\nConversion result of typeLeak: \t\t%u", sample->leak.typeLeak);
// printf("\nConversion result of staLeak: \t\t%u", sample->leak.staLeak);
// printf("\nConversion result of concentrations: \t%u %%", sample->leak.concentrations);
printf("\n");
}
// 以毫秒为单位设置定时器时间
// 预分频比为8CMP为24位
// 按12M主频计算最大可延时11秒
void TIMER_MyOpen(TIMER_T *timer, uint32_t u32Mode, uint32_t u32Ms)
{
uint32_t u32Clk = TIMER_GetModuleClock(timer);
uint32_t u32Cmpr = 0, u32Prescale = 0;
// 先对定时器软件复位
timer->CTL = 2;
u32Prescale = 7; // real prescaler value is
u32Clk >>= 3;
u32Cmpr = u32Clk / 1000 * u32Ms;
timer->CMPR = u32Cmpr;
timer->PRECNT = u32Prescale;
timer->CTL = u32Mode;
}
void Sample_StartTimer(TIMER_T *timer, uint16_t ms)
{
// 设置定时器的周期
TIMER_MyOpen(timer, TIMER_ONESHOT_MODE, ms);
// 启动定时器
TIMER_EnableInt(timer);
TIMER_Start(timer);
}
// 当前采集阶段
volatile uint8_t Sample_phase = 0;
// 采集是否忙
uint32_t Sample_Busy()
{
return (Sample_phase != 0);
}
void TMR1_IRQHandler(void)
{
static data_sample_t sample;
static data_dtu_t dtuSample;
static uint8_t lastLeakWarning = 0;
// 每隔8小时测一次真空上电第一次不测
static uint32_t vacuum_seconds = 30;
uint32_t sample_time;
S_RTC_TIME_DATA_T sRTC;
// 清除中断,复位定时器
TIMER_Close(TIMER1);
NVIC_ClearPendingIRQ(TMR1_IRQn);
TIMER_ClearIntFlag(TIMER1);
if(Sample_phase == 0)
{
// 下一阶段:采集数据(为避免重复进入采集任务,尽快设置下一阶段)
Sample_phase = 1;
// 初始化准备
memset(&sample, 0, sizeof(data_sample_t));
// Modbus传感器默认为沿用原来的数据
sample.vacuum[0] = dcBuff.sampleData.vacuum[0];
sample.leak = dcBuff.sampleData.leak;
sample.flow = dcBuff.sampleData.flow;
// TODO: 打开电源
ADC_POWER_ON(ADC);
VCC_SENSOR_5V_ON();
// 延时600ms以后进入采集阶段
Sample_StartTimer(TIMER1, 600);
}
else if(Sample_phase == 1)
{
// TODO: 采集数据
Sample_Task(&sample);
// Modbus采集真空计
Sample_phase = 2;
// 直接触发下一阶段
NVIC_SetPendingIRQ(TMR1_IRQn);
}
else if(Sample_phase == 2)
{
// 获取当前时间
RTC_GetDateAndTime(&sRTC);
// 计算自上次gps定位以来的时间
sample_time = Calc_SecondsFromYear(INITIAL_YEAR, sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second);
// 是否到采集时间3秒误差
if(sample_time + 3 < vacuum_seconds)
{
// 下一阶段:采集泄露计
Sample_phase = 5;
// 直接触发下一阶段
NVIC_SetPendingIRQ(TMR1_IRQn);
}
else
{
// 下次上传时再采
vacuum_seconds = sample_time + dcBuff.configData.intervalTrans;
// 下一阶段:采集真空计,需要额外延时
Sample_phase = 3;
// 等待8s以后进入下一阶段
Sample_StartTimer(TIMER1, 10000);
}
}
else if(Sample_phase == 3)
{
// 下一阶段:采集真空计,需要额外延时
Sample_phase = 4;
// 采集真空计需要上电5秒
Sample_StartTimer(TIMER1, 5000);
}
else if(Sample_phase == 4)
{
printf("\n*** Read vacuum ***\n");
// TODO: Modbus采集真空计1
Sensor_ReadVacuum(0, &sample);
// 下一阶段:采集泄露计
Sample_phase = 5;
// 最多等待500ms以后进入下一阶段
Sample_StartTimer(TIMER1, 500);
}
else if(Sample_phase == 5)
{
// 下一阶段:打印信息
Sample_phase = 6;
if(!VCC_POWER_STATUS())
{
// 无外接电源,直接触发下一阶段
NVIC_SetPendingIRQ(TMR1_IRQn);
}
else
{
// 有外接电源Modbus采集泄露计
Sensor_ReadLeak(&sample);
// 最多等待500ms以后进入下一阶段
Sample_StartTimer(TIMER1, 500);
}
}
else
{
VCC_SENSOR_5V_OFF();
// TODO: 打印信息
Sample_Print(&sample);
// 检查充装、报警等
Sample_CheckWarning(&sample);
// 如果没有扩展温度,且有真空计温度,用真空计温度代替扩展温度(显示和上传)
if(sample.staExtTempr[0].status == SENSOR_STATUS_NOCONNECT)
{
if(sample.vacuum[0].staVacuum != VACUUM_STATUS_COMM_FAULT && sample.vacuum[0].staVacuum != VACUUM_STATUS_FAULT)
{
sample.extTempr[0] = sample.vacuum[0].tempr;
sample.staExtTempr[0].status = SENSOR_STATUS_NORMAL;
}
}
// 写入全局缓冲(保持报警标志,直到发送任务处理)
if(dcBuff.sampleData.warnning)
sample.warnning = 1;
dcBuff.sampleData = sample;
// 检测电量
if(DS2788_ReadBattery(&dtuSample))
{
// 写入全局缓冲
dcBuff.dtuData.batLow = dtuSample.batLow;
dcBuff.dtuData.batCurrent = dtuSample.batCurrent;
dcBuff.dtuData.batPct = dtuSample.batPct;
dcBuff.dtuData.batCapa = dtuSample.batCapa;
dcBuff.dtuData.batMaxCapa = dtuSample.batMaxCapa;
dcBuff.dtuData.batTempr = dtuSample.batTempr;
dcBuff.dtuData.batVoltage = dtuSample.batVoltage;
}
// 首次检测到泄露或停止泄露,立即发送数据
if((dcBuff.sampleData.leak.staLeak == LEAK_STATUS_A2_ALARM) != lastLeakWarning)
{
printf("\n*** Leak warnning: %d ***\n", (dcBuff.sampleData.leak.staLeak == LEAK_STATUS_A2_ALARM));
dcBuff.sampleData.warnning = 1;
DTU_semGPRS = 1;
}
lastLeakWarning = (dcBuff.sampleData.leak.staLeak == LEAK_STATUS_A2_ALARM);
// 通知发送任务采集完成
GPRS_semSampled = 1;
// 通知显示板采集完成
Config_Sample_Request = 0;
// 通知显示屏: 刷新
Form_Refresh();
// 采集结束
Sample_phase = 0;
}
}