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

【经验分享】STM32 脉宽调制 (PWM):控制直流风扇的速度

[复制链接]
STMCU小助手 发布时间:2022-6-21 13:23
在之前的文章中,我们已经了解了使用 STM32 进行 ADC 转换。现在,我们将了解STM32 中的 PWM(脉冲宽度调制)以及如何使用 PWM 技术控制 LED 的亮度或直流风扇的速度。
$ w0 m+ w/ p5 N) O6 k/ Q) S
0 ]' B! C" R3 v* k( U% r我们知道有两种类型的电路信号:模拟和数字。模拟信号有3V、3.1V、2V...等电压信号,而数字信号只有1 和 0。6 q7 e$ K  n1 d. _* g

; q/ h6 w: p, K; T传感器输出的是模拟信号,这些模拟信号使用 ADC 转换为数字信号,因为微控制器只理解数字信号。处理完这些 ADC 值后,需要再次将输出转换为模拟形式以驱动模拟设备。为此,我们使用某些方法,如 PWM、数模 (DAC) 转换器等。
$ }& B2 H9 l3 j+ h5 D: c5 h: ?/ \. y9 s# x
什么是 PWM(脉冲宽度调制)?(前面的文章也有相关介绍)
% n8 c3 _) q# g, X' oPWM可以让数字值控制模拟设备,例如控制电机的速度,LED的亮度等。我们知道电机和LED工作在模拟信号上。但是PWM不提供纯模拟输出,PWM看起来像是由短脉冲产生的模拟信号。, C5 ^- P* q5 \  Q$ n
$ J5 C& ?  F+ X
PWM 的占空比
. S- f5 E  ]' I% Y! L
5 j4 T% f+ i. E3 PPWM 信号保持高电平(ON Time)的时间百分比称为占空比。如果信号始终打开,则占空比为 100%,如果始终关闭,则占空比为 0%。
  v* [2 v3 |/ J* k: |3 t- u' p0 S" Z* `6 H& H/ O
占空比 = ON Time /(ON Time + OFF Time): k# a  i: a6 s5 x, k* R- {" L
3 f! T+ w; A! k) N2 Z8 u+ v3 Y) @
82c66cf9d0984c1e5cb2a23dce21d424.jpg
+ G' u, y9 f$ x5 m  l  n  n$ A+ D: `$ P0 ?" ]" o3 A6 Z
0 c4 j  C/ r% M: q9 P7 @5 r8 W! w* S
STM32中的PWM; n6 l. f& R$ H: H2 ~
STM32F103C8 有 15 个 PWM 引脚和 10 个 ADC 引脚。它具有 16 位 PWM 分辨率(2^16)。& z7 Q- V7 g4 s0 }" X/ l
3 A0 \3 f1 [& ], S
所以 65535 的值为100% 占空比,平均电压=总电压;8 d. E% [1 E0 u0 v* N3 j$ T; H3 g

- G' {+ M; G! l( k4 x( U同样,32767 的值为50% 占空比,平均电压=50%总电压;
/ C8 C8 g6 J9 o- g0 @% W
# N2 n3 Q1 [8 Y: i3 j$ w) v13107 的值为20% 占空比,平均电压=20%总电压。
8 A& ]3 b- n  R; U  ]1 n2 j6 I& \, b
这里我们使用电位器和 STM32 通过 PWM 技术来改变 LED 的亮度和直流风扇的速度。1602 LCD用于显示 ADC 值 (0-4095) 和输出的PWM 值 (0-65535) 。4 |9 v5 Z( {: j, \& d" S

8 {4 o( S# a6 C% k7 Q2 i直流风扇:这里使用的直流风扇是PC 的 BLDC 风扇。它需要额外提供电源,所以我们使用 9V 直流电池。: _9 m) T- o$ j& m1 t
4 B- B( Q/ Z3 e$ F* f/ x- P; ~
ULN2003电机驱动IC:用于单向驱动电机。下面是ULN2003的图片图:
$ j. l% v# E1 a; c& N- \5 _9 W
1 I) \& E& _: U6 ?) `7 h d5ba9aa8c3ef80657b2976a564be137d.jpg 7 V8 x: c3 h+ F* i0 i* O5 i

( j9 ]8 q  u* Z" m! _) e5 M引脚(IN1 到 IN7)是输入引脚,(OUT 1 到 OUT 7)是相应的输出引脚。COM 是负载的正极电压。
2 x  j. [2 U: @% X
8 k: K7 P+ J9 n! P电位器:使用两个电位器,一个用于分压器,用于模拟输入到 ADC,另一个用于控制 LED 的亮度。. W$ |5 {/ E. I9 ^$ G) d
. `, G8 A- U% ^4 l
STM32的管脚细节: J8 a" [& U; c% ^: x! J# ?

' T6 J9 J& z$ W  J e834c186fc3d97d49ae20cada1317997.png
5 A. W4 C) ~8 z( b) w) [3 u* F1 s4 E/ M2 \8 O+ {
我们可以看到 PWM 引脚以波浪线(~) 表示,有 15 个这样的引脚;有 10 个 ADC 引脚用于模拟输入,ADC 引脚以绿色标出。# n' A" a: `4 s) c
) z+ E1 ?. w0 n4 M1 z4 Y- g

1 T% ?5 E2 O3 e( n电路图和连接
7 f: Y, |: I$ _' D8 J" @7 T: D/ e/ U$ x1 ~% ?; ~
e78a348298f86f4b52525f02fc868fd8.png
9 M3 r1 ]+ M% a1 w* P& m: R. R5 i$ e0 C2 y
5 C( P& d' z" K; X# m- Q3 a1 ^
STM32 与各种组件的连接说明如下:% @$ d; V* \# o- p0 _  R

/ _3 c' H9 Q3 G$ i+ f# b1 B> STM32的模拟(ADC)输入: X" D* C; |/ o5 }5 ~; q

5 s" a$ b* @; q" Q5 L, R) R$ ?- C靠近ST32开发板的电位器的中心引脚连接到STM32 的ADC引脚(PA4),该电位器用来调节输入ADC的电压。
  m) _) y1 a6 K2 @# Y' r$ ^
