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

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

[复制链接]
STMCU小助手 发布时间:2022-6-21 13:23
在之前的文章中,我们已经了解了使用 STM32 进行 ADC 转换。现在,我们将了解STM32 中的 PWM(脉冲宽度调制)以及如何使用 PWM 技术控制 LED 的亮度或直流风扇的速度。  F- J3 T4 K9 j/ Y1 p9 X4 _5 E

) n$ H* k* H, C, T+ _$ ?5 y( `我们知道有两种类型的电路信号:模拟和数字。模拟信号有3V、3.1V、2V...等电压信号,而数字信号只有1 和 0。
* `9 p8 y. n( f# S
5 E$ F. g7 k. }- y# i( V传感器输出的是模拟信号,这些模拟信号使用 ADC 转换为数字信号,因为微控制器只理解数字信号。处理完这些 ADC 值后,需要再次将输出转换为模拟形式以驱动模拟设备。为此,我们使用某些方法,如 PWM、数模 (DAC) 转换器等。0 [' n5 a3 w* e3 Q2 i2 w' F6 q
% ~( J- u0 s7 Y4 `  @
什么是 PWM(脉冲宽度调制)?(前面的文章也有相关介绍), M, u( O/ \6 z2 D1 o" G7 c
PWM可以让数字值控制模拟设备,例如控制电机的速度,LED的亮度等。我们知道电机和LED工作在模拟信号上。但是PWM不提供纯模拟输出,PWM看起来像是由短脉冲产生的模拟信号。
9 r0 F# Q% y. `
* g! r$ W$ q3 Q" M" r$ ZPWM 的占空比
$ D6 U, G* b. i- P, t/ I+ x
, k8 ?5 A' O: g/ }6 e( R8 @$ v4 `1 p0 WPWM 信号保持高电平(ON Time)的时间百分比称为占空比。如果信号始终打开,则占空比为 100%,如果始终关闭,则占空比为 0%。: I% P9 z! i8 W+ p8 P6 E
5 n& p) H! q3 g/ o
占空比 = ON Time /(ON Time + OFF Time)
4 d7 J' K# o: Q) c0 z+ G
& q5 o9 c3 o6 n 82c66cf9d0984c1e5cb2a23dce21d424.jpg
7 K0 b- ~4 h4 d2 l# ]( ?' m
) G9 u+ Y( u& L9 ?! C" P; v0 R/ j4 C7 O5 `' N
STM32中的PWM
$ {5 C9 U1 i8 [, bSTM32F103C8 有 15 个 PWM 引脚和 10 个 ADC 引脚。它具有 16 位 PWM 分辨率(2^16)。; v# Y) S6 J" M( P! P- o; B- {! X

0 D5 @6 P! r% J7 F: M5 L# L8 L所以 65535 的值为100% 占空比,平均电压=总电压;
+ J; ]% c0 m0 e) |2 F- o! Y  Z1 ?/ S/ U; S9 z
同样,32767 的值为50% 占空比,平均电压=50%总电压;
" V* f6 _# F: ^
4 @- I) K% `3 Y1 }, {; s& ]' y9 x4 w13107 的值为20% 占空比,平均电压=20%总电压。7 [) S. q' k( _' V: L' P
5 @( s2 `! x& @" ?
这里我们使用电位器和 STM32 通过 PWM 技术来改变 LED 的亮度和直流风扇的速度。1602 LCD用于显示 ADC 值 (0-4095) 和输出的PWM 值 (0-65535) 。
4 {  J: D4 I) P5 S& R  r
7 ~8 {6 k( R, ~' T直流风扇:这里使用的直流风扇是PC 的 BLDC 风扇。它需要额外提供电源,所以我们使用 9V 直流电池。/ o) R# R8 N& t; P" o* e
* ]: V0 a: P8 _, T: R
ULN2003电机驱动IC:用于单向驱动电机。下面是ULN2003的图片图:
$ O  L8 ~! i- I6 t7 k( q4 s0 ~' C/ k! C+ _. U. d( J2 ?
d5ba9aa8c3ef80657b2976a564be137d.jpg
! _: z5 M& P8 n. e9 ]4 [' H8 t# A5 s
$ i# j# D) i# Y0 d0 r引脚(IN1 到 IN7)是输入引脚,(OUT 1 到 OUT 7)是相应的输出引脚。COM 是负载的正极电压。! l- C9 Z- `) x' D8 x$ _

1 v* Q! D* {$ ]电位器:使用两个电位器,一个用于分压器,用于模拟输入到 ADC,另一个用于控制 LED 的亮度。) C- g' @* z$ k; y( w

/ p/ e, T# O- aSTM32的管脚细节, T7 P0 `$ ?( J# p( y

) L, z# J- \; B5 q5 S e834c186fc3d97d49ae20cada1317997.png   V3 q1 l9 L/ V

