STM32基于SPI和AD7192的数据采集

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

1、AD7192简介

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;
}

欢迎关注:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/499413.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Modbus协议栈实现Modbus RTU多主站支持

前面我们已经详细讲解过Modbus协议栈的开发过程&#xff0c;并且利用协议栈封装了Modbus RTU主站和从站&#xff0c;Modbus TCP服务器与客户端&#xff0c;Modbus ASCII主站与从站应用。但在使用过程中&#xff0c;我们发现一些使用不便和受限的地方&#xff0c;所以我们就想要…

STM32基于AD5663的UV灯电压控制

在开发臭氧发生器的时&#xff0c;我们使用UV灯来实现臭氧的产生。而UV灯的强度决定了臭氧产生的浓度&#xff0c;UV灯的光强则与其控制电压密切相关。所以我们要控制产生的臭氧的浓度就需要调节其控制电压。我们选择了AD5663这一模拟量输出模块来实现这一点。 1、AD5663简介 …

实现Modbus ASCII多主站应用

前面我们已经分析了Modbus RTU的更新设计和具体实现&#xff08;如果不清楚可查看前一篇文章&#xff09;。其实Modbus ASCII与Modbus RTU都是基于串行链路实现的&#xff0c;所以有很多的共同点&#xff0c;基于此&#xff0c;这篇文章我们只讨论与Modbus RTU所不同的部分。 …

STM32一种基于NTC的控温电路及软件实现

NTC&#xff08;Negative Temperature Coefficient&#xff09;是一种随温度上升时&#xff0c;电阻值呈指数关系减小的热敏电阻。应用广泛&#xff0c;最近我们就采用了NTC来控制加热并测温&#xff0c;并达到了预期的效果。 1、硬件设计 我们使用三极管作为加热元件&#x…

STM32利用光敏二极管实现光度测量

最近我们在开发臭氧发生器时&#xff0c;需要监测生成的臭氧的浓度&#xff0c;于是想到使用光度计来测量。因为不同浓度的臭氧对管的吸收作用是不相同的&#xff0c;于是检测光照强度的变化就可以得到相应的浓度数据。 1、硬件设计 此次光照度检测我们选用了S1336-5BQ光电点二…

STM32的ADC通道间干扰的问题

最近我们在开发一个项目时&#xff0c;用到了MCU自带的ADC&#xff0c;在调试过程中发现通道之间村在相互干扰的问题。以前其实也用过好几次&#xff0c;但要求都不高所以没有太关注&#xff0c;此次因为物理量的量程较大&#xff0c;所以看到了变化。 首先来说明一下此次的软…

实现Modbus TCP多网段客户端应用

对于Modbus TCP来说与Modbus RTU和Modbus ASCII有比较大的区别&#xff0c;因为它是运行于以太网链路之上&#xff0c;是运行于TCP/IP协议之上的一种应用层协议。在协议栈的前两个版本中&#xff0c;Modbus TCP作为客户端时也存在一些局限性。我们将对这些不足作一定更新。 1、…

改进初学者的PID-介绍

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…

改进初学者的PID-采样时间

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…

改进初学者的PID-微分冲击

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…

LwIP应用开发笔记之一:LwIP无操作系统基本移植

现在&#xff0c;TCP/IP协议的应用无处不在。随着物联网的火爆&#xff0c;嵌入式领域使用TCP/IP协议进行通讯也越来越广泛。在我们的相关产品中&#xff0c;也都有应用&#xff0c;所以我们结合应用实际对相关应用作相应的总结。 1、技术准备 我们采用的开发平台是STM32F407…

改进初学者的PID-修改整定参数

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…

改进初学者的PID-积分饱和

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…

改进初学者的PID-手自动切换

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…

改进初学者的PID-初始化

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…

如何优化代码和RAM大小

如果供应商为我自己的项目提供了一个起点&#xff0c;那就太好了。工作blinky始终是一个伟大的首发。方便总是有代价&#xff0c;而且“blinky”就是夸大“切换GPIO引脚”的代码大小。对于具有少量RAM和FLASH的设备&#xff0c;这可能会引起关注&#xff1a;如果blinky占用那么…

改进初学者的PID-正反作用

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…

改进初学者的PID-测量的比例介绍

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…

改进初学者的PID-测量的比例编码

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…

PID:我应该何时计算积分项?

最近看到了Brett Beauregard发表的有关PID的系列文章&#xff0c;感觉对于理解PID算法很有帮助&#xff0c;于是将系列文章翻译过来&#xff01;在自我提高的过程中&#xff0c;也希望对同道中人有所帮助。作者Brett Beauregard的原文网址&#xff1a;http&#xff1a;//brettb…