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

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

[复制链接]
z258121131 发布时间:2016-9-22 15:46
由于项目需要,需要发出固定个数的PWM脉冲,因为未接触过网上搜集的也多不行,后来根据官方手册调试成功。使用的第一种方式,后续的测试后放出。
" N' k  G# |& J- avoid PWMS8_Init()7 b4 s: B- [1 d+ Q
{/ {0 e" D. E6 g
GPIO_InitTypeDef GPIO_InitStructure;1 G5 l# D% z& t4 A( [$ S
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;# b3 b2 Q# M0 j; f8 v' s5 o
TIM_OCInitTypeDef  TIM_OCInitStructure;
! Y- J, d3 k; C# o# k   /* TIM4 clock enable */
1 s9 @* z: S! t" \  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);. m# S; r9 J1 _$ `1 d
  /* GPIOB clock enable */
* e2 f1 }8 m5 @2 K) j% ~( C3 p, N  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);- b6 L% l' c+ P/ d& H
  /* TIM4_CH1 pin (PB.06) configuration */
2 A* _- b* s0 P0 O0 R  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;  c# g8 a1 O/ H3 N" F3 B
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;5 @, n; c; F$ G! ^4 d- a( Q
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
9 n8 A3 O! e$ X0 H4 D' a; J6 D  GPIO_Init(GPIOC, &GPIO_InitStructure);. G6 I1 q. [6 v5 W6 l4 e3 i- p! T
" d% t- r% u! _

' v1 F4 g: K  t, M* r TIM_TimeBaseStructure.TIM_Period = 200;
8 n1 o! I' I3 G, h2 f  TIM_TimeBaseStructure.TIM_Prescaler = 7200;$ J1 M9 @( R6 C, W+ S4 Z# p& K
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
2 Z/ A" y$ k" L1 B* { TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
+ i" x1 s6 o* v2 M5 O8 i8 m  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
* H, }9 S* q1 r. B; F TIM_TimeBaseStructure.TIM_RepetitionCounter = 5;
4 Q3 ]0 A6 b3 U& l& Y9 K  TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure);9 h" V" l, P8 {, l2 Y
5 c) k5 y4 L) D
TIM_GenerateEvent(TIM8,TIM_EventSource_Update);
/ C- ]6 P2 h  j+ d TIM_InternalClockConfig(TIM8);
! L5 g1 I4 J+ \$ I) y5 \' d7 L TIM_SelectOCxM(TIM8,TIM_Channel_2,TIM_OCMode_PWM1);  @% B& a# F& A8 }3 {9 ]" z
/* PWM1 Mode configuration: Channel2 *// Q* _6 [( j8 x
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
8 N* O2 f& Q" ]1 p5 l  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
) g) v7 L! P! A* n  TIM_OCInitStructure.TIM_Pulse = 100;
0 Q8 x% R, y; f  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
! R8 O+ [4 C3 O% a# p  TIM_OC2Init(TIM8, &TIM_OCInitStructure);
: b) s& y3 k8 Q. F7 D3 s7 ^  TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable);
4 _/ e' X3 u. H( }  TIM_ARRPreloadConfig(TIM8, ENABLE);
9 ~( T. l8 c5 E3 Z0 M. ^  /* TIM8 enable counter */
# a7 z% i3 U$ d. ^/ e' t( N TIM_CtrlPWMOutputs(TIM8,ENABLE);
3 @( Q% E0 `1 P6 j9 l+ `
- L3 z6 l0 c( B$ B' ?( L0 D TIM_SelectOnePulseMode(TIM8,TIM_OPMode_Single);& J6 ~. }/ O" F) b( F; k: _) A# N& o
  TIM_Cmd(TIM8, ENABLE);
6 M! R  k2 o; H6 b- K( B( L% m}
+ Y& P( }* u$ @. \8 @' e  `
1 _" U9 z" R5 y以上是核心代码,自己可根据需要修改,生成不同个数以及频率的脉冲。+ l3 N, `8 C5 R% j) }

通用定时器.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( C5 n( l- v" q4 @: d1 }5 k
我修改了不起作用
/ ^2 a  \7 a0 R* v9 L
这个功能只对高级定时器起作用,普通定时器实现不了
  1. if ((TIMx == TIM1) || (TIMx == TIM8))  / D& R  Y/ o& i' ]; d: t
  2.   {. X7 z/ `! C! x9 B$ R- j5 T! M, z
  3.     /* Set the Repetition Counter value */9 h' w( g* l( E) |% \. a# A: Z
  4.     TIMx->RCR = TIM_TimeBaseInitStruct->TIM_RepetitionCounter;
    0 n* O4 ^$ i2 F
  5.   }/ L/ `( K1 U: g
复制代码
z258121131 回答时间:2016-12-14 09:28:05
foleon 发表于 2016-12-13 14:40( l3 q7 r, K( i" S
你好,这段代码看不太明白能解释一下吗?我现在也需要调试步进电机,不知道怎么产生固定的脉冲数,我用的ti ...

+ U+ {% y6 {- C0 F" j你只需要对应的修改引脚就可以了啊
琳风 回答时间:2018-10-16 10:45:18
z258121131 发表于 2016-12-15 09:06
& R& F' v+ U/ a/ {4 mTIM_TimeBaseStructure.TIM_RepetitionCounter = 1000,修改RCR寄存器的值

- Y! f7 t* b' L. j8 Q1 NRCR寄存器是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 s, u2 G8 E' k) @2 Y- I, X6 m
你只需要对应的修改引脚就可以了啊

& g$ F" L( \8 f还是不明白,加入我要输出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
$ H1 R/ J7 |$ j2 w$ x* \TIM_TimeBaseStructure.TIM_RepetitionCounter = 1000,修改RCR寄存器的值

7 o2 \- i2 U+ l) f2 H我修改了不起作用
z258121131 回答时间:2017-3-21 20:26:53
foleon 发表于 2017-3-13 15:55
, D3 J) [4 V+ X0 @  \我修改了不起作用

2 p: ~7 h) ?8 e# \7 A; Q9 o你要实现什么?传上来看看
牙签骑士 回答时间:2017-6-4 03:03:59
想问个问题,你这个最高速度多少
% A# I: ~. M$ j: g1 a2 M
Silenceasd 回答时间:2017-7-29 15:45:05
楼主  我怎么更改引脚,比如用PB0输出PWM呢: b1 Z& e4 Q# H7 E# w
Silenceasd 回答时间:2017-7-29 15:54:38
怎么改用其他io口输出脉冲呢?比如PB0
weizuokai 回答时间:2017-12-5 17:44:03
这个能重复输出吗,每次都要调这个函数不是很耗时?
12下一页

所属标签

相似分享

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