STM32Cube HAL库——ADC电压采集
一、ADC基本介绍
模拟数字转换器,即A/D转换器,或简称ADC(Analog to Digital Converter),通常是指一个将模拟信号转变为数字信号的电子元件。通常的模数转换器是将一个输入电压信号转换为一个输出的数字信号。由于数字信号本身不具有实际意义,仅仅表示一个相对大小。故任何一个模数转换器都需要一个参考模拟量作为转换的标准,比较常见的参考标准为最大的可转换信号大小。而输出的数字量则表示输入信号相对于参考信号的大小。
A/D转换的作用是将时间连续、幅值也连续的模拟信号转换为时间离散、幅值也离散的数字信号,因此,A/D转换一般要经过取样、保持、量化及编码4个过程。在实际电路中,这些过程有的是合并进行的,例如,取样和保持,量化和编码往往都是在转换过程中同时实现的。
这种转换器的基本原理是把输入的模拟信号按规定的时间间隔采样,并与一系列标准的数字信号相比较,数字信号逐次收敛,直至两种信号相等为止。然后显示出代表此信号的二进制数,模拟数字转换器有很多种,如直接的、间接的、高速高精度的、超高速的等。每种又有许多形式。同模拟数字转换器功能相反的称为“数字模拟转换器”,亦称“译码器”,它是把数字量转换成连续变化的模拟量的装置,也有许多种和许多形式。
如果还有不懂,请看其它博主的文章。
二、STM32CubeMX配置
为体现ADC实际效果,本例中用ADC采集电池电压。
OLED显示屏程序是在完成调试接口任务的基础上进行的(所有编程都在这个基础上进行,没有完成则无法烧录),可以在链接代码或者上一期代码的基础上进行编程。
1.确定引脚
查看控制板电路图,确定与电池相关的引脚(或者自己设计电路)。
发现PB1引脚与电池电压有联系,确定以PB1引脚来采集电池电压。
2.配置引脚
点击PB1引脚选择ADC1_IN9并修改名字,选中IN9,开启连续转换模式的使能(选为Enabled),具体如下图。
点击右上角GENERATE CODE按钮生成代码。
三、STM32CubeIDE编程
1.计算引脚电压与电池关系
将电压的范围设置在0-3300mV,电压转换关系:Voltage=(3300X)/2^12 mV。(X为ADC转换后的值,即原始数据)
根据电路图计算PB1引脚电压与电池电压的关系:V电源=11VPB。
首先获取ADC转换后的值,并显示(原始值),再通过电路图计算并显示电池电压的实际值。
1.编程
首先在主函数main.c中定义变量:
//在int main和while之间定义,位置一定要对,在begain和end之间。
int adcval[0];
float V_value1;
在while循环中加入以下代码:
adcval[0] = HAL_ADC_GetValue(&hadc1); //ADC1中获取转换后的值,并将其存储在adcval[0]变量中
HAL_ADC_PollForConversion(&hadc1, 50); //轮询函数,它等待ADC转换完成,最多等待50毫秒
OLED_ShowString(0,10,"ADC:");
OLED_ShowNumber(30,5,adcval[0],4,16);//输出原始值
HAL_ADC_Start(&hadc1);//函数启动ADC1,让它开始进行转换
HAL_ADC_PollForConversion(&hadc1,100);//轮询函数,它等待ADC转换完成,最多等待100毫秒。
if(HAL_IS_BIT_SET(HAL_ADC_GetState(&hadc1),HAL_ADC_STATE_REG_EOC))//判断ADC是否转换成功
{
//读取
adcval[0]=HAL_ADC_GetValue(&hadc1);
V_value1 = (adcval[0]/4096.0*3300*11);//计算
HAL_Delay(300);
OLED_ShowString(70,10,"V:");
OLED_ShowNumber(85,10,(uint32_t)V_value1,5,12);//输出实际值
OLED_ShowString(120,10,"m");
}
OLED_Refresh_Gram();
}
烧录代码运行后效果如下(分别显示原始值和电池电压实际值):
三、小结
本例中以电池电压为例讲解了ADC采集电压的过程,学会这个,我们就可以将模拟信号转化为数字信号并进行显示,比如温度传感器,压力传感器等。
大家一起学习一起进步,变得更强,希望大家点赞和关注,下期将带来电机控制的内容。