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

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

[复制链接]
z258121131 发布时间:2016-9-22 15:46
由于项目需要,需要发出固定个数的PWM脉冲,因为未接触过网上搜集的也多不行,后来根据官方手册调试成功。使用的第一种方式,后续的测试后放出。
' ^5 O4 @' H8 rvoid PWMS8_Init()2 n1 C! Q, ]: U5 i. C$ F& ^7 A" P6 B
{
0 Y- \9 \7 y8 Q GPIO_InitTypeDef GPIO_InitStructure;
; x% f0 r6 P2 Y$ d9 j TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
; O5 _* ?% ]' G- ^9 g$ m. T! x TIM_OCInitTypeDef  TIM_OCInitStructure;
9 q5 C% a& C$ e& Z   /* TIM4 clock enable */
( _! Z4 n+ p; C3 R  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);
: I& C6 Z) B9 M/ h' J, S- ~' L& [  /* GPIOB clock enable */
% w/ u2 d- t+ X: g9 o5 Y. S* R9 O  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);" Y: d7 }6 c' l. [
  /* TIM4_CH1 pin (PB.06) configuration */- S. r/ I, J3 K, f6 ^/ e$ q
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;' F5 L7 v. @5 i+ _5 q
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;. i7 }. c* e# G6 }
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
4 u7 f  ?' c. X2 n& b! ?  GPIO_Init(GPIOC, &GPIO_InitStructure);
5 z& M- s7 C2 i. F+ x
, M' ^$ G3 z, y- O
# N& O( G1 @5 k( J. l4 m* Q0 m TIM_TimeBaseStructure.TIM_Period = 200;5 R/ z* }7 d' U
  TIM_TimeBaseStructure.TIM_Prescaler = 7200;# Q# E1 b- v( v6 _; p2 h
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;. O( H6 S- R/ p+ a8 S- y* `$ i  f
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
" N, A! }7 C0 V! g6 i) Z* |9 r  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;) h# s, v1 m$ w- _
TIM_TimeBaseStructure.TIM_RepetitionCounter = 5;4 v1 h! B8 N+ H& D: R, U) O2 v
  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);
* _; n+ h9 v9 H3 r9 D & Y  t: F5 _7 l5 z+ u3 e" k
TIM_GenerateEvent(TIM8,TIM_EventSource_Update);) o" x, K: a) v# P5 Z: W* _
TIM_InternalClockConfig(TIM8);
; H& u  t3 A: O: K1 n+ \- _3 J8 a3 ] TIM_SelectOCxM(TIM8,TIM_Channel_2,TIM_OCMode_PWM1);/ r$ b. a' b5 z& g4 w7 C* L7 u
/* PWM1 Mode configuration: Channel2 */1 n. O# b: b3 a
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
+ n0 n" n* `" F1 L" \  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;1 u+ U7 m4 |% R4 _! V0 x' U
  TIM_OCInitStructure.TIM_Pulse = 100;" e* y5 G: N6 ~0 ~  U
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;  L; T: P' m/ r- p
  TIM_OC2Init(TIM8, &TIM_OCInitStructure);; i6 a2 [5 s" P9 H9 [
  TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);
4 y- K- Q) q! ]- @. U$ H) Z  TIM_ARRPreloadConfig(TIM8, ENABLE);% |3 a4 {% N% g
  /* TIM8 enable counter */
/ N/ S3 s+ o% H+ W+ V2 c TIM_CtrlPWMOutputs(TIM8,ENABLE);' X/ j  E+ B- j
0 U" Q) T- J4 M, F6 B& i2 `) K
TIM_SelectOnePulseMode(TIM8,TIM_OPMode_Single);. e' E$ H- `0 F& V
  TIM_Cmd(TIM8, ENABLE);
0 n* T1 D' m; f7 R% p+ U}
0 ^; ~  {8 Z* w2 d; S4 E6 W1 b3 O& n- g
以上是核心代码,自己可根据需要修改,生成不同个数以及频率的脉冲。
: u' l; O8 }, E( z9 F- Y4 @

通用定时器.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- {- g; G' Y! n7 i  n! J
我修改了不起作用
0 z' R$ f5 N# M* k# l+ G4 A$ ]
这个功能只对高级定时器起作用,普通定时器实现不了
  1. if ((TIMx == TIM1) || (TIMx == TIM8))  1 T* g7 j" N6 i% w7 ?0 t# L
  2.   {" b- n- L2 M, P& s8 x
  3.     /* Set the Repetition Counter value */; X% M# m+ q+ l
  4.     TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;* {4 ?$ Z. `7 J( J
  5.   }1 f$ X2 M& d" w" }. o9 |* c* }
复制代码
z258121131 回答时间:2016-12-14 09:28:05
foleon 发表于 2016-12-13 14:407 r( k) ]0 D7 W  e" a3 C
你好,这段代码看不太明白能解释一下吗?我现在也需要调试步进电机,不知道怎么产生固定的脉冲数,我用的ti ...

" ]; l; f, _( P; j' D! \2 k- o你只需要对应的修改引脚就可以了啊
琳风 回答时间:2018-10-16 10:45:18
z258121131 发表于 2016-12-15 09:064 ~$ G3 W5 s6 P$ S: E
TIM_TimeBaseStructure.TIM_RepetitionCounter = 1000,修改RCR寄存器的值
! b4 \; n" x' C
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:288 r; A5 l) g- j4 v( R! e6 _1 o0 {
你只需要对应的修改引脚就可以了啊
0 ~9 ~# @4 Y& x6 e8 y- A: ?
还是不明白,加入我要输出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. a  s. X; s" z% P7 L
TIM_TimeBaseStructure.TIM_RepetitionCounter = 1000,修改RCR寄存器的值
  U" d1 @8 I8 ?$ O
我修改了不起作用
z258121131 回答时间:2017-3-21 20:26:53
foleon 发表于 2017-3-13 15:55
/ x9 s! D6 M7 z0 n' l$ m我修改了不起作用

0 k( z4 S, ~  @8 \) V. O你要实现什么?传上来看看
牙签骑士 回答时间:2017-6-4 03:03:59
想问个问题,你这个最高速度多少" G& J. C) a# W+ T
Silenceasd 回答时间:2017-7-29 15:45:05
楼主  我怎么更改引脚,比如用PB0输出PWM呢$ E( Q8 B, D2 F
Silenceasd 回答时间:2017-7-29 15:54:38
怎么改用其他io口输出脉冲呢?比如PB0
weizuokai 回答时间:2017-12-5 17:44:03
这个能重复输出吗,每次都要调这个函数不是很耗时?
12下一页

所属标签

相似分享

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