当前位置:网站首页>cubemx stm32 afm3000模块 气体流量传感器 驱动代码
cubemx stm32 afm3000模块 气体流量传感器 驱动代码
2022-08-04 10:22:00 【嵌入一下?】
afm3000
- AFM3000 传感器是奥松电子的数字流量计,专为呼吸机应用而设计。它以高超的精确度测量空气,氧气和其他非侵蚀性气体的流量。风道内采用特殊设计,使得通过传感器的流动体的压损非常低,使其性能适用于各种苛刻的应用场景,例如医疗通风和呼吸应用。
- AFM3000 采用 5V 电源电压工作,具有数字 I2C 接口。输出测量结果经过内部校准和温度补偿。
- 这款传感器的卓越性能基于奥松电子的传感器技术,内部由一个热式传感芯片和一个高性集成 24 位 AD 采集的 CMOS 微处理器相连接。气体流量由热传感器芯片测量,确保了非常快的信号处理时间和相比同类产品有最佳精度且具备双向测量功能。
cubemx配置
- 开个I2C
- 串口配置
硬件连接
代码
afm3000
afm3000.c
#include "afm3000.h"
/* 设备i2c地址 */
#define AFM_WAdd 0x80 // 写地址
#define AFM_RAdd 0x81 // 读地址
/* 设备命令 */
//#define AFM_FlowCollect 0x1000 // 流量采集
#define AFM_FlowRead 0x1000 // 读取流量:返回2个字节
#define AFM_IDRead 0x31AE // 读取ID号:返回4个字节
#define AFM_Reset 0x2000 // 复位指令
/* 内部函数声明 */
static HAL_StatusTypeDef afm3000_write(uint16_t afmCmd, uint8_t * afmData, uint16_t afmDataSize);
static HAL_StatusTypeDef afm3000_read(uint16_t afmCmd, uint8_t * afmData, uint16_t afmDataSize);
/* 内部函数实现 */
static HAL_StatusTypeDef afm3000_write(uint16_t afmCmd, uint8_t * afmData, uint16_t afmDataSize)
{
return HAL_I2C_Mem_Write(&AFM_hi2c, AFM_WAdd, afmCmd, I2C_MEMADD_SIZE_16BIT, afmData, afmDataSize, 0xffff);
}
static HAL_StatusTypeDef afm3000_read(uint16_t afmCmd, uint8_t * afmData, uint16_t afmDataSize)
{
return HAL_I2C_Mem_Read(&AFM_hi2c, AFM_RAdd, afmCmd, I2C_MEMADD_SIZE_16BIT, afmData, afmDataSize, 0xffff);
}
/* 外部函数 */
/* 复位AFM3000 参数 : 无 返回值 : 来自 HAL_StatusTypeDef 枚举中 */
HAL_StatusTypeDef afm3000_Reset(void)
{
uint8_t *afmData = NULL;
return afm3000_write(AFM_Reset, afmData, 0);
}
/* 获取AFM3000的值 参数 : afmGetVal 通过指针获取数据 返回值 : 来自 HAL_StatusTypeDef 枚举中 */
HAL_StatusTypeDef afm3000_GetVal(uint16_t * afmGetVal)
{
uint8_t afmVal[3] = {
0}; // 2字节的数据 + 1字节的CRC
HAL_StatusTypeDef afmState = HAL_ERROR;
HAL_Delay(20); // 至少等待10ms一次数据,保险起见延时翻倍
afmState = afm3000_read(AFM_FlowRead, afmVal, 3);
*afmGetVal = (afmVal[0]<<8 | afmVal[1]); //不知道先发过来的是高位还是低位,先测试一波
*afmGetVal = (*afmGetVal - AFM_Offset) / AFM_FlowCoeff; // 计算数据,根据公式 ((测试量 - 偏移量)/ 流量系数)
return afmState;
}
/* 初始化AFM3000 参数 : 无 返回值 : 来自 HAL_StatusTypeDef 枚举中 */
HAL_StatusTypeDef afm3000_Init(void)
{
uint16_t afmGetVal = 0;
HAL_StatusTypeDef afmState = HAL_ERROR;
afm3000_Reset(); // 先复位一波
// 前面几次获取的数据不准确,去掉
for(uint8_t i=0; i<5; i++)
{
afmState = afm3000_GetVal(&afmGetVal);
}
return afmState;
}
afm3000.h
#ifndef _AFM3000_H_
#define _AFM3000_H_
#include "i2c.h"
/* i2c句柄 */
#define AFM_hi2c hi2c1
/* AFM偏移量和空气的流量系数 (不知道可不可以修改,也不知道原始值是不是这个)*/
#define AFM_Offset 32000 // 偏移量
#define AFM_FlowCoeff 140 // 空气的流量系数
/* 外部函数区 */
HAL_StatusTypeDef afm3000_Reset(void);
HAL_StatusTypeDef afm3000_GetVal(uint16_t * afmGetVal);
HAL_StatusTypeDef afm3000_Init(void);
/* // 使用示例 // 初始化 if(afm3000_Init() == HAL_OK) { printf("afm3000_Init OK !"); } else { printf("afm3000_Init failed ..."); } // 获取数据 uint16_t afmGetVal = 0; afm3000_GetVal(&afmGetVal); printf("Flow Val : %d slm", afmGetVal); */
#endif /* _AFM3000_H_ */
main
头文件
#include "stdio.h"
#include "afm3000.h"
初始化
uint16_t afmGetVal = 0;
if(afm3000_Init() == HAL_OK)
{
printf("afm3000_Init OK !");
}
else
{
printf("afm3000_Init failed ...");
}
循环中
afm3000_GetVal(&afmGetVal);
printf("Flow Val : %d slm", afmGetVal);
HAL_Delay(500);
边栏推荐
猜你喜欢
随机推荐
【COS 加码福利】COS 用户实践有奖征文,等你来投稿!
多媒体和物联网技术让版本“活”起来 129张黑胶唱片“百年留声”
Mysql应用日志时间与系统时间相差八小时
STM32前言知识总结
MySQL core SQL: SQL structured query statements, library, table operation, CRUD
华为云安全云脑,让企业云化运营更放心
bash shell数组详解
Acwing 3208. Z字形扫描 偏移量+扩展图
在测试集上训练,还能中CVPR?这篇IEEE批判论文是否合理?
[代码阅读] CycleGAN: Unpaired Image-To-Image Translation Using Cycle-Consistent Adversarial Networks
无代码平台单项选择入门教程
【cookie 临时存储数据,WebStorage ,sessionStorage】
XCTF-reverse-signin
HTB-Nibbles
有12个球,其中11个重量相等,只有1个不一样,不知是轻还是重.用天平秤三次,找出这个球.
Person.class.getInterfaces() 注意使用方法
Jenkins使用手册(1) —— 软件安装
OD-Model【5】:YOLOv1
Ansible deployment scripts - pro available without pit
gom登录器配置教程_谷歌浏览器如何使用谷歌搜索引擎