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

STM32——用PWM控制电机

[复制链接]
STMCU小助手 发布时间:2022-11-1 16:37
大概的思路:初始化连接电机的IO口,配置定时器的PWM模式,配置电机IO口的电平。
) F- p% D7 _4 p- N: g
: [  j5 ^7 w4 K5 Y/ d$ M! I2 W+ t1 \代码如下:
# d7 {3 R7 ~: V* \7 R9 c- c9 s. u9 N. E
  1. #include "moto.c"5 y6 ?8 Q- I9 P/ ^7 D; ^. ^+ }- ~  S

  2. ( `* q3 [) b. A" Q: f/ S2 _0 v
  3. void MOTO_GPIO_Init(void)3 v" l% n0 b1 ~  }1 s+ ?- S
  4. {                . u; [9 U) [4 u  ~4 [" h: Y
  5.                 /*定义一个GPIO_InitTypeDef类型的结构体*/
    - x& I( F" Y' q. }5 G5 r. W
  6.                 GPIO_InitTypeDef GPIO_InitStructure;
    ( {  F) ]3 @1 v( O9 z3 C' s
  7.                 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);                                /*开启GPIO的外设时钟*/                                                                                                                                   
    9 ^+ h, W1 ^/ D7 P- v
  8.                 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;            /*选择要控制的GPIO引脚*/        4 c  V* U( F! g6 m) u
  9.                 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                              /*设置引脚模式为通用推挽输出*/   / n! S. j( T3 d( j( U/ c
  10.                 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;                             /*设置引脚速率为50MHz */
    - W* i7 I5 }/ A2 d" g3 W; D4 J
  11.                 GPIO_Init(GPIOB, &GPIO_InitStructure);                                        /*调用库函数,初始化GPIO*/                        
    ) q& b7 q( A0 L. N* K( Q
  12.         
    4 [$ ?( v7 j: Q' _& T% u1 a
  13. }
    ' x6 Q- Z/ |0 V

  14. : d1 e8 Q% P% p$ z' S& Z, s. R9 ~
  15. //电机模式4 q$ y" d6 }) s. X7 d
  16. void MOTO_Mode(char state)5 d+ P. ^  D( W- v  X" e( q
  17. {6 X$ E; W# f8 a( f) |2 \+ J
  18.         if(state == GO)//电机前进
    6 t+ @, F& ~4 A. h
  19.         {
    & E# W. G: K7 j9 x
  20.                 GPIO_SetBits(GPIOB,GPIO_Pin_13);
    3 B  m. X8 @3 C' r
  21.             GPIO_ResetBits(GPIOB,GPIO_Pin_12);
    7 D$ s0 P. W  t3 v" x: e: |
  22.         }! l3 `" g' B2 o/ `3 X: x
  23.         if(state == BACK)//电机后退
    0 j0 s5 b. W2 c( P0 c" f: f3 a
  24.         {" \( v- f! X$ g: b. W. `; O
  25.                 GPIO_SetBits(GPIOB,GPIO_Pin_12);
    ' L9 t$ E7 _- C1 V$ T3 E
  26.             GPIO_ResetBits(GPIOB,GPIO_Pin_13);
    9 l" j, p# Y1 t1 C3 H
  27.                
    5 H- I& p7 e9 P& f" {9 \# ?0 P! |
  28.         }  Q2 `) \4 E4 d8 K
  29.         if(state == STOP)//停转
    ' ^7 o: J. i& m2 P" @
  30.         {
    . W! D0 X7 S) k% z
  31.                 GPIO_ResetBits(GPIOB,GPIO_Pin_12);
    , {8 l( |1 y# V
  32.           GPIO_ResetBits(GPIOB,GPIO_Pin_13);
    * f7 p  M% l& I/ Z/ }( o) l
  33.         }
    . K% K5 z& I$ \- d) A
  34.                         
    / U4 p# g( I8 Z4 S
  35. }
    # ?+ X/ x( w( q6 m4 q2 O% U# _
  36. " O$ I* ?1 h: _- a" a
  37. void Car_Go(void)% }, c+ q3 S. z% S) M/ o6 H
  38. {: H4 ]2 k7 _( D
  39.         MOTO_Mode(GO);  " g% s3 B: p5 s1 D. |; s
  40. }
复制代码
  1. #include "timer.h"7 f5 T0 [+ P( P4 L' Z, O4 R
  2. + \3 v. f1 o* p- X+ R; f
  3. void MOTO_PWM_Init(u16 arr, u16 psc); X7 x( J5 l* ^6 x4 ^% \" d
  4. {
    - v+ I0 E6 @# k* }
  5.         TIM_OCInitTypeDef TIM_OCInitSructure;
    & Y# r1 k! m8 p. m- m  Q9 ?8 e
  6.         GPIO_InitTypeDef    GPIO_InitStructure;
    " g( W8 u1 X, S1 F8 M1 c+ ]  q
  7.         TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    9 S% A, z+ `, L; I8 \8 e7 R; \
  8.         + d, y; q, x+ H, e. x( F9 u
  9.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
    % A" d( J: e0 A9 V
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
    ! F$ k- o  G7 J' F4 N2 r  o  l
  11.         TIM_TimeBaseStructure.TIM_Period = arr;                   //自动重新装载寄存器周期的值
    * ]! V% j4 H, P2 b
  12.         TIM_TimeBaseStructure.TIM_Prescaler = psc;                  //时钟分频系数
    * }+ c7 c; |# ]+ {
  13.         TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //对外部时钟进行采样的时钟分频  Z$ J! h! B: r+ A5 v/ n; y9 h- m
  14.         TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数4 }9 t/ C8 Y  E. l
  15.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);              //参数初始化
    % j3 {0 ]& l/ W+ g3 z

  16. / _. F9 j+ |* I+ X
  17.         //TIM_ClearFlag(TIM3, TIM_FLAG_Update);9 q# e& }: i2 p! G6 n! b& Y
  18.         //TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
    ) F" g" |) I% ~, P
  19.         
    0 s. _1 m" }. J( f, x8 T; O: {4 `
  20.         //配置pwm输出端口1 |7 R" Z0 \1 I$ y
  21.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0|GPIO_Pin_1;) C/ h! @% H7 H( G% j0 H. M
  22.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;         // 复用推挽输出
    * J# C; A' s/ j; {5 R/ d
  23.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;% ]9 u3 q0 }7 c: k
  24.   GPIO_Init(GPIOB, &GPIO_InitStructure);
    - Y' r- N! ^- c7 j# |0 c2 X

  25. . B2 U/ |0 m6 I# n+ v1 ~7 y. `
  26.         //设置通道3 pwm参数% J; y' ?; v* g9 i
  27.         TIM_OCInitSructure.TIM_OCMode = TIM_OCMode_PWM1;
    * W- q& C) L- o* l7 _5 c
  28.         TIM_OCInitSructure.TIM_OutputState= TIM_OutputState_Enable;, p( `. U. C& Q  E) |
  29.         TIM_OCInitSructure.TIM_Pulse = 2300;        //设置比较值,控制占空比
      a& a% \4 X8 Y+ y
  30.         TIM_OCInitSructure.TIM_OCPolarity = TIM_OCPolarity_High;//当定时器计数值小于CCR1_Val时为高电平/ O( i1 q9 j8 @* i$ K
  31.         TIM_OC3Init(TIM3, &TIM_OCInitSructure);//参数初始化
    ) X0 o; z5 J( s( M* j
  32.         TIM_OC3PolarityConfig(TIM3, TIM_OCPreload_Enable);//开始输出pwm
    3 h) L) W  ^9 U/ i  G" G$ i
  33.         
    6 V( e: j: F0 Y5 o8 K
  34.         TIM_ARRPreloadConfig(TIM3, ENABLE);//启动自动重装0 P3 w+ h; V& ?# D
  35.         TIM_Cmd(TIM3, ENABLE);//启动定时        
    7 F" M1 D- V8 K" H) A  ]
  36.         
    4 b. n) @+ k8 v' S6 _) k' X/ `& }
  37. }
