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

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

[复制链接]
z258121131 发布时间:2016-9-22 15:46
由于项目需要,需要发出固定个数的PWM脉冲,因为未接触过网上搜集的也多不行,后来根据官方手册调试成功。使用的第一种方式,后续的测试后放出。) P' g3 G5 I/ v2 K% V5 B) V
void PWMS8_Init()! D; l! W, E) A1 n: t. e- m
{4 s, x  n3 ?/ c5 c: G
GPIO_InitTypeDef GPIO_InitStructure;
2 l, D2 M' ?7 e8 D1 j2 u! k TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;3 g$ Z. l+ T' R7 p' l( ?$ y9 O
TIM_OCInitTypeDef  TIM_OCInitStructure;
. {5 h# h/ o: t   /* TIM4 clock enable */: j$ e1 b7 C6 m! W/ Y) i
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
: o, c( q  o3 a6 X& f  /* GPIOB clock enable */
) J8 V: ^# ^- l" A  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);' R  C. e/ U# P: Z, Y2 P7 c
  /* TIM4_CH1 pin (PB.06) configuration */
4 P0 [8 e* C( ?; u4 a) v$ s% }& x  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;: f, f- O0 d1 N; O
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;4 f2 U5 A% d" F+ m, j  M
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
% r8 w* [  F9 k" k7 ^: J( s" _  GPIO_Init(GPIOC, &GPIO_InitStructure);7 S  A" P$ R- t# v

1 ]. y) Q2 r8 T7 u  f& U ! Z6 R+ x- l9 A0 p# M
TIM_TimeBaseStructure.TIM_Period = 200;/ @. {3 S5 p! z7 i. N+ X
  TIM_TimeBaseStructure.TIM_Prescaler = 7200;
' ^6 C- W2 U7 c0 k2 j/ K  TIM_TimeBaseStructure.TIM_ClockDivision = 0;/ v6 \( X( {  x7 W/ w
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;* `+ X  j, m  |' C( O' x
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;; x+ B/ o2 P8 ^
TIM_TimeBaseStructure.TIM_RepetitionCounter = 5;
  r6 [  s7 m+ O2 v( l$ V) D  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);* r' F! I: h6 P5 N# o- b5 G4 K
8 c- }; {- }( d: y7 l
TIM_GenerateEvent(TIM8,TIM_EventSource_Update);
; x7 c7 l8 [$ U1 ~: l TIM_InternalClockConfig(TIM8);
0 v2 h! i7 j0 q7 K: t TIM_SelectOCxM(TIM8,TIM_Channel_2,TIM_OCMode_PWM1);
  n  \2 L+ F+ |' Z" Z/* PWM1 Mode configuration: Channel2 */* c0 x- S8 Y' c) Y8 U6 W7 |9 Q
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;9 L! d& T( V! A8 |* M
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
. Y* v: p0 a+ l' D) P  TIM_OCInitStructure.TIM_Pulse = 100;
% ~0 m- J+ N+ p+ L% G  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;; T0 p" D2 Q# x: {2 V
  TIM_OC2Init(TIM8, &TIM_OCInitStructure);
' R- Y- {$ b$ B0 c8 N  TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);: D( j( l8 O0 ~) U' h! l
  TIM_ARRPreloadConfig(TIM8, ENABLE);
* |9 n, d" k! i  ?. g  /* TIM8 enable counter */   Q+ n2 Q& m& V; \
TIM_CtrlPWMOutputs(TIM8,ENABLE);
) h% S8 R3 l) N3 ]: Q* K. O' \ & L+ w8 u) N2 J3 @$ E# g
TIM_SelectOnePulseMode(TIM8,TIM_OPMode_Single);
& ?' d! z& s0 y* ^0 F  TIM_Cmd(TIM8, ENABLE);   E7 L6 v8 ]; \$ [. h
}
) j- j! d" v' z& Z; j$ @  t2 g( h0 z0 v, U4 c
以上是核心代码,自己可根据需要修改,生成不同个数以及频率的脉冲。
) h6 ]3 L- z# O5 I& o; v

通用定时器.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
& ~/ |/ n( C) `1 E. H7 M* g我修改了不起作用

( O  Y/ z4 v  h. G5 B这个功能只对高级定时器起作用,普通定时器实现不了
  1. if ((TIMx == TIM1) || (TIMx == TIM8))  $ z0 ^8 d  T0 J- V3 f+ `, i9 z
  2.   {
    ( V/ I2 Q- S1 e; J
  3.     /* Set the Repetition Counter value */+ F2 `' {9 v' @4 }! y
  4.     TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;, ~1 N, E0 M1 a) m
  5.   }' m9 s/ Q, e* X) l" M9 s
复制代码
z258121131 回答时间:2016-12-14 09:28:05
foleon 发表于 2016-12-13 14:40
4 e0 Y% l) L8 Q' r" i; r你好,这段代码看不太明白能解释一下吗?我现在也需要调试步进电机,不知道怎么产生固定的脉冲数,我用的ti ...
: M% O6 m4 u+ F, Y9 E
你只需要对应的修改引脚就可以了啊
琳风 回答时间:2018-10-16 10:45:18
z258121131 发表于 2016-12-15 09:06
0 }8 Z: T) w  jTIM_TimeBaseStructure.TIM_RepetitionCounter = 1000,修改RCR寄存器的值

* a1 \  e' d, E- ^- pRCR寄存器是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:28
* W1 r) N6 v( z你只需要对应的修改引脚就可以了啊
& g$ z# B  G: o$ k" n. ^, O
还是不明白,加入我要输出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:066 M) u; V; [8 {8 H8 J! ^
TIM_TimeBaseStructure.TIM_RepetitionCounter = 1000,修改RCR寄存器的值
# M( S* l  Y# I: b3 \9 l! n: X6 _1 o7 x
我修改了不起作用
z258121131 回答时间:2017-3-21 20:26:53
foleon 发表于 2017-3-13 15:55. D: E$ N7 Y0 C" f( y( M, [
我修改了不起作用

) y& P: A8 y: c9 ~你要实现什么?传上来看看
牙签骑士 回答时间:2017-6-4 03:03:59
想问个问题,你这个最高速度多少
" ]" o! A; t6 r, K( g
Silenceasd 回答时间:2017-7-29 15:45:05
楼主  我怎么更改引脚,比如用PB0输出PWM呢
; v+ I5 C) f5 V" K
Silenceasd 回答时间:2017-7-29 15:54:38
怎么改用其他io口输出脉冲呢?比如PB0
weizuokai 回答时间:2017-12-5 17:44:03
这个能重复输出吗,每次都要调这个函数不是很耗时?
12下一页

所属标签

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