你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】如何在 STM32F103C8 中使用 ADC 测量模拟电压

[复制链接]
STMCU小助手 发布时间:2022-6-21 17:29
几乎每个嵌入式应用程序中都使用的一个常见功能是 ADC 模块(模数转换器)。这些模数转换器可以从温度传感器、倾斜传感器、电流传感器、弯曲传感器等模拟传感器读取电压。现在,我们学习 如何使用 STM32F103C8 中的 ADC 读取模拟电压,我们将一个电位器连接到 STM32 Blue Pill 板,通过改变电位器阻值为ADC提供不同的电压,将读取的电压显示在 1602 LCD 上。

STM32F103C8 中的 ADC
在 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

STM32F103C8T6 中的 ADC 引脚
STM32 中有 10 个ADC引脚,从 PA0 到 PB1。

5bacced2a07b3cae565f403fbaf3978b.png

电路图及说明

OK)XBPQK{JM8PFC]ZX{C92J.png


LCD与STM32连接

b3339a1fa6cd99e996361c5f10c88a70.jpg

1602 LCD根据上表进行连接。电路中有两个电位器,第一个用于分压器,用于改变电压并为 STM32 提供模拟输入。该电位器的左侧引脚从 STM32(3.3V)获得输入正电压,右侧引脚接地,电位器的中心引脚连接到 STM32 的模拟输入引脚(PA7)。另一个电位器用于改变 LCD 显示屏的对比度。STM32 的电源由 PC的 USB 电源提供。

1b91528c72183f06a4554701366ba6de.png

对 STM32 进行编程以读取 ADC 值
通过 STM32 的 USB 端口将其连接到 PC 并开始使用 ARDUINO IDE 进行编程。在程序中,读取模拟值并使用该值计算电压,然后在 LCD 屏幕上显示模拟值和数字值。

  1. #include <LiquidCrystal.h> // LCD 库
  2. //首先 定义出 LCD 引脚。这些定义了 LCD 引脚连接到 STM32 的哪个引脚。
  3. //你可以根据自己的需求进行修改。
  4. const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
  5. LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //初始化LCD
  6. const int analogip = PA7;//模拟输入引脚
  7. void setup()
  8. {
  9.     lcd.begin(16, 2); //我们使用的是 16*2 LCD
  10.     lcd.clear(); //清屏
  11.     lcd.setCursor(0, 0); //设置光标在第一行第一列
  12.     lcd.print("Hello Wrold!"); //LCD显示这个
  13.     lcd.setCursor(0, 1); //设置光标在第二行第一列
  14.     lcd.print("STM32F103C8"); //LCD显示这个
  15.     delay(2000);//等待两秒
  16.     lcd.clear(); //清屏
  17.     lcd.setCursor(0, 0); //设置光标在第一行第一列
  18.     lcd.print("USING ADC IN");//打印这个
  19.     lcd.setCursor(0,1); //设置光标在第二行第一列
  20.     lcd.print("STM32F103C8");//打印这个
  21.     delay(2000); //等待两秒
  22.     lcd.clear(); //清屏
  23. }

  24. void loop()
  25. {
  26.     int val = analogRead(PA7); // 从引脚 A7 读取 ADC 值
  27.     float voltage = (float(val)/4096) * 3.3; //将 ADC 值转换为电压值
  28.     lcd.setCursor(0, 0); // 将光标设置到第 0 列第 0 行
  29.     lcd.print("ADC Val:");
  30.     lcd.print(val); //显示ADC值
  31.     lcd.setCursor(0, 1); // 将光标设置到第 0 列第 1 行
  32.     lcd.print("Voltage:");
  33.     lcd.print(voltage);//显示电压


复制代码

收藏 评论0 发布时间:2022-6-21 17:29

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版