2.55 0~40KPa 气压模块(来自这气候风扇最大档都不顶用的贡献)
2.55.1 模块来源
采购链接: https://detail.tmall.com/item.htm?abbucket=0&id=669294592937&ns=1&spm=a21n57.1.0.0.2543523cNcGCRI
也有模块使用 HX710B 进行 AD 采样,可对比参考。
2.55.2 规格参数
工作电压:2.6V~5.5V 引脚数量:4 产品尺寸:19×18mm(2mm 固定孔) 模块压力值:0~40KPa 气压传感器参数 资料文件
AD 采样芯片参数:
2.55.3 模块原理
该模块由一个压阻式压力传感器芯片和一个 24 位 AD 采样芯片组成。本例模块使用 GZP160 系列压阻式压力传感器芯片和 TM7711 AD 采样芯片。通过向压力传感器施加气压,引起输出电压变化,通过 TM7711 放大采样,得到与压力变化线性相关的输出值,提供标准气压,调整代码参数,将值映射到 0~40Kpa 即可得到气压测量值。
2.55.4 移植工程
引脚选择(接线方式)
0~40Kpa | 立创·梁山派 | 接线图 |
---|
2.55.5 移植步骤
将驱动代码文件添加到自己的工程中
/**********************************tm7711.c************************/
#include "tm7711.h"
#include "delay.h" //延时子程序
#include "stdio.h"
static void SET_SCK_H(void);
static void SET_SCK_L(void);
static uint8_t read_dout(void);
/******************************************************************
* 函 数 名 称:TM7711_Init
* 函 数 说 明:完成连接TM7711的引脚初始化
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LCKFB
* 备 注:无
******************************************************************/
void TM7711_Init(void)
{
/* 使能时钟 */
rcu_periph_clock_enable(RCU_GPIOA);
/* 配置为输出模式 浮空模式 */
gpio_mode_set(GPIOA,GPIO_MODE_OUTPUT,GPIO_PUPD_NONE,GPIO_PIN_0);
/* 配置为推挽输出 50MHZ */
gpio_output_options_set(GPIOA,GPIO_OTYPE_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_0);
/* 配置为输出模式 浮空模式 */
gpio_mode_set(GPIOA,GPIO_MODE_INPUT,GPIO_PUPD_NONE,GPIO_PIN_4);
/* 配置为推挽输出 50MHZ */
}
/******************************************************************
* 函 数 名 称:Read_TM7711
* 函 数 说 明:从TM7711读取数据
* 函 数 形 参:next_select=选择下一次数据更新率或者切换通道
* 函 数 返 回:data_temp 数据反码
* 作 者:LCKFB
* 备 注:无
******************************************************************/
uint32_t Read_TM7711()
{
uint8_t i = 0;
uint32_t data_temp = 0;
while(read_dout())
{
;
}
for(i = 0;i < 24;i++)
{
SET_SCK_H(); //第一个时钟脉冲的上升沿将读出输出24位数据的最高位
data_temp <<= 1;
DELAY_US(5);
SET_SCK_L();
if(read_dout())
data_temp++;
}
// 默认使用10Hz的数据输出速率
SET_SCK_H();
DELAY_US(1);
SET_SCK_L();
#ifdef USE_40HZ_OUT //如果使用40Hz的数据输出
DELAY_US(1);
SET_SCK_H();
DELAY_US(1);
SET_SCK_L();
DELAY_US(1);
SET_SCK_H();
DELAY_US(1);
SET_SCK_L();
#endif
data_temp = data_temp^0x800000; //- 8388608;
return(data_temp); //返回从 TM7711 中读出的数据
}
/******************************************************************
* 函 数 名 称:get_air_pressure_max40kpa
* 函 数 说 明:读取气压值
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LCKFB
* 备 注:无
******************************************************************/
float get_air_pressure(void)
{
float air_press_data;
air_press_data = (float)Read_TM7711() * VALUE_FACTOR;
return air_press_data;
}
/******************************************************************
* 函 数 名 称:get_start_value
* 函 数 说 明:获取未施加压力前静态值,可用于开机初始化
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LCKFB
* 备 注:无
******************************************************************/
float get_initial_value(void)
{
float air_press_initial;
air_press_initial = (float)Read_TM7711() * VALUE_FACTOR;
return air_press_initial;
}
/******************************************************************
* 函 数 名 称:SET_SCK_H
* 函 数 说 明:引脚PD_SCK拉高
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LCKFB
* 备 注:无
******************************************************************/
static void SET_SCK_H(void)
{
gpio_bit_set(PD_SCK_PIN_GROUP, PD_SCK_PIN);
}
/******************************************************************
* 函 数 名 称:SET_SCK_L
* 函 数 说 明:引脚PD_SCK拉低
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LCKFB
* 备 注:无
******************************************************************/
static void SET_SCK_L(void)
{
gpio_bit_reset(PD_SCK_PIN_GROUP, PD_SCK_PIN);
}
/******************************************************************
* 函 数 名 称:read_dout
* 函 数 说 明:读取DOUT引脚电平
* 函 数 形 参:无
* 函 数 返 回:无
* 作 者:LCKFB
* 备 注:无
******************************************************************/
static uint8_t read_dout(void)
{
return gpio_input_bit_get(DOUT_PIN_GROUP, DOUT_PIN);
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
在 tm7711.h 中配置引脚和延时函数,通过设置 VALUE_FACTOR 值放缩来映射到 0~40Kpa,通过#define USE_40HZ_OUT 可调整 TM7711 的 AD 转换输出频率为 40Hz
/**********************************tm7711.h************************/
#ifndef _TM7711_H_
#define _TM7711_H_
#include "gd32f4xx.h"
#define VALUE_FACTOR 1 // TM7711读出值0~16777215偏移后值放缩
//#define USE_40HZ_OUT //如果使用40Hz输出速率,否则默认10Hz输出速率
#define PD_SCK_PIN_GROUP GPIOA // PD_SCK 引脚group
#define PD_SCK_PIN GPIO_PIN_0 // PD_SCK 引脚
#define DOUT_PIN_GROUP GPIOA // DOUT 引脚group
#define DOUT_PIN GPIO_PIN_4 // DOUT 引脚
#define DELAY_US(us) Delay_1us(us) // 延时函数,修改为自己工程的延时函数
void TM7711_Init(void);
uint32_t Read_TM7711();
float get_initial_value(void);
float get_air_pressure(void);
#endif // _TM7711_H_
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
在 main 函数中调用 TM7711_Init 进行初始化,调用 get_initial_value()获取启动时未施加压力时的静态值,在 while 循环中调用 get_pressure()减去 get_initial_value()值获取施加的压力值。
int main(void)
{
Delay_Timer_Init();
usart_config();
TM7711_Init();
float initial_pressure = get_initial_value(); // 获取启动初始值
while(1)
{
printf("气压值为 %f 帕\r\n", get_air_pressure() - initial_pressure);
Delay_1ms(10);
}
}
2
3
4
5
6
7
8
9
10
11
12
2.55.6 移植验证
现象:用软管连接使用针管分别提供正压,负压,使用串口助手打印,结果呈线性变化。由于没有标准气压计校准,本实验只测试了输出值是否线性。通过标准气压计测量,可调整 tm7711.h 中 VALUE_OFFSET 和 VALUE_FACTOR 值将结果映射到标准气压值。
| ------------------------------------------- | ------------------------------------------- |移植成功示例,见文件: