STM32L072 多路ADC DMA方式采集电压

在使用STM32L072进行ADC电压采集时遇到精度和通道冲突问题,经分析发现是ADC采集频率过高导致。降低ADC采集频率至8M以下后,问题得到解决。代码中展示了如何配置ADC初始化、DMA传输以及校准过程,以确保电压值的准确采集。
摘要由CSDN通过智能技术生成

最近在使用STM32L072采集ADC采集电压值时遇到一个问题,采集电压值不准且两路采集会有冲突导致两路采集值偏差都较大,最后经过查阅资料发现是因为ADC采集频率的问题,ADC采集频率最好小于8M,修改配置后ADC采集正常。

CubeMx配置如下:
SYS配置
ADC基本配置
ADC配置2

DMA配置
时钟配置
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;
}
### 回答1: STM32F407可以使用多个ADC通道来采集电压信号。可以使用DMA来实现高效的数据传输。以下是一些基本的步骤: 1. 配置ADC时钟和引脚。根据需要选择ADC通道和引脚,并将其配置为模拟输入。 2. 配置ADC参数。可以设置采样时间、分辨率、触发模式等参数。 3. 启动ADC转换。可以使用软件触发或外部触发来启动转换。 4. 等待转换完成。可以使用轮询或中断来等待转换完成。 5. 读取转换结果。可以使用DMA或直接读取寄存器来获取转换结果。 6. 处理数据。可以对采集到的数据进行处理和分析。 需要注意的是,ADC采集电压范围是到Vref,其中Vref是参考电压。如果需要测量超过Vref的电压,可以使用外部电阻分压或差分输入来实现。另外,ADC的精度和采样速率也会影响采集结果的准确性和稳定性。 ### 回答2: STM32F407是一款高性能、低功耗的ARM Cortex-M4微处理器,具有多路ADC采集电压的功能。通过使用ADC模块,可以将外部电压转换为数字信号,进而进行处理和分析,具有广泛的应用领域,如工业控制、电力管理、医疗仪器等。 STM32F407共有3个ADC模块,每个模块最多可采集16路模拟电压信号,且每路信号的分辨率可达12位或者10位。同时,每个ADC模块还配备了一个DMA控制器,可以实现高效的数据传输和处理。 在进行多路ADC采集电压时,需要注意以下几点: 1. 选择合适的参考电压:在转换模拟电压信号之前,需先选定合适的参考电压,在STM32F407中可选的参考电压有内部参考电压和外部参考电压。 2. 配置ADC通道:对于要采集的每路模拟电压信号,需要配置相应的ADC通道。在STM32F407中,每个ADC模块最多可配置16个通道。 3. 配置采样时间:采样时间指的是模拟信号在ADC模块中被采样的时间长度,既要保证采样时间足够长,又要尽可能的缩短采样时间,以提高ADC转换的速度和精度。 4. 启动ADC转换:当以上参数都配置完成后,即可启动ADC转换,将模拟电压信号转换为数字信号,并将转换结果存入ADC数据寄存器中。 多路ADC采集电压STM32F407中的实现并不复杂,但是需要熟悉STM32F407的硬件结构和相关寄存器的使用方法,才能更好的实现多路ADC采集电压的功能。 ### 回答3: stm32f407是一款高性能的32位微处理器,拥有多个ADC(模数转换器)通道,可以实现多路电压采集。 首先,我们需要了解ADC采样的基本流程。当我们需要采样某个电压时,首先将该电压引入芯片内部,经过采样保持电路将该电压保持,传入ADC进行采样转换,最终以数字信号的形式输出。 stm32f407的ADC模块支持单通道和多通道采集模式。在单通道采集模式下,只能采集一个通道的电压值;而在多通道采集模式下,可以通过循环扫描的方式采集多个通道的电压值。在多通道采集模式下,可以使用DMA(直接存储器访问)技术,实现高效的数据传输。 在使用stm32f407进行多路ADC采集时,需要注意以下几点: 1. 确定采样频率和采样分辨率:采样频率和采样分辨率直接影响到采集精度和速度。在确定采样频率和采样分辨率时,要考虑到被采集的模拟信号的带宽和精度要求,以及芯片处理能力等因素。 2. 确定参考电压源:ADC的转换结果和参考电压源直接相关。stm32f407内部有多种参考电压源可供选择,可以根据实际需要进行配置。 3. 配置ADC参数:包括采样频率、采样分辨率、参考电压源、采集通道等参数。在配置时需要注意到芯片的时钟和电源等基本设置,以及ADC工作模式等高级设置。 4. 编写采集程序:可以使用中断或DMA方式进行数据采集。在使用中断方式时,需要编写中断服务程序;在使用DMA方式时,需要配置DMA通道并编写相应的数据处理程序。 总之,stm32f407多路ADC采集电压需要仔细考虑硬件参数配置和软件程序设计,才能获得准确、高效的采集结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值