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

【经验分享】基于STM32的pwm温度风扇(带人体检测)

[复制链接]
STMCU小助手 发布时间:2022-5-12 11:04
一.硬件方案
* ~& V) C8 S" S* Q# p! \7 z* d. [$ s本次设计采用STM32单片机做主控芯片,通过DS18B20采集温度,将温度显示在 LCD1602上。通过人体传感器检测周围是否有人存在,并根据温度的不同,利用STM32对风扇进行调速。4 J1 Q/ r6 Y% i5 {/ f# E) B
主要由STM32单片机+LCD1602液晶显示+DS18B20温度采集+按键设置电路+PWM风扇+人体红外检测;如图:! D( o( E4 O( s+ [% `1 y* b
( S+ L+ S0 ^! A1 `
A0)JG2BC]BH7]L4DS`3DFSO.png
. \! s' Y4 |/ @% y/ X0 Z4 A% a) D; I5 H- L# L- t8 J! m
二.设计功能  G2 U4 {/ f( F
(1)LCD1602液晶显示当前温度,风扇等级,自动手动模式。
2 z( z) o- g- l3 H; z4 n$ ?(2)按键可以设置自动和手动2种模式切换,按键设置温度上限。6 j9 E/ u4 v! k: }) [
(3)手动模式下可以自由开启风扇,调整档位等级。4 U7 X5 {6 |& U" w: b( D0 u
(4)自动模式下,人体红外检测到人并且当前温度大于我们设置温度上限值风扇开启。
+ [, @* Y, E/ g+ d! G) V(5)每大于一度风扇档位pwm加一,最大上限为10档。
5 y+ ~$ p* y& k0 F) W6 \" |# o) \. J7 G* {
三.设计原理图
$ v4 W# O. u# m" U* X' P5 [9 T  g+ c(1)原理图主要采用AD软件进行设计,如图:
9 x; I% R3 h2 [, [$ G
* I3 i( d% S  }& k: S2 {3 ^  q ]AU~`2KX6EAWYNU)(C4CDH5.png # S% S+ l0 `9 L- i
, z, V2 ~/ W2 H6 A4 W
(2)PCB图如下:
. B& e& F0 v! V. `! G, {% u3 N3 P1 K4 u+ T
H066}FFXOON$FG@XI1)RVUS.png & Y6 P7 h' m  g- V2 E5 g) m
, _6 P9 d) M) T( m3 g* t2 }# d! ?
四.软件设计
# y& C5 w, @/ e2 I- c2 V(1)程序流程图
( c: ~8 u; `0 r. |* G3 _3 m' w# u  v) b' G; G* A+ V
2]}KQ0VN%(E413DC8JUJQDR.png 9 z, X1 K: r' F2 P3 f9 V
* k3 \" n) l7 h' _' x5 k$ ]
(2)主程序源码
) k7 X8 b% e, g7 W7 E
8 Y# H" G! ?3 J3 K# f, W/ R
  1. int main(void)
    , m  F7 X9 q  I; |; _
  2. {               
    ' C; ]2 M$ P0 G- [
  3.           u8 count = 0;
    ' l2 b3 l# I; j, d
  4.         
    4 M4 j! P' n$ h, K$ ~8 `
  5.           Motor = 0;' H- _5 L) L, q4 J0 {% `" F( G8 m
  6.                 delay_init();                     //延时函数初始化          0 r  z. I( t! t# L3 x8 c
  7.                 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级, X4 W' j3 h8 P$ T8 t
  8.                 delay_ms(500);
    6 q6 P- s" X9 T& K+ d
  9.           LCD_Init();//1602初始化( s" F8 `, J  [1 Y# f
  10.           KEY_Init();//按键初始化
    . j: _& @# V. `; x0 M7 Y7 ^; v5 ~
  11.                 while(DS18B20_Init())//温度初始化
    : w/ T; ~9 ]$ w0 R, G9 U: J, n
  12.                 {& p5 b- I* J4 Q- F! i0 v$ x: y
  13.                                 LCD_Write_String(0,0,"  DS18B20 Erro  ");3 e; G. Q5 W# N& f8 w, r  }- N2 M, |
  14.                                 LCD_Write_String(0,1,"                ");" [: S9 G: p* C4 t8 \+ w5 d  U
  15.                 }
    * b+ Y; |+ \6 n- w- [! P4 `  A9 {
  16.                 DS18B20_Get_Temp();//温度初始化- ~9 k5 I* K9 p- v; v. S
  17.                 LCD_Write_String(0,0," DS18B20 Init...");+ X, M& \9 K" E( i% @/ P) B' {0 f
  18.                 delay_ms(1000);4 ~. C4 ^4 P! [; h& _
  19.                 LCD_Write_String(0,0,"Temp:   C  M:  C");# g. `; ^- D! Y
  20.           LCD_Write_String(0,1,"Auto:    Gear:  ");
    2 H- K% V; V8 [) x# J
  21.                 TIM3_Int_Init(1,7199);//10kh频率计数,定时100us# s" J+ J% U9 G: F( W6 X- S' A! Z
  22.                 if(Auto_flag == 1)
    " I$ x( k/ t. p* ~( d2 y; b
  23.                         LCD_Write_String(5,1,"on ");/ g6 n! f! R: Y
  24.                 else
    - \5 Z9 c) W1 K1 r8 i: Z
  25.                         LCD_Write_String(5,1,"off");
    1 f9 ]0 g: q8 g- i# I, F( t
  26.                 display_Max();  x: _% W. {# t) f3 j* r6 A- j
  27.                 ( w; {# {7 Q- C0 G' z
  28.                 while(1)
    2 y( u, Z) L$ V1 U3 s8 F
  29.                 {
    2 v& ]# O7 y/ b2 d3 j5 u: y
  30.                           keyscan();//按键扫描
    / F( I$ ^4 g& o! S
  31.                           if(count++ >= 200)//延时一段时间读取温度
    # z6 T; ?6 e  I
  32.                                 {" ~, Y. F5 k& h- X, v, ]
  33.                                                 count = 0;
    3 D4 r2 x. \/ L7 f& ^5 h; ]4 X
  34.                                                 temperature = DS18B20_Get_Temp();//获取温度
    - m0 ?  @. R2 m; x& j
  35.                                                 if(temperature<0)
    . [9 z+ `( x; i6 D9 m: u) l
  36.                                                 {
    6 `& K- m6 m4 z
  37.                                                         LCD_Write_Char(5,0,'-');                        //显示负号
    ( p, y9 v8 j5 V2 ~% d" a( v9 q
  38.                                                         temperature=-temperature;                                        //转为正数
    + `/ t; v; w: o, E
  39.                                                 }else LCD_Write_Char(5,0,' ');                        //去掉负号' _, I4 \( `2 q6 v0 s
  40.                                                 
    - q% f* U5 e9 o, g0 s. v
  41.                                                 //显示温度
    ; [% T" L; ~. ~! I. {7 H
  42.                                                 LCD_Write_Char(6,0,temperature/100+'0');
    0 B! i" n+ a% m% r
  43.                                                 LCD_Write_Char(7,0,temperature%100/10+'0');# `2 t3 Y* ^0 ]0 _5 o: O) P, q
  44.                                                 / f6 c5 l4 G) m# U" `
  45.                                                 if(Auto_flag == 1)//在开启模式下,感应到有人,并且温度超过上限开启风扇& V) b& t: j6 t  {# z  n% I# d
  46.                                                 {
    2 `; v6 V* l! }! E
  47.                                                           if(RTHW == 1)//感应到有人
    ' _: \4 T( D% \: Q# m
  48.                                                                 {! g6 b9 b1 [; S
  49.                                                                                 temp_dispose(temperature/10);//根据温度进行pwm调节
      @; V6 R5 t3 o: o) H2 `# _5 n
  50.                                                                 }9 x: H6 L. T1 C
  51.                                                                 else//没感应到有人,关闭风扇, e' U4 V8 z6 ?
  52.                                                                 {8 j- a8 D* n3 i9 Y2 x
  53.                                                                           PWM_Val = 100;
    ( _: Z3 ]" _. S3 |' E5 p
  54.                                                                                 Motor = 0;
    * \. w, k8 R, V. P5 t* e
  55.                                                                           LCD_Write_String(14,1,"--");
    , r& [% A  D9 R- Z/ [% z
  56.                                                                 }
    1 Y: \* c8 D; B; D5 E
  57.                                                 }
    - ?: p3 N' g" t
  58.                                                 else//关闭风扇8 [3 O; U1 Q- ]: x' s
  59.                                                 {
    & s6 E& B! N) V4 Q6 u# t
  60.                                                           PWM_Val = 100;
    4 Z% O. I1 o/ M% C# E6 ]  [# Q4 `8 ^
  61.                                                                 Motor = 0;2 ]+ ^7 `7 s4 P8 m
  62.                                                                 LCD_Write_String(14,1,"--");6 T6 y4 u6 N" U! y4 K
  63.                                                 }
    3 T4 L, w5 O. @* u! }! @0 J3 p
  64.                                 }+ v' j- Z3 o' T1 r% c$ I6 l
  65.                                 delay_ms(1);$ R8 n8 @3 Q  h, M: i2 I
  66.                 }
    & {! F5 S( w; U) k
  67. }
复制代码
5 a" c2 N2 w: `! [2 m

( o4 v( P; o! c' E2 \  f& m, M" T* q7 D2 v" F& u( f
赞 收藏 评论0 发布时间:2022-5-12 11:04

举报

0个回答

所属标签

相似技术帖

官网相关资源

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