基于STM32F103驱动AD9220高速AD数据采集模块采样单端/差分信号

电子说

1.4w人已加入

描述

一、AD9220模块简介

AD9220为新代高性能、12位模数转换器,采用单电源供电。具有真12位线性度和温度漂移性能,以及11.5位或更佳的交流性能。
AD9220采用高速、低成本的单CMOS工艺及新颖的架构,分辨率和速度均达到现有混合单芯片方案的水平,而功耗与成本却低得多。内置片内高性能、低噪声采样保持放大器,选用外部基准电压,以满足应用的直流精度与温度漂移要求。器件采用多级差分流水线架构,内置数字输出纠错逻辑,在额定数据速率时可提供12位精度,并保证在整个工作温度范围内无失码。适用于IF下变频的通讯系统。
STM32F103
特性参数

  • 模块供电:DC 5V
  • 模块电流:20mA(MAX)
  • 通讯协议:数据并行
  • 模块控制信号电平:3.3V
  • 模块输入电压范围:0~5V
  • 输入阻抗:1M欧
  • ADC分辨率位数:12位
  • 采样率:10MSPS
  • 输入通道数:1通道
  • 基准电压:2.5V,可焊接SOP8封装外部输入基准
  • 采样模式:可配置采样电压范围,最大0~5V
  • 输出模式:12位数据并行

模块应用

  • 电力线监控和保护、多相电机控制、仪表和控制、多轴定位、数据采集等系统

二、AD9220模块接口说明

STM32F103

VINB:模拟输入引脚(-),输入差分信号。下面的焊盘是选择单端输入还是差分输入,默认单端输入。
REF:外部基准输入。下面的焊盘是选择外部基准输入和内部基准输入,默认内部基准输入。

三、AD9220的通讯方式

AD9220采用同步并行接口通讯方式,通讯完全依赖“时钟驱动”,每一个时钟周期完成:模拟采样,内部转换,数据输出。
时序工作流程:

  1. 时钟上升沿触发采样,CLK上升沿 → 采样模拟信号。
  2. 内部延迟,ADC不是立即输出结果,而是经过几个周期延迟再输出。
  3. 数据输出到并行总线。

下图为时序时间和时序图:
STM32F103

四、AD9220的输入范围与输出数据格式

AD9220输出12位数据,D0到D11,D11为最高位,D0位最低位。AD9220支持单端输入和差分输入,模块默认使用单端信号输入。
单端输入范围[Vref - Vref,Vref + Vref],以基准电压Vref为中点,输出二进制格式如下:

输入输出
Vref - Vref0000 0000 0000
Vref(中点)1000 0000 0000
Vref + Vref1111 1111 1111

差分输入范围[-Vref,+Vref],0V为中点,输出二进制格式如下:

输入输出
-Vre0000 0000 0000
0V(中点)1000 0000 0000
+Vref1111 1111 1111

数据读取:
AD9220的数据不是连续流,而是每个时钟周期更新一次,读取数据需在CLK上升沿到Pipeline Delay延迟内读取。注意:并行数据读取时,12条数据线同时采样,避免IO延迟不一致,布线长度不等。

数据对齐:
由于有Pipeline 延迟,输入信号 ≠ 当前输出数据,实际关系:当前输出 = N个周期前的输入。

其中,转换电压的换算公式:Vol = (采样值 / 4096)* Vref。

五、STM32F103驱动AD9220

准备工作

STM32F103ZET6开发板,AD9220高速AD数据采集模块,导线若干。

引脚接线

STM32F103ZET6AD9220
PA4CLK
PC0D1
PC1D2
PC2D3
PC3D4
PC4D5
PC5D6
PC6D7
PC7D8
PC8D9
PC9D10
PC10D11
PC11D12
PC12D0

STM32F103

代码示例

AD9220.c

#include "AD9220.H"

