You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NUCLEO64-STM32L073RZ的12位ADC输出波动问题求助

问题描述

使用NUCLEO64-STM32L073RZ开发板搭配ACS725电流传感器IC,配置Timer2触发ADC自动转换,系统时钟为16MHz。开发板由笔记本USB供电,ACS725由开发板3.3V输出供电,ADC引脚连接ACS725输出引脚(理论输出为1.65V,即Vcc的一半),但ADC输出波动超过20步。已确认STM32的ADC参考电压和Vcc稳定,相关代码如下:

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
    endOfConversion = 1;
}
int main(void)
{
  /* USER CODE BEGIN 1 */

  /* USER CODE END 1 */

  /* MCU Configuration--------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* USER CODE BEGIN Init */

  /* USER CODE END Init */

  /* Configure the system clock */
  SystemClock_Config();

  /* USER CODE BEGIN SysInit */

  /* USER CODE END SysInit */

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_USART2_UART_Init();
  MX_ADC_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */

  HAL_ADCEx_Calibration_Start(&hadc, ADC_SINGLE_ENDED);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */

  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
      HAL_TIM_Base_Start(&htim2);
      HAL_ADC_Start_IT(&hadc);
         do
         {
             if(endOfConversion==1)
             {
                 endOfConversion=0;
                 adc_val = HAL_ADC_GetValue(&hadc);
                 volt = (float) (adc_val*3.33)/4095;
                 txcount++;
                 char str[70]={};
                 sprintf(str,"adc = %d, Ic out = %.03f\n\r", adc_val, volt);
                 HAL_UART_Transmit(&huart2,(uint8_t *)str, strlen(str), 50);
                 HAL_Delay(500);
             }
         }while(txcount>0);
      HAL_ADC_Stop_IT(&hadc);
      HAL_TIM_Base_Stop(&htim2);

      char *str1 = "NEW SET \n\r";
      HAL_UART_Transmit(&huart2,(uint8_t *)str1, strlen(str1), 50);

  }

  /* USER CODE END 3 */
}

后续在ACS725滤波引脚接入1uF电容(截止频率88Hz)后,大幅波动消除,但仍存在3-7步的波动。由于需测量交流电流无法使用平均滤波,寻求消除剩余波动的方法。

可行解决方案

硬件优化

  • 在ACS725的3.3V供电端添加LC滤波:串联10~100Ω磁珠/电感,并联10uF钽电容+0.1uF陶瓷电容,抑制电源链路的高频噪声
  • 优化ADC引脚布线:缩短ADC输入走线,远离USB、UART等高频信号线;在ADC引脚对地并联100nF陶瓷电容(电容值不宜过大,避免影响交流信号响应)
  • 切换外部高精度参考源:若STM32内部Vref稳定性不足,可改用TL431这类外部参考电压芯片,确保参考源纹波足够低

软件优化

  • 启用ADC硬件过采样:STM32L0系列ADC支持硬件过采样,无需软件额外处理,不会延迟交流信号响应。可配置4x/8x倍率,硬件自动完成采样平均,平衡噪声抑制与响应速度
  • 调整Timer2触发频率:确保ADC采样频率至少为被测交流信号的10倍以上(如50Hz交流设为1kHz采样率),避免混叠噪声,配合硬件过采样进一步优化
  • 延长ADC采样时间:将ADC采样窗口调整为239.5个ADC时钟周期,让输入信号在采样电容上充分稳定,减少采样引入的误差

内容的提问来源于stack exchange,提问作者vishnu m c

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 15:42:02