STM32cube全型号移植HAL库+配置DMA+多通道ADC(ADC1的4个通道)

首先介绍一下DMA

 

 敲黑板:用于高速搬运数据,还无需CPU干预。 因此在多通道采集模拟量是,我们可以建立一个数组,用于储存AD转换的数据。一旦ADC_DR寄存器里有了新的数据,就把新数据放在数组里。一会儿ADC_DR有了一个新的数据,就放在数组下一位。数组装满以后?根据需求来。我们设置的是循环模式,也就是再来一遍,覆盖之前的数据。

2. cubemx配置主要内容

ADC引脚配置

生成代码

main.c里边需添加的/
 1、定义变量

/* USER CODE BEGIN 0 */
 uint32_t IOUT_Value[300]={0};; //传递给DMA存放多通道采样值的数组
 uint16_t i,j,buf=0;
 int32_t adc1_aver_val[3] = {0}; 
 float PM25,yanwu,xinlv;           //保存多通道的平均采样值的数组   [1]号写入PM2.5  [2]号写入yanwu [3]号写入心率
/* USER CODE END 0 */

2、启动DMA 

  /* USER CODE BEGIN 2 */
    /*启动定时器3中断*/
    HAL_TIM_Base_Start_IT(&htim3);
    /*启动DMA中断*/
		HAL_ADC_Start_DMA(&hadc, (uint32_t*)&IOUT_Value, 300);  //启动DMA转换
		//HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
  //模块开机
	// POWER_ON;
	// HAL_Delay(1000);
	// POWER_OFF;
    printf("System Running\r\n");
  /* USER CODE END 2 */

3、添加主函数

	for(i=0;i<3;i++)
	{
		adc1_aver_val[i] = 0;
	}
/* 在采样值数组中分别取出每个通道的采样值并求和 */
	for(i=0;i<300;i++)
	{
		adc1_aver_val[0] +=  IOUT_Value[i++];
		adc1_aver_val[1] +=  IOUT_Value[i++];
		adc1_aver_val[2] +=  IOUT_Value[i++];
	}
HAL_Delay(100);
/* 依次对每个通道采样值求平均值 */
	for(i=0;i<3;i++)
	{
		adc1_aver_val[i] /=100;
	}
	for(i=0;i<3;i++)
	{
	printf("ADC1[%02d] 转换值 = %1.3f V 原始数据 =  %04d\r\n",i,adc1_aver_val[i]*3.30f/4095,adc1_aver_val[i]);
	}


 

发布了5 篇原创文章 · 获赞 0 · 访问量 121

猜你喜欢

转载自blog.csdn.net/qq_42930154/article/details/104286308