本文档详细描述了LH32M0G30X微控制器的24位Sigma-Delta ADC模块的完整API接口规范,包括数据结构定义、函数接口、参数配置和使用示例。该ADC模块支持双通道同步采样、可编程增益放大、多种参考电压选择和激励电流源配置。
术语 | 英文全称 | 中文定义 | 备注 |
|---|---|---|---|
ADC | Analog-to-Digital Converter | 模数转换器 | 24位Sigma-Delta架构 |
PGA | Programmable Gain Amplifier | 可编程增益放大器 | 1x~128x增益范围 |
SPS | Samples Per Second | 每秒采样数 | 采样率单位 |
IEXC | Excitation Current | 激励电流源 | 用于传感器激励 |
VBIAS | Bias Voltage | 偏置电压 | 提供共模偏置 |
SIMU | Simultaneous | 同步模式 | 双ADC同步采样 |
LSB | Least Significant Bit | 最低有效位 | 分辨率单位 |
ADC子系统架构
┌─────────────────────────────────────────────────────┐
│ AFE模块 (模拟前端) │
├─────────────────┬───────────────────┬───────────────┤
│ 参考电压源 │ 激励电流源 │ VBIAS控制 │
│ ┌─────────────┐ │ ┌───────────────┐ │ ┌───────────┐ │
│ │VREF: 1.25V~ │ │ │IEXC0: 0~1000μA│ │ │AIN0~AIN11 │ │
│ │ 4.096V │ │ │IEXC1: 0~1000μA│ │ │偏置控制 │ │
│ └─────────────┘ │ └───────────────┘ │ └───────────┘ │
└─────────────────┴───────────────────┴───────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────────────────────────────────────────┐
│ ADC双通道控制器 │
├─────────────────────────┬───────────────────────────┤
│ ADC0 │ ADC1 │
│ ┌─────────────────────┐ │ ┌─────────────────────────┐ │
│ │• AIN0~AIN11输入 │ │ │• AIN0~AIN11输入 │ │
│ │• 24位分辨率 │ │ │• 内部信号监测 │ │
│ │• PGA: 1x~128x │ │ │• 温度传感器 │ │
│ │• 2.5~7813SPS │ │ │• 电源监测 │ │
│ │• 主控制器(同步模式) │ │ │• 从控制器(同步模式) │ │
│ └─────────────────────┘ │ └─────────────────────────┘ │
└─────────────────────────┴───────────────────────────┘
typedef struct
{
uint32_t ADC_Mode; // ADC同步模式控制
uint32_t ADC_ConvMode; // 转换模式 (连续/单次)
uint32_t ADC_TrigMode; // 触发模式 (软件/硬件)
uint8_t ADC_INP; // 正输入通道选择
uint8_t ADC_INM; // 负输入通道选择
uint32_t ADC_CODE_MODE; // 编码模式 (双极性/单极性)
uint32_t REF_BUFP_MODE; // 正参考缓冲器控制
uint32_t REF_BUFN_MODE; // 负参考缓冲器控制
uint8_t ADC_REF_SEL; // 参考电压源选择
uint8_t ADC_PGA; // PGA增益设置
uint8_t ADC_DR; // 数据输出率设置
uint8_t ADC_RDY_INT; // 数据就绪中断控制
uint16_t ADC_RDY_CNT; // 中断计数器
} ADC_InitTypeDef;
宏定义 | 数值 | 功能描述 |
|---|---|---|
ADC_SIMU_ENABLE | 0x00000400U | 使能同步模式(主控制器) |
ADC_SIMU_DISABLE | 0x00000000U | 禁用同步模式(从控制器) |
宏定义 | 数值 | 功能描述 |
|---|---|---|
ADC_CONT_CONVERT | 0x00000004U | 连续转换模式 |
ADC_SINGLE_CONVERT | 0x00000008U | 单次转换模式 |
宏定义 | 数值 | 功能描述 |
|---|---|---|
ADC_SOFT_TRIG | 0x00000000U | 软件触发 |
ADC_HARD_TRIG | 0x00000800U | 硬件触发 |
// ADC0正输入通道
typedefenum {
ADC0_PCHAN_AIN0 = 0, // 外部输入AIN0
ADC0_PCHAN_AIN1, // 外部输入AIN1
ADC0_PCHAN_AIN2, // 外部输入AIN2
ADC0_PCHAN_AIN3, // 外部输入AIN3
ADC0_PCHAN_AIN4, // 外部输入AIN4
ADC0_PCHAN_AIN5, // 外部输入AIN5
ADC0_PCHAN_AIN6, // 外部输入AIN6
ADC0_PCHAN_AIN7, // 外部输入AIN7
ADC0_PCHAN_AIN8, // 外部输入AIN8
ADC0_PCHAN_AIN9, // 外部输入AIN9
ADC0_PCHAN_AIN10, // 外部输入AIN10
ADC0_PCHAN_AIN11, // 外部输入AIN11
ADC0_PCHAN_AVSS = 0x10, // 模拟地
ADC0_PCHAN_REFP = 0x11, // 参考电压正极
ADC0_PCHAN_CALIBP = 0x12// 校准正极
} ADC0_POS_CHAN_t;
// ADC0负输入通道
typedefenum {
ADC0_NCHAN_AIN0 = 0, // 外部输入AIN0
ADC0_NCHAN_AIN1, // 外部输入AIN1
ADC0_NCHAN_AIN2, // 外部输入AIN2
ADC0_NCHAN_AIN3, // 外部输入AIN3
ADC0_NCHAN_AIN4, // 外部输入AIN4
ADC0_NCHAN_AIN5, // 外部输入AIN5
ADC0_NCHAN_AIN6, // 外部输入AIN6
ADC0_NCHAN_AIN7, // 外部输入AIN7
ADC0_NCHAN_AIN8, // 外部输入AIN8
ADC0_NCHAN_AIN9, // 外部输入AIN9
ADC0_NCHAN_AIN10, // 外部输入AIN10
ADC0_NCHAN_AIN11, // 外部输入AIN11
ADC0_NCHAN_AVSS = 0x10, // 模拟地
ADC0_NCHAN_REFP = 0x11, // 参考电压正极
ADC0_NCHAN_CALIBN = 0x12// 校准负极
} ADC0_NEG_CHAN_t;
// ADC1正输入通道
typedefenum {
ADC1_PCHAN_AIN0 = 0, // 外部输入AIN0
ADC1_PCHAN_AIN1, // 外部输入AIN1
ADC1_PCHAN_AIN2, // 外部输入AIN2
ADC1_PCHAN_AIN3, // 外部输入AIN3
ADC1_PCHAN_AIN4, // 外部输入AIN4
ADC1_PCHAN_AIN5, // 外部输入AIN5
ADC1_PCHAN_AIN6, // 外部输入AIN6
ADC1_PCHAN_AIN7, // 外部输入AIN7
ADC1_PCHAN_AIN8, // 外部输入AIN8
ADC1_PCHAN_AIN9, // 外部输入AIN9
ADC1_PCHAN_AIN10, // 外部输入AIN10
ADC1_PCHAN_AIN11, // 外部输入AIN11
ADC1_PCHAN_TEMPP = 0x10, // 温度传感器正极
ADC1_PCHAN_AVSS, // 模拟地
ADC1_PCHAN_REFP, // 参考电压正极
ADC1_PCHAN_DACP, // DAC输出正极
ADC1_PCHAN_LOOPP, // 环路测试正极
ADC1_PCHAN_AVDDP, // 模拟电源正极
ADC1_PCHAN_IOVDDP, // IO电源正极
ADC1_PCHAN_CALIBP, // 校准正极
} ADC1_POS_CHAN_t;
// ADC1负输入通道
typedefenum {
ADC1_NCHAN_AIN0 = 0, // 外部输入AIN0
ADC1_NCHAN_AIN1, // 外部输入AIN1
ADC1_NCHAN_AIN2, // 外部输入AIN2
ADC1_NCHAN_AIN3, // 外部输入AIN3
ADC1_NCHAN_AIN4, // 外部输入AIN4
ADC1_NCHAN_AIN5, // 外部输入AIN5
ADC1_NCHAN_AIN6, // 外部输入AIN6
ADC1_NCHAN_AIN7, // 外部输入AIN7
ADC1_NCHAN_AIN8, // 外部输入AIN8
ADC1_NCHAN_AIN9, // 外部输入AIN9
ADC1_NCHAN_AIN10, // 外部输入AIN10
ADC1_NCHAN_AIN11, // 外部输入AIN11
ADC1_NCHAN_TEMPN = 0x10, // 温度传感器负极
ADC1_NCHAN_AVSS, // 模拟地
ADC1_NCHAN_REFP, // 参考电压正极
ADC1_NCHAN_DACN, // DAC输出负极
ADC1_NCHAN_LOOPN, // 环路测试负极
ADC1_NCHAN_AVDDN, // 模拟电源负极
ADC1_NCHAN_IOVDDN, // IO电源负极
ADC1_NCHAN_CALIBN, // 校准负极
} ADC1_NEG_CHAN_t;
typedef enum {
ADC_DR_7813SPS = 0u, // 7813样本/秒
ADC_DR_3906SPS, // 3906样本/秒
ADC_DR_1953SPS, // 1953样本/秒
ADC_DR_977SPS, // 977样本/秒
ADC_DR_488SPS, // 488样本/秒
ADC_DR_244SPS, // 244样本/秒
ADC_DR_122SPS, // 122样本/秒
ADC_DR_61SPS, // 61样本/秒
ADC_DR_60SPS, // 60样本/秒
ADC_DR_30SPS, // 30样本/秒
ADC_DR_15SPS, // 15样本/秒
ADC_DR_50SPS = 16, // 50样本/秒
ADC_DR_25SPS = 17, // 25样本/秒
ADC_DR_12P5SPS = 18, // 12.5样本/秒
ADC_DR_10SPS = 24, // 10样本/秒
ADC_DR_5SPS = 25, // 5样本/秒
ADC_DR_2P5SPS = 26, // 2.5样本/秒
} ADC_DR_t;
typedef enum {
PGA_GAIN_1 = 0, // 1倍增益
PGA_GAIN_2, // 2倍增益
PGA_GAIN_4, // 4倍增益
PGA_GAIN_8, // 8倍增益
PGA_GAIN_16, // 16倍增益
PGA_GAIN_32, // 32倍增益
PGA_GAIN_64, // 64倍增益
PGA_GAIN_128, // 128倍增益
} PGA_GAIN_t;
typedef enum {
VREF_VREFP_VREFN = 0, // 外部参考VREFP-VREFN
VREF_AIN7_AIN8, // AIN7-AIN8作为参考
VREF_REFP_AVSS, // 内部参考-AVSS
VREF_VDRIVE_AVSS // VDRIVE-AVSS
} ADC_REF_SEL;
// IEXC0电流范围
typedefenum {
IEXC0_0UA = 0, // 0μA (禁用)
IEXC0_50UA, // 50μA
IEXC0_100UA, // 100μA
IEXC0_150UA, // 150μA
IEXC0_200UA, // 200μA
IEXC0_250UA, // 250μA
IEXC0_300UA, // 300μA
IEXC0_350UA, // 350μA
IEXC0_400UA, // 400μA
IEXC0_450UA, // 450μA
IEXC0_500UA, // 500μA
IEXC0_600UA, // 600μA
IEXC0_700UA, // 700μA
IEXC0_800UA, // 800μA
IEXC0_900UA, // 900μA
IEXC0_1000UA, // 1000μA
} IEXC0_RANGE_t;
// IEXC1电流范围 (同IEXC0)
typedefenum {
IEXC1_0UA = 0, // 0μA (禁用)
IEXC1_50UA, // 50μA
// ... (其他值同IEXC0)
IEXC1_1000UA, // 1000μA
} IEXC1_RANGE_t;
// IEXC0输出通道
typedefenum {
IEXC0_CHAN_AIN2 = 2, // 输出到AIN2
IEXC0_CHAN_AIN3 = 3, // 输出到AIN3
IEXC0_CHAN_AIN4 = 4, // 输出到AIN4
IEXC0_CHAN_AIN5 = 5, // 输出到AIN5
IEXC0_CHAN_AIN7 = 7, // 输出到AIN7
IEXC0_CHAN_AIN8 = 8, // 输出到AIN8
IEXC0_CHAN_AIN10 = 10, // 输出到AIN10
IEXC0_CHAN_AIN11 = 11, // 输出到AIN11
} IEXC0_CHAN_t;
// IEXC1输出通道 (同IEXC0)
typedefenum {
IEXC1_CHAN_AIN2 = 2, // 输出到AIN2
IEXC1_CHAN_AIN3 = 3, // 输出到AIN3
// ... (其他值同IEXC0)
IEXC1_CHAN_AIN11 = 11, // 输出到AIN11
} IEXC1_CHAN_t;
// VREFP控制
#define VREFP_ENABLE (0x00000008U) // 使能内部参考
#define VREFP_DISABLE (0x00000000U) // 禁用内部参考
#define VREFP_2V5 (0x00000000U) // 2.5V参考
#define VREFP_2V048 (0x00000001U) // 2.048V参考
#define VREFP_1V25 (0x00000002U) // 1.25V参考
#define VREFP_4V096 (0x00000003U) // 4.096V参考
// VDRIVE控制
#define VDRIVE_ENABLE (0x00000040U) // 使能驱动电压
#define VDRIVE_DISABLE (0x00000000U) // 禁用驱动电压
#define VDRIVE_2V5 (0x00000000U) // 2.5V驱动
#define VDRIVE_2V048 (0x00000010U) // 2.048V驱动
#define VDRIVE_1V25 (0x00000020U) // 1.25V驱动
#define VDRIVE_4V096 (0x00000030U) // 4.096V驱动
// 温度传感器控制
#define TEMP_SENSER_EN (0x00000080U) // 使能温度传感器
#define TEMP_SENSER_DIS (0x00000000U) // 禁用温度传感器
#define VBIAS_ENABLE_AIN0 (0x00000001U) // AIN0偏置使能
#define VBIAS_ENABLE_AIN1 (0x00000002U) // AIN1偏置使能
#define VBIAS_ENABLE_AIN2 (0x00000004U) // AIN2偏置使能
#define VBIAS_ENABLE_AIN3 (0x00000008U) // AIN3偏置使能
#define VBIAS_ENABLE_AIN4 (0x00000010U) // AIN4偏置使能
#define VBIAS_ENABLE_AIN5 (0x00000020U) // AIN5偏置使能
#define VBIAS_ENABLE_AIN6 (0x00000040U) // AIN6偏置使能
#define VBIAS_ENABLE_AIN7 (0x00000080U) // AIN7偏置使能
#define VBIAS_ENABLE_AIN8 (0x00000100U) // AIN8偏置使能
#define VBIAS_ENABLE_AIN9 (0x00000200U) // AIN9偏置使能
#define VBIAS_ENABLE_AIN10 (0x00000400U) // AIN10偏置使能
#define VBIAS_ENABLE_AIN11 (0x00000800U) // AIN11偏置使能
/**
* @brief ADC初始化函数
* @param ADCx_InitStruct: ADC初始化结构体指针
* @param ADC_select: ADC选择 (0=ADC0, 1=ADC1)
* @retval 无
*/
void ADCx_init(ADC_InitTypeDef *ADCx_InitStruct, uint8_t ADC_select);
/**
* @brief 启动ADC0转换
* @param 无
* @retval 无
*/
void ADC0_convert_start(void);
/**
* @brief 启动ADC1转换
* @param 无
* @retval 无
*/
void ADC1_convert_start(void);
/**
* @brief 配置激励电流源范围
* @param IEXC1_range: IEXC1电流范围
* @param IEXC0_range: IEXC0电流范围
* @retval 无
*/
void AFE_IEXC_RANGE(uint8_t IEXC1_range, uint8_t IEXC0_range);
/**
* @brief 配置激励电流源控制
* @param IEXC1_select: IEXC1使能控制
* @param IEXC0_select: IEXC0使能控制
* @param IEXC1_CHAN: IEXC1输出通道
* @param IEXC0_CHAN: IEXC0输出通道
* @retval 无
*/
void AFE_IEXC_CTRL(uint32_t IEXC1_select, uint32_t IEXC0_select,
uint8_t IEXC1_CHAN, uint8_t IEXC0_CHAN);
/**
* @brief 配置参考电压控制
* @param VREFP_state: VREFP使能状态
* @param VREFP_VALUE: VREFP电压值
* @param VDRIVE_state: VDRIVE使能状态
* @param VDRIVE_VALUE: VDRIVE电压值
* @param TEMP_SENSER_state: 温度传感器使能状态
* @retval 无
*/
void AFE_REF_CTRL(uint32_t VREFP_state, uint32_t VREFP_VALUE,
uint32_t VDRIVE_state, uint32_t VDRIVE_VALUE,
uint32_t TEMP_SENSER_state);
/**
* @brief 配置VBIAS偏置通道
* @param vbias_ch: VBIAS通道使能位掩码
* @retval 无
*/
void VABIS_channel_select(uint32_t vbias_ch);
void ADC_Basic_Init_Example(void)
{
ADC_InitTypeDef ADC_InitStruct;
// 使能ADC时钟
RCC_APB2PeriphClockCmd(RCC_APB2ENR_ADC0EN_Msk, ENABLE);
// 配置ADC参数
ADC_InitStruct.ADC_Mode = ADC_SIMU_DISABLE; // 独立模式
ADC_InitStruct.ADC_ConvMode = ADC_CONT_CONVERT; // 连续转换
ADC_InitStruct.ADC_TrigMode = ADC_SOFT_TRIG; // 软件触发
ADC_InitStruct.ADC_INP = ADC0_PCHAN_AIN0; // 正输入AIN0
ADC_InitStruct.ADC_INM = ADC0_NCHAN_AIN1; // 负输入AIN1
ADC_InitStruct.ADC_CODE_MODE = ADC_CODE_BIPOLAR; // 双极性编码
ADC_InitStruct.REF_BUFP_MODE = REF_BUFP_ENABLE; // 使能正参考缓冲
ADC_InitStruct.REF_BUFN_MODE = REF_BUFN_ENABLE; // 使能负参考缓冲
ADC_InitStruct.ADC_REF_SEL = VREF_REFP_AVSS; // 参考电压选择
ADC_InitStruct.ADC_PGA = PGA_GAIN_1; // 1倍增益
ADC_InitStruct.ADC_DR = ADC_DR_25SPS; // 25样本/秒
ADC_InitStruct.ADC_RDY_INT = ADC_RDY_INT_EN; // 使能中断
ADC_InitStruct.ADC_RDY_CNT = 1; // 中断计数
// 初始化ADC0
ADCx_init(&ADC_InitStruct, 0);
// 启动转换
ADC0_convert_start();
}
void ADC_Dual_Sync_Init_Example(void)
{
ADC_InitTypeDef ADC_InitStruct;
// 使能时钟
RCC_APB2PeriphClockCmd(RCC_APB2ENR_ADC0EN_Msk, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2ENR_ADC1EN_Msk, ENABLE);
// 配置ADC0 (主控制器)
ADC_InitStruct.ADC_Mode = ADC_SIMU_ENABLE; // 同步模式主控
ADC_InitStruct.ADC_ConvMode = ADC_CONT_CONVERT;
ADC_InitStruct.ADC_TrigMode = ADC_SOFT_TRIG;
ADC_InitStruct.ADC_INP = ADC0_PCHAN_AIN0; // 外部信号
ADC_InitStruct.ADC_INM = ADC0_NCHAN_AIN1;
ADC_InitStruct.ADC_CODE_MODE = ADC_CODE_BIPOLAR;
ADC_InitStruct.REF_BUFP_MODE = REF_BUFP_ENABLE;
ADC_InitStruct.REF_BUFN_MODE = REF_BUFN_ENABLE;
ADC_InitStruct.ADC_REF_SEL = VREF_REFP_AVSS;
ADC_InitStruct.ADC_PGA = PGA_GAIN_1;
ADC_InitStruct.ADC_DR = ADC_DR_2P5SPS; // 2.5样本/秒
ADC_InitStruct.ADC_RDY_INT = ADC_RDY_INT_EN;
ADC_InitStruct.ADC_RDY_CNT = 1;
ADCx_init(&ADC_InitStruct, 0); // 初始化ADC0
// 配置ADC1 (从控制器)
ADC_InitStruct.ADC_Mode = ADC_SIMU_DISABLE; // 同步模式从控
ADC_InitStruct.ADC_INP = ADC1_PCHAN_AVDDP; // 内部电源监测
ADC_InitStruct.ADC_INM = ADC1_NCHAN_AVDDN;
ADCx_init(&ADC_InitStruct, 1); // 初始化ADC1
// 使能中断
NVIC_EnableIRQ(ADC0_IRQn);
// 启动同步转换
ADC0_convert_start(); // ADC0启动,ADC1自动同步
}
void IEXC_Config_Example(void)
{
// 配置激励电流范围
AFE_IEXC_RANGE(IEXC1_150UA, IEXC0_1000UA);
// 配置激励电流控制
AFE_IEXC_CTRL(IEXC1_EN, // 使能IEXC1
IEXC0_EN, // 使能IEXC0
IEXC1_CHAN_AIN2, // IEXC1输出到AIN2
IEXC0_CHAN_AIN3); // IEXC0输出到AIN3
}
void VREF_Config_Example(void)
{
// 配置参考电压系统
AFE_REF_CTRL(VREFP_ENABLE, // 使能内部参考
VREFP_4V096, // 4.096V参考
VDRIVE_ENABLE, // 使能驱动电压
VDRIVE_2V5, // 2.5V驱动
TEMP_SENSER_EN); // 使能温度传感器
}
void VBIAS_Config_Example(void)
{
// 使能AIN0的VBIAS偏置
VABIS_channel_select(VBIAS_ENABLE_AIN0);
// 或者使能多个通道的VBIAS
VABIS_channel_select(VBIAS_ENABLE_AIN0 |
VBIAS_ENABLE_AIN1 |
VBIAS_ENABLE_AIN2);
}
寄存器名称 | 偏移地址 | 功能描述 |
|---|---|---|
ADC_CONTROL_0 | 0x00 | ADC0控制寄存器 |
ADC_CONTROL_1 | 0x04 | ADC1控制寄存器 |
CHANNEL_CFG_0 | 0x08 | ADC0通道配置 |
CHANNEL_CFG_1 | 0x0C | ADC1通道配置 |
CONFIGURATION_0 | 0x10 | ADC0配置寄存器 |
CONFIGURATION_1 | 0x14 | ADC1配置寄存器 |
FILTER_0 | 0x18 | ADC0滤波器配置 |
FILTER_1 | 0x1C | ADC1滤波器配置 |
ADC_DATA_0 | 0x20 | ADC0数据寄存器 |
ADC_DATA_1 | 0x24 | ADC1数据寄存器 |
ADC_STATUS_0 | 0x28 | ADC0状态寄存器 |
ADC_STATUS_1 | 0x2C | ADC1状态寄存器 |
INTERRUPT_CONTROL_0 | 0x30 | ADC0中断控制 |
INTERRUPT_CONTROL_1 | 0x34 | ADC1中断控制 |
寄存器名称 | 偏移地址 | 功能描述 |
|---|---|---|
IEXC_RANGE | 0x00 | 激励电流范围配置 |
IEXC_CTRL | 0x04 | 激励电流控制 |
REF_CTRL | 0x08 | 参考电压控制 |
/**
* @brief 读取并处理24位ADC数据
* @param reg_data: 从ADC_DATA寄存器读取的原始数据
* @retval int32_t: 处理后的32位有符号数据
*/
int32_t Process_ADC_24bit_Data(uint32_t reg_data)
{
uint8_t adc_code[3];
int32_t adc_hex;
// 步骤1: 数据字节分离
adc_code[2] = (reg_data >> 16) & 0xFF; // 高字节 [23:16]
adc_code[1] = (reg_data >> 8) & 0xFF; // 中字节 [15:8]
adc_code[0] = (reg_data) & 0xFF; // 低字节 [7:0]
// 步骤2: 24位数据重组与符号扩展
adc_hex = (int32_t)(
((((adc_code[2] & 0x80) ? (0xFF) : (0x00)) ) << 24) | // 符号扩展
((adc_code[2] & 0xFF) << 16) | // 高字节
((adc_code[1] & 0xFF) << 8) | // 中字节
((adc_code[0] & 0xFF) << 0) // 低字节
);
return adc_hex;
}
/**
* @brief 将ADC数据转换为电压值(双极性模式)
* @param data: 24位有符号ADC数据
* @param vref_mv: 参考电压(mV)
* @retval float: 电压值(mV)
*/
float ADC_Data_To_Voltage_Bipolar(int32_t data, float vref_mv)
{
float voltage_mv;
// 双极性转换公式: V = data × 2.0 × Vref / (2^24)
voltage_mv = (float)data * 2.0f * vref_mv / 16777216.0f;
return voltage_mv;
}
/**
* @brief 将ADC数据转换为电压值(单极性模式)
* @param data: 24位无符号ADC数据
* @param vref_mv: 参考电压(mV)
* @retval float: 电压值(mV)
*/
float ADC_Data_To_Voltage_Unipolar(uint32_t data, float vref_mv)
{
float voltage_mv;
// 单极性转换公式: V = data × Vref / (2^24)
voltage_mv = (float)data * vref_mv / 16777216.0f;
return voltage_mv;
}
参数 | 规格 | 单位 | 备注 |
|---|---|---|---|
分辨率 | 24 | 位 | 有效位数可能略低 |
采样率范围 | 2.5~7813 | SPS | 可编程配置 |
输入电压范围 | ±VREF | V | 取决于参考电压 |
参考电压 | 1.25~4.096 | V | 内部/外部可选 |
PGA增益 | 1~128 | 倍 | 8档可选 |
输入阻抗 | >10 | MΩ | 高阻抗输入 |
噪声性能 | <1 | LSB | 典型值 |
参数 | 规格 | 单位 | 备注 |
|---|---|---|---|
电流范围 | 0~1000 | μA | 16档可调 |
电流精度 | ±1 | % | 典型值 |
输出通道 | 8 | 个 | AIN2~AIN11可选 |
温度系数 | <50 | ppm/°C | 典型值 |
电压值 | 精度 | 温漂 | 应用场景 |
|---|---|---|---|
1.25V | ±0.1% | 10ppm/°C | 低功耗应用 |
2.048V | ±0.05% | 5ppm/°C | 标准应用 |
2.5V | ±0.1% | 10ppm/°C | 通用应用 |
4.096V | ±0.05% | 5ppm/°C | 高精度应用 |
void High_Precision_Sensor_Config(void)
{
ADC_InitTypeDef ADC_Config;
// 配置参数
ADC_Config.ADC_Mode = ADC_SIMU_DISABLE;
ADC_Config.ADC_ConvMode = ADC_CONT_CONVERT;
ADC_Config.ADC_INP = ADC0_PCHAN_AIN0;
ADC_Config.ADC_INM = ADC0_NCHAN_AIN1;
ADC_Config.ADC_CODE_MODE = ADC_CODE_BIPOLAR;
ADC_Config.ADC_REF_SEL = VREF_REFP_AVSS;
ADC_Config.ADC_PGA = PGA_GAIN_1;
ADC_Config.ADC_DR = ADC_DR_10SPS; // 较低采样率提高精度
// 配置4.096V高精度参考
AFE_REF_CTRL(VREFP_ENABLE, VREFP_4V096,
VDRIVE_DISABLE, VDRIVE_2V5,
TEMP_SENSER_EN);
}
void RTD_Temperature_Config(void)
{
ADC_InitTypeDef ADC_Config;
// ADC配置
ADC_Config.ADC_Mode = ADC_SIMU_DISABLE;
ADC_Config.ADC_ConvMode = ADC_CONT_CONVERT;
ADC_Config.ADC_INP = ADC0_PCHAN_AIN0; // RTD+
ADC_Config.ADC_INM = ADC0_NCHAN_AIN1; // RTD-
ADC_Config.ADC_CODE_MODE = ADC_CODE_BIPOLAR;
ADC_Config.ADC_PGA = PGA_GAIN_32; // 高增益放大小信号
ADC_Config.ADC_DR = ADC_DR_5SPS;
// 配置激励电流源(1mA激励RTD)
AFE_IEXC_RANGE(IEXC1_0UA, IEXC0_1000UA);
AFE_IEXC_CTRL(0, IEXC0_EN, 0, IEXC0_CHAN_AIN3);
}
void Dual_Channel_Sync_Config(void)
{
ADC_InitTypeDef ADC_Config;
// 通道1配置(主)
ADC_Config.ADC_Mode = ADC_SIMU_ENABLE;
ADC_Config.ADC_ConvMode = ADC_CONT_CONVERT;
ADC_Config.ADC_INP = ADC0_PCHAN_AIN0;
ADC_Config.ADC_INM = ADC0_NCHAN_AIN1;
ADC_Config.ADC_DR = ADC_DR_25SPS;
ADCx_init(&ADC_Config, 0);
// 通道2配置(从)
ADC_Config.ADC_Mode = ADC_SIMU_DISABLE;
ADC_Config.ADC_INP = ADC1_PCHAN_AIN2;
ADC_Config.ADC_INM = ADC1_NCHAN_AIN3;
ADCx_init(&ADC_Config, 1);
// 启动同步采样
ADC0_convert_start();
}
应用类型 | 推荐配置 | 原因 |
|---|---|---|
高精度DC测量 | 4.096V参考 + 低采样率 | 最大动态范围和精度 |
传感器信号 | PGA增益 + 双极性 | 放大小信号 |
快速采样 | 高采样率 + 单极性 | 提高转换速度 |
RTD测量 | 激励电流 + 高增益 | 标准测量方法 |
电源监测 | 内部通道 + 连续模式 | 实时监测 |
问题现象 | 可能原因 | 解决方法 |
|---|---|---|
无数据输出 | 时钟未使能 | 检查RCC配置 |
数据异常 | 参考电压不稳定 | 检查VREF配置和电源 |
同步失效 | 模式配置错误 | 确认SIMU_ENABLE设置 |
精度不足 | 增益设置不当 | 调整PGA增益 |
噪声过大 | 参考缓冲未使能 | 使能REF_BUF |
void ADC_Debug_Register_Dump(void)
{
printf("ADC_CONTROL_0: 0x%08X\n", pADC_SUBSYS_USER->ADC_CONTROL_0);
printf("ADC_CONTROL_1: 0x%08X\n", pADC_SUBSYS_USER->ADC_CONTROL_1);
printf("CONFIGURATION_0: 0x%08X\n", pADC_SUBSYS_USER->CONFIGURATION_0);
printf("CONFIGURATION_1: 0x%08X\n", pADC_SUBSYS_USER->CONFIGURATION_1);
printf("ADC_STATUS_0: 0x%08X\n", pADC_SUBSYS_USER->ADC_STATUS_0);
printf("ADC_STATUS_1: 0x%08X\n", pADC_SUBSYS_USER->ADC_STATUS_1);
}
// 最小化配置示例
ADC_InitTypeDef adc;
adc.ADC_Mode = ADC_SIMU_DISABLE;
adc.ADC_ConvMode = ADC_CONT_CONVERT;
adc.ADC_INP = ADC0_PCHAN_AIN0;
adc.ADC_INM = ADC0_NCHAN_AIN1;
ADCx_init(&adc, 0);
ADC0_convert_start();