基于STM32单片机的压力变送器的使用
1、使用原因
在一次项目中需要获取压力罐中的压力,在淘宝挑选了一款压力变送器。在没有学习《过程控制》这门课之前,我也分不清楚“传感器”与“变送器”的区别。后来才清楚,传感器是把非电量信号转换为电信号,而变送器是将电信号转换为标准电信号。根据课本上所写的,目前广泛使用的是4~20mA DC模拟电流与1~5V DC模拟电压信号是国际标准。那这就好办了,对接这款压力变送器,我只需要使用单片机的ADC采集去采集电压,再根据输出电压与实际压力之间的数学关系式计算出测得的压力即可。
2、传感器介绍
介绍下这款压力变送器,手感挺沉的,底部有一小孔,下端有螺纹可以用来固定安装。铭牌上标注有:
-
型号:PT210B-M20
-
量程:(-0.1-2)MPa
-
输出:0.2-3.2V
-
供电:DC3.5V
-
精度:0.5%FS
-
红:电源、黑:共地、蓝:输出
3、开发环境与工具
打开STM32CubeMX,新建工程。
-
外部时钟,倍频至72MHz
-
串口打印配置
-
配置ADC采集+DMA
-
生成工程
5、编写代码
基本采用自己的框架,不做详细展示了。但是这里需要注意,找到压力变送器输出电压与压力的数学关系式。
量程:(-0.1-2)MPa
输出:0.2-3.2V
采用数学小工具:在线多项式曲线拟合
获得函数关系式:[F(x) = +0.7000000000000002*x-0.24000000000000002]
简化后为:F(x) = 0.7 * x - 0.24
压力传感器.c/.h编写:
#include "Mydrivers.h"
static void Get_Pressure_Voltage(void); //获取压力电压
static void Get_Pressure_Value(void); //获取压力值
Pressure_t Pressure =
{
Get_Pressure_Voltage,
0,
0.0,
Get_Pressure_Value,
0.0
};
/*
* @name Get_Pressure_Voltage
* @brief 获取压力电压
* @param None
* @retval None
*/
static void Get_Pressure_Voltage(void)
{
Pressure.Pressure_Voltage = (Pressure.usADC_Value * 3.3) / 4095;
printf("AD转换原始值 = %d\r\n", Pressure.usADC_Value);
printf("计算得出的电压值 = %.2fV\r\n", Pressure.Pressure_Voltage);
}
/*
* @name Get_Temperature_Value
* @brief 获取压力值
* @param None
* @retval None
*/
static void Get_Pressure_Value(void)
{
Pressure.fPressure = 0.7 * Pressure.Pressure_Voltage - 0.24;
printf("Pressure = %.1fMPa", Pressure.fPressure);
}
#ifndef __Pressure_Transmitter_H__
#define __Pressure_Transmitter_H__
#include "Mydrivers.h"
typedef struct
{
void (*Get_Pressure_Voltage)(void); //获取压力电压
uint16_t usADC_Value; //ADC采集值
float Pressure_Voltage; //压力电压
void (*Get_Pressure_Value)(void); //获取压力值
float fPressure; //压力
}Pressure_t;
extern Pressure_t Pressure;
#endif
main.c
6、测试结果
7、总结
- 仔细阅读变送器的数据手册或者铭牌
- 计算出数学关系式
- 配置ADC采集+DMA