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

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

[复制链接]
z258121131 发布时间:2016-9-22 15:46
由于项目需要,需要发出固定个数的PWM脉冲,因为未接触过网上搜集的也多不行,后来根据官方手册调试成功。使用的第一种方式,后续的测试后放出。
% Q  o& B" @" y& N* Vvoid PWMS8_Init()
- m8 t6 ~. Y$ S; q6 q# B5 a{
% l- Y8 I2 \1 {8 ^' F  j' | GPIO_InitTypeDef GPIO_InitStructure;: R0 @1 P$ u# U* i; h
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;) |% u' k% E  I$ I1 z& K; R
TIM_OCInitTypeDef  TIM_OCInitStructure;
) u8 s& u6 _: D$ a9 F3 n+ U; ~   /* TIM4 clock enable */
5 x+ T: T( @8 G$ j) d4 \( W: J+ V  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);5 e7 E7 n) v5 a
  /* GPIOB clock enable */6 a' e: S, Q! C( c$ p
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);
+ h& ]+ ~' }2 s* B  g# P  /* TIM4_CH1 pin (PB.06) configuration */
% }3 h) {' W8 X) [  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;/ X! j: r4 L" T/ P: I
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
0 |  ?2 U" @5 ?5 Y5 ?' c) J0 W  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
- ?$ }" |* z2 j0 z% Z  GPIO_Init(GPIOC, &GPIO_InitStructure);
: ?3 h* |! ?4 I- x# R1 w; P . i: Q9 A3 C* _! C% W4 b
" J) R: V/ H1 `; Z2 v0 X
TIM_TimeBaseStructure.TIM_Period = 200;
+ J  |9 e6 N" e/ S9 ~  TIM_TimeBaseStructure.TIM_Prescaler = 7200;0 D( [; O( V) |- F) P
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
2 V# p1 g! y( _' v) J8 C; i TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
# c; A. H/ C4 i' Y" @+ b, x  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
7 S, d3 g- E! Y- d. x TIM_TimeBaseStructure.TIM_RepetitionCounter = 5;2 |' z! @' w% ]$ Y* t+ H5 P  A, S
  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);; F& M8 d- z2 V7 ]/ o9 B

6 ]& [+ \) g0 Z' ?* U TIM_GenerateEvent(TIM8,TIM_EventSource_Update);  N$ U+ U4 X8 ]7 i
TIM_InternalClockConfig(TIM8);
( D4 ~( Z* W; }# I# l" g: I$ | TIM_SelectOCxM(TIM8,TIM_Channel_2,TIM_OCMode_PWM1);
7 u+ L. D* [% K/ p' h: e# s5 W/* PWM1 Mode configuration: Channel2 */
+ q" q2 e6 ?8 g5 o5 O( B2 R  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
1 J! e* D" P( g: ~3 X6 l  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
$ |8 h  t2 s* p. H: \; y9 s  TIM_OCInitStructure.TIM_Pulse = 100;
0 g' X( z% J* f8 n. O5 j7 [  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;6 N" o& T* ]! _8 ~( o: M; {5 [' P
  TIM_OC2Init(TIM8, &TIM_OCInitStructure);
* h: t' t5 Y- ^! D  TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);
6 H" |, a: b6 W) q! E; c  TIM_ARRPreloadConfig(TIM8, ENABLE);
+ B" l3 |9 s- F5 B( T  /* TIM8 enable counter */
! E% D1 L( m) P0 H: V! R- v TIM_CtrlPWMOutputs(TIM8,ENABLE);
8 p! W1 N" C8 ]; W' a- r ( H- V. i4 X4 F% J2 [
TIM_SelectOnePulseMode(TIM8,TIM_OPMode_Single);
+ @; f  P4 d# l  r+ R  TIM_Cmd(TIM8, ENABLE);
5 o6 D! v+ Z0 F9 }" q( s. w}
2 K5 Y! j+ i4 k1 D; x0 a& }
3 S# K$ v2 N6 @9 m6 B以上是核心代码,自己可根据需要修改,生成不同个数以及频率的脉冲。
7 t! g, o. t/ t# C, l

通用定时器.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:559 ?2 s( y. N$ L& d% M
我修改了不起作用

2 F2 e$ Y/ {! w5 J- S4 h+ U这个功能只对高级定时器起作用,普通定时器实现不了
  1. if ((TIMx == TIM1) || (TIMx == TIM8))  
    ! \. G# \2 S* M! p
  2.   {5 C2 o& ^5 X' w+ U
  3.     /* Set the Repetition Counter value */: n- @; j! J$ |( N$ r
  4.     TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;
    $ _# F: b* c6 a7 J/ l/ e9 w  o
  5.   }
    7 {$ j/ M4 B9 F8 v4 K2 `, z+ f3 ~
复制代码
z258121131 回答时间:2016-12-14 09:28:05
foleon 发表于 2016-12-13 14:40
' @" u7 U7 B; a1 Q% z8 e你好,这段代码看不太明白能解释一下吗?我现在也需要调试步进电机,不知道怎么产生固定的脉冲数,我用的ti ...

, n+ v! ?$ u6 n5 h你只需要对应的修改引脚就可以了啊
琳风 回答时间:2018-10-16 10:45:18
z258121131 发表于 2016-12-15 09:06
% w* u* ^; @( G" x2 ~9 nTIM_TimeBaseStructure.TIM_RepetitionCounter = 1000,修改RCR寄存器的值
7 n5 i& }+ E/ `( ]. m& p9 v* Y4 y; E
RCR寄存器是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:287 K  N* v' d) P; e" W  w' p% C/ ]3 G" P: x
你只需要对应的修改引脚就可以了啊
- L# D- _! m" b  m  |+ g/ n) k
还是不明白,加入我要输出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
4 C. a- q+ i8 U8 JTIM_TimeBaseStructure.TIM_RepetitionCounter = 1000,修改RCR寄存器的值
% m! p" h' {2 ], K7 g
我修改了不起作用
z258121131 回答时间:2017-3-21 20:26:53
foleon 发表于 2017-3-13 15:55+ y! j$ u: S; L) O, d
我修改了不起作用

5 n# j8 C  S$ x# b  ^你要实现什么?传上来看看
牙签骑士 回答时间:2017-6-4 03:03:59
想问个问题,你这个最高速度多少; d% e* f6 i' r, l" H5 f( c4 [
Silenceasd 回答时间:2017-7-29 15:45:05
楼主  我怎么更改引脚,比如用PB0输出PWM呢$ D' H) j0 p3 [$ B  J1 C
Silenceasd 回答时间:2017-7-29 15:54:38
怎么改用其他io口输出脉冲呢?比如PB0
weizuokai 回答时间:2017-12-5 17:44:03
这个能重复输出吗,每次都要调这个函数不是很耗时?
12下一页

所属标签

相似分享

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