ADC功能讲解

2026-06-23 17:19:47 8620

前言:

针对ADC使用注意点做汇总

一、功能描述

计算公式参考手册,建议使用“建议实际可用测量电压范围”作为ADC采集的增益选择判断标准。计算公式参考手册。

仅使用ADC功能,同时降低功耗,可以将引脚的数字输入功能关闭,配置 R16_PIN_ANALOG_IE。 注:如果引脚用于模拟功能(ADC/TouchKey),建议将该引脚的数字输入功能关闭,即设置数字输入禁用,从而可以降低功耗,并有利于减少干扰。

PA9引脚进行ADC采集,在置为浮空后,过300ms左右再进行ADC的采集。因为初次烧录的时候boot是串口功能开启的,PA9是输出高电平。切换到浮空会需要等待时间。

二、电池电压采集参考:

默认配置为-12db增益模式,计算时需要根据手册选择对应的计算公式。

查看代码

uint32_t CountBat = 0;

uint16_t abcBuff[40];

uint32_t min_number = 0;

uint32_t max_number = 0;

double bat_value = 0;

ADC_InterBATSampInit();

for(i = 0; i < 20; i++){

abcBuff[i] = ADC_ExcutSingleConver(); // 连续采样20次

}

for(i = 0; i < 20; i++){

CountBat += abcBuff[i];

if(i == 0){

min_number = abcBuff[i];

max_number = abcBuff[i];

}

min_number = ((min_number > abcBuff[i]) ? abcBuff[i] : min_number); //软件滤波

max_number = ((max_number < abcBuff[i]) ? abcBuff[i] : max_number);

}

printf("min_number = %d, max_number = %d\n", min_number, max_number);

CountBat = (CountBat - min_number - max_number) / 18; //删除最小与最大值

printf("AverageCountBat = %d\n", CountBat);

bat_value = ((double)CountBat/512-3)*1.05; //注意编译器要开启float打印

printf("bat_value = %1.5lfv\n", bat_value);

while(1);

电池电压采集的是供电电压。如果给芯片供电电压经过降压后给到芯片,并需要测试源电压,则单独拉一路ADC,完成采集。如果源电压的电压超出芯片ADC采集范围,可以分压采集。分压电路参考:

三、PA9ADC采集+浮点滤波:

查看代码

int main()

{

uint8_t i;

signed short RoughCalib_Value = 0; // ADC粗调偏差值

uint32_t countadc = 0;

uint16_t min_number = 0;

uint16_t max_number = 0;

double voltage = 0;

SetSysClock(CLK_SOURCE_PLL_60MHz);

/* 配置串口调试 */

DebugInit();

PRINT("\nStart @ChipID=%02X\n", R8_CHIP_ID);

/* 单通道采样:选择adc通道0做采样,对应 PA4引脚, 带数据校准功能 */

GPIOA_ModeCfg(1 << 9 | GPIO_Pin_15, GPIO_ModeIN_Floating);

mDelaymS(300);

ADC_ExtSingleChSampInit(SampleFreq_3_2, ADC_PGA_0);

RoughCalib_Value = ADC_DataCalib_Rough(); // 用于计算ADC内部偏差,记录到全局变量 RoughCalib_Value中

PRINT("RoughCalib_Value =%d \n", RoughCalib_Value);

printf("PA9:::::\n");

ADC_ChannelCfg(13);

for(i = 0; i < 20; i++)

{

adcBuff[i] = ADC_ExcutSingleConver() + RoughCalib_Value; // 连续采样20次

}

printf("original: ");

for(i = 0; i < 20; i++)

{

PRINT("%d ", adcBuff[i]); // 注意:由于ADC内部偏差的存在,当采样电压在所选增益范围极限附近的时候,可能会出现数据溢出的现象

}printf("\n");

for(i = 0; i < 20; i++)

{

countadc += adcBuff[i];

if(i == 0){

min_number = adcBuff[i];

max_number = adcBuff[i];

}

min_number = ((min_number > adcBuff[i]) ? adcBuff[i] : min_number); //软件滤波

max_number = ((max_number < adcBuff[i]) ? adcBuff[i] : max_number);

}

printf("min=%d, max=%d, diff=%d\n", min_number, max_number, (max_number-min_number));

countadc = (countadc - min_number - max_number) / 18; //删除最小与最大值

printf("countaveradc = %d\n", countadc);

voltage = (double)countadc/2048*1.05;

printf("voltage=%1.3lfv\n", voltage);

while(1);

}

Copyright © 2022 世界杯积分_上一届世界杯冠军 - f0cai.com All Rights Reserved.