基于STM32F103驱动AD7608采集ADC数据信号

一、AD7608模块简介

  AD7608是一款18位、8通道同步采样模数数据采集系统(DAS),该器件内置模拟输入箝位保护、二阶抗混叠滤波器、跟踪保持放大器、18位电荷再分配逐次逼近型模数转换器(ADC)、灵活的数字滤波器、2.5 V基准电压源、基准电压缓冲以及高速串行和并行接口。AD7608采用5 V单电源供电,可以处理±10 V和±5 V真双极性输入信号,同时所有通道均能以高达200 kSPS的吞吐速率采样。输入箝位保护电路可以耐受最高达±16.5 V的电压。无论以何种采样频率工作,AD7608的模拟输入阻抗均为1 MΩ。它采用单电源工作方式,具有片内滤波和高输入阻抗,因此无需驱动运算放大器和外部双极性电源。AD7608抗混叠滤波器的3 dB截止频率为22 kHz;当采样速率为200 kSPS时,它具有40 dB抗混叠抑制特性。灵活的数字滤波器采用引脚驱动,可以改善信噪比(SNR),并降低3 dB带宽。
在这里插入图片描述

二、主要特性及应用

主要特性

  • 18 位分辨率:分辨率提升带来更小的量化误差,适合精度要求极高的测量系统。
  • 8 通道同步采样:所有通道同时采样,非常适用于多相电机控制、电力监测等应用。
  • 200 kSPS 全通道采样速率:每通道峰值速率可达 200 kSPS。
  • 二阶抗混叠模拟滤波:3 dB 截止频率约 22 kHz,能够有效减少混叠。
  • 可编程数字滤波:管脚驱动选择灵活的过采样模式,改善 SNR。
  • 真双极输入 ±10 V/±5 V:单 5 V 供电,可直接测量高达 ±10 V 的信号,输入阻抗高达 1 MΩ。

应用场景

  • 多相电机驱动和控制系统
  • 配电和电能质量监测
  • 工业自动化中的多通道数据采集
  • 精密测试与测量仪器

三、与AD7606的主要区别

特性AD7608AD7606
分辨率18 位16 位
通道数固定 8 通道可选 4/6/8 通道
最大采样速率200 kSPS 全通道200 kSPS(部分 EP 为 150 kSPS)
模拟滤波二阶抗混叠模拟滤波,–3 dB @ 22 kHz二阶抗混叠模拟滤波,–3 dB @ 22 kHz
数字滤波可编程过采样,SNR 改善可编程过采样,SNR 改善
输入范围±10 V/±5 V,1 MΩ,±16.5 V 保护±10 V/±5 V,1 MΩ,±16.5 V 保护
接口并行/SPI/QSPI/DSP并行/SPI/DSP

四、AD7608模块接口说明

  1. DB7为DOUTA,DB8为DOUTB。
  2. 板载电阻设置说明(默认外部基准,串行接口,10V输入范围):
    1、内部基准设置:R28电阻拆除,R24拆除,R19焊接1K阻值电阻。
    2、外部基准设置:R28焊接0R电阻,R19电阻拆除,R24焊接1K阻值电阻。
    3、并行接口设置:R18电阻拆除,R23焊接1K阻值电阻。
    4、串行接口设置:R18焊接1K阻值电阻,R23电阻拆除。
    5、5V输入范围设置:R22焊接1K阻值电阻,R17电阻拆除。
    6、10V输入范围设置:R17焊接1K阻值电阻,R22电阻拆除。

五、时序图分析


转换之后读:先等 BUSY 变低(转换彻底完成),再拉 CS 读数据。

  1. 启动转换:对任一 CONVST 引脚(A 或 B)拉低并保持至少 t₅,ADC 开始采样并进入转换,BUSY 拉高表示“忙碌中”。
  2. 等待转换完成:从 CONVST上升沿 到 BUSY上升沿 的这段时间就是 t₁,之后 BUSY 一直保持高,直到转换结束。
  3. 读数据:转换结束后(BUSY下降沿),拉低 CS 并按时序读出数据,BUSY下降沿至下次 CS下降沿的间隔为 t₄,保证总线空闲。
  4. 复位准备:如需硬复位,RESET 脉冲宽度 ≥ t₇,确保寄存器恢复初始。

