最近在使用STM32L072采集ADC采集电压值时遇到一个问题,采集电压值不准且两路采集会有冲突导致两路采集值偏差都较大,最后经过查阅资料发现是因为ADC采集频率的问题,ADC采集频率最好小于8M,修改配置后ADC采集正常。
CubeMx配置如下:
main.c
uint32_t AD_Value[2] = {0};
float ADC_0,ADC_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_DMA_Init();
MX_ADC_Init();
/* USER CODE BEGIN 2 */
HAL_Delay(1000);
printf("start ....\r\n");
HAL_ADCEx_Calibration_Start(&hadc,ADC_SINGLE_ENDED);
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
int16_t rawData = 0;
float voltage = 0;
float voltage_1 = 0;
uint8_t channel = 0;
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
HAL_ADC_Start_DMA(&hadc,(uint32_t*)&AD_Value,2);
HAL_Delay(100);
printf("ADC0 %d %.2f ADC1 %d %.2f\r\n",AD_Value[0],ADC_0*2,AD_Value[1],ADC_1*10);
memset((uint8_t *)AD_Value,0,4);
ADC_0 = ADC_1 = 0;
HAL_Delay(1000);
run_index++;
if (run_index == 20)
{
run_index = 0;
HAL_ADCEx_Calibration_Start(&hadc,ADC_SINGLE_ENDED);
}
}
/* USER CODE END 3 */
}
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
ADC_0 = AD_Value[0]*3.3/4095;
ADC_1 = AD_Value[1]*3.3/4095;
}