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

使用CubMX和Proteus学习STM32单片机(六)------PWM波形产生

[复制链接]
STMCU小助手 发布时间:2022-11-16 15:04
项目简介
3 }4 a9 p) B3 ^3 n- G' U3 r        利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。这是第六部分针对STM32单片机内置TIM模块的PWM波形产生的学习和理解。
& t* ^9 \! a# ]& V/ ^& V$ i
1 J. Z! U6 i+ N$ b% e0 G2 s硬件模块3 [5 H/ |: Q; P5 K1 |! v
        STM32F103R4; M5 O$ R1 x) c$ I7 L( i! I4 l
9 Q+ v: g* P. Z2 X$ r- C- F
        示波器
' i5 W$ a3 _% K3 i
+ w% }- I. G9 \8 e5 ^软件工具
7 a  u7 M4 i& r) |9 s# U$ O  p        CubMX
' W4 F' L) o* b3 ]6 h2 [
, w. A$ g  g4 v1 Y        Proteus
& W; [5 P4 _4 p) _5 j5 [" B! O( e* Q8 g$ x
        KEIL/ b1 k6 W( p  _# i/ P$ F

  w4 p5 \/ K. }+ V5 P8 K6 l电路连接图
# I7 I2 a3 H! q8 W" l3 ?4 V* U, W5 S1 A+ _, b7 ]
NSOTM3M7822I~G]FX`V0KZ7.png ; F: K" F/ A6 R' E7 N

1 A2 u( t5 Z: b6 W" `4 ]
+ E2 o% @1 W( P! h工作流程3 j& y; u( F1 B
        首先,在CubMX种设置号一些参数,选择TIM1定时器,按下图设置好工作模式。输出PWM的引脚是PB15引脚。2 M# I' e2 w% L" g6 F7 }6 q2 c! I4 `
* a; a3 p# r) Q5 _: V
TA@H9{PW]Z_VRXH6B]J{R.png - u8 w5 G) \8 S. Y
- G; K0 A" e/ F- i( i; Z5 S
然后再按下图设置好预分频和计数值/ T3 W0 E8 `5 O& Y5 Z3 c$ i8 j
7 j7 a- B2 J, [+ z' m; w* y
}AE0]XHC_OLLRLB79}]RXO1.png 8 S) J+ |7 _, ]5 G$ }: [

7 ?: _" H% W3 Y. `" `# U  Y最好设置好占空比,占空比=Pulse/Per,比如想要设置占空比为20%,而上面设置了计数值为1000,那么按照这个占空比,就照下图设置好Pulse为200即可。. d  Z" x) L3 m

) V8 b' h' [& N  e5 M  q LBE145KB5}E`AD0274MSCDH.png - R3 A9 E- x) @1 R7 ?8 \) ]
& X& e8 `  O3 [" T' P
然后生成工程。3 u: k$ i) i8 j

