一、什么是ADC?
ADC(Analog-to-Digital Converter)即模数转换器。它是一种将模拟信号转换为数字信号的电子器件。在电子系统中,ADC 起着至关重要的作用,它能将连续变化的模拟量(如电压、电流等)转换为离散的数字量,以便数字电路进行处理、存储和传输。ADC通过将模拟量转化为数字量,例如将连续的电压信号转化为离散的数字信号。
二、配置工程
蓝桥杯竞赛板有两个模拟电压输出,分别是PB15和PB12.STM32G431内部集成2个有最高12位精度ADC(ADC1、ADC2)可配置的转换精度:6位,8位,10位,12位。12位精度为:0000 0000 0000 ~ 1111 1111 1111,2^12 = 4096。意思是把0 ~ 3.3v分成4096份 一份精度约为0.0008v(电压变换了0.0008v,ADC都能感受到).如原理图所示,两个采集端均存在跳线帽,若跳线帽拔掉,则无法正常工作。
分别配置PB15和PB12
三、使用步骤
在adc.c中编写getADC1和getADC2函数,目的是为了获取AD值,并在adc.h声明
uint16_t getADC2(void)
{
uint16_t adc=0;
HAL_ADC_Start(&hadc2);//启动ADC转换
adc=HAL_ADC_GetValue(&hadc2);//获取AD值
return adc;
}
uint16_t getADC1(void)
{
uint16_t adc=0;
HAL_ADC_Start(&hadc1);
adc=HAL_ADC_GetValue(&hadc1);
return adc;
}
对上述代码进行详解
uint16_t adc=0;
:定义一个 16 位无符号整数变量adc
,并初始化为 0。HAL_ADC_Start(&hadc2);
:调用特定的硬件抽象层(HAL)函数来启动hadc2
的 ADC 转换。adc=HAL_ADC_GetValue(&hadc2);
:使用 HAL 函数获取hadc2
转换得到的 AD 值,并将其存储到adc
变量中。return adc;
:函数返回获取到的 AD 值。
uint16_t adc=0
初始化为 0 主要有以下原因:
- 明确初始状态:确保变量在使用前有一个明确的、可预期的初始值,避免出现未定义或不确定的情况。
- 避免潜在错误:如果不进行初始化,变量可能会包含随机或无效的数据,这可能导致后续计算或操作出现错误。
- 一致性:将其初始化为 0 可以保持代码的一致性和可读性,使代码更易于理解和维护。
&hadc2
表示取变量hadc2
的地址。在这个函数中,它是将
hadc2
的地址传递给HAL_ADC_Start
和HAL_ADC_GetValue
等函数,以便这些函数能够对指定的 ADC 进行操作。
在adc.h中声明
/* USER CODE BEGIN Prototypes */
uint16_t getADC2(void);
uint16_t getADC1(void);
/* USER CODE END Prototypes */
在main.c中添加校准函数,也可以放置与adc.c中的初始化函数中void MX_ADC1_Init(void),void MX_ADC2_Init(void)
HAL_ADCEx_Calibration_Start(&hadc1,ADC_SINGLE_ENDED);
HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);
这两行代码的作用是分别启动
hadc1
和hadc2
这两个 ADC 的校准操作。ADC_SINGLE_ENDED
表示单端模式的校准。通过执行校准,可以提高 ADC 的测量精度。
定义两个值,用来获取ADC采集到的值
double volt_R37;
double volt_R38;
double是双精度浮点数,是一种计算机数据类型。它具有更高的精度和范围,能表示比单精度浮点数更精确的小数。
volt_R37=getADC2()*3.2/4096;
volt_R38=getADC1()*3.2/4096;
这两行代码是在对获取到的 ADC 值进行进一步的计算和转换。getADC2()
和getADC1()
获取到的是经过 ADC 转换后的数值,然后分别乘以3.2/4096
,可能是为了将 ADC 值转换为实际的电压值。
sprintf(buf," R37:%.2fV ",volt_R37);
LCD_DisplayStringLine(Line4,(uint8_t*)buf);
sprintf(buf," R38:%.2fV ",volt_R38);
LCD_DisplayStringLine(Line5,(uint8_t*)buf);
%.2f
表示以保留的浮点数形式输出电压值两位小数
四、效果展示
五、代码开源
通过网盘分享的文件:16-TEST7-ADC.zip
链接: https://pan.baidu.com/s/1N3-lp_dettxJMHnpxKlvHg?pwd=0820 提取码: 0820