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

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

[复制链接]
STMCU小助手 发布时间:2022-6-21 17:29
几乎每个嵌入式应用程序中都使用的一个常见功能是 ADC 模块(模数转换器)。这些模数转换器可以从温度传感器、倾斜传感器、电流传感器、弯曲传感器等模拟传感器读取电压。现在,我们学习 如何使用 STM32F103C8 中的 ADC 读取模拟电压,我们将一个电位器连接到 STM32 Blue Pill 板,通过改变电位器阻值为ADC提供不同的电压,将读取的电压显示在 1602 LCD 上。
3 e/ S4 ^, W: h3 Y% W3 L6 ~% d. w) B# K! v$ S
STM32F103C8 中的 ADC' G3 k1 I) Z* X8 ]# {
在 STM32F103C8有 10 个通道、12 位 ADC,输入范围为 0V -3.3V。它将 0 到 3.3 伏之间的输入电压映射为 0 到 4095 之间的整数值。2 a2 |: K) u6 s4 t& j& w9 W4 i

" i4 N1 Q; M" {- ]  ^# s; t这里的术语 10 通道意味着有 10 个 ADC 引脚可以用来测量模拟电压。术语 12 位表示ADC 的分辨率,表示000000000000-111111111111(2^12即 4096)。这是我们 ADC 的采样步数,因此我们的 ADC 值的范围从 0 到 4095。该值将从 0 增加到4095基于每步电压值,可通过方面方式计算
% U! \7 Z- W8 T+ W% ?
9 _7 A2 H/ u- t! W& B3 Q0 n$ Q电压 / 步数 = 参考电压 / 4096 = (3.3/4096= 8.056mV) 每单位。
* r2 O4 @7 ]3 N$ X
& A# }5 N: h' n# d: f模拟信号如何转换为数字格式
2 }1 r2 I) w! a+ \: J$ R& t由于计算机仅存储和处理二进制/数字值(1 和 0)。因此,模拟信号(如传感器的伏特输出)必须转换为数字值以进行处理,并且转换需要准确。当在模拟输入端向 STM32 提供输入模拟电压时,模拟值被读取并存储在整数变量中. 使用以下方式将存储的模拟值(0-3.3V)转换为整数值(0-4096):" Q  Q: m% H4 X! F2 o, e
1 J0 E9 z4 z0 F1 H
输入电压 = (ADC 值 / ADC 分辨率) * 参考电压
& ~7 a* J4 t  K. x  B* o* y9 O. O
分辨率 = 4096$ _5 k7 l& p' K: k: \  @& O

' E- F+ d' c8 o5 A& Z4 i参考电压 = 3.3V" I3 h1 ^3 q+ n5 f

8 A- K3 ?: b' D2 VSTM32F103C8T6 中的 ADC 引脚# N: \8 L9 t* K
STM32 中有 10 个ADC引脚,从 PA0 到 PB1。9 e; g; O5 |6 b0 K& ^) y. Y
" k- W* f: C% H
5bacced2a07b3cae565f403fbaf3978b.png
' v. v4 c( O1 Y0 D5 p- A9 i$ F$ y
" G8 b( y' j" x1 b& b电路图及说明
. Y3 J: w3 ]- l/ d/ E0 g2 z+ X2 m; Q, j% d5 k! I
OK)XBPQK{JM8PFC]ZX{C92J.png 3 K) N6 q1 e% u! m9 S" n  r

