STM32CubeIDE开发笔记5:ADC+DMA

STM32CubeIDE开发笔记5:ADC+DMA

  • 基本配置
  • HAL关于ADC的库函数的使用
    • ADC轮询
    • ADC_DMA

本文链接:https://blog.csdn.net/qq_42038029/article/details/103846439
版权声明:本文为CSDN博主「遥望1415984987」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
stm32CubeIDE所用版本:1.1.0
固件库包:f1 1.8.0
测试平台stm32f103c8t6

基本配置

ADC的配置很简单,如下图:
STM32CubeIDE开发笔记5:ADC+DMA_第1张图片
当然,你配置好后要注意ADC的采集时钟频率的配置,这样导入时才不会报错。
STM32CubeIDE开发笔记5:ADC+DMA_第2张图片
这样就配置好了,导入工程。

HAL关于ADC的库函数的使用

ADC轮询

在个人变量里添加

/* USER CODE BEGIN PV */
uint16_t AD_Value = 0;

在while里添加如下程序:

 /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
	  HAL_ADC_Start(&hadc1);
	  HAL_ADC_PollForConversion(&hadc1, 50);
	  AD_Value = HAL_ADC_GetValue(&hadc1);
	  
	  HAL_Delay(1000);


  }
  /* USER CODE END 3 */
}

其中
HAL_ADC_Start(&hadc1); 为启动ADC转换。
HAL_ADC_PollForConversion(&hadc1, 50); 表示等待转换完成,第二个参数表示超时时间,单位ms。这个我用的时候感觉影响不大,可有可无。
HAL_ADC_GetValue(&hadc1); 读取ADC转换数据,数据为12位。查看数据手册可知,寄存器为16位存储转换数据,数据右对齐,则转换的数据范围为0~2^12-1,即0 ~4095。

还有其他的函数可用,如:
HAL_ADC_GetState(&hadc1); 为换取ADC状态,HAL_ADC_STATE_REG_EOC表示转换完成标志位,转换数据可用。
配合使用
HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1), HAL_ADC_STATE_REG_EOC); 就是判断转换完成标志位是否设置。

下载到单片机上验证,我用20KR电位器接PA1,电源接单片机电源,接使用外部的电源记得一定要共地,且测量电压不能超过单片机电源电压,即不超过3.3V。

用在线调试可查看ADC的值。
在这里插入图片描述
用这个值除以4096乘以3.3即为实际电压值。

ADC_DMA

使用DMA来进行ADC采集更方便,配置如下:
STM32CubeIDE开发笔记5:ADC+DMA_第3张图片
STM32CubeIDE开发笔记5:ADC+DMA_第4张图片
配置好后先注意初始化的顺序是不是先DMA再ADC,下图是正确的:
STM32CubeIDE开发笔记5:ADC+DMA_第5张图片
具体原因上节讲过了,感兴趣的可以去上节(https://blog.csdn.net/qq_42038029/article/details/103835984)DMA串口通信的注意里看。
然后先在变量处添加变量。

/* USER CODE BEGIN PV */

uint16_t ADC_Value[100];
uint8_t i;
uint32_t ad1;

再在主函数内添加启动函数
第一个参数是ADC句柄
第二个参数是存储采集回来的ADC值的地址
第三个参数是一次ADC采集的值的个数

/* USER CODE BEGIN 2 */
  HAL_ADC_Start_DMA(&hadc1, &ADC_Value, 100);


  /* USER CODE END 2 */

最后在while里添加下面代码:

 /* USER CODE BEGIN 3 */
	  for(i = 0,ad1 =0; i < 100;)
	          {
	              ad1 += ADC_Value[i++];
	          }
	          ad1 /= 100;

将所有的值相加求均值,可是结果更准确。
下载到单片机上验证,在现场表达式里查看ad1的值:
在这里插入图片描述
创作不易,点个赞吧!

你可能感兴趣的:(stm32)