NANO130_H2Press/User/adc_sample.c

661 lines
20 KiB
C
Raw Normal View History

2025-04-10 14:54:41 +08:00
#include "includes.h"
// *** ÿ<><C3BF>ͨ<EFBFBD><CDA8><EFBFBD>ܹ<EFBFBD><DCB9><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Σ<EFBFBD><CEA3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ժ<EFBFBD><D4BA><EFBFBD>ȥ<EFBFBD><C8A5><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ļ<EFBFBD><C4BC><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD>м<EFBFBD><D0BC>ļ<EFBFBD><C4BC><EFBFBD>ֵ<EFBFBD><D6B5>ƽ<EFBFBD><C6BD>
// ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define ADC_SAMPLE_COUNT (24)
// ADCƽ<43><C6BD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD>
#define ADC_AVGVAL_COUNT (16)
// <20><><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>
#define SAMPLE_CHANNEL_COUNT 12
// ADC<44><43><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
#define ADC_COMPENSATE 0
// ͨ<><CDA8><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><C9BC>ı<EFBFBD>־
volatile uint8_t Config_Sample_Request = 0;
// <20><><EFBFBD>ݲɼ<DDB2>ʧ<EFBFBD>ܵı<DCB5>־
volatile uint8_t Capa_Sample_failed = 0;
// <20><><EFBFBD>ݲɼ<DDB2><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ı<EFBFBD>־
volatile uint8_t Capa_Sample_finish = 0;
// <20>õ<EFBFBD><C3B5>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ݵ<EFBFBD>֪ͨ
volatile uint8_t GPRS_semSampled = 0;
void PWM0_IRQHandler(void)
{
if(PWM_GetCaptureIntFlag(PWM0, 3) & PWM_RISING_LATCH_INT_FLAG) // <20><><EFBFBD><EFBFBD><EFBFBD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD>ʼ
{
PWM_ClearPeriodIntFlag(PWM0, 3);
PWM_ClearCaptureIntFlag(PWM0, 3, PWM_RISING_LATCH_INT_FLAG);
}
if(PWM_GetCaptureIntFlag(PWM0, 3) & PWM_FALLING_LATCH_INT_FLAG) // <20>½<EFBFBD><C2BD>أ<EFBFBD><D8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
{
PWM_DisablePeriodInt(PWM0, 3); // ֹͣ<CDA3><D6B9>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>
PWM_ClearPeriodIntFlag(PWM0, 3);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
Capa_Sample_finish = 1;
PWM_ClearCaptureIntFlag(PWM0, 3, PWM_FALLING_LATCH_INT_FLAG);
}
if(PWM_GetPeriodIntFlag(PWM0, 3)) // <20><>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD>·<EFBFBD><C2B7>
{
Capa_Sample_failed = 1; // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʧ<EFBFBD><CAA7>
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ϣ
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 PA6<41><36>BAT_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()
{
// <20><><EFBFBD>ô<EFBFBD><C3B4><EFBFBD><EFBFBD><EFBFBD>״̬
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; // <20>ص<EFBFBD>У׼
// /* Reset PWM0 module */
// SYS_ResetModule(PWM0_RST);
// /* set PWM0 channel 1 capture configuration<6F><6E>time 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);
// <20>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȼ<EFBFBD><C8BC>ϸ<EFBFBD>
NVIC_SetPriority (TMR1_IRQn, 2); /* set Priority for Sample Interrupt */
NVIC_EnableIRQ(TMR1_IRQn);
}
// ADC<44>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
void Sample_Task(data_sample_t *sample)
{
uint8_t ch;
uint32_t oriData[ADC_SAMPLE_COUNT]; // ԭʼ<D4AD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
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);
// <20>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
memset(sampleData, 0, sizeof(sampleData));
Capa_Sample_failed = 0; // Ĭ<>ϲ<EFBFBD><CFB2><EFBFBD><EFBFBD>ݳɹ<DDB3>
for(ch = 0; ch < SAMPLE_CHANNEL_COUNT; ch++)
{
// <20>޲<EFBFBD>ѹ
if(ch == 0)
continue;
// <20><>չѹ<D5B9><D1B9>23
if(ch >= 3 && ch <= 4)
continue;
// <20><><EFBFBD><EFBFBD>չ<EFBFBD><EFBFBD>3<EFBFBD><33><EFBFBD><EFBFBD><EFBFBD>֣<EFBFBD>
if(ch >= 9 && ch <= 10)
continue;
memset(oriData, 0, sizeof(oriData));
// ÿ<><C3BF>ͨ<EFBFBD><CDA8><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
for(i = 0; i < ADC_SAMPLE_COUNT; i++)
{
// Ϊ<>˱<EFBFBD><CBB1><EFBFBD>ADCģ<43><C4A3><EFBFBD><EFBFBD>ʹ<EFBFBD>ó<EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ִ<EFBFBD><D6B4>
// <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD>ã<EFBFBD><C3A3>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><D1B9>adcֵ<63><D6B5><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
if(ch == 1)
{
// <20><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>ģ<EFBFBD>鵽ѹ<E9B5BD><D1B9>ͨ<EFBFBD><CDA8>
ADC_SET_INPUT_CHANNEL(ADC, ADC_CH_5_MASK);
}
else if(ch == 2)
{
// <20><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>ģ<EFBFBD><EFBFBD>ڶ<EFBFBD>·ѹ<C2B7><D1B9>ͨ<EFBFBD><CDA8><EFBFBD><EFBFBD>ռ<EFBFBD>ò<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD>ӣ<EFBFBD>
ADC_SET_INPUT_CHANNEL(ADC, ADC_CH_4_MASK);
}
else if(ch == 5)
{
// <20><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>ģ<EFBFBD><EFBFBD><E9B5BD>չ<EFBFBD><EFBFBD>1<EFBFBD><31>ͨ<EFBFBD><CDA8>
ADC_SET_INPUT_CHANNEL(ADC, ADC_CH_0_MASK);
}
else if(ch == 6)
{
// <20><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>ģ<EFBFBD><EFBFBD><E9B5BD>չ<EFBFBD><EFBFBD>1<EFBFBD><31>ͨ<EFBFBD><CDA8>
ADC_SET_INPUT_CHANNEL(ADC, ADC_CH_1_MASK);
}
else if(ch == 7)
{
// <20><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>ģ<EFBFBD><EFBFBD><E9B5BD>չ<EFBFBD><EFBFBD>2<EFBFBD><32>ͨ<EFBFBD><CDA8>
ADC_SET_INPUT_CHANNEL(ADC, ADC_CH_2_MASK);
}
else if(ch == 8)
{
// <20><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>ģ<EFBFBD><EFBFBD><E9B5BD>չ<EFBFBD><EFBFBD>2<EFBFBD><32>ͨ<EFBFBD><CDA8>
ADC_SET_INPUT_CHANNEL(ADC, ADC_CH_3_MASK);
}
else // ch == 11
{
// <20><><EFBFBD>Ӳ<EFBFBD><D3B2><EFBFBD>ģ<EFBFBD><EFBFBD><E9B5BD><EFBFBD><EFBFBD>ͨ<EFBFBD><CDA8>
ADC_SET_INPUT_CHANNEL(ADC, ADC_CH_6_MASK);
}
// <20><><EFBFBD><EFBFBD>ADIF0
ADC_CLR_INT_FLAG(ADC, ADC_ADF_INT);
// <20><><EFBFBD><EFBFBD>ADIE0
ADC_EnableInt(ADC, ADC_ADF_INT);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ģ<EFBFBD><C4A3>,<2C><>ʼ<EFBFBD><CABC><EFBFBD><EFBFBD>
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;
// <20><>ֹADIE0
ADC_DisableInt(ADC, ADC_ADF_INT);
}
// <20><><EFBFBD><EFBFBD>
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");
// }
// ȥ<><C8A5><EFBFBD><EFBFBD>С<EFBFBD><D0A1><EFBFBD><EFBFBD>ֵ<EFBFBD><D6B5><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
}
// <20><>ƽ<EFBFBD><C6BD>ֵ
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]);
}
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
// Һλ<D2BA><CEBB><EFBFBD><EFBFBD>֧<EFBFBD>֣<EFBFBD>
#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
// ѹ<><D1B9>
// 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);
}
// <20><>չѹ<D5B9><D1B9>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)
{
// <20><>չ<EFBFBD>ȣ<C2B6><32><C2B7>
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
{
// <20><>չ<EFBFBD>ȣ<C2B6><32><C2B7>
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);
}
}
}
// Ϊ<>˱<EFBFBD><CBB1><EFBFBD>ADCģ<43><C4A3><EFBFBD><EFBFBD>ʹ<EFBFBD>ó<EFBFBD>ͻ<EFBFBD><CDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD>ʹ<EFBFBD><CDB4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB>ִ<EFBFBD><D6B4>
// <20><><EFBFBD><EFBFBD><EFBFBD>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD>δ<EFBFBD>ã<EFBFBD><C3A3>ʽ<EFBFBD><CABD><EFBFBD><EFBFBD>ص<EFBFBD>ѹ<EFBFBD><D1B9>adcֵ<63><D6B5><EFBFBD><EFBFBD><EFBFBD>ڳ<EFBFBD><DAB3>ش<EFBFBD><D8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ<EFBFBD><CEBB>
sample->adWeight = sampleData[SAMPLE_CHANNEL_COUNT - 1][0];
// <20><><EFBFBD>ݻ<EFBFBD>
sample->volumeTotal = Theoretical_Param.v;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ݻ<EFBFBD><DDBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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;
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD>ѹ<EFBFBD><D1B9><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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");
// <20><>¼<EFBFBD>ɼ<EFBFBD>ֵ
last_Press = sample->pressure;
}
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7>¶ȱ<C2B6><C8B1><EFBFBD>
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;
// <20><>¼<EFBFBD>ɼ<EFBFBD>ֵ
last_Tempr = sample->extTempr[0];
}
}
// <20>ж<EFBFBD><D0B6>Ƿ<EFBFBD><C7B7><EFBFBD><EFBFBD>նȱ<D5B6><C8B1><EFBFBD>
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;
// <20><>¼<EFBFBD>ɼ<EFBFBD>ֵ
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 <20><>", 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");
}
// <20>Ժ<EFBFBD><D4BA><EFBFBD>Ϊ<EFBFBD><CEAA>λ<EFBFBD><CEBB><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1>ʱ<EFBFBD><CAB1>
// Ԥ<><D4A4>Ƶ<EFBFBD><C6B5>Ϊ8<CEAA><38>CMPΪ24λ
// <20><>12M<32><4D>Ƶ<EFBFBD><C6B5><EFBFBD><EFBFBD><E3A3AC><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ11<31><31>
void TIMER_MyOpen(TIMER_T *timer, uint32_t u32Mode, uint32_t u32Ms)
{
uint32_t u32Clk = TIMER_GetModuleClock(timer);
uint32_t u32Cmpr = 0, u32Prescale = 0;
// <20>ȶԶ<C8B6>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>λ
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)
{
// <20><><EFBFBD>ö<EFBFBD>ʱ<EFBFBD><CAB1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
TIMER_MyOpen(timer, TIMER_ONESHOT_MODE, ms);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
TIMER_EnableInt(timer);
TIMER_Start(timer);
}
// <20><>ǰ<EFBFBD>ɼ<EFBFBD><C9BC>׶<EFBFBD>
volatile uint8_t Sample_phase = 0;
// <20>ɼ<EFBFBD><C9BC>Ƿ<EFBFBD>æ
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;
// ÿ<><C3BF>8Сʱ<D0A1><CAB1>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD>գ<EFBFBD><D5A3>ϵ<EFBFBD><CFB5><EFBFBD>һ<EFBFBD>β<EFBFBD><CEB2>
static uint32_t vacuum_seconds = 30;
uint32_t sample_time;
S_RTC_TIME_DATA_T sRTC;
// <20><><EFBFBD><EFBFBD><EFBFBD>жϣ<D0B6><CFA3><EFBFBD>λ<EFBFBD><CEBB>ʱ<EFBFBD><CAB1>
TIMER_Close(TIMER1);
NVIC_ClearPendingIRQ(TMR1_IRQn);
TIMER_ClearIntFlag(TIMER1);
if(Sample_phase == 0)
{
// <20><>һ<EFBFBD>׶Σ<D7B6><CEA3>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ݣ<EFBFBD>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD><EFBFBD>ظ<EFBFBD><D8B8><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>񣬾<EFBFBD><F1A3ACBE><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>׶Σ<D7B6>
Sample_phase = 1;
// <20><>ʼ<EFBFBD><CABC>׼<EFBFBD><D7BC>
memset(&sample, 0, sizeof(data_sample_t));
// Modbus<75><73><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĭ<EFBFBD><C4AC>Ϊ<EFBFBD><CEAA><EFBFBD><EFBFBD>ԭ<EFBFBD><D4AD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
sample.vacuum[0] = dcBuff.sampleData.vacuum[0];
sample.leak = dcBuff.sampleData.leak;
sample.flow = dcBuff.sampleData.flow;
// TODO: <20>򿪵<EFBFBD>Դ
ADC_POWER_ON(ADC);
VCC_SENSOR_5V_ON();
// <20><>ʱ600ms<6D>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><C9BC>׶<EFBFBD>
Sample_StartTimer(TIMER1, 600);
}
else if(Sample_phase == 1)
{
// TODO: <20>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
Sample_Task(&sample);
// Modbus<75>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ռ<EFBFBD>
Sample_phase = 2;
// ֱ<>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>׶<EFBFBD>
NVIC_SetPendingIRQ(TMR1_IRQn);
}
else if(Sample_phase == 2)
{
// <20><>ȡ<EFBFBD><C8A1>ǰʱ<C7B0><CAB1>
RTC_GetDateAndTime(&sRTC);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ϴ<EFBFBD>gps<70><73>λ<EFBFBD><CEBB><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ<EFBFBD><CAB1>
sample_time = Calc_SecondsFromYear(INITIAL_YEAR, sRTC.u32Year, sRTC.u32Month, sRTC.u32Day,
sRTC.u32Hour, sRTC.u32Minute, sRTC.u32Second);
// <20>Ƿ񵽲ɼ<F1B5BDB2>ʱ<EFBFBD>䣨3<E4A3A8><33><EFBFBD><EFBFBD><EFBFBD>
if(sample_time + 3 < vacuum_seconds)
{
// <20><>һ<EFBFBD>׶Σ<D7B6><CEA3>ɼ<EFBFBD>й¶<D0B9><C2B6>
Sample_phase = 5;
// ֱ<>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>׶<EFBFBD>
NVIC_SetPendingIRQ(TMR1_IRQn);
}
else
{
// <20>´<EFBFBD><C2B4>ϴ<EFBFBD>ʱ<EFBFBD>ٲ<EFBFBD>
vacuum_seconds = sample_time + dcBuff.configData.intervalTrans;
// <20><>һ<EFBFBD>׶Σ<D7B6><CEA3>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ռƣ<D5BC><C6A3><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
Sample_phase = 3;
// <20>ȴ<EFBFBD>8s<38>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>׶<EFBFBD>
Sample_StartTimer(TIMER1, 10000);
}
}
else if(Sample_phase == 3)
{
// <20><>һ<EFBFBD>׶Σ<D7B6><CEA3>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ռƣ<D5BC><C6A3><EFBFBD>Ҫ<EFBFBD><D2AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ʱ
Sample_phase = 4;
// <20>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC><EFBFBD>Ҫ<EFBFBD>ϵ<EFBFBD>5<EFBFBD><35>
Sample_StartTimer(TIMER1, 5000);
}
else if(Sample_phase == 4)
{
printf("\n*** Read vacuum ***\n");
// TODO: Modbus<75>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD>ռ<EFBFBD>1
Sensor_ReadVacuum(0, &sample);
// <20><>һ<EFBFBD>׶Σ<D7B6><CEA3>ɼ<EFBFBD>й¶<D0B9><C2B6>
Sample_phase = 5;
// <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>500ms<6D>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>׶<EFBFBD>
Sample_StartTimer(TIMER1, 500);
}
else if(Sample_phase == 5)
{
// <20><>һ<EFBFBD>׶Σ<D7B6><CEA3><EFBFBD>ӡ<EFBFBD><D3A1>Ϣ
Sample_phase = 6;
if(!VCC_POWER_STATUS())
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Դ<EFBFBD><D4B4>ֱ<EFBFBD>Ӵ<EFBFBD><D3B4><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>׶<EFBFBD>
NVIC_SetPendingIRQ(TMR1_IRQn);
}
else
{
// <20><><EFBFBD><EFBFBD><EFBFBD>ӵ<EFBFBD>Դ<EFBFBD><D4B4>Modbus<75>ɼ<EFBFBD>й¶<D0B9><C2B6>
Sensor_ReadLeak(&sample);
// <20><><EFBFBD><EFBFBD><EFBFBD>ȴ<EFBFBD>500ms<6D>Ժ<EFBFBD><D4BA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD>׶<EFBFBD>
Sample_StartTimer(TIMER1, 500);
}
}
else
{
VCC_SENSOR_5V_OFF();
// TODO: <20><>ӡ<EFBFBD><D3A1>Ϣ
Sample_Print(&sample);
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>װ<EFBFBD><D7B0><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
Sample_CheckWarning(&sample);
// <20><><EFBFBD><EFBFBD>û<EFBFBD><C3BB><EFBFBD><EFBFBD>չ<EFBFBD>ȣ<C2B6><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC>ȣ<C2B6><C8A3><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ռ<EFBFBD><D5BC>¶ȴ<C2B6><C8B4><EFBFBD><EFBFBD><EFBFBD>չ<EFBFBD>ȣ<C2B6><C8A3><EFBFBD>ʾ<EFBFBD><CABE><EFBFBD>ϴ<EFBFBD><CFB4><EFBFBD>
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;
}
}
// д<><D0B4>ȫ<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD><E5A3A8><EFBFBD>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD>־<EFBFBD><D6BE>ֱ<EFBFBD><D6B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(dcBuff.sampleData.warnning)
sample.warnning = 1;
dcBuff.sampleData = sample;
// <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
if(DS2788_ReadBattery(&dtuSample))
{
// д<><D0B4>ȫ<EFBFBD>ֻ<EFBFBD><D6BB><EFBFBD>
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;
}
// <20>״μ<D7B4><CEBC>⵽й¶<D0B9><C2B6>ֹͣй¶<D0B9><C2B6><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
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);
// ֪ͨ<CDA8><D6AA><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
GPRS_semSampled = 1;
// ֪ͨ<CDA8><D6AA>ʾ<EFBFBD><CABE><EFBFBD>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
Config_Sample_Request = 0;
// ֪ͨ<CDA8><D6AA>ʾ<EFBFBD><CABE>: ˢ<><CBA2>
Form_Refresh();
// <20>ɼ<EFBFBD><C9BC><EFBFBD><EFBFBD><EFBFBD>
Sample_phase = 0;
}
}