STM32F103高精度ADC采样的黑科技揭秘
STM32F103高精度ADC采样的黑科技揭秘
在嵌入式系统开发中,STM32F103微控制器因其高性能和丰富的外设而广受欢迎。然而,其内置的12位ADC在某些高精度测量应用中可能显得不够用。幸运的是,通过过采样技术,我们可以将ADC的分辨率提升至14位甚至更高,从而显著提高测量精度。
过采样技术原理
过采样技术的基本思想是在一个采样周期内多次采样,并将结果累加平均,从而提高ADC的分辨率。假设原始ADC的分辨率为N位,通过M倍的过采样,可以将有效分辨率提升至N+log2(M)位。
例如,对于STM32F103的12位ADC,如果我们进行16倍过采样(即M=16),则有效分辨率可以提升至:
12 + log2(16) = 12 + 4 = 16位
硬件设计要点
在实现高精度ADC采样时,硬件设计同样重要。根据[[2]]中的经验分享,以下几点值得特别注意:
基准电压源:确保基准电压稳定且具有足够的驱动能力。建议参考[[2]]中提到的文章,深入了解基准电压源的设计要点。
输入信号处理:不要直接将电阻分压信号接入ADC,因为ADC的输入阻抗会影响采样精度。应使用运放跟随器来隔离信号源。
抗混叠滤波:在高速采样时,输入信号需要进行低通滤波处理,以消除采样瞬间产生的尖峰。这可以通过在输入端添加RC滤波电路来实现。
软件实现
为了实现高速采样,我们采用DMA(直接内存访问)方式来传输ADC数据。以下是基于STM32CubeMX生成的HAL库代码示例:
// 定义采样数组
#define SAMPLE_NUM 10
#define CHANNEL_NUM 2
uint16_t adc_converted_value[SAMPLE_NUM][CHANNEL_NUM];
// 初始化ADC和DMA
void MX_ADC1_Init(void)
{
// ADC配置
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = ENABLE;
hadc1.Init.ContinuousConvMode = ENABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = CHANNEL_NUM;
hadc1.Init.DMAContinuousRequests = ENABLE;
hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV;
if (HAL_ADC_Init(&hadc1) != HAL_OK)
{
Error_Handler();
}
// ADC通道配置
ADC_ChannelConfTypeDef sConfig = {0};
sConfig.Channel = ADC_CHANNEL_1;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_2;
sConfig.Rank = 2;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
{
Error_Handler();
}
}
// 启动ADC采样
void Start_ADC_Sampling(void)
{
if (HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_converted_value, SAMPLE_NUM * CHANNEL_NUM) != HAL_OK)
{
Error_Handler();
}
}
在获取到采样数据后,我们可以通过以下代码实现过采样处理:
// 过采样处理函数
float Oversampling_Process(uint16_t *data, uint16_t sample_num)
{
uint32_t sum = 0;
for (uint16_t i = 0; i < sample_num; i++)
{
sum += data[i];
}
return (float)sum / sample_num;
}
// 使用示例
float voltage = Oversampling_Process(adc_converted_value[0], SAMPLE_NUM);
效果评估
通过实验验证,采用过采样技术后,ADC的测量精度显著提高。下图展示了过采样前后的对比结果:
从图中可以看出,过采样后的数据更加平滑,噪声得到有效抑制,测量精度明显提升。
总结
过采样技术为提升STM32F103的ADC精度提供了一个简单而有效的解决方案。通过合理的硬件设计和软件实现,我们可以轻松将12位ADC提升至14位甚至更高精度。虽然这种方法不能完全替代专业的AD芯片,但对于许多应用场景来说,已经足够满足需求。希望本文能帮助你在项目中实现更精确的模拟信号采集。