【STM32Cube HAL】ADC(七)

 实验内容:使用的ADC单通道采集,实现引脚电压的采集并通过串口打印至PC 端串口调试助手。

一、原理图

二、 CubeMX配置

Step1.打开 STM32CubeMX,点击“New Project”,选择芯片型号,STM32F103VETx。

 Step2.选择时钟源,并配置时钟树。选择Crystal/Ceramic Resonator,并配置系统时钟为72M。

  

Step3.配置SYS,我们这里选择的是Serial Wire。(正常情况配置不配置不影响,debug可以使用。但是你不可以把这两个引脚用于其他复用功能,如果用于其他复用功能,debug就不起作用了。)

 

Step4.串口配置(主要为了在串口调试助手显示测试的时间),因为没有用到中断和DMA所以我们就不过多讲解。

Step5.ADC的配置,因为就使用一个ADC,所以工作模式选择独立模式,如果使用两个ADC时,是双模式,双模式还有很多细分情况。对齐模式,我们一般使用右对齐。ADC扫描使能与否,取决于你是否使用多通道。连续转换使能,因为希望能够不断的转换而不是转换一次。正常转换是使用的规则通道所以需要使能,通道数目就根据你实际使用来填写,多个通道还需要设置优先级,来决定转换顺序。因为是通过转换完成后进入中断以后获取转换值,所以还需要使能中断。(rank中还可以设置采样周期,我是使用默认1.5周期,这里的周期1/ADC_CLK,ADC 输入时钟 ADC_CLK 由 PCLK2 经过分频产生,最大是 14M,我们配置是12M,采样周期1.5周期,转换时间:Tconv = 采样时间 + 12.5 个周期,所以约等于1.17us。)

 

  到这里关于ADC参数配置基本已经完成,只需要根据之前文章《STM32Cube HAL:GPIO输入/输出(一)》Step4-Step8,设置相关工程参数和生成代码。

三、添加功能代码

1、我们等会会向串口调试助手发送数据,进行实验结果的验证。 发送数据我们采用printf函数,所有需要重定向c库函数printf到串口。注意使用时需要在keil设置中勾选微库(use mircolib),同时需要添加头文件#include <stdio.h>。重定向代码如下(usart.c)

//重定向c库函数printf到串口DEBUG_USART,重定向后可使用printf函数
int fputc(int ch, FILE *f)
{
	/* 发送一个字节数据到串口DEBUG_USART */
	HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 1000);	
	
	return (ch);
}

//重定向c库函数scanf到串口DEBUG_USART,重写向后可使用scanf、getchar等函数
int fgetc(FILE *f)
{		
	int ch;
	HAL_UART_Receive(&huart1, (uint8_t *)&ch, 1, 1000);	
	return (ch);
}

  2、定义相关变量,以及使能相关ADC和处理代码(main.c)

//全局变量
uint32_t conv_value;//用于存储转换的值
//使能ADC及中断
HAL_ADC_Start_IT(&hadc1);
//在WHILE(1)中,输出电压值
while (1)
  {
		printf("\r\n电压:%.2fV\r\n",(float)conv_value*3.3/4096);//输出电压值
		HAL_Delay(1000);//延时1秒
  }

3、中断回调函数(转换完成中断)(main.c)

void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef* hadc)
{
	conv_value=HAL_ADC_GetValue(&hadc1);//获取转换的值
}

 ADC单通道的转换需要注意几点:

1、电压的转换,因为我们ADC的精度是12位 ,所以模拟电压经过ADC转换的以后,是一个12位的数值,我们使用串口打印,为了提高可读性,我们会通过公式转换成模拟电压,同时也能验证是否转换正确。我们一般在设计原理图的时候会把 ADC 的输入电压范围设定在:0~3.3v,因为 ADC 是 12 位的, 那么 12 位满量程对应的就是 3.3V,12 位满量程对应的数字值是:2^12。数值 0 对应的就是 0V。 如果转换后的数值为 X ,X 对应的模拟电压为 Y,那么会有这么一个等式成立: 2^12 / 3.3 = X/ Y,=> Y = (3.3 * X ) / 2^12。

2、转换周期的设置,主要是通过设置采样周期、ADC时钟,我是使用默认1.5周期,这里的周期1/ADC_CLK,ADC 输入时钟 ADC_CLK 由 PCLK2 经过分频产生,最大是 14M,我们配置是12M,采样周期1.5周期,转换时间:Tconv = 采样时间 + 12.5 个周期,所以约等于1.17us。

猜你喜欢

转载自blog.csdn.net/qq_29031103/article/details/119894043