一、ADS8688模塊簡介
ADS8688是一款8通道集成數據采集系統,基于16位逐次逼近(SAR)模數轉換器 (ADC),工作時的吞吐量可達500kSPS。器件提供了用于各輸入通道的集成模擬前端電路(過壓保護高達+20V)、支持自動和手動兩種掃描模式的8通道多路復用器、以及低溫度漂移的片上4.096V基準電壓。采用5V單模擬電源供電時,器件上的各輸入通道均可支持±10.24V、 ±5.12V和2.56V的實際雙極輸入范圍以及0V到 10.24V和0V到5.12V的單極輸入范圍。模擬前端在所有輸入范圍內的增益均經過精確微調,以確保高直流精度。輸入范圍的選擇可通過軟件進行編程,各通道輸入范圍的選擇相互獨立。該器件提供了一個1M Ω的恒定阻性輸入阻抗。
特性
- 分辨率:16位 SAR ADC
- 通道數:8 路單端輸入通道(支持多種模擬量程)
- 支持自動和手動兩種掃描模式的8通道多路復用器(MUX)
- 通道的可編程輸入范圍:
雙極:±10.24V、±5.12V和±2.56V
單極:0V到10.24V和0V到5.12V - 供電電源:DC 5V
- 內部基準:4.096V 精密基準電壓
- 接口:SPI接口
- 恒定的阻性輸入阻抗:1MQ
- 500kSPS的總吐
- 差分非線性(DNL):±0.5最低有效位(LSB)
- 最大積分非線性(INL):±0.75LSB
- 信噪比(SNR):92dB
- 總諧波失真(THD): -102dB
- 低功耗:65mW

二、模塊接口和引腳說明


| RST | 復位引腳,低電平復位 |
|---|---|
| CS | SPI 片選 |
| SDI | SPI 數據輸入 |
| SDO | SPI 數據輸出 |
| CLK | SPI 時鐘輸入 |
| DAISY | 以菊花鏈模式鏈接串行通信期間的數據輸入 |
簡單說明,菊花鏈就是把多個 SPI 設備像一串項鏈那樣串在一起,讓主機用同一組時鐘(SCLK)、主出數據(MOSI)和片選(CS)一次性把命令“推”進整串設備,同時一次性從整串讀出它們的輸出。好處是省線、接線簡單;壞處是需要按“鏈序”拼裝命令與解析數據,延遲和故障傳播要注意。
用比喻理解,把每個 SPI 設備想像成一個移位寄存器,它有一個輸入口(SDI / MOSI),一個輸出口(SDO / MISO),當主機每打一位時,這個寄存器就“向右”推一位,最右邊的位就從 SDO 輸出。把多個這樣的寄存器串起來(SDO? → SDI? → SDO? → SDI? …),就是菊花鏈。主機只需一套 MOSI / SCLK / CS 就能同時對整串設備“打包”發送/讀取數據 —— 數據會在各設備間被逐位傳遞。
讀寫順序記住這一句就夠:“發送順序 = 鏈尾 → … → 鏈首;讀取順序 = 鏈尾 → … → 鏈首。”
三、功能框圖和時序圖


其中下圖為菊花鏈模式的連接示意和時序圖,以及操作模式的轉換圖

四、ADC傳遞函數
ADS8688 為多通道器件,所有輸入通道均支持單端、雙極性和單極性輸入范圍。對于雙極性和單極性輸入范圍,器件的輸出均為標準二進制格式。所有模擬通道的輸出代碼格式相同。圖 69 顯示了每個 ADC 通道在所有輸入范圍內的理想傳輸特性。每個輸入信號的滿量程范圍 (FSR) 等于正滿量程 (PFS) 輸入電壓與負滿量程 (NFS) 輸入電壓之差。由于 ADC 的分辨率為 16 位,因此 LSB 大小等于 FSR / 216 = FSR / 65536。對于參考電壓 VREF = 4.096 V,表 4 列出了與不同輸入范圍對應的 LSB 值。
ADC 輸出為 16 位無符號值,但表示的電壓與配置的輸入范圍相關。ADC換算公式:
輸入電壓 = (ADC輸出值-32767) x 量程 / 65535
例:若量程為 ±10.24V,對應范圍為 20.48V,ADC 輸出值為 65535 → 電壓 = (65535-32767) × 20.48 / 65535 ≈ 10.24V,ADC 輸出值為 0 → -10.24V;65535 → +10.24V,32768為中點碼 = 0V 。注意:當量程為單極性時,則無需減去32767。
五、STM32F103驅動ADS8688模塊采集信號
準備工作
STM32F103C8T6最小系統板、ADS8688 ADC采集模塊、USB轉TTL,輸入信號源和導線若干。
引腳接線
| STM32F103C8T6 | ADS8688 |
|---|---|
| 外部DC 5V電源正 | VIN |
| 外部DC 5V電源負 | GND |
| PA0 | SDI |
| PA1 | RST |
| PA2 | DAISY |
| PA3 | CLK |
| PA4 | CS |
| PA5 | SDO |
| PA9 | USB轉TTL-RX |
| PA10 | USB轉TTL-TX |