复制代码

+ O: W9 f3 |6 Fmain函数
! U0 o: J( X2 {# X8 x( F6 I/ H" |9 [& l( n) i+ z. ~( }% r
  1. #include "stm32f10x.h"
    8 W4 \1 q  ^6 y0 U9 s" F$ F
  2. #include "moto.h"
    8 I* }- x! q  q
  3. #include "timer.h"8 Y5 I8 R* {4 k# B% j) p) W; d# M
  4. #include "sys.h"! |* Q7 }$ q4 c9 ~8 l: N
  5. #include "delay.h"
    4 @: i6 \, R' `' x' k* @9 r

  6. 4 v, x& K( C( T% l  d* m- w( P
  7. int main()
    . P9 f$ a- U' U# B! Z
  8. {( F' i: Z4 m+ p  n% D1 d+ Q" w1 B* y
  9.    MOTO_GPIO_Init();  //初始化IO# O- z7 c7 S5 x3 t6 l1 G( f, ]  h
  10.    MOTO_PWM_Init(3599,0);//配置周期和预分频值
    0 D# Y% b8 E6 l  R, t1 h
  11.    delay_init();  C2 v4 B1 F- t
  12.         ( R/ q$ e7 H4 b# G
  13.         while(1)1 L0 g. |( C* ~
  14.         {                $ J$ G% F4 ^9 u# w  Y* p/ D" X
  15.             Car_Go();        
    $ o; p# {* |  M- y/ B
  16.         }* K; l3 {& B4 z. `4 [4 B

  17. ' C' k# _3 v) ~8 K' u5 J! ~6 W
  18. }
复制代码

, D* o; h' S4 y& w
! V7 x9 z$ j' n$ @; R, u7 B* o: q————————————————9 @4 G( \: C% q; L4 H* h
版权声明:@C#&- i. ]8 E" \3 t( |/ p. \# O: |

/ g% [7 ^& O6 A5 ^# g0 l
赞 收藏 评论0 发布时间:2022-11-1 16:37

举报

0个回答

所属标签

相似技术帖

官网相关资源

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