% t/ g0 l9 x( U! R4 G0 @# u
' u" H, M7 G7 b; m! }; d( S- OLCD与STM32连接. _% X5 \) J! @- D
5 c; _1 ^& T2 p# \- F5 J+ w! B8 I
b3339a1fa6cd99e996361c5f10c88a70.jpg
3 e; ?' g7 U0 J0 ~0 L  U/ D+ {$ l3 y% R+ F* L7 K, I4 N7 [2 V% k
1602 LCD根据上表进行连接。电路中有两个电位器,第一个用于分压器,用于改变电压并为 STM32 提供模拟输入。该电位器的左侧引脚从 STM32(3.3V)获得输入正电压,右侧引脚接地,电位器的中心引脚连接到 STM32 的模拟输入引脚(PA7)。另一个电位器用于改变 LCD 显示屏的对比度。STM32 的电源由 PC的 USB 电源提供。4 ]2 _+ Z' R7 F/ {
2 h, a" _4 Q2 D" y! ~
1b91528c72183f06a4554701366ba6de.png , i9 _4 m, H. |! e
: \% u. U. a) z  T3 M) a! C  P- V
对 STM32 进行编程以读取 ADC 值9 N7 Y& K5 q) r0 X6 \+ b/ A; g
通过 STM32 的 USB 端口将其连接到 PC 并开始使用 ARDUINO IDE 进行编程。在程序中,读取模拟值并使用该值计算电压,然后在 LCD 屏幕上显示模拟值和数字值。
2 A( a2 {6 O; I! y! ?: T( M* y
% N) x6 g  y- R, b8 F' [- P% u
  1. #include <LiquidCrystal.h> // LCD 库
    ! Z# x& B- ~7 D
  2. //首先 定义出 LCD 引脚。这些定义了 LCD 引脚连接到 STM32 的哪个引脚。
    - k1 X8 v8 _3 Y
  3. //你可以根据自己的需求进行修改。+ z! R4 ^1 f' o" X
  4. const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;7 C; ~/ Q+ N% G; H, u
  5. LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //初始化LCD
    5 q" E# p9 ^$ Y4 t  v8 V7 W
  6. const int analogip = PA7;//模拟输入引脚
    $ Z2 d" ]; d5 u5 F* C* ^' V0 b8 L6 o
  7. void setup()
      a3 |. x' X% X8 l/ M9 U
  8. {
    8 z) ?0 L  t( T& s' W1 F2 S
  9.     lcd.begin(16, 2); //我们使用的是 16*2 LCD
      J9 k$ B. ?" N2 L) |3 D0 T
  10.     lcd.clear(); //清屏
    - e+ g- b. h& W: T6 }, U/ A/ V
  11.     lcd.setCursor(0, 0); //设置光标在第一行第一列
    9 A. p6 L  f& |: Y& P1 V+ }3 ^7 X
  12.     lcd.print("Hello Wrold!"); //LCD显示这个
    " g1 m% q1 s9 F4 E: s8 [5 k7 o
  13.     lcd.setCursor(0, 1); //设置光标在第二行第一列
    + F  y* Z7 ]8 \" D
  14.     lcd.print("STM32F103C8"); //LCD显示这个9 c  ~7 ~0 }: Z  E9 D) i) S/ o- N
  15.     delay(2000);//等待两秒4 @2 A8 X* q/ Z3 p. ?9 s
  16.     lcd.clear(); //清屏9 @$ _7 F3 t: J" h0 I
  17.     lcd.setCursor(0, 0); //设置光标在第一行第一列
    , T  l3 H; G4 d
  18.     lcd.print("USING ADC IN");//打印这个( \* A# H& a4 r+ m
  19.     lcd.setCursor(0,1); //设置光标在第二行第一列
    8 g% h7 S- y. A1 C, ?
  20.     lcd.print("STM32F103C8");//打印这个
    9 I4 Z0 H) _$ d; }# l; w) S
  21.     delay(2000); //等待两秒
    : ]7 m0 X) q( ^1 N
  22.     lcd.clear(); //清屏6 M0 h+ T: W! \6 Z& Q
  23. }/ I9 T5 M! V& @$ n4 f- q
  24. % Y" c7 H' I! ~
  25. void loop()
    1 T. w/ a, V* t' N: _; k8 A
  26. {& a" `' Y, y0 T+ Y
  27.     int val = analogRead(PA7); // 从引脚 A7 读取 ADC 值
    2 h' g0 f, c1 }% e
  28.     float voltage = (float(val)/4096) * 3.3; //将 ADC 值转换为电压值
    " y0 o! \; ^. o/ F0 I
  29.     lcd.setCursor(0, 0); // 将光标设置到第 0 列第 0 行: t+ b2 s* s" f
  30.     lcd.print("ADC Val:");
    % b- E& u+ w& \8 O. k9 U/ [
  31.     lcd.print(val); //显示ADC值
    . I, p6 F  I* M1 I7 [5 T+ Y1 D
  32.     lcd.setCursor(0, 1); // 将光标设置到第 0 列第 1 行
    ! P9 ^$ ~5 _( `2 J
  33.     lcd.print("Voltage:");
    * n; z& {8 Y# \7 r
  34.     lcd.print(voltage);//显示电压
    ! Q3 R, o, M1 J- C; \

  35. # S- R  ]4 u/ }
  36. 1 C0 n$ }$ }: F8 P( [; v
复制代码
! q- ~; d' f; m8 H$ S' p; D
收藏 评论0 发布时间:2022-6-21 17:29

举报

0个回答

所属标签

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版