【STM32】HAL库—快速使用ADC

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、优化你的数据

猜你喜欢

转载自blog.csdn.net/qq_39587650/article/details/119521784