基于STM32F103平台的ADS79xx系列ADC(TI公司)应用方案
目录
- 第一章 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公司)应用方案相关推荐
- COS云存储有哪些优势?基于EasyCVR平台的两种监控视频数据存储方案
随着物联网.AI.云计算.大数据等新兴技术的发展.海量设备的接入.视频质量的不断提升,监控视频存储也面临着巨大的挑战.当前用户对视频监控数据的存储问题,主要考虑到以下三个因素: 1)数据的安全性和稳定 ...
- 物联网和android有关系吗,基于Android平台的物联网网关有什么优势?
针对移动终端融合物联网具有很大的意义,而物联网接入互联网的瓶颈是网关 本文提出了基于Android平台.采用蓝牙连接物联网的网关方案,从而有效避免了物联网网关的开发瓶颈. 1 基于Android平台的 ...
- 个人项目 免费开源 基于STM32F103的oled示波器,频谱fft adc电压采集 spi接口0.96寸oled
@基于stm32的adc检测波形 0.96oled显示(spi/iic)移植gui库(开源). 使用标准库开发,未使用dsp官方库. adc采集到电压并且在oled上显示. 支持0-3.3v电压采集显 ...
- 项目体系架构设计——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(四)
系列文章目录 初识推荐系统--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一) 利用用户行为数据--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二) 项目主要效果展示--基 ...
- 利用用户行为数据——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二)
系列文章目录 初识推荐系统--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一) 利用用户行为数据--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二) 项目主要效果展示--基 ...
- 基础环境搭建——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(五)
系列文章目录 初识推荐系统--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一) 利用用户行为数据--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二) 项目主要效果展示--基 ...
- WEBRTC系列之基于IOS平台编译(一)
Webrtc 系列文章: WEBRTC系列之基于IOS平台编译(一) WEBRTC系列之 AGC 算法原理初识(二) WEBRTC系列之 AGC 算法原理初识(三) WEBRTC系列之基于IOS平台编 ...
- 实时推荐服务建设——基于Spark平台的协同过滤实时电影推荐系统项目系列博客(八)
系列文章目录 初识推荐系统--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(一) 利用用户行为数据--基于Spark平台的协同过滤实时电影推荐系统项目系列博客(二) 项目主要效果展示--基 ...
- 基于STM32F103和物联网平台的滚动轴承在线监测系统
摘要: 设计了一种基于云平台的滚动轴承在线监测系统,信号采集模块将振动传感器输出的振动信号进行变换,再通过 有源滤波模块处理后交给控制器,控制器内部进行 A / D 采样,随后处理器对 A / D 采 ...
最新文章
- USB-HDD-WinPE U盘版WINPE启动盘维护系统
- buuctf 二维码
- vue 给iframe设置src_vue组件中使用iframe元素
- 使用Notepad++打造称心的IDE: Python PHP Perl
- jq轮播tab等特效果
- 【Android图像处理】图像处理之-素描效果
- Shell脚本学习-阶段十三-在 Linux 中使用日志来排错
- 21天自学c语言漫画版,21天学通C语言第6版
- 免费下载Microsoft Visual C++ 2010 Express (VSExpress)安装包地址分享速进
- 卫星通信 | 使用虹科SAF手持式频谱分析仪进行TDD信号分析
- 学嵌入式有必要参加培训吗
- arcgis影像怎么去黑边_arcgis遥感图像去黑边林林种种(至少7种方法)
- mysql 事务一直running_事务一直running?记录一次事务异常导致的下单阻塞
- 网段、子网号、网络地址、网络号辨析
- 使用ie浏览器打开chrome(谷歌)。
- matlab regress bint,Matlab一个关于regress的困惑
- java容器系列一(java容器Collection概述)
- 单目视觉定位测距的两种方式
- Confluent介绍(一)
- 9.leetcode题目189: Rotate Array
热门文章
- 学习LSM(Linux security module)之二:编写并运行一个简单的demo
- 51.【Java String方法的小结】
- Packet Tracer - 研究直连路由
- Diagonal Scaling
- 关于 web service 参数传递的序列化反序列化问题
- 【汇正财经】什么是股票交割方式?股票交割方式有哪些?
- 第十二章 齐桓公不计前嫌用良才 管夷吾庙堂陈谋论国是
- matlab矩阵的合并
- 在windows下启动容器时,报 the input device is not a TTY. If you are using mintty, try prefixing the command
- 今天开始正式认认真真学习Python,以上!