STM32应用实例十一:基于SPI和AD7192的数据采集

在开发臭氧发生器的时,我们需要一个高分辨率的AD采集,于是选择了AD7192,选择这款ADC的原因比较简单。首先它是24位的符合我们的精度要求;其次它自带时钟,便于节省空间;第三他又4路单端或2路差分输入,与我们需要三路采集相符。

1AD7192简介

AD7192是一款适合高精密测量应用的低噪声完整模拟前端,内置一个低噪声、 24 位Σ-Δ型模数转换器 (ADC)。片内低噪声增益级意味着可直接输入小信号。

AD7192可配置为两路差分输入或四路伪差分输入。片内通道序列器可以使能多个通道,AD7192 按顺序在各使能通道上执行转换,这可以简化与器件的通信。 片内 4.92 MHz时钟可以用作 ADC 的时钟源; 或者也可以使用外部时钟或晶振。 该器件的输出数据速率可在 4.7 Hz 至 4.8 kHz 的范围内变化。

AD7192提供两种数字滤波器选项。 滤波器的选择会影响以编程输出数据速率工作时的均方根噪声和无噪声分辨率、建立时间以及 50 Hz/60 Hz 抑制。 针对要求所有转换均需建立的应用, AD7192 具有零延迟特性。

其功能结构图如下:

2、硬件设计

AD7192的串行接口包含四个信号:CS、DIN、SCLK 和DOUT/RDY。所以我们采用标准的SPI接口来实现AD7192的数据操作。具体的硬件设计图如下:

4路输入分别通过运算放大器做前端处理,然后以标准信号输入到AD7192,数字输入输出则接到MCU的SPI接口。

3、软件设计

AD7192内部具有多个寄存器,对AD7192的操作就是通过这些片内寄存器进行控制和数据寄存器/数据寄存器加状态信息配置。这些寄存器包括:通信寄存器、状态寄存器、模式寄存器、配置寄存器、ID寄存器、GPOCON寄存器、失调寄存器以及满量程寄存器。其中通信寄存器和状态寄存器共享地址,读操作时针对的是状态寄存器,写操作时针对的是通讯寄存器。对任何寄存器的操作都是从写通讯寄存器开始。

(1)、AD7192初始化

在使用AD719前先对其实先初始化。首先是软件复位,连续写入40个1就可对AD7192实现复位。复位完成后,对零点和量程进行较准。而后读取各寄存器状态。具体实现代码如下:

/*AD7192初始化配置*/

void AD7192Initialization(void (*ReadWriteForAd7192)(uint8_t *,uint8_t *,uint16_t ),void (*ChipSelected)(bool),uint16_t (*GetReadyInput)(void))

{

  AD7192SoftwareReset(ReadWriteForAd7192,ChipSelected);

  AD7192InternalZeroScaleCalibration(ReadWriteForAd7192,ChipSelected,GetReadyInput);

  AD7192InternalFullScaleCalibration(ReadWriteForAd7192,ChipSelected,GetReadyInput);

  /*读取并存储全部寄存器的值*/

  ReadAD7192Register(REG_COM_STA, 8, AD7192Registers, REG_COM_STA,ReadWriteForAd7192,ChipSelected);

  AD7192InternalZeroScaleCalibration(ReadWriteForAd7192,ChipSelected,GetReadyInput);

  AD7192InternalFullScaleCalibration(ReadWriteForAd7192,ChipSelected,GetReadyInput);

}

零点和量程校准包括内部校准和外部校准,我们这里使用内部校准。

(2)、读取转换数据

读取转换的结果有2中方式:单次获取和连续获取。单次转换模式下,AD7192 在完成转换后处于关断模式。 将模式寄存器中的MD2、MD1和MD0分别设置为0、0、1,便可启动单次转换,此时AD7192将上电,执行单次转换,然后返回关断模式。时序图如下所示:

单次转换数据获取具体实现代码如下:

uint32_t GetStartSingleConvertionValue(uint32_t Channels,void (*ReadWriteForAd7192)(uint8_t *,uint8_t *,uint16_t ),void (*ChipSelected)(bool),uint16_t (*GetReadyInput)(void))

