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

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

[复制链接]
STMCU小助手 发布时间:2022-6-21 13:23
在之前的文章中,我们已经了解了使用 STM32 进行 ADC 转换。现在,我们将了解STM32 中的 PWM(脉冲宽度调制)以及如何使用 PWM 技术控制 LED 的亮度或直流风扇的速度。( }% A9 X; o$ K$ l. K

( |6 j, {2 d2 f# e) r我们知道有两种类型的电路信号:模拟和数字。模拟信号有3V、3.1V、2V...等电压信号,而数字信号只有1 和 0。
# F6 V% r5 E/ H
& o8 U2 I- [$ ~. }) u1 x3 r' [传感器输出的是模拟信号,这些模拟信号使用 ADC 转换为数字信号,因为微控制器只理解数字信号。处理完这些 ADC 值后,需要再次将输出转换为模拟形式以驱动模拟设备。为此,我们使用某些方法,如 PWM、数模 (DAC) 转换器等。6 n0 c  n: B* W8 ?3 l! K0 b
$ V0 r6 ]! _' [6 D  F
什么是 PWM(脉冲宽度调制)?(前面的文章也有相关介绍)9 T* x6 O) e4 \0 n. k. `# w
PWM可以让数字值控制模拟设备,例如控制电机的速度,LED的亮度等。我们知道电机和LED工作在模拟信号上。但是PWM不提供纯模拟输出,PWM看起来像是由短脉冲产生的模拟信号。
, a; A, d" _6 O& U* j; R7 T- |" }6 N. C
PWM 的占空比
& M- x+ a2 N8 @! x% ]
% v4 z6 N1 E0 \, [6 x5 FPWM 信号保持高电平(ON Time)的时间百分比称为占空比。如果信号始终打开,则占空比为 100%,如果始终关闭,则占空比为 0%。$ m" @+ V2 @+ R! y
! i4 V  x, j5 _& Y0 S; e$ u9 Q
占空比 = ON Time /(ON Time + OFF Time)0 {. D+ d4 I3 U! m

1 N  H: H7 I% k2 i# w" S 82c66cf9d0984c1e5cb2a23dce21d424.jpg
2 m6 X' ]- ?$ P  B4 I
) r3 ~- @9 K& [: _6 E7 c* z; }" z8 c  i* p& J) Y8 W/ ^
STM32中的PWM! f3 p9 B; w  F3 w0 c
STM32F103C8 有 15 个 PWM 引脚和 10 个 ADC 引脚。它具有 16 位 PWM 分辨率(2^16)。
7 d. g" G: i# R. r# n# O" {8 D1 K: F/ c
所以 65535 的值为100% 占空比,平均电压=总电压;
( @& a4 A- o8 ?; K) r
( {( C* A4 D( {5 g同样,32767 的值为50% 占空比,平均电压=50%总电压;
3 i2 z& `7 Y2 f- X4 V# {& w
! C4 N) E" }# m( v& ~: x8 V8 I13107 的值为20% 占空比,平均电压=20%总电压。0 u/ i0 B* d) ]8 g  S" b( `

8 Q$ [* |) i+ |这里我们使用电位器和 STM32 通过 PWM 技术来改变 LED 的亮度和直流风扇的速度。1602 LCD用于显示 ADC 值 (0-4095) 和输出的PWM 值 (0-65535) 。& o* `) K* `, o: A9 j

2 Y4 W% Y' x% h8 T直流风扇:这里使用的直流风扇是PC 的 BLDC 风扇。它需要额外提供电源,所以我们使用 9V 直流电池。. w4 y$ [, ?3 s! |/ ?5 l

: c* c2 c& `% Z. AULN2003电机驱动IC:用于单向驱动电机。下面是ULN2003的图片图:
( J3 }1 N8 d5 C. n4 v& E
' S% s9 w% @* B4 C" O# | d5ba9aa8c3ef80657b2976a564be137d.jpg ) u; i& {% h" K% y" e! j) [

