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

STM32单片机产生PWM信号

[复制链接]
STMCU小助手 发布时间:2021-7-6 15:07
1、开发环境3 f, h& ~- Y, B- i& u
3 q" K& i$ ~7 R/ H* Y
目标单片机 : STM32F407VET6芯片,系统时钟高达168Mhz
$ I9 R1 I0 [9 s% h* S0 \+ d( p开发平台:KEIL 51 G* u# {2 {7 v) }  P$ y
编写程序借助ST公司的标准函数库,不过现在已经不更新这个写函数库了,大部分开发都STM32CubeMX软件直接生成代码使用。但旧的东西(标准函数库)仍然能够使用。% o( m' A/ U. b2 ^0 ]9 H! q( F
1 G' L& _8 _1 c' q3 J
2、目标0 W$ D" u% @1 K* P

' W9 H% W, h. b3 a5 XPWM称为脉冲宽度调制,可通过修改占空比来控制LED灯的亮度(呼吸灯)
" V% v. E8 V- R4 Z( {; |& q7 g: j
1 d0 }: ]7 K8 K% W, u占空比:指在一个脉冲循环的周期内,通电时间相对于总时间所占的比例
! e& D- k, U9 w! i3 Y2 R
' \) k7 n. \+ x; u) i+ X2 ^  _
配置单片机寄存器来产生PWM( V) R2 z3 x5 A  b2 K

* C, J8 z' E5 x. W使PA1引脚产生方波,
, S8 {/ B1 ^7 C; D! Q: k
' {: ]7 L7 `: C3、代码. ?) }5 P& }& }7 j5 X
1 w$ j6 B5 R% |1 K% O* p
pwm.c文件代码! m) g3 H/ H$ v& y+ f
  1. //TIM5 PWM部分初始化
    & r+ `2 C" @0 o4 H) Y
  2. //PWM输出初始化
    - g2 H! N- X' c' x
  3. //@arr:自动重装值   
    & Z6 i" ~% V* \. S9 R; J
  4. //@psc:时钟预分频数   单片机168MHz经过系统时钟2分频,PWM外设时钟84MHz/(84-1+1)=1MHz 1us
      t5 n* I$ C+ V0 c& h
  5. //功能:由PA1产生占空比50%的方波! Z$ x8 X" f  |' `# w% m% R  \
  6. void TIM5_PWM_Init(u32 arr,u32 psc)
    - H: x$ s; ~$ p7 R5 `( o+ [
  7. {                                                          " X1 X! |* J' x, ~7 ?7 R' |
  8.         GPIO_InitTypeDef GPIO_InitStructure;
    1 s3 v$ }& Y& n
  9.         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    ' G0 h# |% ~1 d! F
  10.         TIM_OCInitTypeDef  TIM_OCInitStructure;, z. T0 R5 ]) n5 N" Q# U" Q$ Z
  11.         
      L/ L/ ?( p; T
  12.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);          //TIM5时钟使能   
      B$ ]/ b* V& H5 c8 a
  13.         RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);         //使能PORTA时钟        ' {" Z6 F' f) r+ [
  14.         9 g6 ~7 u$ E1 I4 J0 R: g5 h
  15.         GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM5); //GPIOA1复用为定时器5
      s) B8 H! G, [" p0 M4 E, w! ^0 C) ^
  16.         
    7 P3 X9 b! L  z0 ~9 |! p$ `, f
  17.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;           //GPIOA1
    - A& b5 E0 g# I* }7 ?/ S
  18.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能! x/ _4 m7 m3 U9 v
  19.         GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;        //速度100MHz
    " D* Q5 q" K6 K2 k, m4 g# L: x
  20.         GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
    # P# [9 O5 b2 `. @
  21.         GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
    2 R/ u9 A# ~# e" X0 o" N
  22.         GPIO_Init(GPIOA,&GPIO_InitStructure);              //初始化PA1; v! K# y8 q- v0 u- O0 R
  23.          
    * ^% Z) D/ }) j' W3 r
  24.         TIM_TimeBaseStructure.TIM_Prescaler=psc;  //16bit定时器分频   84Mhz/84 = 1MHz   / U) H( t/ j) o0 E1 Z: B0 s
  25.         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 1us * 500= 0.5ms溢出时间
    1 _8 b+ e) N. ^8 D
  26.         TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
    / d& ]+ H7 Y% ]
  27.         TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //  时钟跳动1/168MHz: G; b+ M0 C- `2 O
  28.           ?# o# |3 F* u' c0 O0 P, x+ v
  29.         TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//初始化定时器5; R6 e! i/ A- ?. l( g) s7 B5 M) Q
  30.         " _* @# y. t, B' g! C: I$ }
  31.         //初始化TIM5 Channe2         6 F7 I0 @8 {+ T
  32.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
    - c" R, R1 w, f% ~$ x' B
  33.          TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能; t& A2 T: w9 J8 S
  34.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
    % c5 L' u5 L7 J8 D
  35.         TIM_OC2Init(TIM5, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM5 2OC1+ z9 v$ ~* v. \6 G5 O$ P4 {
  36. ( L& R6 Y8 m0 s' K# b4 B5 p
  37.         TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable);  //使能TIM5在CCR1上的预装载寄存器
    2 ^' H; ^' V' v+ q6 ~; n% e

  38. # ^! u, d2 e7 m* U1 V" |4 X
  39.           TIM_ARRPreloadConfig(TIM5,ENABLE);//ARPE使能
    ) c) ?% P0 W( q& j2 `- P/ S  N
  40.         
    8 b4 }: ^4 B- T- M: P6 p; c3 C
  41.         TIM_Cmd(TIM5, ENABLE);  //使能TIM50 N* z  ~. `+ B2 n) T: U
  42. ) o( h7 k: M2 A! z# N; v+ H) T. R7 |
  43.         TIM_SetCompare2(TIM5,arr/2);        //修改比较值,修改占空比50%                                                                          " u2 b; q. v; u* p1 m0 O
  44. }  / @4 K% B" ^2 A/ ^1 W; j! h
  45. 9 F2 D% t8 Z5 J: V- m; V" g6 V
  46. void main(void)6 i$ X1 C# y1 F1 P( {5 K
  47. {
    ) B2 j/ t% x# `* U! \( v: e2 F
  48.         TIM5_PWM_Init(1000-1,84-1);        //arr=200 5KHz arr=1000 1Kh4 ^3 S$ ~8 {7 Y. Q  m/ V  f4 v7 r
  49.         while(1)  Y+ j8 @& G6 o7 I
  50.         {
    3 @0 A: X1 h, a8 M: c8 U% q, |6 H
  51.         /*什么也不做*/8 L  D2 D& ]) K; y" T9 s0 J' L: h
  52.         }9 G: s0 q6 \8 L7 [- W
  53. }+ v2 E9 F, s  Z" p3 y# ~
复制代码
0 M! B7 \6 b5 e1 \. t

4 ?4 |. @; u2 Q0 B' U% o
赞 收藏 评论0 发布时间:2021-7-6 15:07

举报

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