为什么NUCLEO64-STM32L073RZ的12位ADC输出波动超过20步?

问题描述 投票:0回答:1

我正在使用带有电流传感器 IC ACS725 的 NUCLEO64 板 STM32L073RZ。我正在为 STM 使用以下 ADC 和定时器配置。

ADC 配置为使用定时器 2 自动触发。时钟频率为 16Mhz,因此 Timer2 频率。

NUCLEO 板由笔记本电脑的 USB 端口供电,ACS725 由 NUCLEO 板的 3.3V 输出供电。 ADC 引脚连接到 ACS725 输出引脚的输出,应产生 1.65V(Vcc 的一半)的输出。

但是当我显示ADC输出时,它波动超过20步。 ADC 输出如下。

我的读取 ADC 值的代码如下

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 */
}

造成这种波动的原因是什么?我检查了STM的ADC ref和Vcc,它是稳定的。

我的连接设置如下所示。

这就是 ACS725 板的样子。

编辑:IC 内置有源滤波器,我在滤波器引脚上使用了 1uF 电容器,这使得截止频率为 88Hz。现在大的波动已经消除了。但仍然存在 3 到 7 个 ADC 步长的波动。如何消除所有这些波动?我无法使用平均值,因为我需要测量交流电流

embedded stm32 adc nucleo stm
1个回答
1
投票

根据“常见电气特性”下的数据表,噪声水平通常为 27 mA (rms)。

假设您的电流传感器范围为 +/-5A,则输出为 27mA * 264mV/1000mA = 7mV(第 7 页)。峰峰值,这对应于 2 * 7 * sqrt(2) = 19.8mV,所以大约。 20mV。

在具有 3.3V 参考电压的 12 位 ADC 上,这可转换为 20mV * 3.3V/4096 = 16 个计数,大致与您观察到的一致。

我建议用滤波器过滤输出信号。我会使用有源滤波器,因为传感器的最大输出电容负载为 10nF(第 6 页)。如果这不是一个选项,请确保电容器的值不超过这些 10nF。

© www.soinside.com 2019 - 2024. All rights reserved.