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

STM32关于定时器输出多路PWM波的持续跟进

[复制链接]
STMCU小助手 发布时间:2023-2-5 22:57
简介:) W2 B* W! M1 [. _3 Q( K# k* O* m6 Z
这里简单用stm32产生多路PWM& F3 h% K& {3 ~7 l; E6 @+ j0 L4 m
1、 32的通用定时器3可以产生4路PWM输出(同频率,不同占空比)
/ A: W$ y; H9 c& y2、 一个定时器产生的PWM频率由定时器输入频率决定; k2 s5 o* i3 W; h! m1 R1 l
时钟树决定通用定时器时钟来自APB1,且如果APB1的分频为1的话,定时器时钟为APB1时钟,否则定时器时钟为APB1时钟的两倍。  w' v" ^8 ^, c
系统初始化的时候,将APB1分频数为2也就是36MHZ,所以此处的定时器3输入时钟是APB1的两倍 72MHZ。
4 ^& c. W: k- ^. G- g7 _# b7 u根据 Tout= ((arr+1)(psc+1))/Tclk 计算溢出时间 注:溢出时间单位us, 输入时钟单位MHZ
% k- D- O2 ]6 L* g/ _此处计算的溢出时间:90019/72=237.5us
; S; A3 F' R  Z0 S6 a  F: Y3、 确定定时器多路输出的GPIO引脚 查表
% x+ S: P( X# w) z! `4 p+ {( a, p# o( n# ?
- y* k, p. b; p2 z! F2 a5 j) d# N
源码:3 W; r  o: I" `; J
第一部分:main函数1 Z" Y; t  L4 q5 c' b

0 H) g: X# u9 m5 g5 L: N! G#include “sys.h” //配置中断. J" ?1 e* d! W( C: m. w
#include “timer.h” //配置定时器
0 W  `8 g; e8 Qstatic u16 seg[4]={200,400,600,800}; //保存各路占空比7 f, i4 c3 a; Q% P& U% i
int main(void) //多个定时器同一通道实现多路PWM(同频率,不同占空比)
) Y! L8 m3 p# U{
: O/ ~# d# ?+ d* c, u- INVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2
7 |6 B8 E9 d5 _. S0 c* y) RTIM3_PWM_Init(899,18); //18分频。设置频率
: d" V: M3 Z+ n4 mTIM_SetCompare1(TIM3,seg[0]); //设置定时器3通道的比较值% v# y3 n) v7 O# n, w; w
TIM_SetCompare2(TIM3,seg[1]);) Y) y; E7 I# M8 w6 l8 q
TIM_SetCompare3(TIM3,seg[2]);" k* J: f2 q9 K
TIM_SetCompare4(TIM3,seg[3]);. j  z+ w; ]% g
while(1);
, e9 K- F7 Q( {% m}) V4 g# A3 v; E: ^$ ?3 L

: _/ z/ K" c! H$ a/ V% B
; F" v0 Y( G: {" p$ S  g" Z
第二部分 定时器初始化函数:& D( Z6 D! [( |3 i  n

  N- ^" \/ a( b0 M
下面展示一些 内联代码片。  V& N" C' V/ S# A. f
  1. // 定时器设置
    * L0 o5 O! a1 }
  2. void TIM3_PWM_Init(u16 arr,u16 psc)/ w, P3 Y, _; ^. [$ D, p! T/ t
  3. {  
    1 r/ G. F0 ?' r
  4.         GPIO_InitTypeDef GPIO_InitStructure;
    5 B8 Z# z6 U4 |) {8 O/ K( n
  5.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;! H) T$ B3 A8 b0 g2 G
  6.         TIM_OCInitTypeDef  TIM_OCInitStructure;' G: A. b& K8 J. h
  7.         ( r: `& }$ m/ e2 u

  8. : a' V& Q% Z+ S$ C
  9.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定时器3时钟: C( I" d5 C9 M
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,  ENABLE);  //使能GPIO外设模块时钟. p: ?- w2 M! S; [
  11.         , D1 J. j2 K  ?3 e7 o' A
  12.    //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形        GPIOB.5
    ! b9 _+ ~- x4 [; `
  13.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
    - T  b1 p' b" s, A" B3 d1 U
  14.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //推挽输出
    2 Z) G: j1 Z, Y9 R# A! M: n( B6 c
  15.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;# L2 |5 U$ \; A- K1 i5 A+ r% V
  16.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
    7 [- }2 r) d9 G& ]
  17.     1 Z# X$ ?+ U: L" B& H8 s" {
  18.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; 5 D" @) V! \' s0 D; H; s
  19.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO: j1 e3 z7 I8 W  H. ]& ~: q" k

  20. ) m2 ]9 j6 u' k9 k. X+ y
  21.    //初始化TIM3
    - p8 \* {8 R- K- k4 |% h8 O* y* V0 }
  22.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    " j- g( b9 C6 H3 I/ L& h' B4 i4 t/ V
  23.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    + W0 r. @. W4 R/ _" O5 j; b
  24.         TIM_TimeBaseStructure.TIM_ClockDivision =0; //设置时钟分割:TDTS = Tck_tim
    ; \# y! T( i! r
  25.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式+ D& u$ b7 N, x, E' I
  26.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位  o6 K+ q4 g* u/ D0 i, K6 {
  27.         4 b1 T; f& M' |0 W- \
  28.         //初始化TIM3 Channel2 PWM模式         
    3 L& k$ n8 ?9 g$ e
  29.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
    ' c/ ^. W7 O, X2 w( E
  30.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能2 M* ~- A; `2 K
  31.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高/ U1 D0 M& r4 }! H/ r% D  Q, ]
  32.    
    6 b! ^& m; f* J
  33.         TIM_OC1Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC13 ?1 b" E. C/ e
  34.     TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2' M& `; ~3 P8 m) p5 [0 s" ]9 {% R
  35.     TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC3. z  u: G% K5 q- O
  36.     TIM_OC4Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC46 M- {7 B' E) ?( l( i7 u1 P( K$ V
  37. ' z2 H9 s' S$ L8 e8 M; V
  38. " y, l* h2 C3 _6 g
  39.     TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器' M. h( A0 W; r; J+ d4 t/ S% p/ ~6 ]
  40.         TIM_Cmd(TIM3, ENABLE);  //使能TIM3  E3 r8 @. x2 w' l# g3 E
  41.        
    * x& R! m1 b, z# P  \6 ~/ a

  42. 0 [! ]% g" X( N$ Y8 d8 Q
  43. }7 z+ n8 x. r7 A: {4 k9 P
复制代码
. Z$ x! g" T  ?6 k
最终效果:+ ]  {' ~0 S% o
/ O/ h& m+ q$ d% x
32611423a9174da18c00ec1df9e1c98a.png ) |" H, h1 p% g7 o1 o8 Z
7 c9 Z- y% t4 n; S1 g# E+ U4 |
通过差量可以看出PWM波的周期为237.5us,频率是4208.8HZ。0 D7 w& N5 A& v& W2 t. m6 {
2 _5 Z) L' R2 K: O
改天更新修改PWM频率6 g$ a) a# v. ~' C7 N- y* T; ~
————————————————
! l, P6 a; u, U/ n3 U1 K7 q. W版权声明:两只老虎爱跳舞.com5 @) J& R" n9 A* }

/ _- D. \. f7 F2 w! D& O
收藏 评论0 发布时间:2023-2-5 22:57

举报

0个回答
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新和工艺
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版