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