转换期间读:边转换边读,提高吞吐量——上一周期的数据可在本周期转换过程中取走。

  1. 启动转换:同样拉低 CONVST,BUSY 上升表示“忙碌中”。
  2. 转换过程中读数据:BUSY 高的 t₃ 之内,CS 可提前拉低;也就是说,不必等 BUSY 变低之后才开始读,而是在转换完成前的 t₆ 窗口内就能读到上一次转换的数据。
  3. 转换完成不影响读取:即便 BUSY 拉低(转换结束),只要 CS 仍在低电平期间,输出依旧稳定可读。
  4. 定期触发:多次周期循环(t_CYCLE)中不断启动 CONVST 并在转换中或转换后读出。

      图6显示串行模式下从AD7608读取一个通道的数据(由CS信号使能帧传输)的时序图。SCLK输入信号为串行读取操作提供时钟源。CS变为低电平,以从AD7608访问数据。CS下降沿使总线脱离三态,并逐个输出18位转换结果的MSB。此MSB在CS下降沿后的第一个SCLK下降沿有效。后续17个数据位在SCLK的上升沿逐个输出。数据在SCLK下降沿有效。要访问各转换结果,必须提供18个时钟周期。FRSTDATA输出信号指示何时回读第一通道V1。当CS输入为高电平时,FRSTDATA输出引脚处于三态。在串行模式下,CS下降沿使FRSTDATA脱离三态,并将FRSTDATA引脚设为高电平,表示DOUTA输出数据线可以提供V1的结果。在第18个SCLK下降沿之后,FRSTDATA输出恢复逻辑低电平。如果所有通道都在DOUTB上读取,则当V1输出到串行数据输出引脚时,FRSTDATA输出不会变为高电平。只有当DOUTA提供V1结果时(此时DOUTB提供V5结果),它才会变为高电平。

      采用双DOUT线路在AD7608上读取8个同步转换结果。这种情况下,使用72个SCLK传输来访问AD7608的数据,并且CS保持低电平,以使能全部72个SCLK周期帧。也可以仅用一路DOUT线逐个输出数据;这种情况下,建议用DOUTA访问所有转换数据,因为通道数据以升序输出。对于AD7608,通过一路DOUT线访问所有8个转换结果时,总共需要144个SCLK周期。可以通过一个CS信号使能这144个SCLK周期帧,也可以通过CS信号独立使能各组的18个SCLK周期帧。只用一路DOUT线的缺点是:如果在转换后读取,则吞吐速率会下降。串行模式下,不用的DOUT线应保持不连接。对于AD7608,如果DOUTB用作一路DOUT线,通道结果将以V5、V6、V7、V8、V1、V2、V3、V4的顺序输出;不过,在DOUTB上读取V5后,FRSTDATA指示就会恢复低电平。

      转换时间和BUSY信号宽度随着过采样倍率提高而延长。例如,当采样速率为10 kSPS时,周期时间为100 μs。图44显示了OS × 2和OS × 4的情况;对于10 kSPS采样速率,仍有足够的周期时间来进一步提高过采样倍率,使SNR性能得到更大的改善。例如,在初始采样或吞吐速率为200 kSPS的应用中,如果开启过采样,则必须降低吞吐速率,以满足较长的转换时间要求,并顾及到读取操作。当开启过采样时,为实现最快吞吐速率,可以在BUSY高电平期间执行读取操作。BUSY下降沿用于以新转换数据更新输出数据寄存器,因此转换数据的读取不应发生在此边沿上。

      OS引脚在BUSY的下降沿锁存,从而设置下一个转换的过采样倍率。如果OS引脚选择过采样率8,则下一个CONVST x上升沿采集各通道的第一个样点,一个内部产生的采样信号采集所有通道的其余7个样点。然后对这些样点求平均值,以改进SNR性能。

六、AD7608传递特性


  AD7608的输出编码方式为二进制补码。所设计的码转换在连续LSB整数值的中间(即1/2 LSB、3/2 LSB)进行。AD7608的LSB大小为FSR/262144。其理想传递特性如图36所示。LSB大小取决于所选的模拟输入范围。
  因此,通过传递函数,可以分析出AD7608在 ±10 V 量程下的输出码值公式。真双极量程 ±FS(±10 V 或 ±5 V)被分成 2¹⁷=131072 steps,LSB 大小为 FSR/131072。由于LSB=76.29μV,即2¹⁷ x 76.29μV≈10000mV。可简化成:
        sample_mV = (raw_code * 10000) / 131072 //单位mV,raw_code为二进制补码

七、STM32F103驱动AD7608采集数据

1、引脚接线

STM32F103AD7608
PC6S0
PC7S1
PC8S2
PA0SCLK
PA1RESET
PA2CS
PA3BUSY
PA4DB7
PA5DB8
PA11ST_A
PA12ST_B

2、代码示例

AD7608.c

#include "ad7608.h"

void RCC_Configuration(void) 
{    
  ErrorStatus HSEStartUpStatus;
  RCC_DeInit(); 
  RCC_HSEConfig(RCC_HSE_ON); 
  HSEStartUpStatus = RCC_WaitForHSEStartUp(); 
  if(HSEStartUpStatus == SUCCESS) 
  { 
    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); 
    FLASH_SetLatency(FLASH_Latency_2); 
    RCC_HCLKConfig(RCC_SYSCLK_Div1);  
    RCC_PCLK2Config(RCC_HCLK_Div1);  
    RCC_PCLK1Config(RCC_HCLK_Div2); 
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9); 
    RCC_PLLCmd(ENABLE); 
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET) { } 
    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); 
    while(RCC_GetSYSCLKSource() != 0x08) { } 
  } 
  RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA2, ENABLE); 
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO | RCC_APB2Periph_GPIOC| RCC_APB2Periph_GPIOA, ENABLE); 
} 