1 @3 W* M" L8 Q引脚(IN1 到 IN7)是输入引脚,(OUT 1 到 OUT 7)是相应的输出引脚。COM 是负载的正极电压。
: G6 X+ C4 h1 ^5 V& \( d3 n" p- @9 T9 F  d: ^9 f
电位器:使用两个电位器,一个用于分压器,用于模拟输入到 ADC,另一个用于控制 LED 的亮度。
2 `5 ^1 a2 c- {, X  h
& Z# A& n! e& c% v, {STM32的管脚细节
3 i' M8 D0 A3 T8 }
6 _- `2 X+ P3 r& l9 J e834c186fc3d97d49ae20cada1317997.png
" X. G) p$ k- j8 l
* a0 b4 |  S+ D我们可以看到 PWM 引脚以波浪线(~) 表示,有 15 个这样的引脚;有 10 个 ADC 引脚用于模拟输入,ADC 引脚以绿色标出。
0 l+ }& |+ f1 W* w
7 Q* J! v" ]& D/ j- g* v6 Y' J$ c$ ?' a9 Q" O7 [4 E- q! m8 i
电路图和连接
' T3 m+ p+ d2 e  ?8 L& W% H( F# L1 X* P+ [! T
e78a348298f86f4b52525f02fc868fd8.png ( d' ~& P$ R3 k! }) w1 A; `3 u

3 s! I/ Q, n9 E' }
1 r' b' s: F; ]5 E+ o5 ]9 i* SSTM32 与各种组件的连接说明如下:
, V. o: |/ Y1 P7 u& a
. H$ h5 S, `" T3 Z> STM32的模拟(ADC)输入
/ G2 C# [( o, v2 h. B+ S# r
7 ^' }+ u! q% x: a靠近ST32开发板的电位器的中心引脚连接到STM32 的ADC引脚(PA4),该电位器用来调节输入ADC的电压。! {8 v7 j# T! v

$ y/ p: B& q- ]$ g  g+ k! g>STM32连接LED
( T2 _4 M: T9 d) }
: x$ [: _/ z0 b; `STM32 PWM 输出引脚(PA9)通过串联电阻连接到 LED 的正极引脚,LED并联一个电容。1 }' [( T5 J5 _
) |2 ~0 K, g' j# A% {
>STM32 连接ULN2003 和 ULN2003连接风扇
$ U+ H( S) E! o  u
* B  J6 Q: P0 m" ^9 OSTM32 PWM 输出引脚(PA8)连接到 ULN2003 IC 的输入引脚(IN1),ULN2003 的相应输出引脚(OUT1)连接到 直流风扇的负极线。% v6 I+ O' ~5 y- v# u) H

