目录

  • 第一章 ADS79xx系列芯片特性简介
  • 第二章 芯片内部结构简介
  • 第三章 封装介绍
  • 第四章 硬件布线设计
  • 第五章 基于STM32F103平台的Keil编程
  • 参考文献

第一章 ADS79xx系列芯片特性简介

基本特性
12/10/8 位分辨率产品系列
• 零等待时间
• 20MHz 串行接口
• 模拟电源范围:2.7V 至 5.25V
• I/O 电源范围:1.7V 至 5.25V
• 两个软件可选择单极,输入范围:0 到 VREF 和 0 到 2 x VREF
• 针对通道选择的自动和手动模式
• 4 通道、8 通道器件和 12 通道、16 通道器件大小相同
• 每通道两个可编程警报级别
• TSSOP 封装中四个可独立配置的 GPIO:VQFN 封装中一个 GPIO
• 典型功率耗散值:1MSPS下为14.5 mW (+VA = 5 V, +VBD = 3 V, 相当于工作电流约为2~4mA)
• 断电电流(1μA, 允许低功耗运行)
• 输入带宽(3db时为47MHz需要在输入前端进行抗混叠设计
• 38 引脚、30 引脚 TSSOP 和 32 引脚、24 引脚VQFN 封装

第二章 芯片内部结构简介


从中可以看出,Ch0~Chn为芯片的模拟输入通道端,由模数转换器控制哪个通道与输出接口MXO连接。AINP为芯片内部单ADC的输入端;REF为ADC的参考源输入端,转换的结果由SDO被输出至主机。此外,SDI,SCK,CS与SDO共同构成了该芯片的通信接口。该芯片推荐在MXO与AINP中间接入一个高输入阻抗的PGA(可编程增益放大器),用于提高输入阻抗。而GPIO1-GPIO3可用于控制增益PGA的增益系数。此外,GPIO0可用于对输入电压的高低进行报警。

第三章 封装介绍

以ADS7952/ADS7956/ADS7960为例,说明封装的各个引脚定义

引脚号 引脚 功能
1 AGND 连接至模拟地
2 MXO 连接到芯片内部多路复用器Muxplexier的输出端
3 AINP 内部单ADC的输入正端
4 AINM 内部单ADC的输入负端
5 NC 连接至模拟地
6 NC 连接至模拟地
7~18 CH 输入通道
19 NC 连接至模拟地
20 NC 连接至模拟地
21 +VA 模拟电压输入,一般为5V,决定了所能检测的电压范围
22 AGND 连接至模拟地
23 CS’ 连接至模拟地
24 SCLK SPI协议的SCLK线
25 SDI SPI协议的SDI线(MOSI)
26 SDO SPI协议的SDO线(MISO)
27 BDGND 连接到数字地
28 +VBD 数字电压输入,一般为3.3V,决定了逻辑电平
29 GPIO 芯片通用端口,用于报警
30 REFM ADC参考源的地
31 REFP ADC参考源的正输入端,一般接2.5V
32 +VA 模拟电压输入,一般为5V,决定了所能检测的电压范围
33

第四章 硬件布线设计


在设计时,采用单5V供电的方式来整个系统系统供电,并利用REF2925作为2.5V的参考电压源;XC6206-3.3被用于将5V电平转换为3.3V电平,为逻辑部分供电。注意,电路中区分了模拟地与参考地,二者在ADC附近通过0Ω电阻相连。MXO与AINP由于成本限制,选择了直接相连的方式。在输入端,利用33Ω电阻与150pF电容进行抗混叠滤波,低通截止频率为32MHz(这里是参考了小信号带宽47MHz)。最终设计的3D仿真图如下图所示:

第五章 基于STM32F103平台的Keil编程


由数据手册可知,该芯片由SPI协议驱动,故在Keil内使能SPI外设。通过查阅STM32F103的数据手册可知,该主控芯片有2个SPI外设。由于平台选用的是mcudev的STM32F103C8T6平台,如上图所示,其SPI2口上接了24C04,若直接将ADS79XX的SPI接至此处,会产生误码而导致无法通信。故选用SPI1接口,包括PA5~PA7。经过测试,将SPI协议配置如下:

void CS_Init(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能PA端口时钟GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;                //CS2-->PA8 端口配置GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;        //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHzGPIO_Init(GPIOA,&GPIO_InitStructure);                  //根据设定参数初始化GPIOB0GPIO_SetBits(GPIOA,GPIO_Pin_8);                            //PA8 输出高}
void ADS7960_Init(void)
{ SPI_InitTypeDef SPI_InitStructure; //SPI结构体SPI_I2S_DeInit(SPI2);  //清空SPI2的所有设置RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2,ENABLE);//使能SPI2时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//GPIOB时钟//GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE); //禁用JTAG//PA5~PA7使能复用功能,SCK->PA5 MISO->PA6 MOSI->PA7GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);SPI_InitStructure.SPI_Direction=SPI_Direction_2Lines_FullDuplex;SPI_InitStructure.SPI_Mode=SPI_Mode_Master; //STM32F103为SPI的主机SPI_InitStructure.SPI_DataSize=SPI_DataSize_16b; //16位数据SPI_InitStructure.SPI_CPOL=SPI_CPOL_Low; //SCK引脚在空闲时为低电平SPI_InitStructure.SPI_CPHA=SPI_CPHA_1Edge; //SCK时钟的第一个边沿进行数据位的采样,数据在第一个时钟边沿被锁存。SPI_InitStructure.SPI_NSS=SPI_NSS_Soft; //软件控制CSSPI_InitStructure.SPI_BaudRatePrescaler=SPI_BaudRatePrescaler_4; //4分频 9MHzSPI_InitStructure.SPI_FirstBit=SPI_FirstBit_MSB; //数据高位在前SPI_InitStructure.SPI_CRCPolynomial=7;SPI_Init(SPI2,&SPI_InitStructure); //SPI2初始化SPI_Cmd(SPI2,ENABLE); //SPI2使能CS_Init();ADS7960_CS2=1;
}
u16 SPI1_ReadWriteByte(u16 TxData)
{                    while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_TXE) == RESET){}//等待发送区空  SPI_I2S_SendData(SPI1, TxData); //通过外设SPIx发送一个byte数据while (SPI_I2S_GetFlagStatus(SPI1, SPI_I2S_FLAG_RXNE) == RESET){} //等待接收完一个byte  return SPI_I2S_ReceiveData(SPI1); //返回通过SPIx上一时刻接收的数据   }

以上便完成了STM32F103平台上的SPI初始化,接下来查阅数据手册,明确通过MOSI往ADC芯片内写入数据的含义。

选择自动模式auto-2(用于轮扫所有的通道)。可以看到:
DI15-DI12用于选择模式,将其置为0x3;
DI11用于使得DI10~DI0的设置有效,选为1;
DI10则用于控制通道,显然第一次调用时应当将其归1,从CH0开始,而后将其至1,每次通道加1;
DI09-DI07不关心,任意设置即可;
DI06选择转换范围,是2×VREF还是1×VREF,这里我们选用2倍参考输入,即5V输入范围;
DI05用于选择低功耗,这里我们不需要低功耗运行,故选择为1;
DI04为配置DO15-DO12的内容,这里我们不适用GPIO,故选择为0,这是DO15-DO12为通道代码,如CH0就为0x0,CH15就为0xF;
DI03-DI00用于配置GPIO,我们未用到,故将其置0.

此外,auto-2模式写入的设置在2次使能芯片后方才有效。也就是说,这时通过MOSI写入的指令在两次使能后才从MISO中输出。故读取指令编写如下:

void ADS7960_ReadSR2(u8* data)
{  u16 byte[13]={0};ADS7960_CS2=0;                              //使能器件SPI2_ReadWriteByte(0x3C40);    //发送读取状态寄存器命令ADS7960_CS2=1;                              //取消片选delay_us(1);ADS7960_CS2=0;                              //使能器件byte[0]=SPI2_ReadWriteByte(0x3840);    //发送读取状态寄存器命令ADS7960_CS2=1;                              //取消片选delay_us(1);ADS7960_CS2=0;                              //使能器件byte[1]=SPI2_ReadWriteByte(0x3840);    data[0]=(byte[1]&0x0FFF)>>4;ADS7960_CS2=1;                              //取消片选delay_us(1);ADS7960_CS2=0;                              //使能器件byte[2]=SPI2_ReadWriteByte(0x3840);    data[1]=(byte[2]&0x0FFF)>>4;ADS7960_CS2=1;                              //取消片选delay_us(1);ADS7960_CS2=0;                              //取消片选byte[3]=SPI2_ReadWriteByte(0x3840);    data[2]=(byte[3]&0x0FFF)>>4;ADS7960_CS2=1;                              //取消片选delay_us(1);ADS7960_CS2=0;                              //取消片选byte[4]=SPI2_ReadWriteByte(0x3840);    data[3]=(byte[4]&0x0FFF)>>4;ADS7960_CS2=1;                              //取消片选delay_us(1);//以下为ADS7960ADS7960_CS2=0;                              //取消片选byte[5]=SPI2_ReadWriteByte(0x3840);    data[4]=(byte[5]&0x0FFF)>>4;ADS7960_CS2=1;                              //取消片选delay_us(1);ADS7960_CS2=0;                              //取消片选byte[6]=SPI2_ReadWriteByte(0x3840);   data[5]=(byte[6]&0x0FFF)>>4;ADS7960_CS2=1;                              //取消片选delay_us(1);ADS7960_CS2=0;                              //取消片选byte[7]=SPI2_ReadWriteByte(0x3840);    data[6]=(byte[7]&0x0FFF)>>4;ADS7960_CS2=1;                              //取消片选delay_us(1);ADS7960_CS2=0;                              //取消片选byte[8]=SPI2_ReadWriteByte(0x3840);    data[7]=(byte[8]&0x0FFF)>>4;ADS7960_CS2=1;                              //取消片选delay_us(1);ADS7960_CS2=0;                              //取消片选byte[9]=SPI2_ReadWriteByte(0x3840);    data[8]=(byte[9]&0x0FFF)>>4;ADS7960_CS2=1;                              //取消片选delay_us(1);ADS7960_CS2=0;                              //取消片选byte[10]=SPI2_ReadWriteByte(0x3840);    data[9]=(byte[10]&0x0FFF)>>4;ADS7960_CS2=1;                              //取消片选delay_us(1);ADS7960_CS2=0;                              //取消片选byte[11]=SPI2_ReadWriteByte(0x3840);    data[10]=(byte[11]&0x0FFF)>>4;ADS7960_CS2=1;                              //取消片选delay_us(1);ADS7960_CS2=0;                              //取消片选byte[12]=SPI2_ReadWriteByte(0x3840);    data[11]=(byte[12]&0x0FFF)>>4;ADS7960_CS2=1;                              //取消片选delay_us(1);
}

而后,通过USART1串口输出采样数值

u8 data[12]={0};
ADS7960_ReadSR2(data);for(i=0;i<=11;i++){while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET);  //线连不需要USART_SendData(USART1,data[i]);}

至此完成了ADS79XX模数转换器的配置与数据读取。

如有需要购买上图中的模块(价格为¥100,包顺丰),请私信我。程序相关代码在https://download.csdn.net/download/qq_43657314/12515311给出

参考文献

[1] TI ADS7952数据表, available at https://www.ti.com.cn/product/cn/ADS7952
[2] STM STM32F103C8T6数据表, available at https://www.stmcu.org.cn/document/list/index/category-154

基于STM32F103平台的ADS79xx系列ADC(TI公司)应用方案相关推荐

  1. COS云存储有哪些优势?基于EasyCVR平台的两种监控视频数据存储方案

    随着物联网.AI.云计算.大数据等新兴技术的发展.海量设备的接入.视频质量的不断提升,监控视频存储也面临着巨大的挑战.当前用户对视频监控数据的存储问题,主要考虑到以下三个因素: 1)数据的安全性和稳定 ...

  2. 物联网和android有关系吗,基于Android平台的物联网网关有什么优势?

    针对移动终端融合物联网具有很大的意义,而物联网接入互联网的瓶颈是网关 本文提出了基于Android平台.采用蓝牙连接物联网的网关方案,从而有效避免了物联网网关的开发瓶颈. 1 基于Android平台的 ...

  3. 个人项目 免费开源 基于STM32F103的oled示波器,频谱fft adc电压采集 spi接口0.96寸oled

    @基于stm32的adc检测波形 0.96oled显示(spi/iic)移植gui库(开源). 使用标准库开发,未使用dsp官方库. adc采集到电压并且在oled上显示. 支持0-3.3v电压采集显 ...

  4. 项目体系架构设计——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(四)

    系列文章目录 初识推荐系统--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一) 利用用户行为数据--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二) 项目主要效果展示--基 ...

  5. 利用用户行为数据——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二)

    系列文章目录 初识推荐系统--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一) 利用用户行为数据--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二) 项目主要效果展示--基 ...

  6. 基础环境搭建——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(五)

    系列文章目录 初识推荐系统--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一) 利用用户行为数据--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二) 项目主要效果展示--基 ...

  7. WEBRTC系列之基于IOS平台编译(一)

    Webrtc 系列文章: WEBRTC系列之基于IOS平台编译(一) WEBRTC系列之 AGC 算法原理初识(二) WEBRTC系列之 AGC 算法原理初识(三) WEBRTC系列之基于IOS平台编 ...

  8. 实时推荐服务建设——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(八)

    系列文章目录 初识推荐系统--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一) 利用用户行为数据--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二) 项目主要效果展示--基 ...

  9. 基于STM32F103和物联网平台的滚动轴承在线监测系统

    摘要: 设计了一种基于云平台的滚动轴承在线监测系统,信号采集模块将振动传感器输出的振动信号进行变换,再通过 有源滤波模块处理后交给控制器,控制器内部进行 A / D 采样,随后处理器对 A / D 采 ...

