ADC模块(模数转换器)是几乎每个嵌入式应用程序中使用的一个常见功能。这些 模数转换器 可以从模拟传感器(例如温度传感器,倾斜传感器,电流传感器,柔性传感器等)读取电压。因此,在本教程中,我们将学习 如何在STM32F103C8中使用ADC 通过Energia IDE读取模拟电压。我们将一个小的电位计连接到STM32 Blue Pill板上,并向模拟引脚提供变化的电压,读取该电压并将其显示在16x2 LCD屏幕上。
在Arduino和STM32F103C8中比较ADC
在Arduino板上,它包含6通道(Mini和Nano上为8通道,Mega上为16通道),10位ADC,输入电压范围为0V–5V。这意味着它将把0到5伏之间的输入电压映射为0到1023之间的整数。现在,对于STM32F103C8,我们有10个通道的12位ADC,输入范围为0V -3.3V。它将0到3.3伏之间的输入电压映射为0到4095之间的整数值。
STM32中的ADC
嵌入在STM32微控制器中的ADC使用SAR(逐次逼近寄存器)原理,通过该原理可以分几步执行转换。转换步骤的数量等于ADC转换器中的位数。每个步骤均由ADC时钟驱动。每个ADC时钟从结果到输出产生一位。ADC内部设计基于开关电容技术。如果您不熟悉STM32,请查看我们的STM32入门教程。
12位分辨率
该ADC是10通道12位ADC。这里的“ 10通道”一词意味着有10个ADC引脚,我们可以使用它们测量模拟电压。术语12位表示ADC的分辨率。12位表示2等于十的幂(2 12),即4096。这是我们ADC的采样步数,因此我们ADC值的范围将从0到4095。该值将从0增加到4095基于每步的电压值,可以通过公式计算得出
电压/阶跃=参考电压/ 4096 =(3.3 / 4096 = 8.056mV)每单位。
模拟信号如何转换为数字格式
由于计算机仅存储和处理二进制/数字值(1和0)。因此必须将模拟信号(如传感器的伏特输出)转换为数字值进行处理,并且转换必须准确。当在模拟输入上将输入模拟电压提供给STM32时,将读取模拟值并将其存储在整数变量中。使用以下公式将存储的模拟值(0-3.3V)转换为整数值(0-4096):
输入电压=(ADC值/ ADC分辨率)*参考电压
分辨率= 4096
参考= 3.3V
STM32F103C8T6中的ADC引脚
STM32中从PA0到PB1有10个模拟引脚。
还要检查如何在其他微控制器中使用ADC:
- 如何在Arduino Uno中使用ADC?
- ADC0808与8051单片机的接口
- 使用PIC单片机的ADC模块
- Raspberry Pi ADC教程
- 如何在MSP430G2中使用ADC-测量模拟电压
所需组件
- STM32F103C8
- 液晶屏16 * 2
- 电位计100k
- 面包板
- 连接线
电路图和说明
将16 * 2 LCD和模拟输入 接口连接到STM32F103C8T6电路板的电路图 如下所示。
LCD的连接如下所示:
LCD引脚号 |
LCD引脚名称 |
STM32引脚名称 |
1个 |
地面(地) |
地线(G) |
2 |
VCC |
5伏 |
3 |
VEE |
电位器中心引脚 |
4 |
寄存器选择(RS) |
PB11 |
5 |
读/写(RW) |
地线(G) |
6 |
启用(EN) |
PB10 |
7 |
数据位0(DB0) |
无连接(NC) |
8 |
数据位1(DB1) |
无连接(NC) |
9 |
数据位2(DB2) |
无连接(NC) |
10 |
数据位3(DB3) |
无连接(NC) |
11 |
数据位4(DB4) |
PB0 |
12 |
数据位5(DB5) |
PB1 |
13 |
数据位6(DB6) |
PC13 |
14 |
数据位7(DB7) |
PC14 |
15 |
LED正极 |
5伏 |
16 |
LED负极 |
地线(G) |
根据上表进行连接。电路中有两个电位计,第一个用于分压器,可用于改变电压并向STM32提供模拟输入。该电位器的左引脚从STM32(3.3V)获得输入正电压,右引脚接地,电位器的中心引脚与STM32的模拟输入引脚(PA7)连接。另一个电位器用于改变LCD显示屏的对比度。STM32的电源通过PC或笔记本电脑的USB电源提供。
编程STM32以读取ADC值
在上一个教程中,我们了解了使用USB端口编程STM32F103C8T6开发板的知识。因此,我们现在不需要FTDI程序员。只需通过STM32的USB端口将其连接到PC,然后即可使用ARDUINO IDE开始编程。在ARDUINO IDE中对STM32进行编程以读取模拟电压非常简单。像arduino板一样。无需更改STM32的跨接引脚。
在该程序中,将读取模拟值并使用该值计算电压,然后在LCD屏幕上同时显示模拟值和数字值。
首先 定义LCD引脚。这些定义了LCD引脚连接到STM32的哪个引脚。您可以根据需要进行修改。
const int rs = PB11,en = PB10,d4 = PB0,d5 = PB1,d6 = PC13,d7 = PC14;//提到用LCD连接的引脚名称
接下来,我们 包括 LCD显示器的头文件。这将调用该库,其中包含STM32如何与LCD通信的代码。还要确保使用上面刚刚定义的引脚名称调用液晶功能。
#包括
在 setup() 函数内部 ,我们只给出一条介绍性消息,该消息将显示在LCD屏幕上。您可以了解有关LCD与STM32接口的信息。
lcd.begin(16,2); //我们使用的是16 * 2 LCD lcd.clear(); //清除屏幕 lcd.setCursor(0,0); //在第一行的第一列 lcd.prin t(“ CIRCUITDIGEST”); //打印此 lcd.setCursor(0,1); //在第二行的第一列n lcd.print(“ STM32F103C8”); //打印THI小号 延迟(2000); //等待两个秒数 lcd.clear(); //清除屏幕 lcd.setCursor(0,0); //在第一行的第一列 lcd.print(“ USING ADC IN”); //打印此 lcd.setCursor(0,1); //在第二行的第一列 lcd.print(“ STM32F103C8”); //打印此 delay(2000); //等待两个秒数 lcd.clear(); //清除屏幕
最后,在无限 循环() 函数内部,我们开始 从电位计读取提供给PA7引脚的模拟电压。正如我们已经讨论的那样,微控制器是数字设备,它不能直接读取电压电平。使用SAR技术,电压电平从0映射到4096。这些值称为ADC值,只需使用以下行即可获得该ADC值
int val = AnalogRead(A7); //从引脚PA 7读取ADC值
此处, 函数 AnalogRead() 用于读取pin的模拟值。最后,我们将此值保存在一个名为“ val ”的变量中。此变量的类型为整数,因为我们将仅获取0到4096之间的值以存储在此变量中。
下一步将是 根据ADC值计算电压值。为此,我们有以下公式
电压=(ADC值/分辨率ADC)*参考Voltag ë
在我们的案例中,我们已经知道微控制器的ADC分辨率为4096。ADC值也在上一行中找到,并存储了称为val的变量。所述 参考电压等于在该微控制器正在操作的电压。当STM32板通过USB电缆供电时,工作电压为 3.3V。您还可以使用万用表在板上的Vcc和接地引脚上测量工作电压。所以上面的公式适合我们的情况,如下所示
浮动电压=(float(val)/ 4096)* 3.3; //公式的ADC值voltag转换è
您可能对 float(val) 行感到困惑 。 这用于 将变量“ val”从int数据类型转换为“ float”数据类型。之所以需要这种转换,是因为只有在浮点运算中获得val / 4096的结果时,我们才能将其乘以3.3。如果以整数形式接收到该值,则该值将始终为0,结果也将为零。计算完ADC值和电压后,剩下的就是 在LCD屏幕上显示结果 ,可以使用以下几行代码完成
lcd.setCursor(0,0); //将光标设置到第0列第0行 lcd.print(“ ADC Val:”); lcd.print(val); //显示ADC值 lcd.setCursor(0,1); //将光标设置到第0列第1行 lcd.print(“ Voltage:”); lcd.print(电压); //显示电压
完整的代码和演示视频如下。