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, , 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=; AD7192StartSingleConvertion(Channels,ReadWriteForAd7192,ChipSelected); dataCode = AD7192ReadConvertingData(ReadWriteForAd7192,ChipSelected,GetReadyInput); dataCode =dataCode & 0x00FFFFFF; ReadAD7192Register(REG_DATA, , 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=; AD7192StartContinuousConvertion(Channels,ReadWriteForAd7192,ChipSelected); for(int i=;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=; float temp = 0.0; AD7192Registers[REG_MODE] = ; AD7192Registers[REG_CONF] = ; 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, , AD7192Registers,ReadWriteForAd7192,ChipSelected); AD7192Registers[REG_CONF] = CHOP_DIS|REF_IN1|TEMP|BURN_DIS|REFDET_DIS|BUF_DIS|UB_BI|GAIN_1; WriteAD7192Register(REG_CONF, , AD7192Registers,ReadWriteForAd7192,ChipSelected); temperatureCode = AD7192ReadConvertingData(ReadWriteForAd7192,ChipSelected,GetReadyInput); temp = (temperatureCode-0x800000)/2815.0-; return temp; }
STM32应用实例十一:基于SPI和AD7192的数据采集的更多相关文章
- Keil MDK STM32系列(七) STM32F4基于HAL的PWM和定时器
Keil MDK STM32系列 Keil MDK STM32系列(一) 基于标准外设库SPL的STM32F103开发 Keil MDK STM32系列(二) 基于标准外设库SPL的STM32F401 ...
- C语言库函数大全及应用实例十一
原文:C语言库函数大全及应用实例十一 [编程资料]C语言库函数大全及应用实例十一 函数名: setbkcolor 功 能 ...
- mybatis 详解(三)------入门实例(基于注解)
1.创建MySQL数据库:mybatisDemo和表:user 详情参考:mybatis 详解(二)------入门实例(基于XML) 一致 2.建立一个Java工程,并导入相应的jar包,具体目录如 ...
- pixy&STM32使用记录(串口&SPI外设)
先踏踏实实的把stm32的外设串口,SPI搞清楚,不要眼高手低,看不起小事.用SPI通信将pixy的数据读出来,将数据用串口发到串口助手上,然后处理数据,利用STM32的定时器调节pwm,控制电机,先 ...
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(Wi-Fi模块AT指令TCP透传方式),MQTT通信控制升级
实现功能概要 前面的版本都是,定时访问云端的程序版本,如果版本不一致,然后下载最新的升级文件,实现升级. 这一节,在用户程序里面加入MQTT通信,执行用户程序的时候,通过接收MQTT的升级命令实现升级 ...
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于GPRS模块(Air202,SIM800)AT指令TCP透传方式,MQTT通信控制升级
实现功能概要 这节和上一节的功能一样(只不过上节是利用Wi-Fi模块,这节是利用GPRS模块) 用户程序里面加入MQTT通信,执行用户程序的时候, 通过接收MQTT的升级命令实现升级. 凡是可以实现M ...
- 基于SPI的数据报过滤原理与实现
一.个人防火墙技术概述 随着网络安全问题日益严重,广大用户对网络安全产品也越来越关注.防火墙作为一种网络安全工具,早已受到大家的青睐.在PC机上使用的个人防火墙,很大程度上成为广大网民的安全保护者.W ...
- 联盛德 HLK-W806 (十一): 软件SPI和硬件SPI驱动ST7567液晶LCD
目录 联盛德 HLK-W806 (一): Ubuntu20.04下的开发环境配置, 编译和烧录说明 联盛德 HLK-W806 (二): Win10下的开发环境配置, 编译和烧录说明 联盛德 HLK-W ...
- 基于scrapy爬虫的天气数据采集(python)
基于scrapy爬虫的天气数据采集(python) 一.实验介绍 1.1. 知识点 本节实验中将学习和实践以下知识点: Python基本语法 Scrapy框架 爬虫的概念 二.实验效果 三.项目实战 ...
随机推荐
- string赋值和操作
string赋值 string s1; //默认构造函数,s1为空串 string s1(s2); //将s2初始化为s1的一个副本 string s3("value"); //将 ...
- sublime test3 乱码问题的解决
1.下载ConvertToUTF8插件,地址:http://pan.baidu.com/s/1bnvVd2R 2.按Ctrl+Shift+P打开命令行,输入Install Package,回车,然后继 ...
- PHP文件系统管理
文件概念: 第一个是windows的文件,另一个php根据LINUX的文件,两者是有所不同的,我们说的页面基于windows的文件可以是是文件夹(也就是目录)或是文件,而php两者都必须有,它包含目录 ...
- python中的深拷贝和浅拷贝
python的复制,深拷贝和浅拷贝的区别 在python中,对象赋值实际上是对象的引用.当创建一个对象,然后把它赋给另一个变量的时候,python并没有拷贝这个对象,而只是拷贝了这个对象的引用 一 ...
- python中的*和**的用途
def function_with_one_star(*t): print(t, type(t)) def function_with_two_stars(**d) print(d, ty ...
- Java基础_0303:封装性初步
class Book { // 定义一个新的类 private String title; // 书的名字 private double price; // 书的价格 public void getI ...
- 标准盒模型、IE盒模型
结论:IE盒模型是陈旧知识点,除了帮助理解css3 box-sizing: border-box(等分宽度布局)外没什么用. 标准(W3C)模型中:CSS中的宽(width) = 内容 (conten ...
- HttpWebResponse 解压gzip、deflate压缩
需要使用到两个Stream的子类:GZipStream.DeflateStream,代码如下: public string GetResponseBody(HttpWebResponse respon ...
- 【CentOS】MySQL的安装
版本信息:CentOS 7.2 64位 CentOS(Community Enterprise Operating System,中文意思是:社区企业操作系统)是Linux发行版之一,它是来自于Red ...
- 1.2MyBatis介绍
MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了google code,并且改名为MyBatis,实质上 ...