8 m! A: `- \. \我们可以看到 PWM 引脚以波浪线(~) 表示,有 15 个这样的引脚;有 10 个 ADC 引脚用于模拟输入,ADC 引脚以绿色标出。) i; @) L0 x# e6 e

9 }0 P) ~1 e! z2 g
' C* q, a+ U" ]- s* _电路图和连接- H- f: ^' U: a& l# w+ M6 R8 c' ~

4 v: b6 b! b/ D0 j  `& O9 `- u e78a348298f86f4b52525f02fc868fd8.png
* O& p  }9 A! U" }6 v) R
0 a7 w' m! X! M) T/ _. L: B0 _# j% U, R5 T2 p' K; @
STM32 与各种组件的连接说明如下:. k$ S& H! M2 {. s
3 L7 H' o6 x3 z. ?$ G" @0 l
> STM32的模拟(ADC)输入% V  L. j' A$ H2 K

* o' O" R- p8 K- R4 z5 `靠近ST32开发板的电位器的中心引脚连接到STM32 的ADC引脚(PA4),该电位器用来调节输入ADC的电压。5 y% x: U* T5 ]7 W9 U( w3 u

) F2 Z* s9 B8 o, V9 ?>STM32连接LED
- E8 S1 F: U. v4 F! _7 J  ?8 N  K" c3 m5 R( F- S
STM32 PWM 输出引脚(PA9)通过串联电阻连接到 LED 的正极引脚,LED并联一个电容。
/ B0 @1 h" u3 j, i+ u* I; f7 P/ o
. W8 ]  q$ h7 ?% g>STM32 连接ULN2003 和 ULN2003连接风扇* z3 [7 T8 ~1 M2 |
2 r) I3 h& L5 y" W2 g5 N
STM32 PWM 输出引脚(PA8)连接到 ULN2003 IC 的输入引脚(IN1),ULN2003 的相应输出引脚(OUT1)连接到 直流风扇的负极线。. |$ P5 C4 R+ i1 C! q7 R6 q9 ]
1 _2 r/ E7 |, G# V" m3 F
直流风扇的正极引脚连接到 ULN2003 IC 的 COM 引脚,外部电池(9V DC)也连接到 ULN2003 IC 的相同 COM 引脚。ULN2003 的GND、 STM32的GND、电池负极连接到电路相同的 GND。
2 f; @) c2 |' e" O5 ?4 {" d
- n- K3 o" P/ u! l( \>STM32 连接LCD (1602)
% E8 M% I9 i6 v4 L  j" i1 i
- B) G5 L& e+ r! i, I
01eec6bab568f2b6f6fcaa29a561ab21.jpg 3 ^7 S2 a# c! F" k
2 D- X) D3 m4 C( l% q% `" g0 g# ~1 @
>整体电路
! W; F0 {% O3 A8 ?( [" Y/ c

9 K$ c: G* W7 X3 }+ \1 A! t 0cbfb7258888659df2cd48d4a948cd85.png
' x0 e0 \& ~% C. S! U4 R2 b( R8 k* }
编程STM32

9 X" k. u7 s  K
  1. #include <LiquidCrystal.h> // LCD库. x) ^. n6 {' r6 w0 z7 D
  2. ' ^4 S7 u& y& G% v0 `. F) |2 n6 b. v$ x6 X
  3. //声明LCD连接到STM32的哪个引脚( S  g9 Z3 }  y5 L4 j& u
  4. const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;0 r4 V7 A4 X2 O
  5. LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //初始化 LCD
    7 D0 _4 {% F5 Z" p- p8 W3 L
  6. const int analoginput = PA4; //电位器输入' F( }  @& ]* d; I# }+ X5 K
  7. const int led = PA9; // LED PWM输出" i7 g+ h- n; X
  8. const int fan = PA8; // 风扇 输出
    ! r9 }! M! Q4 R$ ~
  9. void setup()
    : t, n: a' t$ a" O; ]. q. _' ~: g
  10. {  j! R) U/ d' X+ n
  11.   lcd.begin(16,2); //16*2LCD
    : J7 y1 `: N1 w- ]. C3 F* K
  12.   lcd.clear(); //LCD清屏) v0 P$ u: G5 u
  13.   lcd.setCursor(0,0); //将光标设置在第0行和第0列
    , J7 G' M7 K: v7 V3 O
  14.   lcd.print("Hello World");
    $ X0 |$ i: ?! ]
  15.   lcd.setCursor(0,1); //设置光标在第二行第一列# ]9 r6 K( s4 `/ w# C3 _
  16.   lcd.print("PWM USING STM32"); //LCD显示 PWM using STM32
    0 \; F" w/ [' o3 k, K& |% u
  17.   delay(2000); // 延时2秒
    6 Y7 Y4 D2 x  p2 v2 O
  18.   lcd.clear(); // LCD清屏
    * h6 b! T5 K9 i0 @
  19.   pinMode(analoginput, INPUT); // 设置为模拟输入
    - t* \4 S/ s8 y7 e* p
  20.   pinMode(led, PWM); // 设置为PWM输出 控制led  B; U  `% I( Y5 T' |+ W% b
  21.   pinMode(fan, PWM); // 设置为PWM输出 控制风扇" @, C3 i7 A" X1 R2 ~# P# Y; k3 }
  22. }
    ( D, ]! Y2 }3 b, X2 }6 Y# H4 W
  23. void loop()( }* X- A7 e9 x) L
  24. {# ]5 T: ]* a( G, v6 O$ a5 `
  25.   int valueadc = analogRead(analoginput); //从引脚 PA4 读取 ADC 值 (电位 器值)
    : Z+ f3 I8 G( R, g0 O
  26.   int result = map(valueadc, 0, 4095, 0, 65535); //把valueadc 从0-4095映射转为0-65535映射
    $ Y6 o4 ]9 |; q6 j" i. ^; Y0 [3 t/ l
  27.                                                    并存储到result中
    1 ]4 J" C% q% L) ?5 b& @

  28. : \* p/ _5 q% x8 ]# O0 ?$ o. m& ^) p
  29.   pwmWrite(led, result); //以PWM波控制LED
    2 q6 ~% q' }" [; L* h
  30.   pwmWrite(fan, result);& x5 r4 n0 \& o9 `/ B
  31.   lcd.setCursor(0,0); //设置光标位置
    - z/ W  R' i4 E
  32.   lcd.print("ADC value= "); // LCD 显示ADC value=9 Q$ s+ l$ O1 b5 L; P# l' `
  33.   lcd.print(valueadc); //显示电位器ADC值* q* T* p8 w3 f# r; l
  34.   lcd.setCursor(0,1); //设置光标位置
    8 ~- H' U2 M0 q: [; ^
  35.   lcd.print("Output = "); //LCD 显示Output =  K2 {7 K3 {! {0 O9 B
  36.   lcd.print(result); //显示电位器映射0-65535的值
    # w9 U" |* R6 n3 h
  37. }
    ! J2 M7 m2 l6 _; i2 q- W4 r- H
  38. $ ^8 _, s' T, W/ c0 [
复制代码

, H9 e8 o$ [4 q3 j  I4 E4 F4 H3 i8 C$ s& u/ I/ e
收藏 评论0 发布时间:2022-6-21 13:23

举报

0个回答

所属标签

相似分享

官网相关资源

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