PID模组485/232/TTL转接板指导手册 |
Ver1.0 |
第1章 产品简介
1.1 概述
此文档是针对本公司PID探头所设计的多功能探头信号采集与输出的转接板使用指导说明,我们提供详细的设计思路包括原理图设计思路以及实例、基于STM32F030F4P6单片机的编程思路,以及标定思路。
1.2 基本参数
参数名称 | 参数内容 |
直流供电(默认) | DC12V/DC5V供电 |
尺寸 | 6cm*3cm |
输出信号 | 485信号/232信号/TTL信号 |
工作压力范围 | 0.9-1.1atm |
通讯协议(默认) | Modbus-RTU |
工作湿度 | 0至95%(相对湿度)、无凝结 |
工作温度 | -20至80℃ |
工作压力范围 | 0.9-1.1atm |
第2章 硬件设计
图1.整体原理图
2.1 电源设计
转接板采用12v/5v直流供电,采用AMS1117-3.3V(U1)线性稳压芯片进行电压转换;前端加有保险丝(F1),47UF滤波电容(C1),双向TVS二极管SMBJ15CA,肖特基二极管,对前端电路进行,过压,过流以及电源反向等可能发生的问题进行保护。
图2.电源电路
2.2 单片机电路设计
单片机采用stm32f030f4p6芯片,此次需要用到一路串口PA2、PA3(USART1),一路ADC采集口PA5,信号指示灯接口PA10。
图3.单片机电路
2.3 信号输出设计
信号输出方式:485信号/232信号/TTL信号可以任选其一输出;
(1)TTL信号输出:
无需焊接MAX232(u5)芯片以及匹配电路,以及MAX3485(u1)芯片的匹配电路;连接R8,R9两个0欧电阻,即可实现TTL信号输出。
(2)485信号输出:
选择MAX3485芯片,将单片机的TTL信号转变为485信号(此时无需焊接232匹配电路,以及断开R8,R9两个电阻)。详细电路如图所示:
图4. 485信号输出电路
(3)232信号输出:
选择MAX232芯片,将单片机的TTL信号转变为232信号(此时无需焊接485匹配电路,以及断开R8,R9两个电阻)。详细电路如图所示:
图5. 232信号输出电路
第3章 软件设计
实现功能:采集PID探头的输出电压值,通过用标气进行标定得到PID的实际值,通过配置串口实现232信号/485信号/TTL信号的输出:
/*********************************************************/
实现功能:此版配套测试程序
使用芯片:stm32f030f4p6
波特率:可修改
编译环境:keil
/*********************************************************/
管脚初始化配置:
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_4|GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_4);
GPIO_SetBits(GPIOA,GPIO_Pin_10);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 ;
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);
if(ModelBaud==3)
USART_InitStructure.USART_BaudRate = 19200;
else if(ModelBaud==2)
USART_InitStructure.USART_BaudRate = 9600;
else if (ModelBaud==1)
USART_InitStructure.USART_BaudRate = 4800;
else
USART_InitStructure.USART_BaudRate = 2400;
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_5 , 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;
}
/*************************************************************/
标定思路:
Pid所得模拟量与实际值存在线性关系。
通固定数值的标气,与实际所采集的模拟量进行拟合成一条曲线
void ADC_Read()
{
double dianya;
dianya=shuchumax*ResultVolt/3300;
Speed=dianya*SHUCHUcheng/SHUCHUchu+SGUCHUjia;
}
/***********************************************************/
Usb通讯协议:采用modbus标准协议进行usb通讯
/***********************************************************/