问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

STM32F103高精度ADC采样的黑科技揭秘

创作时间:
作者:
@小白创作中心

STM32F103高精度ADC采样的黑科技揭秘

引用
CSDN
7
来源
1.
https://blog.csdn.net/2401_84384479/article/details/143491757
2.
https://blog.csdn.net/world9999/article/details/142392030
3.
https://blog.csdn.net/xiaoyuanwuhui/article/details/143803038
4.
https://blog.csdn.net/m0_72952662/article/details/136063831
5.
https://blog.csdn.net/I_want_to_go/article/details/139236710
6.
https://club.rt-thread.org/ask/article/abba9aaed98de32d.html
7.
http://www.ruihutech.com/news_detail.php?id=33&cid=1

在嵌入式系统开发中,STM32F103微控制器因其高性能和丰富的外设而广受欢迎。然而,其内置的12位ADC在某些高精度测量应用中可能显得不够用。幸运的是,通过过采样技术,我们可以将ADC的分辨率提升至14位甚至更高,从而显著提高测量精度。

01

过采样技术原理

过采样技术的基本思想是在一个采样周期内多次采样,并将结果累加平均,从而提高ADC的分辨率。假设原始ADC的分辨率为N位,通过M倍的过采样,可以将有效分辨率提升至N+log2(M)位。

例如,对于STM32F103的12位ADC,如果我们进行16倍过采样(即M=16),则有效分辨率可以提升至:

12 + log2(16) = 12 + 4 = 16位

02

硬件设计要点

在实现高精度ADC采样时,硬件设计同样重要。根据[[2]]中的经验分享,以下几点值得特别注意:

  1. 基准电压源:确保基准电压稳定且具有足够的驱动能力。建议参考[[2]]中提到的文章,深入了解基准电压源的设计要点。

  2. 输入信号处理:不要直接将电阻分压信号接入ADC,因为ADC的输入阻抗会影响采样精度。应使用运放跟随器来隔离信号源。

  3. 抗混叠滤波:在高速采样时,输入信号需要进行低通滤波处理,以消除采样瞬间产生的尖峰。这可以通过在输入端添加RC滤波电路来实现。

03

软件实现

为了实现高速采样,我们采用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);
04

效果评估

通过实验验证,采用过采样技术后,ADC的测量精度显著提高。下图展示了过采样前后的对比结果:

从图中可以看出,过采样后的数据更加平滑,噪声得到有效抑制,测量精度明显提升。

05

总结

过采样技术为提升STM32F103的ADC精度提供了一个简单而有效的解决方案。通过合理的硬件设计和软件实现,我们可以轻松将12位ADC提升至14位甚至更高精度。虽然这种方法不能完全替代专业的AD芯片,但对于许多应用场景来说,已经足够满足需求。希望本文能帮助你在项目中实现更精确的模拟信号采集。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号