文章目录

  • 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驱动程序相关推荐

  1. 【RTD】AD7793四线式铂电阻PT100/PT1000应用

    文章目录 1 前言 2 AD7793 四线式铂电阻测量 2.1 阻值计算 3 小结 1 前言   上一篇文章描述的是RTD驱动芯片AD7793特点,以及其与三线式RTD连接使用方法.本文描述四线式RT ...

  2. 【RTD】AD7793两线式铂电阻PT100/PT1000应用

    文章目录 1 前言 2 AD7793 两线式铂电阻测量 2.1 阻值计算 3 小结 1 前言   上一篇文章描述的是RTD驱动芯片AD7793与四线式RTD连接使用方法.本文描述两线式RTD与AD77 ...

  3. MSP430杂谈--AD7793硬件SPI驱动与模拟SPI驱动

    最近项目中用到了AD7793读取铂电阻值来得到相应的温度,编写了基于MSP430的硬件驱动程序和模拟驱动程序,并且能成功运行,现在记录一下分享给大家. AD7793硬件IIC驱动完整版下载链接:htt ...

  4. 多路三线RTD电阻温度采集电路设计方案

    目录 1.电路结构 2.计算RTD电阻 3.电流源和线路电阻失配的影响 4.最小化误差 电阻温度检测器(RTD)可在很多工业应用中监控温度.在一个分布式控制系统(DCS)或可编程逻辑控制器(PLC)中 ...

  5. stm32F4驱动AD7793程序-ADC模拟前端-应用详解,应该是最全了

    1. AD7793简介: 适合高精度测量应用的低功耗.低噪声的完整模拟前端 内置一个16/24位Σ-Δ型ADC(采样速率 4.17 ~ 470 Hz可调) 含有三路差分模拟输入,内置输入缓冲器 片内集 ...

  6. PT100(RTD)三线制四线制测量方案

    PT100(RTD)三线制四线制测量方案(升级版). 本方案仅为开发者提供的快速原型机参考,并非可直接量产的产品,开发者请根据实际需求增删功能及模块. 本系统以stm32f103c8t6作为主控芯片, ...

  7. OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)?

    OpenGL在图形管道中调用了什么用户模式图形驱动程序(UMD)? 图形硬件供应商,需要为显示适配器编,编写用户模式显示驱动程序.用户模式显示驱动程序,是由Microsoft Direct3D运行时加 ...

  8. 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态

    嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...

  9. 嵌入式Linux设备驱动程序:用户空间中的设备驱动程序

    嵌入式Linux设备驱动程序:用户空间中的设备驱动程序 Embedded Linux device drivers: Device drivers in user space Interfacing ...

最新文章

  1. tableau两个不同的图合并_Tableau可视化分析-业务常用图形绘制1
  2. 将ImageVIew中的图片保存到本地相册中
  3. VC++向txt文件中写入字符串
  4. ubuntu16.0.4 opencv4.0.0 GPU 版本的 SURF
  5. 香港浸会大学计算机系月入4万博士你还不心动吗?
  6. GlusterFS的安装及使用
  7. 软件测试-PR录制脚本程序的时候出现license invalid,error code=0的错误
  8. Windows 7 64位系统上搭建Hadoop伪分布式环境(很详细)
  9. NuGet是什么?理解与使用(上)
  10. 傍腾讯,切阿里,拼多多的千亿瞒天术
  11. Eclipse引用的jar有对应的工程,「Maven依存关系」中显示对应的工程
  12. 修改上传文件大小限制(LNMP/wamp环境)
  13. 14.UNIX 环境高级编程--高级IO
  14. 静态对象和非静态对象的区别
  15. Android之xUtils-3.0数据库框架详解
  16. 计算机毕业设计之java+ssm的图书管理系统的设计与实现论文
  17. opencv-6 边缘检测(Prewitt算子,Sobel算子,Laplacian算子)
  18. android 点击按钮打开浏览器网页
  19. 磁珠和电感在解决EMI和EMC的不同应用
  20. OpenGL之常用方法整理

热门文章

  1. Spring Boot 自动加载指定包下的拦截器
  2. pygame中人物上下左右移动及翻转,背景透明化
  3. mysql 游标当前行,MySQL游标的使用笔记大全
  4. 安川机器人程序还原_安川机器人使用说明书.pdf
  5. 华为交换机配置端口隔离
  6. linux运维现在怎么样,浅谈现下Linux运维人员面临的问题
  7. 关于SqlServer服务无法启动的症状分析和解决方法
  8. JAVA常用API的笔记
  9. Matlab信号处理笔记
  10. Windows Server 2003上搭建FTP服务器(IIS同理)