基础版本
This commit is contained in:
@@ -0,0 +1,275 @@
|
||||
/*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;
|
||||
//
|
||||
// }
|
||||
// }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
#ifndef __Analog_H_
|
||||
#define __Analog_H_
|
||||
/*H******************************************************************************
|
||||
* NAME: pressure.h
|
||||
*********************************************************************************/
|
||||
|
||||
//3.3V,LMV358 跟随器,线性范围0.2~2.6v,4~40ms 输入电阻选用120欧
|
||||
//******************************************************************************
|
||||
//*-------------- 变量声名 -----------------------------------------------------
|
||||
//******************************************************************************
|
||||
extern u16 PressureAdcBuf[20];
|
||||
extern u16 PressureADCValue[2];
|
||||
extern u8 PrssureTask_Flag;
|
||||
|
||||
#define Prssure_DMAAddrSet(x) (DMA2_Stream0->M0AR = x) //设置发送缓存地址
|
||||
#define Prssure_DMALenSet(x) (DMA2_Stream0->NDTR = x) //设置DMA发送长度
|
||||
#define Prssure_DMAStart() DMA_Cmd(DMA2_Stream0,ENABLE) //开启DMA发送
|
||||
#define Prssure_DMAStop() DMA_Cmd(DMA2_Stream0,DISABLE) //关闭DMA发送
|
||||
//******************************************************************************
|
||||
//*-------------- 函数声名 -----------------------------------------------------
|
||||
//******************************************************************************
|
||||
extern void Pressure_Init(void);
|
||||
extern void Pressure_ADCDMA_IRQHandler(void);
|
||||
extern void PrssureTask(void);
|
||||
|
||||
#endif //#ifndef
|
||||
Reference in New Issue
Block a user