基于STM32F103驱动AD7124-8 24Bit 多通道ADC数据采集模块采集信号
AD7124-8是一款高精度24位Σ-Δ模数转换器,支持8路差分或16路伪差分输入。高精度低噪声设计,24位ADC可直接采集微弱信号 提供三种功耗模式,灵活平衡性能与功耗 集成多种滤波器,可抑制50/60Hz工频干扰 内置基准电压源、可编程电流源等模拟前端 支持16通道自动扫描,每通道独立配置 。本文将用stm32单片机驱动AD7124,实现多通道数据采集。
文章目录
一、AD7124-8模块简介
AD7124-8 是一款高精度、低功耗的 24 位模数转换器(ADC),内置多种模拟前端功能,专为高精度传感器测量等应用设计。它支持最多 8 路差分输入,也可配置为最多 16 路伪差分输入,适用于多通道数据采集。
产品特性
- 高精度低噪声:内置 24 位 Σ-Δ(Sigma-Delta)ADC,具备极低的输入噪声。可直接连接微弱信号,无需额外前级放大。
- 灵活的功耗模式:提供三种功耗模式(低功耗、普通、全速),可根据需求权衡功耗、速度和噪声性能。
- 丰富的滤波器和采样配置:支持多种数字滤波器,包括可同时抑制 50Hz 和 60Hz 工频干扰。低速采样时抑制能力可超过 80 dB,适合工业信号处理。
- 集成度高:
- 精密低漂移参考电压源(或支持外部参考)
- 可编程电流源(适合桥式传感器激励)
- 偏置电压产生器(可自动偏置至 AVDD/2)
- 内部或外部时钟支持
- 通道间低功率切换控制(节省功耗)
- 多通道处理:内置通道扫描功能(最多支持 16 通道),可以自动轮询采样多个输入通道;每个通道都可以分配不同的配置(增益、采样率、滤波器、参考源等);
- 提供完整诊断功能:循环冗余校验(CRC)、信号链检查和串行接口检查。
二、模块管脚说明
其中,AVSS与GND相连。8路差分通道分别为AIN0-AIN1,AIN2-AIN3,AIN4-AIN5,AIN6-AIN7,AIN8-AIN9,AIN10-AIN11,AIN12-AIN13,AIN14-AIN15,AINx:x为偶数,则正信号输入,反之负信号输入。
三、功能框图和时序图
信号转换时序:
信号读取时序:
四、主要寄存器说明
-
ADC_CONTROL寄存器(0x01):用于设置 ADC 的工作模式(如连续采样)、功耗模式、参考电压源、时钟源等。其中,DATA_STATUS为状态寄存器内容传输的使能位。可以将状态寄存器的内容附加到AD7124-8的每次转换结果。使能多个通道时,此功能很有用,因为状态寄存器可确定哪一通道与数据寄存器值对应。每次输出转换结果时,都会附加状态寄存器的内容。DATA_STATUS置1后,状态寄存器的内容将与每次从数据寄存器读取的数据一同传输。
-
IO_CONTROL_1寄存器(0x03):用于控制 I/O 引脚(如 PSW 开关、REF 缓冲区、烧断电流检测等)。
-
ID寄存器(0x05):读取设备ID,SPI写入命令0x40为读寄存器,读ID为0x05,故写入0x45就可以读出ID。
-
CHANNEL通道寄存器(0x09~0x18):置通道(AINP输入和AINM输入),使能或禁用通道,以及选择设置。设置可从用户定义的8种不同选项中选择。当ADC转换时,它会自动遍历所有使能的通道。如果需要,用户可以在一个序列中对某些通道多次采样。此位,用户还可以将诊断功能包括在序列之中。
-
CONFIG配置寄存器(0x19~0x20):设置该通道对应的:增益、基准源、输入缓冲等。
-
FILTER滤波器寄存器(0x21~0x28):设置数字滤波器类型(SINC3/SINC4等)、采样速率(输出数据速率)。
-
数据寄存器(0x02):用于存储ADC的转换结果,采样结果在这里输出。
采集信号流程的简要流程:1,2,3寄存器为初始化阶段,配置ADC工作模式,4,5,6寄存器配置输入通道阶段,7寄存器读取数据阶段。
五、模拟信号输入说明
根据数据手册描述,模拟输入信号范围是由基准电压源和增益决定。如2.5V内部基准电压源,设置增益为1,则差分输入信号范围为±2.5V。其中,又因为AINx输入范围要在[AVSS,AVDD]之间,板子是单电源输入且看原理图,AVDD接了3.3V,AVSS接了GND,即[AVSS,AVDD]=[0,3.3V],即AINx输入信号要输入正信号。
所以由模拟输入信号范围和AINx输入信号范围来决定AINx具体输入电压信号范围。如差分输入信号范围为±2.5V,那么AINx输入电压信号要在[0V,2.5V]之间。测量最大正差分值+2.5V,则AIN0接2.5V,AIN1接0V,最大负差分值-2.5V,则AIN0接0V,AIN1接2.5V。
六、STM32F103驱动AD7124采集信号
1. 准备工作
STM32F103C8T6开发板、AD7124采集模块、USB转TTL、输入信号源。
2. 引脚接线
STM32F103C8T6 | AD7124采集模块 |
---|---|
3.3V | VIN |
GND | GND |
PA0 | CS |
PA1 | SCLK |
PA2 | DIN |
PA4 | DOUT |
PA9 | USB转TTL-Rx |
PA10 | USB转TTL-Tx |
AD7124-8 模块程序说明
- 读取 AD7124-8 ID 结果为 0x1x,x 为硅版本,例如:0x12、0x14。新批次ID号为0x17。
- SYNC 为同步输入,低电平有效,模块单独工作时,应确保 SYNC 为高电平或悬空。
- 寄存器操作逻辑描述:首先写入通信寄存器,指示读取或写入、所操作寄存器地址,随后读取或写入 1Byte 或 3Byte 数据。
- void LED_TEST(void)函数控制 AD7124-8 PSW 引脚连接的 LED,可用户通信调试。使用该函数需要把通道初始化注释掉。
- 参考程序基于 STM32F103X,时钟为 72MHz。
3. 代码示例
AD7124.c
#include "ad7124.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_APB2PeriphClockCmd(RCC_APB2Periph_AFIO |RCC_APB2Periph_GPIOA, ENABLE);
}
void GPIO_Configuration(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_1|GPIO_Pin_0;
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_4;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
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 AD7124_8_Reset(void)
{
AD7124_8_CS_L;
AD7124_8_DIN_H;
for(uint8_t a=0;a<65;a++)//提供大于64个写操作,复位AD7124-8
{
AD7124_8_SCLK_L;
Delay(10);
AD7124_8_SCLK_H;
Delay(10);
}
AD7124_8_CS_H;
}
void LED_TEST(void)//AD7124_8的 PSW 上连接的LED,控制LED闪烁
{
AD7124_8_CS_L;
Delay(10);
AD7124_8_Write(0x03);//写入 IO_CONTROL_1寄存器,复位值为0x000000
AD7124_8_Write(0x00);//写入3字节 IO_CONTROL_1寄存器值
AD7124_8_Write(0x80);
AD7124_8_Write(0x00);
AD7124_8_CS_H;
Delay(1000000);//约0.5S延时
AD7124_8_CS_L;
Delay(10);
AD7124_8_Write(0x03);
AD7124_8_Write(0x00);
AD7124_8_Write(0x00);
AD7124_8_Write(0x00);
AD7124_8_CS_H;
Delay(1000000);
}
void AD7124_8_INIT(void)//单通道配置
{
AD7124_8_CS_L;
Delay(100);
AD7124_8_Write(0x09);//写入通道寄存器0 CHANNEL_0 (datasheet Page 86)
AD7124_8_Write(0x80);//使能通道,当有多个通道被使能时,自动按顺序转换;使用CONFIG_0配置当前通道。ADC链接与AIN0与AIN1
AD7124_8_Write(0x01);
AD7124_8_Write(0x19);//写入配置寄存器0 CONFIG_0;(datasheet Page 88)
AD7124_8_Write(0x09);//选择双极型模式、关闭检测电流源、使能REF BUF与AIN BUF,选择内部基准源,增益配置为+-2.5V;
AD7124_8_Write(0xf0);
AD7124_8_Write(0x21);//写入滤波寄存器寄存器,FILTER_0 (datasheet Page 89)
AD7124_8_Write(0x06);//使用SINC4 滤波器
AD7124_8_Write(0x00);
AD7124_8_Write(0x80);//FS=128,因此数据输出速率 = 614.4K/(32*128)= 150Hz
AD7124_8_Write(0x01);//写入ADC控制寄存器,ADC_CONTROL (datasheet Page 78)
AD7124_8_Write(0x09);//使能连续读取,使能内部基准,全功率模式,使用内部614.4kHz时钟源,连续工作模式。
AD7124_8_Write(0xC0);
}
void AD7124_8_INIT1(void)//多通道配置
{
AD7124_8_CS_L;
Delay(100);
AD7124_8_Write(0x09);//写入通道寄存器0 CHANNEL_0 (datasheet Page 86)
AD7124_8_Write(0x80);//使能通道,当有多个通道被使能时,自动按顺序转换;使用CONFIG_0配置当前通道。ADC链接与AIN0与AIN1
AD7124_8_Write(0x01);
AD7124_8_Write(0x0A);//写入通道寄存器1 CHANNEL_1
AD7124_8_Write(0x80);//使能通道,当有多个通道被使能时,自动按顺序转换;使用CONFIG_1配置当前通道。ADC链接与AIN2与AIN3
AD7124_8_Write(0x43);
AD7124_8_Write(0x0B);//写入通道寄存器2 CHANNEL_2
AD7124_8_Write(0x80);//使能通道,当有多个通道被使能时,自动按顺序转换;使用CONFIG_2配置当前通道。ADC链接与AIN4与AIN5
AD7124_8_Write(0x85);
AD7124_8_Write(0x0C);//写入通道寄存器3 CHANNEL_3
AD7124_8_Write(0x80);//使能通道,当有多个通道被使能时,自动按顺序转换;使用CONFIG_3配置当前通道。ADC链接与AIN6与AIN7
AD7124_8_Write(0xC7);
AD7124_8_Write(0x0D);//写入通道寄存器4 CHANNEL_4
AD7124_8_Write(0x81);//使能通道,当有多个通道被使能时,自动按顺序转换;使用CONFIG_4配置当前通道。ADC链接与AIN8与AIN9
AD7124_8_Write(0x09);
AD7124_8_Write(0x0E);//写入通道寄存器5 CHANNEL_5
AD7124_8_Write(0x81);//使能通道,当有多个通道被使能时,自动按顺序转换;使用CONFIG_5配置当前通道。ADC链接与AIN10与AIN11
AD7124_8_Write(0x4B);
AD7124_8_Write(0x0F);//写入通道寄存器6 CHANNEL_6
AD7124_8_Write(0x81);//使能通道,当有多个通道被使能时,自动按顺序转换;使用CONFIG_6配置当前通道。ADC链接与AIN12与AIN13
AD7124_8_Write(0x8D);
AD7124_8_Write(0x10);//写入通道寄存器7 CHANNEL_7
AD7124_8_Write(0x81);//使能通道,当有多个通道被使能时,自动按顺序转换;使用CONFIG_7配置当前通道。ADC链接与AIN14与AIN15
AD7124_8_Write(0xCF);
//注:在通道寄存器中可指定所使用的配置寄存器(或称设置寄存器),配置寄存器与滤波寄存器对应关联。
AD7124_8_Write(0x19);//写入配置寄存器0 CONFIG_0;(datasheet Page 88)
AD7124_8_Write(0x09);//选择双极型模式、关闭检测电流源、使能REF BUF与AIN BUF,选择内部基准源,增益配置为+-2.5V;
AD7124_8_Write(0xf0);
AD7124_8_Write(0x21);//写入滤波寄存器寄存器,FILTER_0 (datasheet Page 89)
AD7124_8_Write(0x06);
AD7124_8_Write(0x00);
AD7124_8_Write(0x80);//FS=128,使用多通道序列器时,转换时间为建立时间的总和,建立时间大于转换时间。
AD7124_8_Write(0x01);//写入ADC控制寄存器,ADC_CONTROL (datasheet Page 78)
AD7124_8_Write(0x0D);//使能连续读取,使能内部基准,全功率模式,使用内部614.4kHz时钟源,连续工作模式,使能 DATA_STATUS以输出状态寄存器,用于分辨通道数据
AD7124_8_Write(0xC0);
}
void AD7124_8_Write(uint8_t Data)
{
uint8_t data;
data=Data;
for(uint8_t i=0;i<8;i++)
{
AD7124_8_SCLK_L;
if(data&0x80)
AD7124_8_DIN_H;
else
AD7124_8_DIN_L;
Delay(100);
AD7124_8_SCLK_H;
Delay(100);
data<<=1;
}
}
uint32_t AD7124_8_Read(void)
{
uint32_t DATA;
DATA=0;
for(uint8_t i=0;i<24;i++)
{
DATA<<=1;
AD7124_8_SCLK_L;
Delay(50);
if(AD7124_8_DOUT)
DATA++;
AD7124_8_SCLK_H;
Delay(50);
}
Delay(100);
return DATA;
}
uint8_t AD7124_8_Read_Byte(void)
{
uint8_t DATA;
DATA=0;
for(uint8_t i=0;i<8;i++)
{
DATA<<=1;
AD7124_8_SCLK_L;
Delay(100);
if(AD7124_8_DOUT)
DATA++;
AD7124_8_SCLK_H;
Delay(100);
}
Delay(100);
return DATA;
}
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Serial.h"
#include "ad7124.h"
uint8_t AD7124_8_ID;
uint32_t Data;
float data_temp,Vol;
float VolM[8];
uint8_t DATA_STATUS;
int main(void)
{
Serial_Init();
RCC_Configuration();
GPIO_Configuration();
NVIC_Configuration();
AD7124_8_Reset();//复位AD7190数字接口
Delay(100);
AD7124_8_CS_L;
Delay(10);
AD7124_8_Write(0x45);//读取ID寄存器
AD7124_8_ID=AD7124_8_Read_Byte();//读取AD7124-8 ID
AD7124_8_CS_H;
printf("AD7124_8_ID = 0x%x\r\n", AD7124_8_ID);
// AD7124_8_INIT(); //单通道读取
AD7124_8_INIT1();
while (1)
{
//LED_TEST(); //使用该函数需要把通道初始化注释掉
while(AD7124_8_DOUT);//低电平时数据就绪
Data=AD7124_8_Read();//Data采集结果
data_temp=Data;
// Vol=(data_temp-0x800000)/0x800000*2.5; //单通道读取
// printf("Vol=%.3fV\r\n", Vol);
DATA_STATUS=AD7124_8_Read_Byte()&0x0F;
VolM[DATA_STATUS]=(data_temp-0x800000)/0x800000*2.5;
printf("CH%u: Volt = %.3fV\r\n", DATA_STATUS, VolM[DATA_STATUS]);
Delay_ms(1000);
}
}
4. 效果展示
采集2,3,4差分通道[AIN4:1.2V,AIN5:GND];[AIN6:GND,AIN7:1.5V];[AIN8:1.8V,AIN9:1.2V]。注意:AD7124 多通道采集时返回的数据的通道顺序不是严格按通道编号顺序返回的,而是由内部通道序列器轮询触发、哪个通道先转换完成就先输出哪个通道的数据。
总结
AD7124-8 是一款高度集成的高性能 ADC,不仅具备出色的精度和灵活配置,还集成了丰富的诊断功能,特别适合用于:工业自动化;仪器仪表;传感器采集系统(如温度、压力、应变等);低功耗便携设备中的高精度数据采集等应用场景。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)