{

  uint32_t dataCode=0;

  AD7192StartSingleConvertion(Channels,ReadWriteForAd7192,ChipSelected);

  dataCode = AD7192ReadConvertingData(ReadWriteForAd7192,ChipSelected,GetReadyInput);

  dataCode =dataCode & 0x00FFFFFF;

  ReadAD7192Register(REG_DATA, 1, AD7192Registers, REG_DATA,ReadWriteForAd7192,ChipSelected);

  return dataCode;

}

连续转换模式是上电后的默认转换模式。AD7192连续转换,每次完成转换后,状态寄存器中的RDY位变为低电平。如果CS为低电平,则完成一次转换时,DOUT/RDY 线路也会变为低电平。若要读取转换结果,用户需要写入通信寄存器,指示下一操作为读取数据寄存器。从数据寄存器中读取数据字后,DOUT/RDY变为高电平。时序图如下所示:

连续转换数据获取具体实现代码如下:

void GettContinuousConvertionValue(uint32_t Channels,uint32_t *dataCodes,int number,void (*ReadWriteForAd7192)(uint8_t *,uint8_t *,uint16_t ),void (*ChipSelected)(bool),uint16_t (*GetReadyInput)(void))

{

  uint32_t dataCode=0;

  AD7192StartContinuousConvertion(Channels,ReadWriteForAd7192,ChipSelected);

  for(int i=0;i<number;i++)

  {

    dataCode = AD7192ReadConvertingData(ReadWriteForAd7192,ChipSelected,GetReadyInput);

    dataCode =dataCode & 0x00FFFFFF;

    dataCodes[i]=dataCode;

  }

}

(3)、读取内部温度

AD7192内置一个温度传感器。利用配置寄存器中的CH2位可以选择温度传感器。如果CH2位设置为1,就会使能温度传感器。使用温度传感器并选择双极性模式时,如果温度为0K,器件应返回0x800000码。为使传感器发挥最佳性能,需要执行单点校准。因此,应记录25°C 时的转换结果并计算灵敏度。 灵敏度约为2815码 /°C。温度传感器的计算公式为 :

温度 (K) = ( 转换结果 – 0x800000)/2815 K

温度 (°C) = 温度 (K) – 273

单点校准之后,内部温度传感器的精度典型值为 ±2°C。具体的实现代码如下:

/*读取内部温度数据,返回摄氏度温度*/

float GetTemperatureValue(void (*ReadWriteForAd7192)(uint8_t *,uint8_t *,uint16_t ),void (*ChipSelected)(bool),uint16_t (*GetReadyInput)(void))

{

  uint32_t temperatureCode=0;

  float temp = 0.0;

  AD7192Registers[REG_MODE] = 0;

  AD7192Registers[REG_CONF] = 0;

  AD7192Registers[REG_MODE] = MODE_SING|DAT_STA_DIS|INCLK_MCLK2EN|SINC_4|ENPAR_EN|CLK_DIV_DIS|SINGLECYCLE_DIS|REJ60_DIS|0x080;

//  AD7192Registers[REG_MODE] = MODE_CONT|DAT_STA_DIS|INCLK_MCLK2TRI|SINC_4|ENPAR_DIS|CLK_DIV_DIS|SINGLECYCLE_DIS|REJ60_DIS|0x060;

  WriteAD7192Register(REG_MODE, 1, AD7192Registers,ReadWriteForAd7192,ChipSelected);

  AD7192Registers[REG_CONF] = CHOP_DIS|REF_IN1|TEMP|BURN_DIS|REFDET_DIS|BUF_DIS|UB_BI|GAIN_1;

  WriteAD7192Register(REG_CONF, 1, AD7192Registers,ReadWriteForAd7192,ChipSelected);

  temperatureCode = AD7192ReadConvertingData(ReadWriteForAd7192,ChipSelected,GetReadyInput);

  temp = (temperatureCode-0x800000)/2815.0-273;

  return temp;

}
时间: 2024-08-25 13:02:56

STM32应用实例十一:基于SPI和AD7192的数据采集的相关文章

C语言库函数大全及应用实例十一

