Files
TXH1.0/User/Analog/Analog.c
T
2026-04-27 16:55:02 +08:00

276 lines
9.4 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.
/*C*****************************************************************************
* NAME: .c
*-------------------------------------------------------------------------------
* RELEASE:
* REVISION: 1.0
*-------------------------------------------------------------------------------
* PURPOSE:
*
*******************************************************************************/
/*_____ I N C L U D E S ______________________________________________________*/
#include "config.h" //全局声明
/*_____ M A C R O S __________________________________________________________*/
/*_____ D E F I N I T I O N __________________________________________________*/
//AD参考电压2.5V,压力传感器输出4-20毫安,对应电压范围0.48-2.4v
/*_____ D E C L A R A T I O N ________________________________________________*/
u16 PressureAdcBuf[20];//压力检测ADC缓存,每把枪C_PressureAdcBuf
u16 PressureADCValue[2];//压力值缓存
u32 pressureCalibrate = 3932; //10倍AD对应2.4V 40MP 2979
u32 pressureBass = (3932/5); //10倍对应0.48V 0MP
u8 PrssureTask_Flag = 0;//压力检测任务开关
#define C_timerPressure 5 //压力异常定时数值
/****************************************************
函数名:Pressure_IO_Configuration
功能 :压力检测IO配置
参数 :无
返回值:无
****************************************************/
void Pressure_IO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_Init(GPIOC, &GPIO_InitStructure);
}
/****************************************************
函数名:Pressure_IO_Configuration
功能 :压力检测ADCDMA配置
参数 :无
返回值:无
****************************************************/
void Pressure_DMA_Configuration(void)
{
DMA_InitTypeDef DMA_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_DMA2, ENABLE);
DMA_DeInit(DMA2_Stream0);
DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;
DMA_InitStructure.DMA_BufferSize = 20;
DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;
DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
DMA_InitStructure.DMA_Priority = DMA_Priority_High;
DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;
DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;
DMA_InitStructure.DMA_PeripheralBaseAddr = (uint32_t)&ADC1->DR;
DMA_InitStructure.DMA_Channel = DMA_Channel_2;
DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)PressureAdcBuf;
DMA_Init(DMA2_Stream0, &DMA_InitStructure);
DMA_ITConfig(DMA2_Stream0, DMA_IT_TC, ENABLE);
DMA_ClearFlag(DMA2_Stream0, DMA_IT_TCIF0);
DMA_Cmd(DMA2_Stream0, ENABLE);
}
/****************************************************
函数名:Pressure_IO_Configuration
功能 :压力检测ADC配置
参数 :无
返回值:无
****************************************************/
void Pressure_ADC_Configuration(void)
{
ADC_CommonInitTypeDef ADC_CommonInitStructure;
ADC_InitTypeDef ADC_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能 ADC1 时钟
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,ENABLE); //ADC1 复位
RCC_APB2PeriphResetCmd(RCC_APB2Periph_ADC1,DISABLE); //复位结束
//②初始化通用配置
ADC_CommonInitStructure.ADC_Mode = ADC_Mode_Independent;//独立模式
ADC_CommonInitStructure.ADC_TwoSamplingDelay = ADC_TwoSamplingDelay_5Cycles;//两个采样阶段之间的延迟 5 个时钟
ADC_CommonInitStructure.ADC_DMAAccessMode = ADC_DMAAccessMode_Disabled; //DMA 失能
ADC_CommonInitStructure.ADC_Prescaler = ADC_Prescaler_Div4;//预分频 4 分频。
//ADCCLK=PCLK2/4=84/4=21Mhz,ADC 时钟最好不要超过 36Mhz
ADC_CommonInit(&ADC_CommonInitStructure);//初始化
//③初始化 ADC1 相关参数
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;//12 位模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE;//扫描模式
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//连续转换
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;//禁止触发检测,使用软件触发
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右对齐
ADC_InitStructure.ADC_NbrOfConversion = 6;//6 个转换在规则序列中
ADC_Init(ADC3, &ADC_InitStructure);//ADC 初始化
ADC_RegularChannelConfig(ADC1, ADC_Channel_4, 1, ADC_SampleTime_480Cycles);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5, 2, ADC_SampleTime_480Cycles);
ADC_DMACmd(ADC1, ENABLE);//开启ADC1DMA
//④开启 ADC 转换
ADC_Cmd(ADC1, ENABLE);//开启 AD 转换器
ADC_DMARequestAfterLastTransferCmd(ADC1,ENABLE);
ADC_SoftwareStartConv(ADC1); //使能指定的 ADC1 的软件转换启动功能
}
/****************************************************
函数名:Pressure_NVIC_Configuration
功能 DMA中断配置
参数 :无
返回值:无
****************************************************/
void Pressure_NVIC_Configuration(void)
{
NVIC_InitTypeDef NVIC_InitStructure; //定义中断配置结构体
//ADC1_DMA
NVIC_InitStructure.NVIC_IRQChannel = DMA2_Stream0_IRQn; //ADC3_DMA
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 2;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/****************************************************
函数名:Pressure_IO_Configuration
功能 :压力检测初始化
参数 :无
返回值:无
****************************************************/
void Pressure_Init(void)
{
u8 Number = 0;
Pressure_IO_Configuration();
Pressure_ADC_Configuration();
Pressure_DMA_Configuration();
Pressure_NVIC_Configuration();
/**********压力定时器初始化**********/
TXHData.AnalogTimer.Cycle = 1;
TXHData.AnalogTimer.Flag = 0;
TXHData.AnalogTimer.ON_OFF = 1;
TXHData.AnalogTimer.Init = 0;
TXHData.AnalogTimer.TimerCount = 0;
TXHData.AnalogTimer.TimerCountMax = 500;//200周期2S
}
/****************************************************
函数名:Pressure_IO_Configuration
功能 :压力检测DMA中断
参数 :无
返回值:无
****************************************************/
void Pressure_ADCDMA_IRQHandler(void)
{
PrssureTask_Flag = 1; //开启压力检测任务
DMA_ClearFlag(DMA2_Stream0, DMA_IT_TCIF0);
}
/****************************************************
函数名:Pressure_IO_Configuration
功能 :压力检测任务
参数 :无
返回值:无
****************************************************/
void PrssureTask(void)
{
volatile u8 Number = 0;
volatile u8 i;
u16 *pBuf = PressureAdcBuf;
volatile u32 sum[2]= {0,0},Temp[2]={0,0};
if(PrssureTask_Flag)
{
PrssureTask_Flag = 0;
for(Number = 0;Number < 2;Number ++)
{
sum[Number] = 0;
for(i = 0; i < 20; i += 2 )
sum[Number] += *(pBuf+i+Number); //求和
PressureADCValue[Number] =(sum[Number] ) / 160;//计算平均值
// if((PressureADCValue[Number] > (pressureBass-470)) && (PressureADCValue[Number] < pressureCalibrate))//压力大于0小于2.5,压力传感器在线
// {
// switch(Number)
// {
// case 0:
// {
// JQJData.ErrState.Flag.e_errPressure_InCut = 0;//清除压力传感器掉线标志位
// if(PressureADCValue[Number] > pressureBass)
// {
// JQJData.AnalogValue.Pressure_In = ((PressureADCValue[Number]- pressureBass) * JQJData.Pressure_Range.Pressure_In_Range * 10)/(pressureCalibrate - pressureBass); //
// if(JQJData.AnalogValue.Pressure_In > (JQJData.Pressure_Limit.Pressure_In_Limit * 10))
// {
// JQJData.ErrState.Flag.e_errPressure_InPass = 1;
// if(JQJData.FuelState.Flag.StartFlag == 1)
// JQJData.ValveClose_Flag = 1;
// }
// else
// JQJData.ErrState.Flag.e_errPressure_InPass = 0;
// }
// else
// {
// JQJData.AnalogValue.Pressure_In = 0;
// }
// if(JQJData.AnalogValue.Pressure_In > JQJData.Pressure_Limit.Pressure_Out_Stop)
// {
// if(V_Moto_State == 1)
// JQJData.ValveClose_Flag = 1;
// }
// }
// break;
// case 1:
// {
// JQJData.ErrState.Flag.e_errPressure_OutCut = 0;//清除压力传感器掉线标志位
// if(PressureADCValue[Number] > pressureBass)
// {
// JQJData.AnalogValue.Pressure_Out = ((PressureADCValue[Number]- pressureBass) * JQJData.Pressure_Range.Pressure_Out_Range * 10)/(pressureCalibrate - pressureBass); //
// if(JQJData.AnalogValue.Pressure_Out > JQJData.Pressure_Limit.Pressure_Out_Limit)
// {
// JQJData.ErrState.Flag.e_errPressure_OutPass = 1;
// if(JQJData.FuelState.Flag.StartFlag == 1)
// JQJData.ValveClose_Flag = 1;
// }
// else
// {
// JQJData.ErrState.Flag.e_errPressure_OutPass = 0;
// }
// if(JQJData.AnalogValue.Pressure_Out > JQJData.Pressure_Limit.Pressure_Out_Stop)
// {
// if(V_Moto_State == 1)
// JQJData.ValveClose_Flag = 1;
// }
// }
// else
// {
// JQJData.AnalogValue.Pressure_Out = 0;
// }
// }
// break;
// }
// }
// else///压力传感器检测不到,启动异常定时器
// {
// switch(Number)
// {
// case 0:
// {
// }
// break;
// case 1:
// {
// }
// break;
//
// }
// }
}
}
}