void GPIO_Configuration(void) 
{ 
  GPIO_InitTypeDef GPIO_InitStructure; 
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_11|GPIO_Pin_12; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
  GPIO_Init(GPIOA, &GPIO_InitStructure); 
  
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 
  GPIO_Init(GPIOC, &GPIO_InitStructure); 
  
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5; 
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 
  GPIO_Init(GPIOA, &GPIO_InitStructure); 
} 

void NVIC_Configuration(void) 
{ 
#ifdef  VECT_TAB_RAM   
  NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);  
#else
  NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);    
#endif 
} 

void Delay(vu32 nCount) 
{ 
  for(; nCount != 0; nCount--); 
} 

#ifdef  DEBUG 
void assert_failed(u8* file, u32 line) 
{  
  while (1) { } 
} 
#endif 

void AD7608_SETOS(uint8_t osv)
{
  switch(osv)
  {
  case 0://000
    AD7608OS0_L;
    AD7608OS1_L;
    AD7608OS2_L;
    break;
  case 1://001
    AD7608OS0_H;
    AD7608OS1_L;
    AD7608OS2_L;
    break;
  case 2://010
    AD7608OS0_L;
    AD7608OS1_H;
    AD7608OS2_L;
    break;
  case 3://011
    AD7608OS0_H;
    AD7608OS1_H;
    AD7608OS2_L;
    break;
  case 4://100
    AD7608OS0_L;
    AD7608OS1_L;
    AD7608OS2_H;
    break;
  case 5://101
    AD7608OS0_H;
    AD7608OS1_L;
    AD7608OS2_H;
    break;
  case 6://110
    AD7608OS0_L;
    AD7608OS1_H;
    AD7608OS2_H;
    break;
  }
}

void AD7608_RESET(void)
{
  AD7608_RESET_H;
  Delay(0xFF);
  AD7608_RESET_L;
}

uint32_t ad7606_ReadDATA(void)
{
	uint8_t i;
  uint32_t usData = 0;
  for (i = 0; i < 18; i++)
  {
    AD7608_SCLK_L;
    usData = usData << 1;
    if(AD7608_DOUTA)
    {
      usData |= 0x0001;
    }
    AD7608_SCLK_H;
  }
  return usData;		
}

void AD7608_STARTCONV(void)
{
  AD7608_CONVST_A_L;
  AD7608_CONVST_B_L;
  Delay(0xF);
  AD7608_CONVST_A_H;
  AD7608_CONVST_B_H;
}

main.c

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

uint32_t datatemp[8];
char dataVol[30];
uint8_t i;

int main(void)
{
	 
	SystemInit();
	delay_init();	     //延时初始化
	usart_Init(115200);   //串口初始化
	delay_ms(100);
	
	RCC_Configuration();
  GPIO_Configuration();
  NVIC_Configuration();

  AD7608_SETOS(0X00);
  AD7608_RESET();
  AD7608_CONVST_A_H;
  AD7608_CONVST_B_H;
	
	
	while(1)
	{
		if(!AD7608_BUSY)
    {
      AD7608_CS_L;
      for(i = 0;i < 8;i++)
      {
//        datatemp[i]=ad7606_ReadDATA();
				datatemp[i] = (int32_t)(10000*((float)(ad7606_ReadDATA())/131072));	//单位1mv
				sprintf(dataVol, "Range%d = %d\t", i, datatemp[i]);
				usart_SendString(dataVol);
      }
      AD7608_CS_H;
      AD7608_STARTCONV();
      while(AD7608_BUSY);
			usart_SendString("\r\n");
    }
		delay_ms(3000);
	}
}

3、效果展示

  信号输入:通道0:1.202V,通道1:1.495V,通道2:1.816V,通道3:2.476V,通道4:3.310V,通道5:4.948V,通道6-7:悬空

总结

  AD7608是一款采用高速、低功耗、电荷再分配逐次逼近型模数转换器(ADC)的数据采集系统,可以对8个模拟输入通道进行同步采样。其模拟输入可以接受真双极性输入信号。使用RANGE引脚可以选择±10 V或±5 V的输入范围。AD7608采用5 V单电源供电。该器件内置输入箝位保护、输入信号调整放大器、二阶抗混叠滤波器、采样保持放大器、片内基准电压源、基准电压缓冲、高速ADC、数字滤波器以及高速并行和串行接口。
使用注意事项:

  1. 输入别悬空,不使用的通道要接地。
  2. 输入别超 ±16.5V,否则损坏。
  3. 复位引脚用来初始化,每次上电要先拉高一次。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值