void AD9220_IO_Init(void)
{
	GPIO_InitTypeDef GPIO_InitStructure ; 

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE);	 //使能PB,PE端口时钟

	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3| GPIO_Pin_4| GPIO_Pin_5| GPIO_Pin_6| GPIO_Pin_7| GPIO_Pin_8| GPIO_Pin_9| GPIO_Pin_10| GPIO_Pin_11| GPIO_Pin_12; 
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
	GPIO_Init(GPIOC ,&GPIO_InitStructure) ;

	GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
	GPIO_Init(GPIOA ,&GPIO_InitStructure);
}

uint16_t AD9220ReadData(void)
{
  uint16_t data;
	DAC902_CLK = 0;
	data = GPIO_ReadInputData(GPIOC)&0X1FFF;
	data = GPIO_ReadInputData(GPIOC)&0X1FFF;
	data = GPIO_ReadInputData(GPIOC)&0X1FFF;
	data = GPIO_ReadInputData(GPIOC)&0X1FFF;//增加延时
	data = ((data< < 1)&0X1FFF)|(data > >12);//对管脚数据重新排序,详细对应关系查看AD9220.H中定义
	DAC902_CLK = 1;
	return (data&0X0FFF);
}

main.c

#include "sys.h"
#include "ad9220.h"
#include "delay.h"
#include "usart.h"

volatile uint16_t AD_Data = 0;
#define FIFOLEN 8
volatile uint16_t fifoPtr = 0;

int32_t int_sampleVol[8];

#define VREF_mV 2500

int main(void)
{
	char showLcd[30];
	
	AD9220_IO_Init();//AD9220初始化
	
	SystemInit();
	delay_init();	     //延时初始化
	usart_Init(115200);   //串口初始化
	delay_ms(100);
	
	while(1)
	{
		AD_Data = AD9220ReadData();	//AD数据读取
		int_sampleVol[fifoPtr++] = ((int32_t)5000)*((float)((short)AD_Data)/4096);	//单端
//		int_sampleVol[fifoPtr++] = (int32_t)(((float)(AD_Data - 2048) / 2048.0f) * VREF_mV);  //差分
		fifoPtr %= FIFOLEN;
		sprintf(showLcd, "AD9220 Vol = %04dmV", int_sampleVol[0]);	
		usart_SendString(showLcd);
		usart_SendString("rn");

		delay_ms(100);
	}
}

效果展示

单端输入
STM32F103

差分输入,注意:要P4下面焊盘要短接右边焊盘。
STM32F103

六、注意事项与常见问题

注意事项
(1) 模块为低功耗模块,供电电源不超过6V,信号输入电压不可超过5.5V。
(2) 由于模块是高精度器件,为了避免不必要的干扰,建议使 用线性电源供电。
(3) 输出信号线建议尽量短,模块接口为SMA,建议使用同轴线SMA接口的线材。接触不良或劣质的线材可能导致信号衰减或者噪声过大。
(4) 配送的代码仅为配套主控板使用,不提供单片机教程,宝贝详情展示以外的功能需要自行开发。
(5) 如需简单测试模块功能,建议搭配本店控制板使用,正确接线后给控制板供电即可实现信号采集显示。

常见问题
Q:AD9220配合本店主控板能到多少采样率?
A:由于单片机的主频和IO速度不够,我们没有做主控板的最高速度测试,如需达到10MSPS采样率,一般需要用到FPGA等高速逻辑器件。

Q:我想将AD9220的12位分辨力用到1-3V的采集,需要怎么做?
A:根据原理图,AD9220采集的电压范围是Vin=Vb±Ref,即是说需要将Vb=2V,Vref=1V即可。

Q:我用STC51单片机采集的数据怎么不对,有较大跳动,是什么原因?
A:一般来说有两种可能,一是信号本身抖动就比较大,二是通讯电平不兼容,AD9220是3.3V通信电平,用5V-TTL的话会对模块有干扰。

Q:使用AD9220和配套的主控板,AD9220使用5V供电,无法采集到 5V的电压?
A:首先AD9220和主控板之间的电源是需要共地,否则AD9220无法接收和返回正常的信号。这样就无法采集,其次是AD9220做了电源的反接保护,需要采集到5V电压建议供电5.3V左右。但是不可超过5.8V,这样就可以采集到5V的电压。

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分