当前位置:网站首页>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);
边栏推荐
猜你喜欢
随机推荐
无代码平台描述文字入门教程
Mobile open source low code tools beeware and kivy
字符串相关题目
Camunda整体架构和相关概念
【C补充】指针相关知识点收集01
STM32前言知识总结
开源一夏 | 查询分页不只有limit,这四种分页方法值得掌握
nsq部署_andlua辅助源码
rk3399-339 usb设备复合 总体流程
云计算适合什么企业_当前全球云计算处于发展
Multimedia and Internet of Things technology make the version "live" 129 vinyl records "Centennial Voice"
Win11系统重装用什么好 一键重装Win11教程
2022-08-03 第六小组 瞒春 学习笔记
无代码平台数字入门教程
bash shell数组详解
helm安装
参数优化。
再次搞定 Ali 云函数计算 FC
SVG 的 path 属性绘制图形
陈春花发布声明,这场流量狂欢该到了收尾的时候