1. AD7793简介:

适合高精度测量应用的低功耗、低噪声的完整模拟前端

内置一个16/24位Σ-Δ型ADC(采样速率 4.17 ~ 470 Hz可调)

含有三路差分模拟输入,内置输入缓冲器

片内集成低噪声可编程仪表放大器(PGA,Gain = 1、2、4、8、16、32、64、128可调)

内置低噪声、低漂移带隙基准电压源

内置可编程激励电流源、熔断电流源、偏置电压发生器(激励电流 10uA、210uA、1mA可调)

四线串行SPI通信接口

2. AD7793应用领域:

热电偶温度测量、热敏电阻测量

力传感器测量

仪器仪表传感器采样

3. 功能框图、应用电路

4. 通信时序

5. 实际波形图

黄 - SCLK ; 蓝 - MOSI

黄 - SCLK ; 蓝 - MISO

黄 - SCLK ; 蓝 - CS

6. stm32F407驱动程序

AD7793.c

#include "AD7793.h"/*******************************************************************************
* Description    : Configure SPI GPIO
*******************************************************************************/
void SPI_GPIO_Configuration(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC,ENABLE);GPIO_StructInit(&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = SPI_SCLK_PIN | SPI_MISI_PIN | SPI_MISO_PIN;GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF;                      //复用GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;                       //推挽输出GPIO_InitStructure.GPIO_PuPd =  GPIO_PuPd_UP;                        //上拉GPIO_Init(SPI_GPIO_PORT,&GPIO_InitStructure);GPIO_PinAFConfig(SPI_GPIO_PORT, GPIO_PinSource10, GPIO_AF_SPI3);GPIO_PinAFConfig(SPI_GPIO_PORT, GPIO_PinSource11, GPIO_AF_SPI3);GPIO_PinAFConfig(SPI_GPIO_PORT, GPIO_PinSource12, GPIO_AF_SPI3);GPIO_InitStructure.GPIO_Pin = SPI_GPIO_CS_PIN;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;GPIO_InitStructure.GPIO_PuPd =  GPIO_PuPd_NOPULL;GPIO_Init(SPI_GPIO_CS_PORT,&GPIO_InitStructure);GPIO_SetBits(SPI_GPIO_CS_PORT,SPI_GPIO_CS_PIN);                      //CS输出高,失能通信
}/*******************************************************************************
* Description    : Configure SPI
*******************************************************************************/
void SPI_Configuration(void)
{SPI_InitTypeDef SPI_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI3,ENABLE);SPI_Cmd(SPI3, DISABLE);SPI_InitStructure.SPI_Direction = SPI_Direction_2Lines_FullDuplex;    //双线双向全双工模式SPI_InitStructure.SPI_Mode = SPI_Mode_Master;                       //作为主机使用SPI_InitStructure.SPI_DataSize = SPI_DataSize_8b;                  //数据长度8SPI_InitStructure.SPI_CPOL = SPI_CPOL_High;                         //同步时钟的空闲状态为高电平SPI_InitStructure.SPI_CPHA = SPI_CPHA_2Edge;                        //同步时钟的第二个跳变沿(上升或下降)数据被采样SPI_InitStructure.SPI_NSS = SPI_NSS_Soft;                           //软件设置NSS功能SPI_InitStructure.SPI_BaudRatePrescaler = SPI_BaudRatePrescaler_32; //波特率预分频值为32,84/32 = 2.625MHzSPI_InitStructure.SPI_FirstBit = SPI_FirstBit_MSB;                    //数据传输从MSB位开始SPI_InitStructure.SPI_CRCPolynomial = 7;   SPI_Init(SPI3, &SPI_InitStructure);SPI_Cmd(SPI3, ENABLE);
}/*******************************************************************************
* Description    : send and receive data
*******************************************************************************/
uint8_t SPI3_TransmitByte(uint8_t TxData)
{while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_TXE) == RESET);      //等待发送区空SPI_I2S_SendData(SPI3, TxData);                                     //SPIx发送一个Byte数据while (SPI_I2S_GetFlagStatus(SPI3, SPI_I2S_FLAG_RXNE) == RESET);  //等待接收完一个Bytereturn SPI_I2S_ReceiveData(SPI3);                                  //返回接收的数据
}uint8_t SPI3_Read_OneByte(uint8_t reg)
{uint8_t i;SPI_CS_Enable();SPI3_TransmitByte(reg);i = SPI3_TransmitByte(0xFF);SPI_CS_Disable();return i;
}/**
* @brief 读取指定寄存器中多个数据
* @param p: 指向SPI设置参数指针
* @param reg: 寄存器地址
* @param pbuf: 指向存储数据的缓存指针
* @param len: 读取长度
*
* @retval 返回结果
*/
void SPI3_Read_buf(uint8_t reg, uint8_t *pbuf, uint8_t len)
{uint8_t i;SPI_CS_Enable();SPI3_TransmitByte(reg);for(i=0; i<len; i++){pbuf[i] = SPI3_TransmitByte(0xFF);}SPI_CS_Disable();
}/**
* @brief 向指定寄存器中写多个数据
* @param p: 指向SPI设置参数指针
* @param reg: 寄存器地址
* @param pbuf: 指向写数据的缓存指针
* @param len: 写数据长度
*
* @retval 返回结果
*/
void SPI3_Write_buf(uint8_t reg, uint8_t *pbuf, uint8_t len)
{uint8_t status, i;SPI_CS_Enable();SPI3_TransmitByte(reg);for(i=0; i<len; i++){SPI3_TransmitByte(*pbuf++);}SPI_CS_Disable();
}void AD7793_Reset(void)
{//连续32个写1脉冲uint8_t xtemp[3] = {0xFF, 0xFF,0xFF};SPI3_Write_buf(0xFF, xtemp, 3);
}/*******************************************************************************
实测AD7793在Gain=64 16.7Hz 65 dB配置下,无抖动位为15Bit
实测AD7793在Gain=64 33.2Hz 配置下,无抖动位为14Bit
*******************************************************************************/
uint8_t xDevice_ID;
void AD7793_Init(void)
{
//  uint8_t ModeRegisterMsg[2] = {0x00, 0x0A};     //Continuous Conversion Mode\
//                                                  Internal 64 kHz Clock. Internal clock is not available at the CLK pin.\
//                                                  Filter Update Rate - 16.7Hz 65 dB (50 Hz and 60 Hz)uint8_t ModeRegisterMsg[2] = {0x00, 0x07};      //Continuous Conversion Mode\Internal 64 kHz Clock. Internal clock is not available at the CLK pin.\Filter Update Rate - 33.2Hz
//  uint8_t ConfigRegisterMsg[2] = {0x06, 0x90};   //Bias voltage generator disabled\
//                                                  Burnout Current Disable //恒流源失能\
//                                                  Bipolar //双极性\
//                                                  Gain  = 64\
//                                                  Internal Reference Selected.//内部参考\
//                                                  buffered mode   //输入缓冲器使能\
//                                                  AIN1(+) – AIN1(–) uint8_t ConfigRegisterMsg[2] = {0x06, 0x91};    //Bias voltage generator disabled\Burnout Current Disable   //恒流源失能\Bipolar //双极性\Gain  = 64\Internal Reference Selected.//内部参考\buffered mode  //输入缓冲器使能\AIN2(+) – AIN2(–)uint8_t IoRegisterMsg[1] = {0x00};             //Excitation Current Disabled.//SPI外设初始化 2.625MHzSPI_GPIO_Configuration();SPI_Configuration();AD7793_Reset();delay_ms(1);//读取设备ID寄存器xDevice_ID = SPI3_Read_OneByte(0x60);          //ID register  0xXA(AD7792)/0xXB(AD7793)if((xDevice_ID & 0x0F) == 0x0B){//进行功能参数配置写入delay_ms(1);SPI3_Write_buf(0x08, ModeRegisterMsg, 2);     //Mode registerdelay_ms(1);SPI3_Write_buf(0x10, ConfigRegisterMsg, 2);      //Config registerdelay_ms(1);SPI3_Write_buf(0x28, IoRegisterMsg, 1);            //IO registerdelay_ms(1);}
}//读AD7793的转换数据寄存器。3字节,无符号
int32_t Read_AD7793_Data(void)
{uint8_t xStatus=1;uint8_t xRDY=0x80;uint8_t xtemp[3];int32_t adValue=0;//   //每次读取ADC转换值前,先读取状态寄存器的RDY位,是否清0
//  while(xRDY)
//  {
//      xStatus = SPI3_Read_OneByte(0x40);             //Status register
//      xRDY = xStatus & 0x80;
//      vTaskDelay(1);
//  }//读取24位数据寄存器SPI3_Read_buf(0x58, xtemp, 3);                 //Data registeradValue = (((int32_t)xtemp[0])<<16) | (((int32_t)xtemp[1])<<8) | (((int32_t)xtemp[2]));return adValue;
}//将int32转换为2进制,并用串口打印出来。方便调试查看ADC的无抖动位
void ToBin(int32_t xValue)
{int8_t i=0;int32_t Bit_adValue;uint8_t btemp[26];/* 按Bit显示 */Bit_adValue = xValue;for(i=23;i>-1;i--){btemp[i] = (uint8_t)(Bit_adValue & 0x00000001) + '0';Bit_adValue = Bit_adValue>>1;}btemp[24] = '\r';btemp[25] = '\n';RS485_Send_Data(btemp, 26);
}

