我正在使用带有电流传感器 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 步长的波动。如何消除所有这些波动?我无法使用平均值,因为我需要测量交流电流
根据“常见电气特性”下的数据表,噪声水平通常为 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。