【RTD】AD7793驱动程序
文章目录
- 1 前言
- 2 AD7793驱动程序
- 2.1 spi访问接口
- 2.2 寄存器和常用配置值
- 2.3 初始化
- 2.4 原始数据获取
- 2.5 阻值换算
- 3 使用
- 4 完整工程代码
1 前言
前面文章主要描述AD7793分别与两线、三线、四线RTD连接电路原理图,及相关阻值计算方法。本文简要说明AD7793驱动程序,如何通过代码精确获取到当前RTD阻值。得到RTD阻值,进而可以通过查表法,对RTD【阻值—温度】表匹配,获得当前温度值。
相关文章:
【RTD】铂电阻测温原理与具体方法
【RTD】AD7793三线式铂电阻PT100/PT1000应用
【RTD】AD7793四线式铂电阻PT100/PT1000应用
【RTD】AD7793两线式铂电阻PT100/PT1000应用
【RTD】AD7793驱动程序
【RTD】二分法查找和分段线性插值算法在RTD中应用
2 AD7793驱动程序
测试平台:
- MCU:STM32F1
- SPI:SPI1(PAA、PA6、PA7)
- CS:PA1
- 支持:两线、三线、四线RTD
2.1 spi访问接口
spi总线借助原有的封装接口(详情参考该文章),只需指定片选函数即可。
/* 片选函数 */
static void ad7793_spi_cs(uint8_t state)
{if (state){GPIO_SetBits(GPIOA, GPIO_Pin_1);}else{GPIO_ResetBits(GPIOA, GPIO_Pin_1);}
}/* 注册spi总线接口 */
int8_t ad7793_init(struct spi_bus_device *spi_bus)
{ GPIO_InitTypeDef GPIO_InitStructure;if (NULL == spi_bus){return -1;}/* spi cs */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA ,ENABLE);GPIO_SetBits(GPIOA, GPIO_Pin_1);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure);/* device init */ad7793_spi_dev[0].spi_cs = ad7793_spi_cs;ad7793_spi_dev[0].spi_bus = spi_bus;return 0;
}
调用spi总线接口实现AD7793 寄存器访问接口,后续读写寄存器都通过下面函数实现。更改为私有spi或者第三方驱动接口,只需更改里面的spi函数即可
/* 写任意位寄存器 */
static uint8_t ad7793_spi_write(uint8_t addr, uint8_t *pbuf, uint8_t size)
{spi_send_then_send(&ad7793_spi_dev[0], &addr, 1, pbuf, size);return size;
}/* 写8位寄存器 */
static uint8_t ad7793_spi_write_byte(uint8_t addr, uint8_t data)
{ad7793_spi_write(addr, &data, 1);return 0x01;
}/* 写16位寄存器 */
static uint8_t ad7793_spi_write_word(uint8_t addr, uint16_t data)
{uint8_t buf[2] = {0};buf[0] = (data>>8)&0xff;buf[1] = data&0xff;ad7793_spi_write(addr, &buf[0], 2);return 0x02;
}/* 写24位寄存器 */
static uint8_t ad7793_spi_write_3byte(uint8_t addr, uint32_t data)
{uint8_t buf[3] = {0};buf[0] = (data>>16)&0xff;buf[1] = (data>>8)&0xff;buf[2] = data&0xff;ad7793_spi_write(addr, &buf[0], 3);return 0x03;
}/* 读任意位寄存器 */
static uint8_t ad7793_spi_read(uint8_t addr, uint8_t *pbuf, uint8_t size)
{spi_send_then_recv(&ad7793_spi_dev[0], &addr, 1, pbuf, size);return size;
}
2.2 寄存器和常用配置值
我们把寄存器和常用寄存器配置值通过宏定义出来,后续配置时,通过“或”("|")的方式进行快速配置,并且提高可读性。
/* 寄存器 */
#define REG_COMM_STA 0x00 /* 8bit,写时为通讯寄存器/读时为状态寄存器 */
#define REG_MODE 0x08 /* 16bit,模式寄存器 */
#define REG_CONFIG 0x10 /* 16bit,配置寄存器 */
#define REG_DATA 0x18 /* 24bit,数据寄存器 */
#define REG_ID 0x20 /* 8bit,芯片ID寄存器 */
#define REG_IO 0x28 /* 8bit,IO寄存器 */
#define REG_IMBL 0x30 /* 24bit,失调寄存器 */
#define REG_FULL 0x38 /* 24bit,满量程寄存器 *//* 读写指令 */
#define READ_EN 0x40 /* 读使能 */
#define CONTINUE_READ 0x20 /* 连续读 *//* 工作模式配置 */
#define CONTINUE_CONVER 0x0000 /* 连续转换,默认 */
#define SINGLE_CONVER 0x2000 /* 单次转换 */
#define IDLE_MODE 0x4000 /* 空闲模式 */
#define LOW_POWER_MODE 0x6000 /* 省电模式 */
#define IZL_CALIBRATION 0x8000 /* 内部零电平校准 */
#define IFC_CALIBRATION 0xA000 /* 内部满量程校准 */
#define SZL_CALIBRATION 0xC000 /* 系统零电平校准 */
#define SFC_CALIBRATION 0xE000 /* 系统满量程校准 *//* 恒流源配置 */
#define CURRENT_OUT1_1 0x00 /* 两路电流正常输出到IO1、IO2 */
#define CURRENT_OUT1_2 0x04 /* 两路电流输出IO1、IO2互换 */
#define CURRENT_OUT1 0x08 /* 两路电流叠加输出到IO1,只对10uA和210uA有效 */
#define CURRENT_OUT2 0x0C /* 两路电流叠加输出到IO2,只对10uA和210uA有效 */
#define CURRENT_10UA 0x01 /* 10uA电流 */
#define CURRENT_210UA 0x02 /* 210uA电流 */
#define CURRENT_1MA 0x03 /* 1mA电流 *//* 放大器配置 */
#define BIPOLAR 0x0000 /* 双极性 */
#define UNIPOLAR 0x1000 /* 单极性 */
#define GAIN_1 0x0000 /* 增益1~128 */
#define GAIN_2 0x0100
#define GAIN_4 0x0200
#define GAIN_8 0x0300
#define GAIN_16 0x0400
#define GAIN_32 0x0500
#define GAIN_64 0x0600
#define GAIN_128 0x0700 /* ADC配置 */
#define OUTER_VREF 0x0000 /* 外部参考源 */
#define INNER_VREF 0x0080 /* 内部参考源 */
#define NO_BUF 0x0000 /* 无缓存 */
#define USE_BUF 0x0010 /* 使用缓存 */
#define AIN_CH1 0x0000 /* 检测通道1~3 */
#define AIN_CH2 0x0001
#define AIN_CH3 0x0002
2.3 初始化
AD7793寄存器初始化,决定后续数据计算的过程。基本而且关键的配置包括:
- 抑制比
- 检测极性
- 放大器增益
- ADC参考源
- 检测通道
- 激励恒流源输出
static void ad7793_register_init(void)
{uint16_t mode = 0x00;/* read chip id */ad7793_spi_read(REG_ID, &s_ad7793_info.id, 1);/* 65db抑制 */ad7793_spi_write_word(REG_MODE, 0x000A);if (s_ad7793_info.mode&MODE_UNIPOLAR){mode |= MODE_UNIPOLAR;}else if (s_ad7793_info.mode&MODE_BIPOLAR){mode |= MODE_BIPOLAR;}if (s_ad7793_info.gain > GAIN_128){s_ad7793_info.gain = GAIN_128;}mode |= s_ad7793_info.gain;/* 双极性/无增益/外部参考源/无缓存/通道AIN1 */ad7793_spi_write_word(REG_CONFIG, mode|OUTER_VREF|NO_BUF|AIN_CH1);/* 210uA恒流源输出 */ad7793_spi_write_byte(REG_IO, CURRENT_OUT1_1|CURRENT_210UA);
}
2.4 原始数据获取
从数据寄存器读取的数据即为实际检测的AD值。读取数据前,应先查询状态寄存器,根据状态寄存器判断数据转换完毕,才执行读取数据寄存器,确保数据有效性。
int8_t ad7793_read_data(int32_t *ad_value)
{int8_t ret = 0;uint8_t temp = 0;uint8_t buf[3] = {0};ad7793_spi_read(REG_COMM_STA|READ_EN, &temp ,1);/* 读取转换完成状态 */if (0xbf == (temp|0xbf)){ad7793_spi_read(REG_DATA|READ_EN, &buf[0] ,3);*ad_value = ((buf[0]<<16) | (buf[1]<<8) | buf[2])&0xffffff;}else{/* todo,出错? */ret = -1;}return ret;
}
2.5 阻值换算
该函数作了自适应,根据选定的模式进行计算。支持:
- 两线、三线、四线RTD
- 增益大小
- 单极性、双极性
- 参考电阻【Ref】阻值
int8_t ad7793_read_resistance(float *resistance)
{int8_t ret = 0;int32_t ad_value = 0;uint8_t gain = 0;if (0 != ad7793_read_data(&ad_value)){return -1;}gain = 0x01<<(s_ad7793_info.gain>>8); /* 计算增益 *//* 根据不同模式计算 */if (s_ad7793_info.mode&MODE_BIPOLAR){*resistance = (float)s_ad7793_info.ref *(ad_value/0x7fffff-1) / gain;}else if (s_ad7793_info.mode&MODE_UNIPOLAR){*resistance = (float)s_ad7793_info.ref * ad_value / 0xffffff / gain;}if (s_ad7793_info.mode&MODE_3LINE_RTD){/* 三线RTD需要两路恒流源 */*resistance *= 2;}return ret;
}
3 使用
驱动程序支持两线、三线、四线RTD,使用前只需根据原理图和相关参数指定struct _ad7793_info
的参数即可,芯片id参数无需指定,初始化时从id寄存器获取。
struct _ad7793_info
{uint8_t mode; /* 工作模式 */uint16_t ref; /* 参考电阻阻值, Ω */uint16_t gain; /* 增益 */uint8_t id; /* 芯片id */
};
例子,一个四线RTD测量例子:
static struct _ad7793_info s_ad7793_info =
{.mode = MODE_BIPOLAR|MODE_4LINE_RTD,/* 双精度/4线RTD */.ref = 2000, /* 2kΩ */.gain = GAIN_1, /* no gain */
};
实际使用过程,还需根据具体电路、测量数据等,调整增益、电流大小、抑制参数等等,以达到最佳测量效果。
4 完整工程代码
【1】https://github.com/Prry/drivers-for-mcu
【RTD】AD7793驱动程序相关推荐
- 【RTD】AD7793四线式铂电阻PT100/PT1000应用
文章目录 1 前言 2 AD7793 四线式铂电阻测量 2.1 阻值计算 3 小结 1 前言 上一篇文章描述的是RTD驱动芯片AD7793特点,以及其与三线式RTD连接使用方法.本文描述四线式RT ...
- 【RTD】AD7793两线式铂电阻PT100/PT1000应用
文章目录 1 前言 2 AD7793 两线式铂电阻测量 2.1 阻值计算 3 小结 1 前言 上一篇文章描述的是RTD驱动芯片AD7793与四线式RTD连接使用方法.本文描述两线式RTD与AD77 ...
- MSP430杂谈--AD7793硬件SPI驱动与模拟SPI驱动
最近项目中用到了AD7793读取铂电阻值来得到相应的温度,编写了基于MSP430的硬件驱动程序和模拟驱动程序,并且能成功运行,现在记录一下分享给大家. AD7793硬件IIC驱动完整版下载链接:htt ...
- 多路三线RTD电阻温度采集电路设计方案
目录 1.电路结构 2.计算RTD电阻 3.电流源和线路电阻失配的影响 4.最小化误差 电阻温度检测器(RTD)可在很多工业应用中监控温度.在一个分布式控制系统(DCS)或可编程逻辑控制器(PLC)中 ...
- stm32F4驱动AD7793程序-ADC模拟前端-应用详解,应该是最全了
1. AD7793简介: 适合高精度测量应用的低功耗.低噪声的完整模拟前端 内置一个16/24位Σ-Δ型ADC(采样速率 4.17 ~ 470 Hz可调) 含有三路差分模拟输入,内置输入缓冲器 片内集 ...
- PT100(RTD)三线制四线制测量方案
PT100(RTD)三线制四线制测量方案(升级版). 本方案仅为开发者提供的快速原型机参考,并非可直接量产的产品,开发者请根据实际需求增删功能及模块. 本系统以stm32f103c8t6作为主控芯片, ...
- OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)?
OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)? 图形硬件供应商,需要为显示适配器编,编写用户模式显示驱动程序.用户模式显示驱动程序,是由Microsoft Direct3D运行时加 ...
- 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态
嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...
- 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序
嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...
最新文章
- tableau两个不同的图合并_Tableau可视化分析-业务常用图形绘制1
- 将ImageVIew中的图片保存到本地相册中
- VC++向txt文件中写入字符串
- ubuntu16.0.4 opencv4.0.0 GPU 版本的 SURF
- 香港浸会大学计算机系月入4万博士你还不心动吗?
- GlusterFS的安装及使用
- 软件测试-PR录制脚本程序的时候出现license invalid,error code=0的错误
- Windows 7 64位系统上搭建Hadoop伪分布式环境(很详细)
- NuGet是什么?理解与使用(上)
- 傍腾讯,切阿里,拼多多的千亿瞒天术
- Eclipse引用的jar有对应的工程,「Maven依存关系」中显示对应的工程
- 修改上传文件大小限制(LNMP/wamp环境)
- 14.UNIX 环境高级编程--高级IO
- 静态对象和非静态对象的区别
- Android之xUtils-3.0数据库框架详解
- 计算机毕业设计之java+ssm的图书管理系统的设计与实现论文
- opencv-6 边缘检测(Prewitt算子,Sobel算子,Laplacian算子)
- android 点击按钮打开浏览器网页
- 磁珠和电感在解决EMI和EMC的不同应用
- OpenGL之常用方法整理