基础版本

This commit is contained in:
bathfire
2026-04-27 16:55:02 +08:00
commit 64b3e488da
269 changed files with 383851 additions and 0 deletions
+275
View File
@@ -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;
//
// }
// }
}
}
}
+26
View File
@@ -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