第1章 产品简介
1.1 概述
此文档是针对本公司固态电解质探头所设计的多功能探头信号采集与输出的转接板使用指导说明,我们提供详细的设计思路包括原理图设计思路以及实例、基于STM32F030F4P6单片机的编程思路,以及标定思路,提供设计原理,以及设计接口封装。
1.2 基本参数
参数名称 | 参数内容 |
直流供电(默认) | DC5V供电 |
尺寸 | 3cm*2cm |
输出信号 | TTL信号 |
工作压力范围 | 0.9-1.1atm |
通讯协议(默认) | Modbus-RTU |
工作湿度 | 0至95%(相对湿度)、无凝结 |
工作温度 | -20至80℃ |
工作压力范围 | 0.9-1.1atm |
第2章 硬件设计
图1.整体原理图
2.1 电源设计
电源VCC的电压范围为3v-5.5v
模组电路板采用的是5v供电,通过LDO稳压芯片输出3.3v提供VCC电压。
图2.电源电路
2.2 接口设计
1、探头接口
探头为2.54mm间距的圆型接口座,(附件中提供接口封装)。
2、模组接口座分为两种接口,兼容不同的使用方式,(1)5P插针式接口,间距为2.54mm(附件中提供接口封装)
3、(2)5P卧式贴片插接座,间距1.25mm(附件中提供接口封装)。
2.3 单片机电路设计
模组单片机采用stm32f030f4p6芯片,此次需要用到一路串口PA2、PA3(USART1),一路ADC采集口PA0。
图3.单片机电路
2.4 信号输出设计
信号输出分为:(1)串口信号输出
(2)模拟量信号输出
第3章 软件编程设计
实现功能:采集固态电解质探头的输出电压值,通过用标气进行标定得到实际值,通过串口实现信号的输出:
/*********************************************************/
实现功能:此版配套测试程序
使用芯片:stm32f030f4p6
波特率:9600
/*********************************************************/
管脚初始化配置:
void GPIOInit()
{
GPIO_InitTypeDef GPIO_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
EXTI_InitTypeDef EXTI_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AN;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
/*******************************************************/
串口初始化配置:
void USART_Config(void)
{
USART_InitTypeDef USART_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource2,GPIO_AF_1);
GPIO_PinAFConfig(GPIOA,GPIO_PinSource3,GPIO_AF_1);
/*配置PA9 ,PA10*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //设置端口复用
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_Level_3;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE,ENABLE);
USART_Cmd(USART1,ENABLE);
/* NVIC configuration */
/* Enable the USARTx Interrupt */
NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
/********************************************************************/
Adc初始化:
static void ADC_Config(void)
{
ADC_InitTypeDef ADC_InitStructure;
ADC_DeInit(ADC1);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
ADC_StructInit(&ADC_InitStructure);
ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
ADC_InitStructure.ADC_ScanDirection=ADC_ScanDirection_Upward;
ADC_Init(ADC1, &ADC_InitStructure);
ADC_ChannelConfig(ADC1,ADC_Channel_0, ADC_SampleTime_239_5Cycles);
ADC_GetCalibrationFactor(ADC1);
ADC_Cmd(ADC1, ENABLE);
while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADRDY));
ADC_StartOfConversion(ADC1);
}
/*************************************************************************/
模拟量采集以及滤算法
#define A 401
u32 caiji[A];
u16 last_ResultVolt;
uint32_t ADC_Check(void)
{
uint16_t i,j,k;
u32 ResultVolt2;
for(i=0;i
{
while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);
caiji[i]=(uint32_t)ADC_GetConversionValue(ADC1);
for(j=0;j<500;j++)
{;}
}
for(j=0;j
{
for(k=0;k
{
if(caiji[k]>caiji[k+1])
{
ResultVolt2=caiji[k];
caiji[k]=caiji[k+1];
caiji[k+1]=ResultVolt2;
}
}
}
ResultVolt=caiji[(A-1)/2];
ResultVolt=ResultVolt*3300;
ResultVolt= ResultVolt/4096;
if(ResultVolt>last_ResultVolt+3||ResultVolt
{
last_ResultVolt=ResultVolt;
}
else
{
ResultVolt=last_ResultVolt;
}
ADC_ClearITPendingBit(ADC1,ADC_IT_EOC);
return ResultVolt;
}
/*************************************************************/
标定思路:
固态电解质所得模拟量与实际值存在线性关系。
通固定数值的标气,与实际所采集的模拟量进行拟合成一条曲线
void ADC_Read()
{
double dianya;
dianya=shuchumax*ResultVolt/3300;
Speed=dianya*SHUCHUcheng/SHUCHUchu+SGUCHUjia;
}
/***********************************************************/
串口通讯协议:采用modbus标准协议进行串口通讯
/***********************************************************/