几乎每个嵌入式应用程序中都使用的一个常见功能是 ADC 模块(模数转换器)。这些模数转换器可以从温度传感器、倾斜传感器、电流传感器、弯曲传感器等模拟传感器读取电压。现在,我们学习 如何使用 STM32F103C8 中的 ADC 读取模拟电压,我们将一个电位器连接到 STM32 Blue Pill 板,通过改变电位器阻值为ADC提供不同的电压,将读取的电压显示在 1602 LCD 上。
在 STM32F103C8有 10 个通道、12 位 ADC,输入范围为 0V -3.3V。它将 0 到 3.3 伏之间的输入电压映射为 0 到 4095 之间的整数值。
这里的术语 10 通道意味着有 10 个 ADC 引脚可以用来测量模拟电压。术语 12 位表示ADC 的分辨率,表示000000000000-111111111111(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
STM32 中有 10 个ADC引脚,从 PA0 到 PB1。
LCD与STM32连接
1602 LCD根据上表进行连接。电路中有两个电位器,第一个用于分压器,用于改变电压并为 STM32 提供模拟输入。该电位器的左侧引脚从 STM32(3.3V)获得输入正电压,右侧引脚接地,电位器的中心引脚连接到 STM32 的模拟输入引脚(PA7)。另一个电位器用于改变 LCD 显示屏的对比度。STM32 的电源由 PC的 USB 电源提供。
通过 STM32 的 USB 端口将其连接到 PC 并开始使用 ARDUINO IDE 进行编程。在程序中,读取模拟值并使用该值计算电压,然后在 LCD 屏幕上显示模拟值和数字值。
#include // LCD 库
//首先 定义出 LCD 引脚。这些定义了 LCD 引脚连接到 STM32 的哪个引脚。
//你可以根据自己的需求进行修改。
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //初始化LCD
const int analogip = PA7;//模拟输入引脚
void setup()
{
lcd.begin(16, 2); //我们使用的是 16*2 LCD
lcd.clear(); //清屏
lcd.setCursor(0, 0); //设置光标在第一行第一列
lcd.print("Hello Wrold!"); //LCD显示这个
lcd.setCursor(0, 1); //设置光标在第二行第一列
lcd.print("STM32F103C8"); //LCD显示这个
delay(2000);//等待两秒
lcd.clear(); //清屏
lcd.setCursor(0, 0); //设置光标在第一行第一列
lcd.print("USING ADC IN");//打印这个
lcd.setCursor(0,1); //设置光标在第二行第一列
lcd.print("STM32F103C8");//打印这个
delay(2000); //等待两秒
lcd.clear(); //清屏
}
void loop()
{
int val = analogRead(PA7); // 从引脚 A7 读取 ADC 值
float voltage = (float(val)/4096) * 3.3; //将 ADC 值转换为电压值
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(voltage);//显示电压
}
本文到此结束,错误之处欢迎指出。