【STM32】HAL库—快速使用ADC

  • Post author:
  • Post category:其他




1、ADC简介



1.1 模式

ADC–模数转换器,将模拟量转换成数字量,以STM32F103为例,包含3个12位ADC,即将0-3.3V范围内的电压,用0-4095表示,二者是线性对应关系。即


实际电压 = (读取的ADC值/4096) * 3.3


STM32F系列ADC有多达18个通道,包括16个外部通道和2个内部通道,各个通道的AD可以以单次模式、连续模式、扫描模式、间断模式执行。

单次模式:只执行一次转换就停止转换

连续模式:一次转换结束后继续开始下次转换

扫描模式:按顺序对所有开启的通道转换

间断模式:一次可以不完成全部通道的转换



1.2 ADC参考电压

对于64及更小的封装,没有VREF+引脚端,在芯片内部被接到ADC电源VDDA。对于100引脚与144引脚的封装,需要对VREF进行设定,比如将VREF+接到3.3V,当然,如果追求更高的精度,可以连接一个独立的外部电压到VREF+引脚端,但要注意电压范围为2.4V—VDDA。



1.3 转换速率



ADC采样时间 = (采样周期+12.5周期)

1/ADC时钟频率

*

例如设置ADC时钟为12MHz,Sampling Time 为1.5Cycles,则采样时间为:(1.5+12.5)*1/12 = 1.167us



2、使用轮询模式



2.1 单通道


1、配置系统时钟为72M,ADC时钟为12M


在这里插入图片描述


2、ADC配置

在这里插入图片描述


3、生成工程,添加你的代码

/* USER CODE BEGIN PD */
//首先声明一个全局变量用于存放AD结果
    u32 adc_value;
/* USER CODE END PD */
  //初始化后加入ADC校准函数,进行一次校准
	HAL_ADCEx_Calibration_Start(&hadc1);
	HAL_Delay(200);
//主循环中加入下列语句可以不断得到AD值
	HAL_ADC_Start(&hadc1);
    HAL_ADC_PollForConversion(&hadc1,50);
	adc_value = HAL_ADC_GetValue(&hadc1);

如图所示为ADC转换结果:

在这里插入图片描述



2.2 多通道

1、同2.1进行系统配置

2、设置ADC参数(以双通道为例)

在这里插入图片描述

3、加入你的代码

//声明一个全局变量用于存放ADC转换数据
u32 ad_value[2];

//主函数中使用下列代码得到两个通道的单次转换结果
	int i;
	for(i=0;i<2;i++)
	{
		HAL_ADC_Start(&hadc1);
		HAL_ADC_PollForConversion(&hadc1,50);
		ad_value[i]=HAL_ADC_GetValue(&hadc1);
	}



3、使用DMA

1、ADC配置

在这里插入图片描述

2、增加DMA通道

在这里插入图片描述

3、加入你的代码

    //DMA双通道,ad_value为定义的数据缓存数组,2为通道数(当设置DMA数据长度为word时)
	HAL_ADC_Start_DMA(&hadc1,ad_value,2);
	
	//UI显示(只为显示数据),使用开源GUI--ugui,OLED
	UG_FontSelect(&FONT_12X16);
	UG_SetBackcolor(C_WHITE);
	UG_SetForecolor(C_BLACK);
	UG_PutString(0,0,"ADCIN1");
	UG_PutString(0,30,"ADCIN2");
	UG_PutNum(80,0,ad_value[0],4,C_WHITE,C_BLACK);
    UG_PutNum(80,30,ad_value[1],4,C_WHITE,C_BLACK);
		



4、使用中断



5、优化你的数据



版权声明:本文为qq_39587650原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。