AD7793.h

#ifndef _AD_7793_H
#define _AD_7793_H
#include "structure.h"//pin
#define SPI_SCLK_PIN        GPIO_Pin_10
#define SPI_MISO_PIN        GPIO_Pin_11
#define SPI_MISI_PIN        GPIO_Pin_12
#define SPI_GPIO_PORT       GPIOC#define SPI_GPIO_CS_PORT   GPIOC
#define SPI_GPIO_CS_PIN     GPIO_Pin_9
#define SPI_CS_Enable()     GPIO_ResetBits(SPI_GPIO_CS_PORT,SPI_GPIO_CS_PIN)    //Chip Select pin set low
#define SPI_CS_Disable()    GPIO_SetBits(SPI_GPIO_CS_PORT,SPI_GPIO_CS_PIN)      //Chip Select pin set Highuint8_t SPI3_Read_OneByte(uint8_t reg);
void AD7793_Init(void);
int32_t Read_AD7793_Data(void);
void ToBin(int32_t xValue);#endif

main.c

int32_t AD7793_adValue;  //ads1115的adc转换值int main(void)
{AD7793_Init();while(1){AD7793_adValue = Read_AD7793_Data();delay_ms(100);}
}

7. 注意事项

(1)上电后必须要复位后才能使用。否则有几率读取的24位ADC转换值不正常。

