基于STM32F103驱动AD7124-8 24Bit 多通道ADC数据采集模块采集信号 电子说
AD7124-8 是一款高精度、低功耗的 24 位模数转换器(ADC),内置多种模拟前端功能,专为高精度传感器测量等应用设计。它支持最多 8 路差分输入,也可配置为最多 16 路伪差分输入,适用于多通道数据采集。
产品特性

其中,AVSS与GND相连。8路差分通道分别为AIN0-AIN1,AIN2-AIN3,AIN4-AIN5,AIN6-AIN7,AIN8-AIN9,AIN10-AIN11,AIN12-AIN13,AIN14-AIN15,AINx:x为偶数,则正信号输入,反之负信号输入。

信号转换时序:
信号读取时序:









采集信号流程的简要流程: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。
STM32F103C8T6开发板、AD7124采集模块、USB转TTL、输入信号源。
| 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.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%xrn", 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=%.3fVrn", Vol);
DATA_STATUS=AD7124_8_Read_Byte()&0x0F;
VolM[DATA_STATUS]=(data_temp-0x800000)/0x800000*2.5;
printf("CH%u: Volt = %.3fVrn", DATA_STATUS, VolM[DATA_STATUS]);
Delay_ms(1000);
}
}

采集2,3,4差分通道[AIN4:1.2V,AIN5:GND];[AIN6:GND,AIN7:1.5V];[AIN8:1.8V,AIN9:1.2V]。注意:AD7124 多通道采集时返回的数据的通道顺序不是严格按通道编号顺序返回的,而是由内部通道序列器轮询触发、哪个通道先转换完成就先输出哪个通道的数据。
AD7124-8 是一款高度集成的高性能 ADC,不仅具备出色的精度和灵活配置,还集成了丰富的诊断功能,特别适合用于:工业自动化;仪器仪表;传感器采集系统(如温度、压力、应变等);低功耗便携设备中的高精度数据采集等应用场景。
审核编辑 黄宇
全部0条评论
快来发表一下你的评论吧 !