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

利用STM32的PWM模块发出固定个数的PWM脉冲  

[复制链接]
z258121131 发布时间:2016-9-22 15:46
由于项目需要,需要发出固定个数的PWM脉冲,因为未接触过网上搜集的也多不行,后来根据官方手册调试成功。使用的第一种方式,后续的测试后放出。- W! N8 J' U  b) B8 t
void PWMS8_Init()8 d) A; W; F' l& U! V# V
{0 [3 v' M( F1 L7 M$ U2 m) K8 R5 A
GPIO_InitTypeDef GPIO_InitStructure;
& O, R8 r  b  W- t+ \ TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;* f4 X  @, e' i; m
TIM_OCInitTypeDef  TIM_OCInitStructure;
, E! f3 W0 ~# I. w   /* TIM4 clock enable */
$ z/ V  Q" S4 x9 j  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
' P" ]8 T5 N' q7 s% @( l  /* GPIOB clock enable */
2 B5 ^  A9 g6 r  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);( a! O; s2 {" w
  /* TIM4_CH1 pin (PB.06) configuration */0 ~' R9 B" v- u& d1 z8 j5 a
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
2 x2 d% a- V. x3 y" z, O0 W  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
% [  R6 H; V) R9 C8 l  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;' i. F  s8 U% z( p
  GPIO_Init(GPIOC, &GPIO_InitStructure);
+ e1 T0 }( v1 N( f7 E9 A
# m0 o3 [- y# \3 Z' V7 U
! S; G- E: F) f TIM_TimeBaseStructure.TIM_Period = 200;
5 C% C, A) P( G" q& p2 b% l0 V. `  TIM_TimeBaseStructure.TIM_Prescaler = 7200;
1 o. B; \9 p) Q  D4 z8 r  TIM_TimeBaseStructure.TIM_ClockDivision = 0;0 a8 `% A4 Y9 @
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;2 _3 ^: Y# n9 }
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
& M# N: Q1 f6 B3 d0 O" t- K) [9 x- G TIM_TimeBaseStructure.TIM_RepetitionCounter = 5;
% B, W" J, I6 Y3 m1 _  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
1 j6 S5 ~% J/ Q
, f% g7 ?3 M, e& y! f. y TIM_GenerateEvent(TIM8,TIM_EventSource_Update);
/ M1 f) ?8 y, M TIM_InternalClockConfig(TIM8);! D9 ^! a5 v+ b7 n/ H1 V6 u
TIM_SelectOCxM(TIM8,TIM_Channel_2,TIM_OCMode_PWM1);
+ I9 k' I# j& |  z2 D* _# }. f6 \8 F. c/* PWM1 Mode configuration: Channel2 */
! `: r& C/ C" w' e  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
4 `9 E/ \' H  S" E: N% U  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;' a0 e. O+ c8 p2 T, y, Z$ |. F6 [" V3 r
  TIM_OCInitStructure.TIM_Pulse = 100;
; r8 D& K! r1 F7 [, L' \- x  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;0 K7 p- K% e5 V3 ^
  TIM_OC2Init(TIM8, &TIM_OCInitStructure);
% ]1 n0 B- R: T  TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);, j* ^' c* j! I9 X: P1 y
  TIM_ARRPreloadConfig(TIM8, ENABLE);" q, f' T0 @% `& e1 |
  /* TIM8 enable counter */
9 T4 F: K% f) a8 x4 Z0 R TIM_CtrlPWMOutputs(TIM8,ENABLE);" U1 j/ m$ i! x+ Q9 J6 \0 Z: U
# }2 u" j, Y0 i) E. N/ j
TIM_SelectOnePulseMode(TIM8,TIM_OPMode_Single);
7 z! T1 \+ C" y: Q* O9 @  TIM_Cmd(TIM8, ENABLE);
* i2 j9 i+ J+ @( K* z( ^1 X7 `}- D8 k4 f/ r9 N7 }

: M+ T: R" V. U以上是核心代码,自己可根据需要修改,生成不同个数以及频率的脉冲。
+ u8 o. q% m5 Z: Z, m) Y3 b3 x

通用定时器.pdf

下载

1.81 MB, 下载次数: 876

评分

参与人数 1 ST金币 +10 收起 理由
zero99 + 10

查看全部评分

1 收藏 7 评论25 发布时间:2016-9-22 15:46

举报

25个回答
学习痴狂 回答时间:2017-7-16 10:38:10
foleon 发表于 2017-3-13 15:55
+ w8 t" y" \9 Y我修改了不起作用

2 T/ W' \2 W0 r/ p这个功能只对高级定时器起作用,普通定时器实现不了
  1. if ((TIMx == TIM1) || (TIMx == TIM8))  
    4 Z' F& ^5 o. n* a: D4 t. z& n
  2.   {$ x& G0 T. w. r/ L
  3.     /* Set the Repetition Counter value */, v6 `/ F8 T& k, S0 B4 h- }' }
  4.     TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;
    3 T* ~, @1 G- _# A( ~
  5.   }
    8 m  L4 }6 e7 {
复制代码
z258121131 回答时间:2016-12-14 09:28:05
foleon 发表于 2016-12-13 14:40# ?/ E- k& D# c0 p
你好,这段代码看不太明白能解释一下吗?我现在也需要调试步进电机,不知道怎么产生固定的脉冲数,我用的ti ...

8 f, Q' N5 \0 C2 P6 a; V你只需要对应的修改引脚就可以了啊
琳风 回答时间:2018-10-16 10:45:18
z258121131 发表于 2016-12-15 09:06
/ J  o1 ~" k0 E0 n. p4 ZTIM_TimeBaseStructure.TIM_RepetitionCounter = 1000,修改RCR寄存器的值

7 @3 T; d1 s" z0 p9 U( G1 MRCR寄存器是8位的,怎么可能写成1000呢
飞行的UPS 回答时间:2016-10-12 17:50:05
学习下
foleon 回答时间:2016-12-13 14:40:00
你好,这段代码看不太明白能解释一下吗?我现在也需要调试步进电机,不知道怎么产生固定的脉冲数,我用的tim3,楼主能指导一下吗
foleon 回答时间:2016-12-14 14:06:36
z258121131 发表于 2016-12-14 09:283 O+ k7 Q' Q" p
你只需要对应的修改引脚就可以了啊

! z) n, P# I3 h还是不明白,加入我要输出1000个脉冲,要修改什么呢
5265325 回答时间:2016-12-14 17:48:35
z258121131 回答时间:2016-12-15 09:06:13
TIM_TimeBaseStructure.TIM_RepetitionCounter = 1000,修改RCR寄存器的值
xhzheng 回答时间:2016-12-15 11:25:48
学习咯;
foleon 回答时间:2017-3-13 15:55:21
z258121131 发表于 2016-12-15 09:06% R( W3 v0 [; d: c8 T3 }  \
TIM_TimeBaseStructure.TIM_RepetitionCounter = 1000,修改RCR寄存器的值

  ?* m$ k# r. z- k( S5 @9 }我修改了不起作用
z258121131 回答时间:2017-3-21 20:26:53
foleon 发表于 2017-3-13 15:556 w# e, I' }  Q) r- F
我修改了不起作用
7 V8 b& ^  w* I5 q
你要实现什么?传上来看看
牙签骑士 回答时间:2017-6-4 03:03:59
想问个问题,你这个最高速度多少
. }# ^' @$ B* d4 U/ \5 i
Silenceasd 回答时间:2017-7-29 15:45:05
楼主  我怎么更改引脚,比如用PB0输出PWM呢, N& T" @3 P  E" O% y
Silenceasd 回答时间:2017-7-29 15:54:38
怎么改用其他io口输出脉冲呢?比如PB0
weizuokai 回答时间:2017-12-5 17:44:03
这个能重复输出吗,每次都要调这个函数不是很耗时?
12下一页

所属标签

相似分享

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