文章目录
一、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的主要区别
特性 | AD7608 | AD7606 |
---|---|---|
分辨率 | 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模块接口说明
- DB7为DOUTA,DB8为DOUTB。
- 板载电阻设置说明(默认外部基准,串行接口,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 读数据。
- 启动转换:对任一 CONVST 引脚(A 或 B)拉低并保持至少 t₅,ADC 开始采样并进入转换,BUSY 拉高表示“忙碌中”。
- 等待转换完成:从 CONVST上升沿 到 BUSY上升沿 的这段时间就是 t₁,之后 BUSY 一直保持高,直到转换结束。
- 读数据:转换结束后(BUSY下降沿),拉低 CS 并按时序读出数据,BUSY下降沿至下次 CS下降沿的间隔为 t₄,保证总线空闲。
- 复位准备:如需硬复位,RESET 脉冲宽度 ≥ t₇,确保寄存器恢复初始。
转换期间读:边转换边读,提高吞吐量——上一周期的数据可在本周期转换过程中取走。
- 启动转换:同样拉低 CONVST,BUSY 上升表示“忙碌中”。
- 转换过程中读数据:BUSY 高的 t₃ 之内,CS 可提前拉低;也就是说,不必等 BUSY 变低之后才开始读,而是在转换完成前的 t₆ 窗口内就能读到上一次转换的数据。
- 转换完成不影响读取:即便 BUSY 拉低(转换结束),只要 CS 仍在低电平期间,输出依旧稳定可读。
- 定期触发:多次周期循环(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、引脚接线
STM32F103 | AD7608 |
---|---|
PC6 | S0 |
PC7 | S1 |
PC8 | S2 |
PA0 | SCLK |
PA1 | RESET |
PA2 | CS |
PA3 | BUSY |
PA4 | DB7 |
PA5 | DB8 |
PA11 | ST_A |
PA12 | ST_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、数字滤波器以及高速并行和串行接口。
使用注意事项:
- 输入别悬空,不使用的通道要接地。
- 输入别超 ±16.5V,否则损坏。
- 复位引脚用来初始化,每次上电要先拉高一次。