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

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

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

5 G# y8 q* W7 b$ GSTM32F103C8 中的 ADC
& |2 w$ _  P; K5 P0 R0 N/ [在 STM32F103C8有 10 个通道、12 位 ADC,输入范围为 0V -3.3V。它将 0 到 3.3 伏之间的输入电压映射为 0 到 4095 之间的整数值。
. ~% l+ D( Q: P+ I' ^0 l5 r8 ]' Q( q+ T1 y5 W) t* z
这里的术语 10 通道意味着有 10 个 ADC 引脚可以用来测量模拟电压。术语 12 位表示ADC 的分辨率,表示000000000000-111111111111(2^12即 4096)。这是我们 ADC 的采样步数,因此我们的 ADC 值的范围从 0 到 4095。该值将从 0 增加到4095基于每步电压值,可通过方面方式计算+ i9 B% O% v4 p$ B; b! e4 H# G, V
5 G& q. i& b- {
电压 / 步数 = 参考电压 / 4096 = (3.3/4096= 8.056mV) 每单位。, `4 i! t' Z0 P7 Z$ }; d9 v- s

+ O; H' d8 q" j3 Z  O4 F模拟信号如何转换为数字格式
8 |: {. L8 G! l) j8 P% K5 A由于计算机仅存储和处理二进制/数字值(1 和 0)。因此,模拟信号(如传感器的伏特输出)必须转换为数字值以进行处理,并且转换需要准确。当在模拟输入端向 STM32 提供输入模拟电压时,模拟值被读取并存储在整数变量中. 使用以下方式将存储的模拟值(0-3.3V)转换为整数值(0-4096):
! Q* o2 y0 ^8 {5 R/ ^6 }- G! E5 @$ g& m$ a& v+ Z3 g. F( C
输入电压 = (ADC 值 / ADC 分辨率) * 参考电压
  y* z( L  e9 @% m2 l* I7 [  R5 U9 J
分辨率 = 4096$ D$ j& `9 i7 J- ]/ w- ]2 j
: @, ?8 A. Y( J$ u
参考电压 = 3.3V2 m7 D+ [- j( G+ r+ x  s; J0 w

8 ]1 r) q1 e) F. Q2 u$ z  q: kSTM32F103C8T6 中的 ADC 引脚( @# s/ \* E$ {4 W$ @
STM32 中有 10 个ADC引脚,从 PA0 到 PB1。1 s) @* Y$ e5 M+ Y
# A4 s  j3 d% E6 r+ _) F3 M
5bacced2a07b3cae565f403fbaf3978b.png 7 q" U7 B7 A0 _5 {

. N3 x5 w0 z7 q& P电路图及说明
, I, N6 b) b$ X0 n, b7 J; ~6 Y7 Z/ ]
$ C8 X) Q. y8 @0 B OK)XBPQK{JM8PFC]ZX{C92J.png
* Q3 b- z9 }" N# u8 h  c4 d" T1 l* k' Z
/ g" k, J5 H7 Q% V. }
LCD与STM32连接+ w" b* L" C8 N% h5 L
$ D& |; I8 Y+ B( V9 F/ i; g) g* w; ?4 O
b3339a1fa6cd99e996361c5f10c88a70.jpg
$ o4 L, H5 \" q; n# ?9 u, b5 n1 ]0 N# Y
1602 LCD根据上表进行连接。电路中有两个电位器,第一个用于分压器,用于改变电压并为 STM32 提供模拟输入。该电位器的左侧引脚从 STM32(3.3V)获得输入正电压,右侧引脚接地,电位器的中心引脚连接到 STM32 的模拟输入引脚(PA7)。另一个电位器用于改变 LCD 显示屏的对比度。STM32 的电源由 PC的 USB 电源提供。+ k  y( o+ _) h& `& N

3 a5 \  d3 P( N  J 1b91528c72183f06a4554701366ba6de.png
2 A: C  p4 _# H- q! x: {& @& @+ j8 C; }
对 STM32 进行编程以读取 ADC 值& x7 f# p. Z; ?% L& _' v8 t
通过 STM32 的 USB 端口将其连接到 PC 并开始使用 ARDUINO IDE 进行编程。在程序中,读取模拟值并使用该值计算电压,然后在 LCD 屏幕上显示模拟值和数字值。6 R3 u6 U2 d. K7 V- I+ g9 @1 U
, ^$ O( a. N3 w5 O$ G. R$ c8 V
  1. #include <LiquidCrystal.h> // LCD 库
    ) ]) r$ J5 V. W$ Z
  2. //首先 定义出 LCD 引脚。这些定义了 LCD 引脚连接到 STM32 的哪个引脚。) K  g1 S- e0 a1 q/ ?1 K# r
  3. //你可以根据自己的需求进行修改。: b9 Q" ?3 K7 m
  4. const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
    / X: A* n- `% i* _
  5. LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //初始化LCD5 B  ~# l  E  e* l* {- `6 C
  6. const int analogip = PA7;//模拟输入引脚
    ; ]- f, x9 a$ S$ B$ ~: H: m
  7. void setup()
    9 y7 m% k* M  L
  8. {+ y9 J1 }& @: V% U2 L9 _4 T) U
  9.     lcd.begin(16, 2); //我们使用的是 16*2 LCD8 v0 `- _9 [* E7 q: W1 X4 i
  10.     lcd.clear(); //清屏
    . X* q2 {1 E" T+ `* v! d
  11.     lcd.setCursor(0, 0); //设置光标在第一行第一列
    ) j, g5 G' w3 I8 A
  12.     lcd.print("Hello Wrold!"); //LCD显示这个, A+ R( D. h4 v; k. x
  13.     lcd.setCursor(0, 1); //设置光标在第二行第一列
    ! F6 ^5 Q  x) @& N& j% r5 e
  14.     lcd.print("STM32F103C8"); //LCD显示这个; Y: P& h1 W# X7 O
  15.     delay(2000);//等待两秒% g! B! ~" E$ n* _
  16.     lcd.clear(); //清屏! A* ]; f* \+ O. u7 o
  17.     lcd.setCursor(0, 0); //设置光标在第一行第一列! \# o/ v# l, V, d
  18.     lcd.print("USING ADC IN");//打印这个" l6 L* c& u+ r3 l8 X
  19.     lcd.setCursor(0,1); //设置光标在第二行第一列5 f6 x( F' j- [
  20.     lcd.print("STM32F103C8");//打印这个. }) v1 u2 _  V& N
  21.     delay(2000); //等待两秒9 \- B( k% U) ^# B: U: \; K2 h
  22.     lcd.clear(); //清屏- C' p$ a+ \1 a" J
  23. }! L# F. M- h- U+ F! O( M

  24. 8 d- c6 ~! y  R; |9 k% \; N
  25. void loop()* P& ]6 ]) J, b" C- m
  26. {
    . r% J' j3 I, @9 S6 m
  27.     int val = analogRead(PA7); // 从引脚 A7 读取 ADC 值
    / v: [$ B7 n" k: Z$ Q# _7 ]
  28.     float voltage = (float(val)/4096) * 3.3; //将 ADC 值转换为电压值
    - `. `7 F) s$ o' }
  29.     lcd.setCursor(0, 0); // 将光标设置到第 0 列第 0 行: o4 \2 `$ t' Z/ f4 z0 }
  30.     lcd.print("ADC Val:");
    . k1 O" n3 t0 z) V4 c$ S
  31.     lcd.print(val); //显示ADC值
    ' _% ]: q! {5 k8 h; I9 R) W
  32.     lcd.setCursor(0, 1); // 将光标设置到第 0 列第 1 行
    % z8 X% t$ i2 c' h* k2 ?$ t
  33.     lcd.print("Voltage:");
    / \: R) N) N7 r  d
  34.     lcd.print(voltage);//显示电压
    1 n7 @0 f) f. Z* S# E
  35. $ j# ^, W3 P5 a- D4 X8 l8 e0 w6 ^

  36. ) o9 s% i5 z+ Q5 X+ D( G# u- G
复制代码

0 `; J) ~( `7 A  r; w
收藏 评论0 发布时间:2022-6-21 17:29

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版