最新文章

  1. USB-HDD-WinPE U盘版WINPE启动盘维护系统
  2. buuctf 二维码
  3. vue 给iframe设置src_vue组件中使用iframe元素
  4. 使用Notepad++打造称心的IDE: Python PHP Perl
  5. jq轮播tab等特效果
  6. 【Android图像处理】图像处理之-素描效果
  7. Shell脚本学习-阶段十三-在 Linux 中使用日志来排错
  8. 21天自学c语言漫画版,21天学通C语言第6版
  9. 免费下载Microsoft Visual C++ 2010 Express (VSExpress)安装包地址分享速进
  10. 卫星通信 | 使用虹科SAF手持式频谱分析仪进行TDD信号分析
  11. 学嵌入式有必要参加培训吗
  12. arcgis影像怎么去黑边_arcgis遥感图像去黑边林林种种(至少7种方法)
  13. mysql 事务一直running_事务一直running?记录一次事务异常导致的下单阻塞
  14. 网段、子网号、网络地址、网络号辨析
  15. 使用ie浏览器打开chrome(谷歌)。
  16. matlab regress bint,Matlab一个关于regress的困惑
  17. java容器系列一(java容器Collection概述)
  18. 单目视觉定位测距的两种方式
  19. Confluent介绍(一)
  20. 9.leetcode题目189: Rotate Array

热门文章

  1. 学习LSM(Linux security module)之二:编写并运行一个简单的demo
  2. 51.【Java String方法的小结】
  3. Packet Tracer - 研究直连路由
  4. Diagonal Scaling
  5. 关于 web service 参数传递的序列化反序列化问题
  6. 【汇正财经】什么是股票交割方式?股票交割方式有哪些?
  7. 第十二章 齐桓公不计前嫌用良才 管夷吾庙堂陈谋论国是
  8. matlab矩阵的合并
  9. 在windows下启动容器时,报 the input device is not a TTY. If you are using mintty, try prefixing the command
  10. 今天开始正式认认真真学习Python,以上!