STM32学习笔记 ADC转换

第六章 ADC转换

6.1模数转换器(ADC)概述

ADC:Analog to Digital Converter
将时间和幅值连续的模拟量转化为时间和幅值离散的数字量,A/D转换一般要经过采样、保持、量化、编码4个过程。
A/D转换的几个技术指标
量程:指ADC所能输入模拟信号的类型和电压范围,即参考电压。信号类型包括单极性和双极性。
转换位数:量化过程中的量化位数n。A/D转换后的输出结果用n位二进制来表示。例如:10位ADC的输出值就是0~1023。
分辨率:ADC能够分辨的模拟信号最小变化量。
分辨率 = 量程/2^n
转换时间:ADC完成一次完整的A/D转换所需要的时间,包括采样、保持、量化、编码4个过程

6.2查询方式和中断方式的HAL库函数应用

1.查询方式,阻塞式A/D转换

Uint16_t  ADC_Value = 0;
HAL_ADC_Start(&hadc); //启动ADC
if(HAL_OK == HAL_ADC_PollForConversion(&hadc,10))
//中断读取返回结果
{
ADC_Value = HAL_ADC_GetValue(&hadc);//将读取的值存放在ADC_Value中
//ADC_Value就是我们得到的采样值
}

2.中断方式,非阻塞式A/D转换

Uint16_t  ADC_Value = 0;
HAL_ADC_Start_IT(&hadc); //启动ADC
Void HAL_ADC_ConvCpltCallback(ADC_Handle TypeDef* hadc1)  
//中断回调函数读取返回结果
{
ADC_Value = HAL_ADC_GetValue(&hadc);//将读取的值存放在ADC_Value中
//ADC_Value就是我们得到的采样值
}

例:
[1]将ADC_ IN0 设置为12位ADC,右对齐,启用中断;
[2]分别用查询和中断这2种方式,每隔0.5秒采样一次ADC的数 据;
[3]将每次读取到的ADC采样值转换为对应电压值,发送到上位机;.
[4] LED1作为采样指示灯,在ADC转换过程中点亮,其余时间熄灭。
CubeMX配置
在这里插入图片描述
查询方式代码:

uint16_t ADC_Value = 0,ADC_Volt = 0;
uint8_t str_buff[64];

void UR1_send()
{
	sprintf((char *)str_buff,"采样值:%d, 电压值:%d.%d%dV\r\n",ADC_Value,ADC_Volt/100,(ADC_Volt%100)/10,ADC_Volt%10);
	HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),10000);
}
void ADC0_Get_Value(void)//查询方式
{
	HAL_ADC_Start(&hadc1);
	LED_up(0x01);//打开LED1
	if(HAL_ADC_PollForConversion(&hadc1,10) == HAL_OK)
	{
		ADC_Value = HAL_ADC_GetValue(&hadc1); //ADC_Value是采样值
		ADC_Volt = ADC_Value*330/4096;  //4096 = 2^12;12是12位的ADC,330表示3.3v,如果是mv则采用3300
		//将采样值转化为电压
	}
	UR1_send(); //调用串口发送函数
	LED_off(0x01);//关闭LED1
	HAL_ADC_Stop(&hadc1); //停止ADC采样
}
//在主函数内调用该函数即可ADC0_Get_Value();

中断方式代码:

uint16_t ADC_Value = 0,ADC_Volt = 0;
uint8_t str_buff[64];

void UR1_send()
{
	sprintf((char *)str_buff,"采样值:%d, 电压值:%d.%d%dV\r\n",ADC_Value,ADC_Volt/100,(ADC_Volt%100)/10,ADC_Volt%10);
	HAL_UART_Transmit(&huart1,str_buff,sizeof(str_buff),10000);
}
//找到中断回调函数,在回调函数内写代码
void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
{
	if(hadc->Instance == ADC1)
	{
		ADC_Value = HAL_ADC_GetValue(&hadc1); //ADC_Value是采样值
		ADC_Volt = ADC_Value*330/4096;  //4096 = 2^12;12是12位的ADC,330表示3.3v,如果是mv则采用3300
		UR1_send();//调用串口发送函数
		LED_off(0x01);
	}
}
//主函数
while(1)
{
	LED_up(0x01);
	HAL_ADC_Start_IT(&hadc1); //启动ADC模数转换
	HAL_Delay(500);
}

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