AD7793_Reset();  --  连续写32个Bit1就复位成功了

(2)int32_t Read_AD7793_Data(void)。AD7793的ADC转换值为无符号的24Bit数据。

(3)int32_t Read_AD7793_Data(void)。为保证每次ADC转换值均为最近一次,最好将while(xRDY)一段屏蔽的加上。

我的应用中,不需要每次数据均为最新的转换值,只要保证读取过程时间短就行,所以这段屏蔽了。

这个片子做热电偶测温、电桥测量实在太方便。电流源、PGA、ADC全集成。我代码里初始化没用电流源切记。

u1s1,AD7793的数据手册是真的友好,全中文没见到有坑,建议去官网下载。

stm32F4驱动AD7793程序-ADC模拟前端-应用详解,应该是最全了相关推荐

  1. 单片机电流检测电路图大全(四款模拟电路设计原理图详解) - 信号处理电子电路图

    电路图简介: 本文主要介绍了单片机电流检测电路图大全(四款模拟电路设计原理图详解).它的主要功能是完成对过电压的瞬时值和峰值的检测.过电压次数的检测.电源输出电压和电流的检测,并通过键盘的操作显示出各 ...

  2. 小程序setdata优化_微信小程序 setData的使用方法详解

    微信小程序 setData的使用方法详解 微信小程序 setData的使用方法详解 最近在使用微信小程序的setData时,遇到了以下问题.如下: 官网文档在使用setData()设置数组对象的某个元 ...

  3. 三菱模块增益和偏置调整步骤_三菱PLC与西门子plc的模拟量编程详解

    三菱PLC与西门子plc的模拟量编程详解 Date:2015-01-01 origin:RCCN上海日成 Visit:2413 三菱和西门子的PLC都有自己的独特的长处的,先讲讲三菱2AD模块吧,2A ...

  4. ADC(模数转换)详解

    ADC(模数转换)详解 前言 ADC的定义 ADC简介 ADC特性 ADC时钟 工作模式 单通道单次转换练习 多通道扫描模式单次转换 前言 在STM32微控制器中,ADC代表模数转换器(Analog- ...

  5. cat命令详解_好程序员Python培训之详解eval好与坏

    好程序员Python培训之详解eval好与坏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,下面我们一起来看一下吧. eval是Python的一个内置函数,这个函数的作用 ...

  6. php curl 模拟多线程,php利用curl 多线程 模拟 并发的详解

    php利用curl 多线程 模拟 并发的详解 发布于 2014-12-07 10:17:25 | 265 次阅读 | 评论: 0 | 来源: 网友投递 PHP开源脚本语言PHP(外文名: Hypert ...

  7. HTML5 多图片上传(前端+后台详解)

    HTML5 多图片上传(前端+后台详解) 1.参考jquery插件库 2.修改代码 3.添加的后台代码 4.删除的后台代码 1.参考jquery插件库 手机端实现多图片上传 2.修改代码 我发现他这里 ...

  8. web前端项目详解:OPPO首页进度条特效(定时轮播)

    web前端项目详解:OPP首页进度条特效(定时轮播) 知识点:布局结构分析,定位运用,页面兼容性问题,Jquery的基础运用(修改盒子样式,动画方法,简单算法,淡入淡出方法,定时器方法)代码结构 效果 ...

  9. python源程序文件的扩展名_python程序文件扩展名知识点详解

    python程序文件的扩展名称是什么 python程序的扩展名有.py..pyc..pyo和.pyd..py是源文件,.pyc是源文件编译后的文件,.pyo是源文件优化编译后的文件,.pyd是其他语言 ...

最新文章

  1. Transformer-LS霸榜ImageNet,输入长度提升三倍!极度压缩参数
  2. 全新思科数字化解决方案与产品让企业如虎添翼
  3. PHP函数处理方法总结
  4. 一个udp用户数据报的数据字段为8192_基于FPGA的千兆网UDP通信分析
  5. drools简单应用
  6. android自动化持续集成,基于持续集成的Android自动化测试.pdf
  7. mysql 时间类型 datetime,timestamp
  8. springMVC rest风格
  9. 服务器怎么修改密码_亚马逊账号登陆不上,修改密码后遭冻结怎么办?有没有什么申诉的办法?...
  10. Java 统计字母个数
  11. 在Spring Boot 项目中使用Spring AOP实现切面日志
  12. acm国际大学上计算机竞赛,ACM国际大学生程序设计竞赛
  13. iPhone 14 Pro将采用开孔全面屏:明年iPhone 15全系标配
  14. vim编辑器常见使用
  15. socketserver剖析.html
  16. I00003 贝尔三角形
  17. 首席省钱赚钱专家微信小程序源码下载,淘宝客 外卖侠 外卖cps 首席多多客 八合一小程序源码
  18. 解决VirtualBox无法安装增强工具
  19. Java实现二维码制作
  20. 更换一个已到使用寿命的墨盒--Epson

热门文章

  1. java对redis的基本操作(初识)
  2. url、href、src 详解
  3. 6月3号=》66页-70页
  4. 在被打击后的心里变化
  5. 头文件相互包含问题的解决办法
  6. 博客园,我的技术摇篮
  7. 90%的人都做错的用户画像,到底应该怎么做?
  8. FineReport的JS编辑框和URL地址栏语法简介
  9. vue3中setup()函数的使用一
  10. linux acl源码,acl框架库下载