项目简介* S# K* P& u" _
利用CubMX生成基于32单片机的HAl库工程,然后编写程序在proteus上仿真验证。本项目最适合没有开发板的同学学习,零成本利用仿真软件率先入门STM32单片机。这是第六部分针对STM32单片机内置TIM模块的PWM波形产生的学习和理解。) v% u8 \$ Y+ ]" G
' l8 C' w9 O( [1 w1 g硬件模块) ^. p$ C6 U9 w8 @( y: b
STM32F103R4
% V ?4 q/ j: [ 示波器
9 }1 A$ A+ q1 _/ _4 Q2 ?" Z8 r% K4 r5 Z9 [/ n: V
软件工具
3 r/ `6 [2 Z3 @0 B/ ~ CubMX
8 M1 e8 @& U! }0 t Proteus, n4 e4 C7 P! }. |. U' m" V% _
KEIL6 l8 }, B! \0 Z
9 _- A0 D- d- n9 {电路连接图
+ I) }( ]' N& U- p; F! a2 i ( u) S6 P/ N3 r
9 g) S" L1 m% P$ F
3 f8 X+ `2 I# y1 f5 a: o; p4 t1 r工作流程
/ Q6 a+ z* K) N- e' |9 H 首先,在CubMX种设置号一些参数,选择TIM1定时器,按下图设置好工作模式。输出PWM的引脚是PB15引脚。
6 Q/ O; Z/ }8 J, ?! @6 ^- \3 b
- y- m/ [9 G& a# h
* V! L, c- w' _* b' j8 o3 |2 h5 f/ N, b! X
然后再按下图设置好预分频和计数值
( ]( O: u2 [" r9 r* s5 Q) N2 n- h' z F; U0 t+ b1 O5 U
2 B3 Q! x: v" S% H) g7 o6 K$ Q
& w# F; d+ a* V( d
最好设置好占空比,占空比=Pulse/Per,比如想要设置占空比为20%,而上面设置了计数值为1000,那么按照这个占空比,就照下图设置好Pulse为200即可。1 |8 M! ~% h: c8 k
7 q' D' m( n/ ?+ U% d) ~. p
. U/ O: n; J: ] A/ O. h, }: i: n$ ~" Q$ X, A
然后生成工程。
n$ c+ C- }9 |: f
a+ I) B) j( f增加输出PWM的代码。& w2 a% P8 M, p ^ S3 Y
" v' D3 I% \9 o5 ^! j; G- f
. \6 a- e) l, N
$ N g/ U' a: h; K$ i g
出现问题了,上网查了一下好像是超出了单片机内部的资源。网上推荐的方法是直接换一个型号的32单片机,但是我不想用这种方法,后来我删掉一行有浮点运算的Printf函数就可以了,可能是printf用的太多了,太占内存。可以运行了,但是一开始还是没有PWM波形输出,于是我换了个通道,如下图。
9 ]; ?1 T2 P$ \. `* f$ s; ~* N2 e+ P6 u- K
5 J. o8 w/ z& d: J" K
( \# O/ ?" o+ |# J' {0 j( T
- c7 V8 v# g% Q; g
7 k3 b& ^* z8 Q" ?- t7 X# d
. b- C6 w+ Z1 Z( V4 oPrescaler:分频值,可以设置为0
+ ]& M) h) ]: }$ F2 ?) M- T" dCounter Mode:计数模式& ?! @& C3 R9 X3 g- C
Counter Period:自动装载值
0 w& D8 ^4 d7 w8 y+ e( eAuto-reload preload:使能自动装载功能
" q6 O" c( a. T& W
8 F d# D- K0 M- \7 I5 `7 X
9 k/ T% f$ ~3 V3 _& F
+ l$ p+ v8 }1 `6 Q* _/ h* |5 oMode:PWM波模式' j( O6 S4 j; e6 v8 X
{5 ?9 W8 Q2 r+ {8 c
Pulse:计数比较值, @# r) [, _/ N5 X S& }/ M) i
6 I/ M5 I9 v+ m, L" Y3 @
CH Polarity:输出极性: ^0 }! e% }! A Y* _/ g
. L p2 U$ p7 @, M' r
输出的结果如下图,这是20%的6 @ X! N8 N5 j2 v
$ I' U- v& C I# v
- L5 `: q& Y3 h- c
5 P9 u4 u' c! ~1 s. @ H
然后改变占空比为50%4 ~; x, q4 m4 P6 C3 ?" D8 b
( [ x" [# Q" a C" \
2 V) Y( W) W5 P. u) n
+ I7 h1 v- [2 t0 D! f输出波形
: u0 N6 W4 s9 }: k5 f
: Y7 m: x: c/ T5 P3 B( |
3 |: D% w+ s2 n; T) K5 I$ [3 j! a
5 O$ m8 Q+ ~" q9 E4 l至此,PWM模块完成。 X8 R- G! Q# O9 A$ k
}; G/ w, i$ Q d6 a5 V4 i: p程序代码
! H+ o" M* J1 D2 v mian.c* I, L ?" F+ p) D6 r( [
- int main(void) S# @# [3 w( r1 { a# p
- {4 F& Z/ w) X9 o& i1 K9 ]
- /* MCU Configuration--------------------------------------------------------*/
( R" S* o% f) h* c4 J& x+ W - . R# U4 A$ {' B6 v2 q$ H! }" k, ^8 D
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
) c. s) U( j( Z7 E% v; c: u/ o - HAL_Init();+ T/ J9 G' I3 Z9 N% e
- + l6 A: e( @3 @# `( j- Z' I& |
- /* USER CODE BEGIN Init */! L( s1 A* N8 G
5 V" Q4 l! Q4 W' P$ h- /* USER CODE END Init */
8 U( C$ x H, N$ v/ B' u - - j& ~% m2 Y. o1 c! a, @! I. w9 n
- /* Configure the system clock */5 f H; V, \/ _4 ~
- SystemClock_Config();3 u' `4 _6 ~& \, N- E* g/ M
. M$ W5 b" F. Q: @1 l' X( {- /* USER CODE BEGIN SysInit */
4 N8 p d4 C4 ], N* t - 5 a9 Y9 O. f$ @$ M6 c
- /* USER CODE END SysInit */6 Y+ j# u* t! r& w" _9 f' F
- u$ Y9 a. t4 {
- /* Initialize all configured peripherals */# T: @' e! m' q H" o% ]
- MX_GPIO_Init();
" a5 i, g# }5 W - // MX_ADC1_Init();7 z# R f* P* m/ e8 R! }- W# {: X
- // MX_USART1_UART_Init();
% U, Y5 c1 p, M& d* z/ p - MX_TIM1_Init();
1 Z1 \+ I9 k0 S( `( p - /* USER CODE BEGIN 2 */; R4 g' I6 N$ P
- ' | h7 g, X5 {. r) V' h! u
- /* USER CODE END 2 */" o6 g2 v; o1 X* ^( W n
1 Y5 ~' j& d; c I" M- ~- /* Infinite loop */* X- T! K4 w' h* G: `' q
- /* USER CODE BEGIN WHILE */;
8 Q, G Z4 I) Q1 c: _, M - HAL_TIM_PWM_Start(&htim1,TIM_CHANNEL_1);//开启PWM波形输出9 |, @9 Z& B) E3 n
- __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 500); //改变占空比,500/1000=50%. ]9 p6 s& V+ ]) E
- 8 r$ i4 P. D/ T( | p' C
- while(1)8 }( ], b3 k) ~9 }8 n+ p
- {
' z) B2 h" E. i* h - /* USER CODE END WHILE */
7 @6 w, c- e$ v7 c5 I - " b. ?# w2 p7 C. @ b# c
- & P* M+ `& R& s% v2 R- w/ S
- /* USER CODE BEGIN 3 */: L$ f+ f6 Z* N d: e
- }: g& k) x. @8 m8 d
- /* USER CODE END 3 */ \7 g# R' W! W" \: q* `, ^
- }
复制代码 1 E% c$ u6 B/ n/ v
作者:jxjajl
' e9 u3 g8 U. S) h' v7 m8 l) n q* E' F: ?) o% o
|