原文:C语言库函数大全及应用实例十一                                         [编程资料]C语言库函数大全及应用实例十一 函数名: setbkcolor 功 能: 用调色板设置当前背景颜色 用 法: void far setbkcolor(int color); 程序例: #i nclude #i nclude #i nclude #i nclude int main(void) { /* select a driver and mode that sup

mybatis 详解(三)------入门实例(基于注解)

1.创建MySQL数据库:mybatisDemo和表:user 详情参考:mybatis 详解(二)------入门实例(基于XML) 一致 2.建立一个Java工程,并导入相应的jar包,具体目录如下 详情参考:mybatis 详解(二)------入门实例(基于XML) 一致 3.在 MyBatisTest 工程中添加数据库配置文件 mybatis-configuration.xml 详情参考:mybatis 详解(二)------入门实例(基于XML) 一致 4.定义表所对应的实体类 详情

[stm32][ucos] 1、基于ucos操作系统的LED闪烁、串口通信简单例程

* 内容简述: 本例程操作系统采用ucos2.86a版本, 建立了5个任务            任务名                                             优先级            APP_TASK_START_PRIO                               2            主任务                          Task_Com1_PRIO                                

一个简单的backbone实例(基于139邮箱)

先看一下效果图: 代码如下: <!doctype html> <html lang="en"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>邮箱前端实现</title> <style type="text/css"> *{

创龙基于TI AM5708多通道振动数据采集处理单元的应用

创龙基于TI AM5708多通道振动数据采集处理单元的应用此产品案例来源于:创龙电子创龙基于TI AM5708处理器设计的开发板,广泛应用于机器视觉.电力自动化.智能交通.医疗器械.自动分拣装置.高精度仪器仪表.高端数控系统等多种工业应用场合.TI AM5708器件通过其极具灵活性的全集成混合处理器解决方案,可实现较高的处理性能.此外,这些器件还将可编程的视频处理功能与高度集成的外设集完美融合, 为用户带来全新的数据计算性能和方案灵活性. 下面简单讲解一下创龙基于TI AM5708多通道振动数据

2. Dubbo原理解析-Dubbo内核实现之基于SPI思想Dubbo内核实现(转)

转载自  斩秋的专栏  http://blog.csdn.net/quhongwei_zhanqiu/article/details/41577159 SPI接口定义 定义了@SPI注解 public @interface SPI { String value() default ""; //指定默认的扩展点 } 只有在接口打了@SPI注解的接口类才会去查找扩展点实现 会依次从这几个文件中读取扩展点 META-INF/dubbo/internal/   //dubbo内部实现的各种扩展

dubbo源码分析之基于SPI的强大扩展

https://blog.csdn.net/luoyang_java/article/details/86609045 Dubbo采用微内核+插件体系,使得设计优雅,扩展性强.那所谓的微内核+插件体系是如何实现的呢!大家是否熟悉spi(service providerinterface)机制,即我们定义了服务接口标准,让厂商去实现(如果不了解spi的请谷歌百度下), jdk通过ServiceLoader类实现spi机制的服务查找功能 1.为什么不使用JDK SPI在dubbo中它实现了一套自己的

Mahout分布式运行实例:基于矩阵分解的协同过滤评分系统

Apr 08, 2014  Categories in tutorial tagged with Mahout hadoop 协同过滤  Joe Jiang 前言:之前配置Mahout时测试过一个简单的推荐例子,当时是在Eclipse上运行的,由于集成插件的缘故,所以一切进行的都比较顺利,唯一不足的是那是单机运行的,没有急于分布式系统处理.所以基于测试分布式处理环境的目的,下午找了一个实例来运行,推荐系统原型是一个电影评分的系统. 一.问题描述 对于协同过滤(Collaborative Filt

【NLP】Python实例:基于文本相似度对申报项目进行查重设计

Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起到一定纠正作用.单位主要针对科技项目申报审核,传统的方式人力物力比较大,且伴随季度性的繁重工作,效率不高.基于此,单位觉得开发一款可以达到实用的智能查重系统.遍及网络文献,终未得到有价值的参考资料,这个也是自然.首先类似知网,paperpass这样的商业公司其毕业申报专利并进行保密,其他科研单位因发