0 p' [# m6 [% U$ E' ~1 @增加输出PWM的代码。
- [8 L) ], G; m% V5 K/ m
+ B% _' x! N' ?6 m$ W! Z( M9 K3 Q K6AC~`MS7KRW5LRI8A6T3`P.png + V  p7 \' ~; K0 m2 H( X" Y

( K; w( u4 W3 Y. M( U出现问题了,上网查了一下好像是超出了单片机内部的资源。网上推荐的方法是直接换一个型号的32单片机,但是我不想用这种方法,后来我删掉一行有浮点运算的Printf函数就可以了,可能是printf用的太多了,太占内存。可以运行了,但是一开始还是没有PWM波形输出,于是我换了个通道,如下图。
: d- c  b1 c7 ]: }- |' G/ f# Q
}E%EI8~)KGTDCWX9(RJG)0R.png 7 b. _9 {5 ^" P
9 [; v6 X; Y) [
Prescaler:分频值,可以设置为0  h" W" y7 g$ Q9 L5 G0 q6 @

% m) Y& r) V: ?, B0 B$ X5 j3 R3 cCounter Mode:计数模式
8 _4 l* P: Y5 }, |9 T2 m% _* O+ z
Counter Period:自动装载值5 j& }& s( N$ T9 E8 o
/ s$ B' D- j6 D3 @2 D( l' E
Auto-reload preload:使能自动装载功能" _7 B4 A8 }6 Y2 _8 V* j
! Q  U6 O; {8 x2 ^8 i
)$H34L1B}B_`0OBN4ZT4UF0.png 9 U$ u0 @$ r* n
7 b+ v& q: f1 c# Z" u* `+ e- J4 K/ f
Mode:PWM波模式: M: Q; Y5 t" P- i# ]+ _; o0 d& L
" P3 o* e5 N, S8 K% c/ v* @
Pulse:计数比较值9 d* D) }+ `0 ~: X5 M$ q9 E
0 ?1 _- p5 o* C$ I
CH Polarity:输出极性
! D, t: f9 a0 F
, G& |+ G) E/ G; w输出的结果如下图,这是20%的( \2 Y+ ~' y% Y2 A
, p% T: B' f9 S9 Y! c
O{GGM9MQUPJH4W`DHCCB5YB.png ! c7 L/ N: Y3 `3 W3 Q

5 R6 T5 ?0 {- j$ _# m: |7 C然后改变占空比为50%
8 \5 y& ]. z( n0 D; q4 D$ [: Z) `2 t6 z3 R
_0U@PO3G{4`HXF5~A8T12$Q.png ' w4 s! t5 z3 w" E( n3 M8 N

3 ^. [2 ^$ _; a/ ?2 u& ~$ M) c输出波形
, x% M( K! p5 b( e) U/ t; q5 h$ c% A- N- ]0 o; S+ K9 [; N
S)KN%]6}UYI7]6SK]W7[W[Y.png ; }, ?) n  d6 P2 z

6 l3 f$ W$ N. j, y" t3 b至此,PWM模块完成。8 J$ G% k+ Q( F% Z5 |$ p! }. `

  r; B0 F9 u! z& e5 j程序代码
  n3 K3 @! w' I3 j        mian.c
: Q) B% t0 `7 L4 ^7 V; u# h% A
  G! t8 v9 a( m
  1. int main(void)5 i1 m" y6 `( R: R/ A
  2. {
    ; M+ L: G: W' N) q- t+ V  @4 ?+ p
  3.   /* MCU Configuration--------------------------------------------------------*/8 H; d; c& X9 d' B7 H; z$ s. z

  4. ' m* Y: u' c: Z8 B( t; k6 E
  5.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
    % j) r. Q! X$ F- y- ^
  6.   HAL_Init();
    0 E. p1 K( r2 L9 S- R

  7. / _( R, Q- N8 S; x4 ]
  8.   /* USER CODE BEGIN Init */
    / @1 ^' `7 c0 ^+ G0 }

  9. 0 ~1 {% `% v% Z, `
  10.   /* USER CODE END Init */
    " I+ b8 X, u) X" l8 O6 G! X
  11. ! @. ^2 m$ b( w& F" ?5 N
  12.   /* Configure the system clock */' j. c  w, {& t6 @! o. u6 Q7 o
  13.   SystemClock_Config();  t5 Y- t! R/ q' W
  14. + B6 J2 A4 k6 N3 Y* _
  15.   /* USER CODE BEGIN SysInit */
    0 b; d  o- N2 u- w) ^, u
  16. * @8 _1 m" N1 R3 }
  17.   /* USER CODE END SysInit */* v. _+ L. w5 Z) m8 Z/ G

  18. " l1 Y1 y5 |3 `  x- {- l$ \
  19.   /* Initialize all configured peripherals */% Y- Y* `, _9 r7 C& ~7 n
  20.   MX_GPIO_Init();5 A  P3 a# d2 N6 I( d# i0 B& w
  21. //  MX_ADC1_Init();
    . C8 O: u1 S2 P
  22. // MX_USART1_UART_Init();
    ! m6 t" d* t) M& V- r9 f6 I: K, m
  23.   MX_TIM1_Init();
    9 G+ u# ]& ^7 j, B
  24.   /* USER CODE BEGIN 2 */7 ?" |' G$ w! H' Z4 z: C
  25. 7 j. H: S5 l% z+ b0 T1 ^! i: C
  26.   /* USER CODE END 2 */7 c8 u& A9 E! h! f

  27. + p. Z# m" e+ b* u' D
  28.   /* Infinite loop */9 e! Q' Z8 u5 R! k; o" ~: `
  29.   /* USER CODE BEGIN WHILE */;
    2 v8 Q# y$ }5 c, l
  30.         HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);//开启PWM波形输出) ]% H; U9 O" M1 {7 H
  31.         __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 500); //改变占空比,500/1000=50%
    : \' q* V. z1 O- F& G5 `% E! x2 C

  32. 9 k: Z. y+ b; b' @7 ]
  33.   while(1)
    + a/ k( ]. {5 V$ @6 D
  34.   {: b+ g% ^- s% d. K& b
  35.     /* USER CODE END WHILE */! r9 j- d# P$ f

  36. 0 q6 n: ^. V. h

  37. : t3 I! W, @3 F2 o, J
  38.     /* USER CODE BEGIN 3 */
    * M+ J8 M1 F* ]$ \
  39.   }
    + d3 x9 E  v7 h- o; V- O5 K
  40.   /* USER CODE END 3 */7 ]$ d& }8 o8 J; e* w: k' e5 @
  41. }
复制代码
2 o- o- C& ^- b6 Z4 U% D
4 E/ V* O4 t+ K7 T( y, O
作者:jxjajl  bilibili6 O- @: d# T9 \; F# A- ?' A4 P

8 T3 {$ ]9 B8 P& h, d/ a" c
赞 收藏 评论0 发布时间:2022-11-16 15:04

举报

0个回答

所属标签

相似技术帖

官网相关资源

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