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

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

[复制链接]
STMCU小助手 发布时间:2022-6-21 17:29
几乎每个嵌入式应用程序中都使用的一个常见功能是 ADC 模块(模数转换器)。这些模数转换器可以从温度传感器、倾斜传感器、电流传感器、弯曲传感器等模拟传感器读取电压。现在,我们学习 如何使用 STM32F103C8 中的 ADC 读取模拟电压,我们将一个电位器连接到 STM32 Blue Pill 板,通过改变电位器阻值为ADC提供不同的电压,将读取的电压显示在 1602 LCD 上。
, ]8 E3 m& Q  K+ ~) i
2 Z" ]; O; B! ~# V* gSTM32F103C8 中的 ADC
7 [2 {! }# B! r& z在 STM32F103C8有 10 个通道、12 位 ADC,输入范围为 0V -3.3V。它将 0 到 3.3 伏之间的输入电压映射为 0 到 4095 之间的整数值。8 V9 x) v0 N% \; P9 W+ Z
7 K) u7 y& h0 b$ B9 \2 e; u
这里的术语 10 通道意味着有 10 个 ADC 引脚可以用来测量模拟电压。术语 12 位表示ADC 的分辨率,表示000000000000-111111111111(2^12即 4096)。这是我们 ADC 的采样步数,因此我们的 ADC 值的范围从 0 到 4095。该值将从 0 增加到4095基于每步电压值,可通过方面方式计算
& o5 R5 h+ ?% L  q! W9 h! @, Z- _! l6 `  @
电压 / 步数 = 参考电压 / 4096 = (3.3/4096= 8.056mV) 每单位。
7 H7 b* S, N6 \. ?# J( q0 ^
0 d3 E; E2 C  w" G7 z模拟信号如何转换为数字格式) c, |7 m# s- h6 l
由于计算机仅存储和处理二进制/数字值(1 和 0)。因此,模拟信号(如传感器的伏特输出)必须转换为数字值以进行处理,并且转换需要准确。当在模拟输入端向 STM32 提供输入模拟电压时,模拟值被读取并存储在整数变量中. 使用以下方式将存储的模拟值(0-3.3V)转换为整数值(0-4096):
; v7 C. ?7 Z! Y# s, v+ V) n; R. L5 k# M
输入电压 = (ADC 值 / ADC 分辨率) * 参考电压/ u+ y; n9 H, R& x) w5 U) S

5 y1 g( p- [2 ^# i2 w5 l分辨率 = 4096
; l9 d% x9 C1 q1 E9 u
% o4 m6 g/ [: h. r5 P8 D2 E参考电压 = 3.3V' K  f' |( E7 G% R
( k; M  ?' ]0 z5 W& b. D2 l
STM32F103C8T6 中的 ADC 引脚
4 S- g: z) I- o) PSTM32 中有 10 个ADC引脚,从 PA0 到 PB1。
) D$ M2 o& T2 f" C; W; T9 Q0 ~: V7 u" A
5bacced2a07b3cae565f403fbaf3978b.png 8 i& a1 i" T, W8 V) F
8 m3 s6 O- r% D4 O  u
电路图及说明
- d( g: K5 c- S' R; U
% f& n+ Z2 h+ ? OK)XBPQK{JM8PFC]ZX{C92J.png
9 G3 @! ]  ^$ M1 E+ u0 U& B$ D% L' m

/ L6 K8 b; z  S% _LCD与STM32连接0 a. f) m3 w7 A4 s! @+ i$ @

5 n! c: D) Y& Y5 P. H+ w b3339a1fa6cd99e996361c5f10c88a70.jpg
+ P5 y4 K6 L) z; [  L- S( M" O2 i. ~" @! S+ w# Y  E) V4 h9 F
1602 LCD根据上表进行连接。电路中有两个电位器,第一个用于分压器,用于改变电压并为 STM32 提供模拟输入。该电位器的左侧引脚从 STM32(3.3V)获得输入正电压,右侧引脚接地,电位器的中心引脚连接到 STM32 的模拟输入引脚(PA7)。另一个电位器用于改变 LCD 显示屏的对比度。STM32 的电源由 PC的 USB 电源提供。
& o/ D" B) n4 ^( B1 |6 i& T; K; X+ T" I6 `, B
1b91528c72183f06a4554701366ba6de.png
% A- I$ P0 @+ s1 ~6 @9 f" K4 G
# I, ?! D* F) A1 D3 h对 STM32 进行编程以读取 ADC 值# f; k( |' `/ J# I0 ^
通过 STM32 的 USB 端口将其连接到 PC 并开始使用 ARDUINO IDE 进行编程。在程序中,读取模拟值并使用该值计算电压,然后在 LCD 屏幕上显示模拟值和数字值。
9 z& k) }7 }6 s3 R+ z6 e# @) A# x$ L$ z: u8 ?+ D4 V
  1. #include <LiquidCrystal.h> // LCD 库3 k$ F$ X* T3 R' ^0 D, n$ V( G
  2. //首先 定义出 LCD 引脚。这些定义了 LCD 引脚连接到 STM32 的哪个引脚。5 r+ g& k8 S% H9 z1 Q+ K5 s
  3. //你可以根据自己的需求进行修改。
    ' Y' f/ b% ^" H0 ?
  4. const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
    ) Z, ^, v. X/ S" e
  5. LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //初始化LCD
    ! H1 _" K6 ^0 d
  6. const int analogip = PA7;//模拟输入引脚* @9 T$ Y1 k( f- u4 ?9 f
  7. void setup()0 f1 A8 ]$ B7 C, N/ w9 p
  8. {# n: ^/ T3 W8 ]; C/ \/ c# k5 A& P
  9.     lcd.begin(16, 2); //我们使用的是 16*2 LCD% F0 X' F3 G0 f$ |; N
  10.     lcd.clear(); //清屏. H8 S8 _  t. q9 o/ O! ]; {
  11.     lcd.setCursor(0, 0); //设置光标在第一行第一列% j- x7 x8 V* Y. b1 n
  12.     lcd.print("Hello Wrold!"); //LCD显示这个2 \( ]- H# m8 I. Z
  13.     lcd.setCursor(0, 1); //设置光标在第二行第一列0 m! S! J; s" k  J
  14.     lcd.print("STM32F103C8"); //LCD显示这个
    / m* h" v3 J% ?
  15.     delay(2000);//等待两秒
    * u- k) f% e2 R9 M" E
  16.     lcd.clear(); //清屏0 p* N$ ~6 `* e
  17.     lcd.setCursor(0, 0); //设置光标在第一行第一列
    # T3 D/ V. A4 E2 v
  18.     lcd.print("USING ADC IN");//打印这个9 p) [& o$ ?- w
  19.     lcd.setCursor(0,1); //设置光标在第二行第一列
    : x; z9 k+ w9 P- G1 v
  20.     lcd.print("STM32F103C8");//打印这个
    1 z  f$ {8 |1 o+ `" Y; ?7 D
  21.     delay(2000); //等待两秒
    ( w6 s1 I$ V) M6 U9 s8 x; B
  22.     lcd.clear(); //清屏
    - B  ]! V) y5 @  g9 }! j' i' `
  23. }5 t6 |! e" U6 }- N9 o. ^

  24. 2 F5 r1 M0 A$ c
  25. void loop()
    5 y1 h2 k2 V6 y, d
  26. {" ^* T0 S/ k9 ?  u
  27.     int val = analogRead(PA7); // 从引脚 A7 读取 ADC 值: e1 H& k! a9 w" d  B) J
  28.     float voltage = (float(val)/4096) * 3.3; //将 ADC 值转换为电压值
    6 H- O4 M1 G" ~5 v
  29.     lcd.setCursor(0, 0); // 将光标设置到第 0 列第 0 行
    5 Y9 ~3 z; ?; V9 g- g+ @/ x
  30.     lcd.print("ADC Val:");
    8 E! q3 V5 e; X1 h, Y1 i8 u
  31.     lcd.print(val); //显示ADC值
    , n- I# [! Z  ]# U/ I
  32.     lcd.setCursor(0, 1); // 将光标设置到第 0 列第 1 行% g# ]3 N% F4 f
  33.     lcd.print("Voltage:");" K7 o$ u$ r3 a5 v1 ^( r
  34.     lcd.print(voltage);//显示电压
    5 a5 ^% I; M2 I8 z# Z6 J0 G

  35. * E: l) y. _  Z5 y
  36. 0 X2 |) |, _2 Z( T8 a4 x
复制代码
/ ^& n) n3 ~5 s# g
赞 收藏 评论0 发布时间:2022-6-21 17:29

举报

0个回答

所属标签

相似技术帖

官网相关资源

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