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

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

[复制链接]
STMCU小助手 发布时间:2023-2-5 22:57
简介:
' ]2 ]- x  p  P+ R8 ?这里简单用stm32产生多路PWM% P# k) k9 U) N8 p3 P. I3 Z: T
1、 32的通用定时器3可以产生4路PWM输出(同频率,不同占空比)
% p( k% d3 t6 T$ O* j2、 一个定时器产生的PWM频率由定时器输入频率决定
2 b3 ?& F1 Z7 r- _9 _2 k8 u时钟树决定通用定时器时钟来自APB1,且如果APB1的分频为1的话,定时器时钟为APB1时钟,否则定时器时钟为APB1时钟的两倍。7 v; U1 q7 w$ D& F: {9 Y4 U3 D. X
系统初始化的时候,将APB1分频数为2也就是36MHZ,所以此处的定时器3输入时钟是APB1的两倍 72MHZ。) q3 L* G9 @4 @2 A8 r" H7 y
根据 Tout= ((arr+1)(psc+1))/Tclk 计算溢出时间 注:溢出时间单位us, 输入时钟单位MHZ1 F* y9 h$ H9 o0 C- O$ q
此处计算的溢出时间:90019/72=237.5us
. x7 y+ r4 x4 P3、 确定定时器多路输出的GPIO引脚 查表! w! ~0 j) ^* @/ u# N2 v
( c( M  J, K1 x; z
" M0 ?7 X$ [. e3 C
源码:
2 M1 n/ W/ S& R, g8 o; T% N第一部分:main函数5 _" H! e- H/ c
# K9 x* J1 q1 o3 N2 h; x% B: G3 v& I
#include “sys.h” //配置中断7 M: R2 [: z" T6 o2 R0 X: q9 x# E
#include “timer.h” //配置定时器& T: \$ _8 G* p% S
static u16 seg[4]={200,400,600,800}; //保存各路占空比' i0 E) a# h3 m" g( @- y$ N  L7 `
int main(void) //多个定时器同一通道实现多路PWM(同频率,不同占空比)
: P$ Y6 g4 i3 s$ G: d{5 N" K+ R6 e# e; [
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组26 b$ W- ]' P0 u/ h- R$ G4 X6 z! S+ l
TIM3_PWM_Init(899,18); //18分频。设置频率
% @- B8 m/ z5 _TIM_SetCompare1(TIM3,seg[0]); //设置定时器3通道的比较值
% R1 O' j$ U8 x( s0 {5 Y' ITIM_SetCompare2(TIM3,seg[1]);% C$ \; Z/ N* j3 M5 O
TIM_SetCompare3(TIM3,seg[2]);
0 n2 R7 ?/ O$ m& p$ f- \& C' M0 }TIM_SetCompare4(TIM3,seg[3]);0 i: y6 ?" O' @3 T2 Z" Z9 t1 G( ^0 d
while(1);
  h; e1 o) x7 Z5 W}+ h& y  A/ X9 B+ n
0 s: @% g! N/ t, s