& o* o3 Z! i- |>STM32连接LED3 S1 o7 [& b- h
; {! q5 R/ g5 e; L8 \5 N' V
STM32 PWM 输出引脚(PA9)通过串联电阻连接到 LED 的正极引脚,LED并联一个电容。8 J7 w( o2 O% J6 B) B

/ p3 ~2 E4 z/ ^4 T1 s>STM32 连接ULN2003 和 ULN2003连接风扇
7 P2 K( z2 L3 B$ \: T: |4 F; r, X& ]; a$ b
STM32 PWM 输出引脚(PA8)连接到 ULN2003 IC 的输入引脚(IN1),ULN2003 的相应输出引脚(OUT1)连接到 直流风扇的负极线。
# q+ ?3 ~  k# s8 s1 l" a& B/ z' K  M
直流风扇的正极引脚连接到 ULN2003 IC 的 COM 引脚,外部电池(9V DC)也连接到 ULN2003 IC 的相同 COM 引脚。ULN2003 的GND、 STM32的GND、电池负极连接到电路相同的 GND。
$ p; N6 r1 `( X; N/ m, ?  N5 p$ M6 H2 M  J$ x3 R
>STM32 连接LCD (1602)
3 [9 Z+ P  g% J. q! W) g: e
. q! V& {- X) T0 w& R$ [, l- l9 S
01eec6bab568f2b6f6fcaa29a561ab21.jpg
! K+ |! T! E9 V# Y5 j2 a
) m/ \8 R2 H' C5 G0 w& u9 t>整体电路

; z9 h% }0 z. G; \" {: r8 W4 C! ^( p8 `% H, B& j7 D) L
0cbfb7258888659df2cd48d4a948cd85.png 5 C* f( E) T$ W3 N+ k4 ~

/ {+ i  g9 m, F编程STM32
2 ^0 t& |1 G" V( \# W. u
  1. #include <LiquidCrystal.h> // LCD库
    7 q/ k1 j( G8 \4 a7 T* B* @+ ~
  2. ( s; V+ j+ C0 `' S
  3. //声明LCD连接到STM32的哪个引脚# a- \4 c! ]$ t1 _6 v8 f- G
  4. const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
    ) ~4 N2 y) k/ b5 I8 `$ @
  5. LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //初始化 LCD
    " O& X" l" j* }6 k2 x; L' i
  6. const int analoginput = PA4; //电位器输入4 h4 \0 h4 [. T/ d
  7. const int led = PA9; // LED PWM输出
    7 W# I4 d/ L" U& h$ L
  8. const int fan = PA8; // 风扇 输出
    6 t! ]' @. z+ W4 k9 k2 J, d
  9. void setup(); Q# k9 E; v  g( v5 d
  10. {. f+ W8 t4 P! H& q& F
  11.   lcd.begin(16,2); //16*2LCD2 [% h8 U$ V: ^6 I) C
  12.   lcd.clear(); //LCD清屏( h* v: y& r% u! Y3 l  F
  13.   lcd.setCursor(0,0); //将光标设置在第0行和第0列9 T# j$ h9 J- |- _- J
  14.   lcd.print("Hello World");
    0 A5 K) T: V2 }9 B* W
  15.   lcd.setCursor(0,1); //设置光标在第二行第一列
    7 g3 F7 N! h* ?+ r- D- o
  16.   lcd.print("PWM USING STM32"); //LCD显示 PWM using STM32
    1 ?2 G" q) w* l
  17.   delay(2000); // 延时2秒
    " [: \) x4 ]4 b2 Y9 v4 s" z, s
  18.   lcd.clear(); // LCD清屏
    4 y4 v$ N8 E4 {  ~4 Q& R' j2 Q
  19.   pinMode(analoginput, INPUT); // 设置为模拟输入9 }/ J: W. |3 o& D9 k
  20.   pinMode(led, PWM); // 设置为PWM输出 控制led, p0 s  }2 F& }
  21.   pinMode(fan, PWM); // 设置为PWM输出 控制风扇$ {: j0 B7 P& }8 ?
  22. }( x0 U% {; U$ `# z2 t$ e
  23. void loop()0 C  G: R+ ~3 E: g
  24. {
    , O. @) H& ?4 Z( o
  25.   int valueadc = analogRead(analoginput); //从引脚 PA4 读取 ADC 值 (电位 器值)
    * X" O/ g4 I1 ~- q6 G  c9 W
  26.   int result = map(valueadc, 0, 4095, 0, 65535); //把valueadc 从0-4095映射转为0-65535映射 % O  D3 Q1 V* }- Z7 H& W
  27.                                                    并存储到result中! C+ `6 Y  H" l

  28. / C  K7 D& K) O- t. _; ^
  29.   pwmWrite(led, result); //以PWM波控制LED
    ( b, h1 R0 e6 m& C. x+ K# l
  30.   pwmWrite(fan, result);/ x  R. L, |5 l# O/ @/ e" v
  31.   lcd.setCursor(0,0); //设置光标位置( {8 g9 O& _3 ?" k- _( A2 d/ c/ n
  32.   lcd.print("ADC value= "); // LCD 显示ADC value=
    3 V: w; v. @1 i+ u& n: e
  33.   lcd.print(valueadc); //显示电位器ADC值
    4 T+ `4 b* q) ?6 B  P' A
  34.   lcd.setCursor(0,1); //设置光标位置' g2 C( G4 _( B3 D# @, J! i+ f5 c
  35.   lcd.print("Output = "); //LCD 显示Output =
    - J  x3 q5 I! V2 \; U1 Y
  36.   lcd.print(result); //显示电位器映射0-65535的值. x) E$ d4 n" x. E. {
  37. }+ x, K* y5 {- O& y: Z
  38. # k. {% ]0 L1 t# G$ u' q
复制代码
8 w0 r# H" G- d" U8 k7 H1 q

4 ?, D1 p! |" p0 _+ o
赞 收藏 评论0 发布时间:2022-6-21 13:23

举报

0个回答

所属标签

相似技术帖

官网相关资源

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