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

  • 8
    点赞
  • 68
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
使用STM32HAL库开启两个ADC的方法如下: 1. 首先,在系统初始化之前,需要通过调用HAL_ADC_MspInit()函数初始化ADC的GPIO引脚和时钟。该函数位于stm32xxxx_hal_msp.c文件中。 2. 在主函数中,首先创建两个ADC_HandleTypeDef结构体类型的变量,例如hadc1和hadc2。 3. 使用HAL_ADC_Init()函数和所需的参数(例如ADC_HandleTypeDef变量、参考电压、ADC分辨率等)初始化两个ADC。 4. 使用HAL_ADC_Start()函数启动ADC转换过程。 5. 使用HAL_ADC_GetValue()函数读取已转换的ADC值。 6. 根据需要,可以使用不同的触发模式(例如软件触发或外部触发)启动ADC转换。 以下是一个简单的示例代码,用于启用和读取两个ADCADC1和ADC2): #include "stm32xxxx_hal.h" // 包含ST HAL库头文件 ADC_HandleTypeDef hadc1; // ADC1句柄 ADC_HandleTypeDef hadc2; // ADC2句柄 // 系统初始化函数 void System_Init(void) { // 初始化硬件抽象层(HAL)ADC引脚和时钟 HAL_ADC_MspInit(&hadc1); // 初始化ADC1引脚和时钟 HAL_ADC_MspInit(&hadc2); // 初始化ADC2引脚和时钟 // 初始化ADC1 hadc1.Instance = ADC1; hadc1.Init.ContinuousConvMode = DISABLE; hadc1.Init.Resolution = ADC_RESOLUTION_12B; // ... 其他设置 HAL_ADC_Init(&hadc1); // 初始化ADC2 hadc2.Instance = ADC2; hadc2.Init.ContinuousConvMode = DISABLE; hadc2.Init.Resolution = ADC_RESOLUTION_12B; // ... 其他设置 HAL_ADC_Init(&hadc2); } // 主函数 int main(void) { // 系统初始化 System_Init(); // 启动ADC1和ADC2转换 HAL_ADC_Start(&hadc1); HAL_ADC_Start(&hadc2); // 读取ADC1和ADC2的值 uint16_t adc1_value = HAL_ADC_GetValue(&hadc1); uint16_t adc2_value = HAL_ADC_GetValue(&hadc2); while (1) { // 执行其他操作 } return 0; } 以上是通过STM32HAL库开启两个ADC的基本方法。你可以根据具体需求进行参数配置和功能扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值