/*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;
//								
//				  }
//			  }
		}
	}
}

