1. 使用 CubeMx 创建 PWM 工程
5 v5 a* P; T4 l: h* q7 C E打开 CubeMx 软件,选中我们此次使用的单片机型号 STM32G030F6P6 ,点击 StartProject.
6 q8 _5 U/ a7 C6 I4 L& T( _" o1 ?
6 y/ {$ s; C r( r4 m$ Z配置定时器
. a2 b8 u2 Z6 S8 n8 x
0 T6 O( O% h6 R% a) _8 O- u. C% [9 q* `
. Y }6 U8 j! P6 O
配置定时器1的通道1和通道2 产生PWM;/ U1 J2 k+ H1 x: |* Y
设置定时器1的主频:设置了( 63 + 1) 分频即定时器主频为1M
4 Z" v6 l! `) L$ q% L设置PWM定时的周期计数为 1000 即 1000HZ+ F" N9 w2 w( I* ]/ s; M0 \6 F7 n
! M$ | t/ e% Z- T: z( d1 h) v( n6 X
: g1 h9 ^+ V2 A+ x4 P) T; W
设置通道一 翻转的计数值为 500 即占空比为 50%
- k% U- S' q0 |1 Y& y+ |2 O6 O/ U设置通道二 翻转的计数值为 200 即占空比为 20%
7 E7 p, _* D- j# E- \5 M$ N5 ~+ o: ^, l+ b: m
配置时钟
+ u# H w' t) p( t+ o4 f, X
9 }8 I' u) ~, R* Y
( O' B! |, m2 v( ?8 {使用内部高速时钟,将主频倍频到64MHZ( ^- ?# P; z2 B! ]
, N" D$ P# p) }* ]& i0 P
配置工程相关选项
) Y/ K3 ^0 X2 h! ?
3 U2 a N4 A- U9 y' C( W8 ], r2 T. C2 g( ^
' o# l; A4 |3 c
2 s- w6 ~8 ?, Y( i5 [9 E# K配置完成后点击右上角 GENERATE CODE完成工程的创建9 U, L. O3 ?* ^
) d& n, G( O ]6 A, x2. 编程
( H) J. A% a+ d定时器的初始化函数都已经由CubeMx生成,我们仅需要打开 PWM的使能即可
0 B, ]* [6 D( v: k F. X' _# P! E* p$ @$ }8 k6 ?
- /**
+ z) ~; C& D1 k; i - * @brief The application entry point.: t( Z, K9 S! Y# N7 _( |* d
- * @retval int# R7 N: l9 {9 J+ a
- */
; u7 U/ a6 r* H; H7 L8 W3 W" u7 \ - int main(void)
* K$ O) J- x0 n9 U5 n& }/ A8 h4 Q - {, y% a3 a( \, l& Y
- /* USER CODE BEGIN 1 */
1 Y# V+ v1 h9 H" x8 g/ ~# D - 8 c' y" L" Y) i2 i# p2 q
- /* USER CODE END 1 */8 @' G% w: s; i: h* c# h' \
' I# v) ^% u4 o* O' F; ?- /* MCU Configuration--------------------------------------------------------*/
. \. g# N7 p h - . ]( [ q1 `0 z
- /* Reset of all peripherals, Initializes the Flash interface and the Systick. */$ d. a5 ~ Z4 y' r
- HAL_Init();, z9 d' O1 L/ K
0 }' G C- Q- `6 L6 r4 m- /* USER CODE BEGIN Init */
k A5 M& ^. c( g/ n. @2 b* e
0 G& x( w! H4 k2 f- /* USER CODE END Init */) p4 d4 @) n J. S
4 b) @; X+ W- C- /* Configure the system clock */
; T( V4 u( a7 }. ]8 n+ _9 z9 O - SystemClock_Config();
" D3 H3 P) Q! l8 m
* w( ^; i/ u# |( u- /* USER CODE BEGIN SysInit */5 ]1 k5 w, h$ G0 f! @7 Z
- ) O8 w+ q+ }" V3 l# N; p
- /* USER CODE END SysInit */ ^/ J x* m- E( [+ {8 M' S1 o: A9 N/ a
- 0 G. M: M) s: X3 O
- /* Initialize all configured peripherals */. _7 e) z5 W0 |- Q
- MX_GPIO_Init();6 t9 k/ b6 }3 T
- MX_TIM1_Init();% b' h9 z" Y3 @$ d# c3 s
- /* USER CODE BEGIN 2 */) j- ?! `+ {! x" O) ^, X! G! o2 r3 B
- HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1); //1000HZ 50%占空比的PWM
- L5 }" H/ Z" j( H - HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2); //1000HZ 20%占空比的PWM9 v' G7 f% m+ b7 l* m9 F
- /* USER CODE END 2 */) S: S+ I" c( U+ z% f+ @& d# \
- ; n1 W7 X9 x9 B" \. v+ d" g- G& r
- /* Infinite loop */. l+ @7 K$ \1 K8 J) t0 F1 s, Y9 @
- /* USER CODE BEGIN WHILE */, `* l, C( Q9 L' z4 P+ t7 [8 F
- while(1)
- ~2 C9 ^8 o3 i - {
* g7 N% z( w) u& g - /* USER CODE END WHILE */4 P# z) f4 J4 B$ m
- ( q: h) ~: U& X% Z( M
- /* USER CODE BEGIN 3 */; {7 j' S: K& \
- }$ l5 C5 w& z- P: a* x
- /* USER CODE END 3 */* B, }! x! i2 P8 y
- }
复制代码 8 s1 c9 U" ~+ Q2 P9 Z
可以使用一下函数修改PWM的占空比
+ R0 C0 I3 d' l/ q. e
9 O, ]2 Q3 d6 h$ Z& A- ^1 m) P3 M- // 使用此宏定义修改占空比
$ |: B- [% [, k - __HAL_TIM_SetCompare(__HANDLE__, __CHANNEL__, __COMPARE__)
复制代码 例如:
! i+ h$ n4 K/ [- [7 E" u- c2 l! t: |" `
- // 将定时器1的通道1 翻转计数修改为 800,在我们的例程上正好就是800/1000 即 80% 的占空比& P J- K E" G2 |: m: t
- __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1,800);
复制代码 # A7 s9 l. ~. ~
3. 实验现象2 M, L& c2 {$ v
编译并将工程下载到开发板后,使用示波器或者逻辑分析器查看 PA8 和 PB3 引脚是否输出 1000HZ 且占空比分别为 50% 和 20% 的方波。1 ?- V6 F9 G" T$ j& [
p0 m5 l$ Z* V9 F4 J' s/ U6 c( D& M1 V9 t1 `4 ?" T: X# c
2 P; v& L9 F( X$ b |