代碼示例
ads8688.c
/**********************************************************
本程序僅供學習使用,未經作者許可,不得用于其它任何用途
功能:ADS8688,16位AD
顯示:12864cog
接口:接口請參照ads8688.h 可直接連接本店主控板TLV5608接口
時間:2020/12/13
版本:0.2
作者:康威電子
其他:本程序自做模塊功能驗證,以便快速測試模塊好壞。
如需進行性能驗證,請自行編程.更換高速MCU或FPGA實現高速采集!!!!
**********************************************************/
#include "stm32f10x.h"
#include "ads8688.h"
#include "delay.h"
/**********************************************************************************************************
* 函 數 名: ADS8688_IO_Init
* 功能說明: ADS8688 IO口初始化
* 形 參: 無
* 返 回 值: 無
**********************************************************************************************************/
void ADS8688_IO_Init(void) //ADS8688 IO口初始化
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能端口時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽輸出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
DAISY_L;
CS_H;
RST_H;
CLK_L;
delay_ms(5);
}
/**********************************************************************************************************
* 函 數 名: ADS8688_Init
* 功能說明: ADS8688初始化
* 形 參: 無
* 返 回 值: 無
**********************************************************************************************************/
void ADS8688_Init(uint8_t ch_en) //ADS8688初始化
{
ADS8688_IO_Init();
SOFT_RESET(); //復位
delay_ms(25);
Set_Auto_Scan_Sequence(ch_en);//使能通道
ADS8688_WriteReg(CH_PD,~ch_en);//通道退出低功耗狀態 通道上電
delay_ms(50);
while(ADS8688_ReadReg(AUTO_SEQ_EN)!=ch_en)//是否使能成功
{
Set_Auto_Scan_Sequence(ch_en);//使能通道
ADS8688_WriteReg(CH_PD,~ch_en);//通道退出低功耗狀態 通道上電
delay_ms(50);
}
}
/**********************************************************************************************************
* 函 數 名: ADS8688_SPI_Read8Bit
* 功能說明: 從SPI總線讀8個bit數據。 不帶CS控制。
* 形 參: 無
* 返 回 值: 無
**********************************************************************************************************/
uint8_t ADS8688_SPI_Read8Bit(void)
{
uint8_t i=0;
uint8_t read=0;
for(i=0;i< 8;i++)
{
read< <=1;
CLK_H;
delay_us(100);
if(READ_SDO) read++;
CLK_L;
delay_us(100);
}
return read;
}
/**********************************************************************************************************
* 函 數 名: ADS8688_SPI_Write8Bit
* 功能說明: 向SPI總線寫8個bit數據。 不帶CS控制。
* 形 參: data : 數據
* 返 回 值: 無
**********************************************************************************************************/
void ADS8688_SPI_Write8Bit(uint8_t data)
{
uint8_t i=0;
CS_L;
for(i=0;i< 8;i++)
{
if(data&0x80) SDI_H;
else SDI_L;
data< <=1;
CLK_H;
delay_us(100);
CLK_L;
delay_us(100);
}
}
/**********************************************************************************************************
* 函 數 名: ADS8688_WriteCmd
* 功能說明: 寫命令寄存器
* 形 參: cmd : 命令
* 返 回 值: 無
**********************************************************************************************************/
void ADS8688_WriteCmd(uint16_t cmd)//寫ADS8688命令寄存器
{
CS_L;
ADS8688_SPI_Write8Bit(cmd >>8 & 0XFF);
ADS8688_SPI_Write8Bit(cmd & 0XFF);
ADS8688_SPI_Write8Bit(0X00);
ADS8688_SPI_Write8Bit(0X00);
CS_H;
}
/*
*********************************************************************************************************
* 函 數 名: SOFT_RESET
* 功能說明: 軟件復位
* 形 參: 無
* 返 回 值: 無
*********************************************************************************************************
*/
void SOFT_RESET(void)//軟件復位
{
ADS8688_WriteCmd(RST);
}
/**********************************************************************************************************
* 函 數 名: AUTO_RST_Mode
* 功能說明: 自動模式
* 形 參: 無
* 返 回 值: 無
**********************************************************************************************************/
void AUTO_RST_Mode(void)//自動掃描模式
{
ADS8688_WriteCmd(AUTO_RST);
}
/**********************************************************************************************************
* 函 數 名: MAN_CH_Mode
* 功能說明: 手動模式通道選擇
* 形 參: ch : 要選擇的通道
* 返 回 值: 無
**********************************************************************************************************/
void MAN_CH_Mode(uint16_t ch)//手動模式
{
ADS8688_WriteCmd(ch);
}
/**********************************************************************************************************
* 函 數 名: ADS8688_ReadReg
* 功能說明: 讀指定的寄存器
* 形 參: addr : 寄存器地址
* 返 回 值: data : 讀到的寄存器值。
**********************************************************************************************************/
uint8_t ADS8688_ReadReg(uint8_t addr)
{
uint8_t data = 0;
CS_L;
ADS8688_SPI_Write8Bit(addr< 1);
data = ADS8688_SPI_Read8Bit();
data = ADS8688_SPI_Read8Bit();
CS_H;
return data;
}
/**********************************************************************************************************
* 函 數 名: ADS8688_WriteReg
* 功能說明: 寫指定的寄存器
* 形 參: addr : 寄存器地址
* data : 寄存器值
* 返 回 值: 無
**********************************************************************************************************/
void ADS8688_WriteReg(uint8_t addr,uint8_t data)
{
CS_L;
ADS8688_SPI_Write8Bit(addr< 1| 0X01);
ADS8688_SPI_Write8Bit(data);
CS_H;
}
/**********************************************************************************************************
* 函 數 名: Set_Auto_Scan_Sequence
* 功能說明: 設置自動掃描序列通道
* 形 參: seq:需要設置自動掃描序列使能寄存器的值
* 返 回 值: 無
**********************************************************************************************************/
void Set_Auto_Scan_Sequence(uint8_t seq)
{
ADS8688_WriteReg(AUTO_SEQ_EN, seq);
}
/**********************************************************************************************************
* 函 數 名: Set_CH_Range
* 功能說明: 設置指定通道測量范圍
* 形 參: ch : 通道
* range : 測量范圍
* 返 回 值: 無
**********************************************************************************************************/
void Set_CH_Range(uint8_t ch,uint8_t range)
{
ADS8688_WriteReg(ch,range);
}
/**********************************************************************************************************
* 函 數 名: Get_AUTO_RST_Mode_Data
* 功能說明: 讀取自動掃描模式AD值
* 形 參:data : 數據指針
* chnum : 通道個數
* 返 回 值: 無
**********************************************************************************************************/
void Get_AUTO_RST_Mode_Data(uint16_t *data, uint8_t chnum)
{
uint8_t i=0,datal=0,datah=0;
for (i=0; i< chnum; i++)
{
CS_L;
ADS8688_SPI_Write8Bit(0X00);
ADS8688_SPI_Write8Bit(0X00);
datah = ADS8688_SPI_Read8Bit();
datal = ADS8688_SPI_Read8Bit();
//delay_ms(1);
CS_H;
*(data+i) = datah< 8 | datal;
}
}
/**********************************************************************************************************
* 函 數 名: Get_MAN_CH_Mode_Data
* 功能說明: 讀取手動模式AD值
* 形 參: 無
* 返 回 值: 無
**********************************************************************************************************/
uint16_t Get_MAN_CH_Mode_Data(void)
{
u8 datah=0,datal=0;
CS_L;
ADS8688_SPI_Write8Bit(0X00);
ADS8688_SPI_Write8Bit(0X00);
datah = ADS8688_SPI_Read8Bit();
datal = ADS8688_SPI_Read8Bit();
CS_H;
return (datah< 8 | datal);
}
main.c
/**********************************************************
本程序僅供學習使用,未經作者許可,不得用于其它任何用途
功能:ADS8688,16位AD 8通道自動掃描采集 使用芯片內部基準4.096V
顯示:12864cog
接口:接口請參照ads8688.h 可直接連接本店主控板TLV5608接口
時間:2020/12/13
版本:0.2
作者:康威電子
其他:本程序只做模塊功能驗證,以便快速測試模塊好壞。
如需進行性能驗證,請自行編程.更換高速MCU或FPGA實現高速采集!!!!
當選擇量程為雙極性時,0V對應32767,因此V=(ADC值-32767)*量程/65535;當量程為單極性時,則無需減去32767。
**********************************************************/
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "usb_lib.h"
#include "math.h"
#include "hw_config.h"
#include "string.h"
#include "stdlib.h"
#include "ads8688.h"
/**********************************************************
* 函數功能 --- > USB連接/斷開
* 入口參數 --- > usb_sw:USB開啟/關閉控制。0:關閉
* 1:打開
* 返回數值 --- > none
* 功能說明 --- > none
**********************************************************/
void USB_Port_Set(u8 usb_sw)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PORTA時鐘
if(usb_sw) _SetCNTR(_GetCNTR()&(~(1< 1)));//退出斷電模式
else
{
_SetCNTR(_GetCNTR()|(1< 1)); // 斷電模式
GPIOA- >CRH &= 0XFFF00FFF;
GPIOA- >CRH |= 0X00033000;
PAout(12) = 0;
}
}
int main(void)
{
uint8_t i=0;
char infoBackPC[64];
uint16_t value[9];
SystemInit();
delay_init(72); //延時初始化
uart_init(9600); //串口初始化
delay_ms(1000);
USB_Port_Set(0); //USB先斷開
delay_ms(600);
USB_Port_Set(1); //USB再次連接
USB_Config();
ADS8688_Init(CH0_EN|CH1_EN|CH2_EN|CH3_EN|CH4_EN|CH5_EN|CH6_EN|CH7_EN);//ADS8688初始化
Set_CH_Range(CHIR_0,ADS8688_IR_N2_5V);
Set_CH_Range(CHIR_1,ADS8688_IR_N2_5V);
Set_CH_Range(CHIR_2,ADS8688_IR_N2_5V);
Set_CH_Range(CHIR_3,ADS8688_IR_N2_5V);
Set_CH_Range(CHIR_4,ADS8688_IR_N2_5V);
Set_CH_Range(CHIR_5,ADS8688_IR_N2_5V);
Set_CH_Range(CHIR_6,ADS8688_IR_N2_5V);
Set_CH_Range(CHIR_7,ADS8688_IR_N2_5V);//設置通道輸入范圍:±10.24V ±2.5*ref ref=4.096V
AUTO_RST_Mode();//進入自動掃描模式
while(1)
{
delay_ms(10);
//手動采集
// MAN_CH_Mode(MAN_CH_0);
// value[0]=Get_MAN_CH_Mode_Data();//讀取通道數據,
// MAN_CH_Mode(MAN_CH_1);
// value[1]=Get_MAN_CH_Mode_Data();//讀取通道數據
// MAN_CH_Mode(MAN_CH_2);
// value[2]=Get_MAN_CH_Mode_Data();//讀取通道數據,
// MAN_CH_Mode(MAN_CH_3);
// value[3]=Get_MAN_CH_Mode_Data();//讀取通道數據
// MAN_CH_Mode(MAN_CH_4);
// value[4]=Get_MAN_CH_Mode_Data();//讀取通道數據,
// MAN_CH_Mode(MAN_CH_5);
// value[5]=Get_MAN_CH_Mode_Data();//讀取通道數據
// MAN_CH_Mode(MAN_CH_6);
// value[6]=Get_MAN_CH_Mode_Data();//讀取通道數據,
// MAN_CH_Mode(MAN_CH_7);
// value[7]=Get_MAN_CH_Mode_Data();//讀取通道數據
// MAN_CH_Mode(MAN_AUX);
// value[8]=Get_MAN_CH_Mode_Data();//采集AUX通道 AUX電壓=value[8]*4096/65535 此通道直接輸入至ADC,無內部PGA,輸入范圍為0-4.096V。
//自動采集
Get_AUTO_RST_Mode_Data(value,8);//自動掃描模式,自動掃描并轉換8通道。數據存在value數組中
for(i = 0; i < 4; i++)//發送
{
sprintf(infoBackPC, "AIN%d=%06dmV AIN%d=%06dmV ",i*2+1,(int16_t)((value[i*2]-32767)*CONST_N2_5V_LSB_mV),i*2+2,(int16_t)((value[i*2+1]-32767)*CONST_N2_5V_LSB_mV));
USB_TxWrite((uint8_t*)infoBackPC, strlen(infoBackPC)); //usb發送
printf("%s",infoBackPC); //串口發送
}
USB_TxWrite("rn", 2); //usb發送
printf("rn"); //串口發送
}
}
效果展示
IN1接GND,IN2接2.47V,IN3接3.31V,IN4接4.94V,IN5接-5.05V,IN6-8懸空。
六、常見問題和注意事項
常見問題:
Q:模塊可測量負電壓嗎?
A:可以,當量程選擇為雙極性時,即可測量負電壓。
Q:最大值是65535嗎?怎樣換算成電壓?
A:是的,當選擇量程為雙極性時,0V對應32767,因此V=(ADC值-32767)* 量程/65535;當量程為單極性時;則無需減去32767。
Q:每個通道是否獨立具有500KSPS數據更新率?
A:ADS8688的最大總吞吐量為500KSPS。每個通道的吞吐量取決于在多路復用器掃描序列中選擇的通道數。如果僅選擇兩個通道,則每個通道的吞吐量等于250KSPS,如果選擇了四個通道,則等于每個通 道125KSPS,依此類推。
Q:AUX與其他通道有什么區別?
A:AUX通道在芯片內部通過多路復用器直接與高精度16位ADC的連接;由于沒有前端PGA,因此AUX通道僅支持0V至VREF的單極性輸入范圍。
Q:每個通道是否可獨立配置輸入范圍?
A:ADS8688每個通道均有PGA,因此可獨立配置輸入范圍與極性。
Q:比如給一個電壓:2.1234V的一個電壓讓模塊去一直采集,它的結果是怎樣的?數值會跳動嗎?
A:數據肯定是有跳動的,這個不是單一條件決定的,電源紋波噪聲,線材過長等因素都會對其造成影響。
Q:ADS8688采集小電壓信號不準,是什么情況?
A:可能是量程范圍配置過大,可根據自己要采集的信號范圍合理設置芯片量程范圍(PGA)。
Q:模塊正常驅動后,沒有接電壓的管腳顯示也有電壓,正常嗎?
A:模塊默認是8通道一直采集的,在沒有接入電壓的時候也會采集到管腳上的浮空電壓,可將管腳直接接地,即為0電壓。
注意事項:
(1)模塊為低功耗模塊,建議供電電源不超過5.25V。
(2)由于模塊是高精度器件。為了避免不必要的干擾,建議使用線性電源供電。
(3)輸入輸出信號線建議盡量短,過長容易引入噪聲信號。接觸不良或劣質的線材可能導致信號衰減或者噪聲過大。
(4)如需簡單測試模塊功能,建議搭配本店控制板使用,正確接線后給控制板供電即可實現信號采集顯示。
審核編輯 黃宇
-
adc
+關注
關注
100文章
7511瀏覽量
555939 -
數據采集
+關注
關注
41文章
8038瀏覽量
120881 -
ADS8688
+關注
關注
1文章
5瀏覽量
10329
發布評論請先 登錄
ADS8345:高性能16位8通道串行輸出采樣ADC的深度解析
ADS8671 14位、1MSPS、1通道SAR ADC技術手冊
Texas Instruments ADS981x系列8通道數據采集系統技術解析
Texas Instruments ADS8661W 12位高速SAR ADC數據手冊
基于STM32F103驅動ADS8688模塊 8通道SAR/ADC數據采集信號
評論