打印

发送固定个数脉冲的方法

[复制链接]
2730|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
xduct|  楼主 | 2010-7-23 21:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 xduct 于 2010-7-23 21:02 编辑

需要输出500hz的方波,但是只输出20个周期。
我自己的方案,使用定时器输出500hz的方波,利用系统滴答始终计数40ms,然后关闭定时器。(此方案有个问题,经常会出现,定时器不工作的时候,一直处于高电平。)
在网上看到有用两个定时器,一个定时器使能另一个定时器,高电平开启方波输出,低电平关闭,但是一直搞不出来。那位指点一下。
沙发
香水城| | 2010-7-23 21:49 | 只看该作者
方案是对的,有问题是你操作有问题。

使用特权

评论回复
板凳
xduct|  楼主 | 2010-7-23 22:01 | 只看该作者
定时器使能关闭后,输出管脚应该是高电平还是低电平?我用示波器测量的时候,感觉定时器不工作的时候,高低电平也会变换出现。是不是关闭定时器那一时刻,如果是高电平,之后就保持高电平;如果关闭的那一时刻是低电平,之后就保持低电平?

使用特权

评论回复
地板
xduct|  楼主 | 2010-7-23 22:04 | 只看该作者
我是用开发板带的例程更改的,自己调整了一下频率,然后就是在主循环里进行定时开关定时器

使用特权

评论回复
5
lut1lut| | 2010-7-26 10:05 | 只看该作者
使用TIM之间的同步模式中的gate mode,例程库中有个例子LZ可以参考:

STM32F10x_StdPeriph_Examples\TIM\Cascade_Synchro

使用特权

评论回复
6
香水城| | 2010-7-26 10:33 | 只看该作者
定时器使能关闭后,输出管脚应该是高电平还是低电平?我用示波器测量的时候,感觉定时器不工作的时候,高低电平也会变换出现。是不是关闭定时器那一时刻,如果是高电平,之后就保持高电平;如果关闭的那一时刻是低电 ...
xduct 发表于 2010-7-23 22:01


定时器使能关闭后,输出管脚应该是高电平还是低电平?要看你关闭定时器的那一时刻,输出电平是高还是低,只要控制的好,它就会按照你的要求输出。

使用特权

评论回复
7
CrazyST| | 2010-7-26 18:37 | 只看该作者
手册的意思,端口复用功能开启,外设自动取代GPIO接管IO电平,外设中有关端口输出控制项关闭后,端口电平由GPIO的ODR寄存器决定,如果是TIM1,还可以在刹车寄存器BKR和输出空闲状态寄存器OISR中修改空闲状态电平。

使用特权

评论回复
8
xduct|  楼主 | 2010-7-27 21:30 | 只看该作者
这个控制还没搞明白,香主能不能给点拨一下。
6# 香水城

使用特权

评论回复
9
dfsa| | 2010-7-27 21:35 | 只看该作者
香主已经点拨的很多了,余下来的要自己悟了

使用特权

评论回复
10
xduct|  楼主 | 2010-7-27 22:24 | 只看该作者
悟性太差了,这点东西误了一个星期了,哎 9# dfsa

使用特权

评论回复
11
香水城| | 2010-7-27 22:38 | 只看该作者
真的是悟性差了点,:L:PWM信号的特点就是信号电平一会儿高、一会儿低,比如你的500Hz方波就是持续1ms的高电平,再持续1ms的低电平,如果你关闭产生这个方波的定时器的时机,正好是在它输出高电平时,那么关闭了定时器后,如果没有其它动作,这个信号线当然会保持这个高电平了,反之亦然。

所以关闭定时器的时机非常重要。

使用特权

评论回复
12
xduct|  楼主 | 2010-7-27 22:53 | 只看该作者
现在的问题就是这个时机怎么掌握,在关闭之前检测他是不是低电平?不是低电平,等他低了再关?
11# 香水城

使用特权

评论回复
13
xduct|  楼主 | 2010-7-27 23:00 | 只看该作者
TIM_TimeBaseStructure.TIM_Period = 7199;
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);

  TIM_TimeBaseStructure.TIM_Period = 9;
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  TIM_TimeBaseStructure.TIM_Period = 9;
  TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

  /* Master Configuration in PWM1 Mode */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 3599;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  TIM_OC2Init(TIM2, &TIM_OCInitStructure);

  /* Select the Master Slave Mode */
  TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);

  /* Master Mode selection */
  TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_OC2Ref);

  /* Slaves Configuration: PWM1 Mode */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_Pulse = 4;

  TIM_OC1Init(TIM3, &TIM_OCInitStructure);

  TIM_OC1Init(TIM4, &TIM_OCInitStructure);

  /* Slave Mode selection: TIM3 */
  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Gated);
  TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1);

  /* Select the Master Slave Mode */
  TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable);

  /* Master Mode selection: TIM3 */
  TIM_SelectOutputTrigger(TIM3, TIM_TRGOSource_Update);

  /* Slave Mode selection: TIM4 */
  TIM_SelectSlaveMode(TIM4, TIM_SlaveMode_Gated);
  TIM_SelectInputTrigger(TIM4, TIM_TS_ITR2);
  
  /* TIM enable counter */
  TIM_Cmd(TIM3, ENABLE);
  TIM_Cmd(TIM2, ENABLE);
  TIM_Cmd(TIM4, ENABLE);

这是配置的代码,板子上测试高电平的时候工作,低电平的时候有个定时器不工作,现在唯一的问题就是,空闲时的电平有时低有时高

使用特权

评论回复
14
香水城| | 2010-7-28 09:02 | 只看该作者
现在的问题就是这个时机怎么掌握,在关闭之前检测他是不是低电平?不是低电平,等他低了再关?
11# 香水城
xduct 发表于 2010-7-27 22:53


对的,你可以通过测试信号,等它低了再关;因为脉冲的频率和脉冲个数都是已知的,所以也可以通过计算,准确地知道它应该在什么时候变低,并关闭定时器。

使用特权

评论回复
15
myzcp123| | 2010-7-28 14:29 | 只看该作者
14# 香水城
把哪只引脚设置为高阻状态不可以吗?

使用特权

评论回复
16
香水城| | 2010-7-28 14:33 | 只看该作者
除非有片外的下拉电阻,否则把引脚设置为高阻状态并不能保证信号线变低。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

11

主题

44

帖子

0

粉丝