. f3 V& F. j1 {2 `/ L% Y* [, J直流风扇的正极引脚连接到 ULN2003 IC 的 COM 引脚,外部电池(9V DC)也连接到 ULN2003 IC 的相同 COM 引脚。ULN2003 的GND、 STM32的GND、电池负极连接到电路相同的 GND。+ q* H; Y) \2 W5 l* f- B4 V& T1 U: j
( b: w. O% u* G7 ]0 V
>STM32 连接LCD (1602)' y" f7 M( e% ?' K9 U

: m. _  t6 v" o% N# k
01eec6bab568f2b6f6fcaa29a561ab21.jpg
* Y0 g! l0 |, k4 E9 N( |1 T4 S
2 I2 i( Y+ o6 |. v0 d# D>整体电路
8 Q& `# |$ o. Z# o+ x; v3 _! K0 F
. S6 v5 ~/ X$ s& N" ^1 }0 c
0cbfb7258888659df2cd48d4a948cd85.png , E: O% k% X0 X) j4 H( M: G( c
4 B" E' I3 P) A* H0 o
编程STM32
% E  }- k' g7 {# r4 Y
  1. #include <LiquidCrystal.h> // LCD库
    8 H* L- U% _% d, R; F+ @
  2. 3 q, W% u, ?, i2 f0 @7 c6 [6 ?6 \
  3. //声明LCD连接到STM32的哪个引脚3 F, b) C  g  H, \* h
  4. const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14;
    $ D  l, `1 E* T8 c% K2 S
  5. LiquidCrystal lcd(rs, en, d4, d5, d6, d7); //初始化 LCD
    4 t* U* d1 J' f- B% K
  6. const int analoginput = PA4; //电位器输入
    5 u! B1 b7 ]# f
  7. const int led = PA9; // LED PWM输出
    5 t! Z0 I0 [+ D6 k$ f# w
  8. const int fan = PA8; // 风扇 输出7 M0 o2 [0 C$ a. q
  9. void setup()
    - B' y  o- ~' Q7 ^, ]
  10. {5 U, y& p  a1 `" f; j
  11.   lcd.begin(16,2); //16*2LCD/ R/ U- S5 a. K% L) ^
  12.   lcd.clear(); //LCD清屏
    * R; i& a- `  E, y' F
  13.   lcd.setCursor(0,0); //将光标设置在第0行和第0列! S, ^9 h% `' q8 }$ Q
  14.   lcd.print("Hello World");8 t( o! e7 r, G/ Z$ D/ J/ d- \( O
  15.   lcd.setCursor(0,1); //设置光标在第二行第一列) b2 H- a) L' `" `2 K
  16.   lcd.print("PWM USING STM32"); //LCD显示 PWM using STM32
    4 X1 r( B% |: o. c
  17.   delay(2000); // 延时2秒
    8 n: D) N& r9 S! ?! r2 o; T
  18.   lcd.clear(); // LCD清屏- F& U8 v# h& O+ \+ Y
  19.   pinMode(analoginput, INPUT); // 设置为模拟输入
    4 {, U5 ]0 B# E# [' [* Z+ r# `; `
  20.   pinMode(led, PWM); // 设置为PWM输出 控制led9 t9 S5 `1 w) F; l' T
  21.   pinMode(fan, PWM); // 设置为PWM输出 控制风扇. |- x+ o1 k( [
  22. }6 ]! W. R5 m) {0 A* }1 w! q
  23. void loop()- b0 i. e: }7 m& k8 s
  24. {
    , }9 k& _) [( }- c. D" E
  25.   int valueadc = analogRead(analoginput); //从引脚 PA4 读取 ADC 值 (电位 器值), ^- K$ B# U' j  X( m8 o
  26.   int result = map(valueadc, 0, 4095, 0, 65535); //把valueadc 从0-4095映射转为0-65535映射 , a! z% [7 U$ f3 |9 q5 s
  27.                                                    并存储到result中4 M$ q; O; ?3 \4 H  a

  28. & u- z2 L8 {  {/ |
  29.   pwmWrite(led, result); //以PWM波控制LED
      Q; u. D; E3 v5 Z5 e7 z$ l
  30.   pwmWrite(fan, result);+ d0 d8 z2 ^/ \1 f7 C! C
  31.   lcd.setCursor(0,0); //设置光标位置9 ~* z/ c4 F8 w4 c9 `
  32.   lcd.print("ADC value= "); // LCD 显示ADC value=
    - ~9 w' u/ a. \# |0 g. P( m  g
  33.   lcd.print(valueadc); //显示电位器ADC值
    ' ]0 J& s. `0 M' }/ }
  34.   lcd.setCursor(0,1); //设置光标位置
    ( h) I' k: p& W# C7 w' K
  35.   lcd.print("Output = "); //LCD 显示Output =' e' _( z( w4 {5 N, H7 m. O
  36.   lcd.print(result); //显示电位器映射0-65535的值
    ) Y3 Q; ~" p8 F7 ?7 m9 i) N
  37. }0 K! b% K1 s. J, g: q: K

  38. # T8 `+ [  ]! U, S# W
复制代码
. k1 L+ v4 j/ J) u/ L$ [
6 a  x2 a. J; R4 ~7 h
收藏 评论0 发布时间:2022-6-21 13:23

举报

0个回答

所属标签

相似分享

官网相关资源

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