/ l: a2 u' Z3 B- }; _第二部分 定时器初始化函数:
: S6 X( {2 I% `5 D7 N- W; S- A/ n
9 q: q+ I+ N0 @1 _2 n4 Q: P
下面展示一些 内联代码片。
( G* C, C- W+ ~1 }* r
  1. // 定时器设置
    + i9 ~7 v! m9 k" V8 h: N
  2. void TIM3_PWM_Init(u16 arr,u16 psc)
    , p5 h" S4 U& C& E5 n. V
  3. {  ; g! @2 u" ~9 v: {& T/ g( E" V
  4.         GPIO_InitTypeDef GPIO_InitStructure;' Y- S! G0 N7 D% m
  5.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    ; K8 u, J/ H0 }! Z6 E7 |
  6.         TIM_OCInitTypeDef  TIM_OCInitStructure;
    & L. H9 v& Y' `7 _9 O+ C! i
  7.         ) b- G- c, l; ~6 @

  8. 6 C$ R8 |6 ]9 V0 `
  9.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);        //使能定时器3时钟
    0 O) q# A8 D, S. \5 M1 G
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA,  ENABLE);  //使能GPIO外设模块时钟
    4 d( Z" X! A" l3 F- p
  11.         + Z' E- ]: @+ ^) n3 E
  12.    //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形        GPIOB.5
    + \5 ~. |  N3 z$ R- ]
  13.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
    " Q* W& X* N% B+ p. i. F
  14.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //推挽输出
    ; F# O7 k0 L: X: _6 G9 L
  15.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;) p9 ~& A1 S+ `) O& n) |4 [8 }
  16.         GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
    " d& w  r: S5 t# t: x! I/ @
  17.     - \1 I- y/ U, {
  18.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7; + O; f8 `2 M; |& g9 K
  19.         GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIO" \; G, I5 O  _4 I) Y% y  M
  20. # J7 }! T$ M/ ^6 y! B$ n9 R3 l6 |
  21.    //初始化TIM3% U2 w5 i+ d( l; N* A. w, [; _
  22.         TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
    0 m6 C" q( c( c
  23.         TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值
    ! z* B8 P' O) L$ @3 b0 M
  24.         TIM_TimeBaseStructure.TIM_ClockDivision =0; //设置时钟分割:TDTS = Tck_tim
      u6 @- A, l: L2 ]5 c, H
  25.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
    0 @- o! M" n1 E* v; G6 n
  26.         TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
    5 E' n* m2 ^2 W$ y. h: F  t
  27.        
    8 O: A0 f- s% v. M& T# n0 w
  28.         //初始化TIM3 Channel2 PWM模式         
    ' L6 p$ Q+ ~/ I, y6 a& Z' J. J
  29.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1/ w3 T+ x2 p1 i/ U6 D% c% C* U
  30.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能1 s" }( K( A! D- j) b6 X) U5 C9 `' |# P
  31.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高: s- ^# G  N: R  X4 r
  32.     : v1 _) y& i7 h3 [- X3 ]3 Y
  33.         TIM_OC1Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC1  m2 K7 m& B- X
  34.     TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC29 Q$ R9 Z; b# g
  35.     TIM_OC3Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC38 M/ L0 @; b& _/ h7 K
  36.     TIM_OC4Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC45 x7 b# f- b! |2 J
  37. * ]1 Y6 {# R/ C% b! k$ {
  38. : v  Z) z7 T1 M; B5 z: N
  39.     TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的预装载寄存器
    2 \. {( f9 B+ Q0 Y& b9 Z
  40.         TIM_Cmd(TIM3, ENABLE);  //使能TIM3
    $ X2 C' C8 a3 `* e7 b3 G6 X3 W
  41.         9 L6 E% p4 e; ?9 i
  42. 2 j3 m5 k% \, Z1 s) o
  43. }
    3 h: |' v" N* p$ ^5 W  k
复制代码
& a; a; Q5 S3 K! Q% h+ V5 w0 S! y
最终效果:
/ l/ f8 c$ r- L: @/ T2 x
% o) U7 p4 }3 V5 ]3 ^6 f
32611423a9174da18c00ec1df9e1c98a.png
# K: H: C- ~7 O4 [
# F; j  o9 h9 {+ I, m$ B7 u
通过差量可以看出PWM波的周期为237.5us,频率是4208.8HZ。
* s+ U3 f- H0 O, M. K
4 @5 L& n) V0 H4 k
改天更新修改PWM频率: c+ N- d! X- B, Y
————————————————6 F9 C( u6 e/ @; U$ |0 T# ^
版权声明:两只老虎爱跳舞.com  R9 b, z# J& p* `- T7 y% C& y
# L8 Q' o1 l* h
赞 收藏 评论0 发布时间:2023-2-5 22:57

举报

0个回答

所属标签

相似技术帖

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