OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 28719|回复: 53

PWM发脉冲,怎么精确控制发脉冲的个数呢?

[复制链接]

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
发表于 2014-12-16 16:12:35 | 显示全部楼层 |阅读模式
5金钱
STM32的PWM发送脉冲,周期和脉宽都可调了,但是现在不知道如何精确的控制所发的脉冲个数。
具体要求就是在一段时间内大概50ms内发送5000-1W个脉冲  个数要很精确,误差2个以内可以接受
该怎么控制呢?
1.接上一个外部中断口,在中断中计数
2.用一个定时器 对发脉冲的时间进行控制

各位大侠还有什么好的办法吗?求解啊!

最佳答案

查看完整内容[请看2#楼]

PWM溢出中断计数,是个不错的解决办法。
电子人生!
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-16 16:12:36 | 显示全部楼层
PWM溢出中断计数,是个不错的解决办法。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

3

主题

26

帖子

0

精华

初级会员

Rank: 2

积分
75
金钱
75
注册时间
2014-12-8
在线时间
5 小时
发表于 2014-12-16 16:36:06 | 显示全部楼层
如果一个上升沿算一个脉冲的话,控制周期(频率)不就行了
回复

使用道具 举报

2

主题

37

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
484
金钱
484
注册时间
2014-9-5
在线时间
179 小时
发表于 2014-12-16 17:26:30 | 显示全部楼层
在脉冲中断里进行加一计数不行吗?
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-12-17 09:00:49 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
求详解!
电子人生!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-17 23:22:32 | 显示全部楼层
回复【5楼】翱翔云端的鸟:
---------------------------------
开启PWM输出的溢出中断,进入一次中断,就是一个波
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-12-18 10:32:46 | 显示全部楼层


原子哥  是这里吗? 设置这个寄存器
电子人生!
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-12-18 10:33:15 | 显示全部楼层
回复【6楼】正点原子:
---------------------------------
找了好久 没找到PWM溢出中断
电子人生!
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2014-12-18 10:35:23 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
或者只是简单的定时器溢出中断
oid TIM3_IRQHandler(void)
{
  if(TIM3->SR&0X0001)//溢出中断
  {
     ....     //计数
  }
  TIM3->SR&=~(1<<0);//清除中断标志位
}
电子人生!
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2014-12-18 23:17:37 | 显示全部楼层
回复【9楼】翱翔云端的鸟:
---------------------------------
看我们开发板:定时器中断例程。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

1

主题

6

帖子

0

精华

新手上路

积分
31
金钱
31
注册时间
2015-10-22
在线时间
0 小时
发表于 2015-10-22 14:52:22 | 显示全部楼层
回复【4楼】正点原子:
---------------------------------
你好  原子哥    中断计数的话  那怎么停止呢    还有停止了还想让他循环发送呢    
有没有实现好的源程序呢   我是STM32F103
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2015-10-25 23:17:10 | 显示全部楼层
回复【11楼】shallwe:
---------------------------------
这个自己想.
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
21
金钱
21
注册时间
2015-10-26
在线时间
0 小时
发表于 2015-10-26 14:26:23 | 显示全部楼层
回复【11楼】shallwe:
---------------------------------
我也是在学习中,不知道以下回答对不对,仅供参考。 
按你要求的频率设置TIMERX计数器周期的值,再设置 TimeCount比较值(TimerX_Period值/2), 当一个周期计数完成,就会产生TimerX的溢出中断,中断就标示一个PWM脉冲完成,这样会比较精确。
回复

使用道具 举报

8

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-10-19
在线时间
3 小时
发表于 2015-11-4 20:47:19 | 显示全部楼层
回复【9楼】翱翔云端的鸟:
---------------------------------
你好  你的这个程序写好了吗   我尝试按照定时器中断的方式记数  可是最终显示的数值是乱码
努力的人生才有意义
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2015-11-5 08:53:42 | 显示全部楼层
回复【14楼】没时间先生1214:
---------------------------------
http://www.openedv.com/posts/list/46194.htm
看我的这个帖子
电子人生!
回复

使用道具 举报

8

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-10-19
在线时间
3 小时
发表于 2015-11-5 09:08:55 | 显示全部楼层
回复【15楼】翱翔云端的鸟:
---------------------------------
好哒  谢谢你
努力的人生才有意义
回复

使用道具 举报

51

主题

1455

帖子

3

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2613
金钱
2613
注册时间
2011-1-25
在线时间
176 小时
发表于 2015-11-5 09:33:02 | 显示全部楼层
原子说得都对,使用pwm溢出中断。
一直努力就很好。
回复

使用道具 举报

8

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-10-19
在线时间
3 小时
发表于 2015-11-5 11:21:50 | 显示全部楼层


这是主函数


求教楼主   TIM1为主定时器,输出的PWM作为TIM3的时钟,可是我下载到板子上,TIM3完全不起作用,能帮忙看下不,谢谢啦

努力的人生才有意义
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2015-11-5 14:40:02 | 显示全部楼层
[mw_shl_code=c,true]void TIM4_GPIO_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; /* TIM4 clock enable */ //PCLK1经过2倍频后作为TIM4的时钟源等于72MHz RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); NVIC_Configuration(1); /* GPIOB clock enable */ RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC, ENABLE); /*GPIOB Configuration: TIM4 channel 1 and 2 as alternate function push-pull */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOB, &GPIO_InitStructure); GPIO_ResetBits(GPIOB,GPIO_Pin_6|GPIO_Pin_7); } void Tim2_Slave_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIM2); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); NVIC_Configuration(8); TIM_TimeBaseStructure.TIM_Period= XBUF[1] - 1; TIM_TimeBaseStructure.TIM_Prescaler= 0; //时钟预分频数 TIM_TimeBaseStructure.TIM_ClockDivision=0; //采样分频 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上溢出 TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure); TIM_SelectInputTrigger(TIM2,TIM_TS_ITR3);//选择TIM2的输入触发源 内部触发3 TIM4 TIM_InternalClockConfig(TIM2); TIM2->SMCR |= 0x0007;//设定从模式控制寄存器,外部时钟模式1 上升沿驱动计数 //TIM_UpdateDisableConfig(TIM4,ENABLE); TIM_ARRPreloadConfig(TIM2, ENABLE); TIM_ClearFlag(TIM2,TIM_FLAG_Update); //清除溢出中断标志 TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE); TIM_Cmd(TIM2,ENABLE);//是否开启时钟(开启后每发送一个脉冲,定时器加一) } void Tim3_Slave_Init(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_DeInit(TIM3); RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); NVIC_Configuration(9); TIM_TimeBaseStructure.TIM_Period= XBUF[3] - 1; TIM_TimeBaseStructure.TIM_Prescaler= 0; //时钟预分频数 TIM_TimeBaseStructure.TIM_ClockDivision=0; //采样分频 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上溢出 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); TIM_SelectInputTrigger(TIM3,TIM_TS_ITR3);//选择TIM2的输入触发源 内部触发3 TIM4 TIM_InternalClockConfig(TIM3); TIM3->SMCR |= 0x0007;//设定从模式控制寄存器,外部时钟模式1 上升沿驱动计数 //TIM_UpdateDisableConfig(TIM4,ENABLE); TIM_ARRPreloadConfig(TIM3, ENABLE); TIM_ClearFlag(TIM3,TIM_FLAG_Update); //清除溢出中断标志 TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE); TIM_Cmd(TIM3,ENABLE);//是否开启时钟(开启后每发送一个脉冲,定时器加一) } /* * 函数名:TIM4_Mode_Config * 描述 :配置TIM4输出的PWM信号的模式,如周期、极性、占空比 * 输入 :无 * 输出 :无 * 调用 :内部调用 */ void TIM4_PWM_Init(u16 T) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; u16 CCR1_Val = (T+1)/2; u16 CCR2_Val = (T+1)/2; u16 CCR3_Val = (T+1)/2; u16 CCR4_Val = (T+1)/2; /* ----------------------------------------------------------------------- TIM1 Configuration: generate 4 PWM signals with 4 different duty cycles: TIM1CLK = 36 MHz, Prescaler = 0x0, TIM1 counter clock = 36 MHz TIM1 ARR Register = 999 => TIM1 Frequency = TIM1 counter clock/(ARR + 1) TIM1 Frequency = 36 KHz. TIM1 Channel1 duty cycle = (TIM1_CCR1/ TIM1_ARR)* 100 = 50% TIM1 Channel2 duty cycle = (TIM1_CCR2/ TIM1_ARR)* 100 = 50% TIM1 Channel3 duty cycle = (TIM1_CCR3/ TIM1_ARR)* 100 = 50% TIM1 Channel4 duty cycle = (TIM1_CCR4/ TIM1_ARR)* 100 = 50% ----------------------------------------------------------------------- */ /* Time base configuration */ TIM_TimeBaseStructure.TIM_Period = T-1;//T us TIM_TimeBaseStructure.TIM_Prescaler = 72-1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); TIM4->CR1 &= ((u16)0x03FD);// UDIS enable /* PWM1 Mode configuration: Channel1 */ TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR1_Val; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM4, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); /* PWM1 Mode configuration: Channel2 */ TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR2_Val; TIM_OC2Init(TIM4, &TIM_OCInitStructure); TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); /* TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR3_Val; TIM_OC3Init(TIM4, &TIM_OCInitStructure); TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = CCR4_Val; TIM_OC4Init(TIM4, &TIM_OCInitStructure); TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);*/ TIM_ARRPreloadConfig(TIM4, ENABLE); TIM_SelectOutputTrigger(TIM4,TIM_TRGOSource_OC1Ref); /* TIM1 enable counter */ TIM_Cmd(TIM4, ENABLE); /* Main Output Enable */ TIM_CtrlPWMOutputs(TIM4, ENABLE); } void TIM4_PWM_START(void) { TIM4_GPIO_Config(); Tim2_Slave_Init(); Tim3_Slave_Init(); TIM4_PWM_Init(XBUF[0]); }[/mw_shl_code]

电子人生!
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2015-11-5 14:42:02 | 显示全部楼层
一主二从的方式
电子人生!
回复

使用道具 举报

29

主题

486

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3083
金钱
3083
注册时间
2014-7-19
在线时间
413 小时
 楼主| 发表于 2015-11-5 14:42:17 | 显示全部楼层
回复【18楼】没时间先生1214:
---------------------------------
看我的代码试试!
电子人生!
回复

使用道具 举报

7

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2015-7-17
在线时间
45 小时
发表于 2015-11-5 18:34:55 | 显示全部楼层
回复【21楼】翱翔云端的鸟:
---------------------------------
我提供我的方法给你参考。反正我是照你说的,输出可预设个数的PWM为目的。这种方法是完全用硬件产生预设个数的PWM后就自动停下的。不用进入中断计数之类。
方法是,使用两个timer1,2,设为互为主从,形成了环形的闭环互控形式。Tim1产生PWM输出,同时tim1溢出作为Tim2的预分频输入。tim2设为单脉冲模式,当计数达到ARP的值就产生一次溢出并停止自身的计数。而tim2的自动停止反过来控制tim1的enable,这样就会连同tim1也关停了。 我已经实验验证过是可行的,还用于我的拍摄模块读数据上。
我的个人小店:https://shop125553301.taobao.com/
回复

使用道具 举报

7

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2015-7-17
在线时间
45 小时
发表于 2015-11-5 18:36:48 | 显示全部楼层
回复【21楼】翱翔云端的鸟:
---------------------------------
#define PrescalerValue  57
#define PWM_Preload  36

/* rivate functions ---------------------------------------------------------*/

void TIM1_Configuration(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure; 
  GPIO_InitTypeDef GPIO_InitStructure;
       
  /* TIM1 clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

  /*GPIOA Configuration: TIM1 channel 1,remap to A.8 */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOA, &GPIO_InitStructure);  

  /* 配置定时器定时周期,计数模式为向上 */
  TIM_TimeBaseStructure.TIM_Period = (u32)PrescalerValue;
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  
  TIM_UpdateRequestConfig(TIM1,TIM_UpdateSource_Regular); /*Source of update is only counter overflow/underflow*/
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
       

  /* Output Compare Toggle Mode configuration */
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
  TIM_OCInitStructure.TIM_Pulse = WM_Preload;
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;

  TIM_OC1Init(TIM1, &TIM_OCInitStructure);  
  TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);

  /* TIM1 Main Output Enable */
  TIM_CtrlPWMOutputs(TIM1, ENABLE);

  /* Master Mode selection. TIM1 sets update as trigger output, act as prescaler to count TIM2 */
  TIM_SelectOutputTrigger(TIM1, TIM_TRGOSource_Update);

  /* Slave Mode selection */
  TIM_SelectInputTrigger(TIM1, TIM_TS_ITR1); // from TIM2
  TIM_SelectSlaveMode(TIM1, TIM_SlaveMode_Gated); //gated by enable of TIM2  

  /* Update TIM1*/
  TIM_GenerateEvent(TIM1,TIM_EventSource_Update);
  
  /*enable TIM1*/
  TIM_Cmd(TIM1, ENABLE);  
}

/****------------------------------------------------------------------------------********/
void TIM2_Configuration(void)
{
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure; 
       
  /* TIM2 clock enable */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);  

  /* 配置定时器定时周期,计数模式为向上 */
  TIM_TimeBaseStructure.TIM_Period = 10000;
  TIM_TimeBaseStructure.TIM_Prescaler = 0;
  TIM_TimeBaseStructure.TIM_ClockDivision = 0;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
  
  TIM_UpdateRequestConfig(TIM2,TIM_UpdateSource_Regular); /*Source of update is only counter overflow/underflow*/
  TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);    

  /* Master Mode selection. TIM2 sets Enable as trigger output, for gating TIM1 */
  TIM_SelectOutputTrigger(TIM2, TIM_TRGOSource_Enable);

  /* Slave Mode selection */
  TIM_SelectInputTrigger(TIM2, TIM_TS_ITR0); // from TIM1
  TIM_SelectSlaveMode(TIM2, TIM_SlaveMode_External1); //clocked by update of TIM1

   /* One ulse Mode selection ,TIM2 stop when overflow ocuur*/
  TIM_SelectOnePulseMode(TIM2, TIM_OPMode_Single);

  /* Update TIM2*/
  TIM_GenerateEvent(TIM2,TIM_EventSource_Update);

  /* TIM2 IT enable */
  TIM_ITConfig(TIM2, TIM_IT_Update , ENABLE);   
}

启动PWM则是:
TIM_SetAutoreload(TIM2,N-1);   //N为预设PWM个数
TIM_GenerateEvent(TIM2,TIM_EventSource_Update);
TIM_Cmd(TIM2, ENABLE);  
我的个人小店:https://shop125553301.taobao.com/
回复

使用道具 举报

8

主题

32

帖子

0

精华

初级会员

Rank: 2

积分
96
金钱
96
注册时间
2015-10-19
在线时间
3 小时
发表于 2015-11-5 19:16:49 | 显示全部楼层
回复【21楼】翱翔云端的鸟:
---------------------------------
谢谢楼主
努力的人生才有意义
回复

使用道具 举报

5

主题

15

帖子

0

精华

初级会员

Rank: 2

积分
57
金钱
57
注册时间
2015-8-26
在线时间
0 小时
发表于 2015-12-4 21:22:11 | 显示全部楼层
感谢楼主,我是用pwm控制步进滑台做机床的   试了好多种方法,脉冲个数不准 ,误差大得很,走着走着就飞了。正在测试楼主的方法 ,希望多交流。(我需要三路可独立精准控制频率和脉冲个数的PWM)
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-12-29
在线时间
12 小时
发表于 2015-12-29 09:58:16 | 显示全部楼层
整鼓猩 发表于 2015-11-5 18:36
回复【21楼】翱翔云端的鸟:
---------------------------------
#define        PrescalerValue        &nbsp;57

请问这个方法最多一次产生多少个脉冲呢?
回复

使用道具 举报

7

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2015-7-17
在线时间
45 小时
发表于 2015-12-29 11:08:19 | 显示全部楼层
网布 发表于 2015-12-29 09:58
请问这个方法最多一次产生多少个脉冲呢?

我的方法一次最多是65535个
我的个人小店:https://shop125553301.taobao.com/
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
5
金钱
5
注册时间
2016-2-1
在线时间
0 小时
发表于 2016-2-1 09:19:34 | 显示全部楼层
整鼓猩 发表于 2015-11-5 18:36
回复【21楼】翱翔云端的鸟:
---------------------------------
#define        PrescalerValue        &nbsp;57

请问你 TIM2的GPIO口不用配吗?
回复

使用道具 举报

7

主题

75

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
261
金钱
261
注册时间
2015-7-17
在线时间
45 小时
发表于 2016-2-1 15:12:23 | 显示全部楼层
EVEN_L 发表于 2016-2-1 09:19
请问你 TIM2的GPIO口不用配吗?

你用哪路timer作为pwm输出就只需设哪路的gpio
我的个人小店:https://shop125553301.taobao.com/
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-21
在线时间
18 小时
发表于 2016-3-9 23:04:23 | 显示全部楼层

时间过了这么久,不知道您还愿不愿意回答这个问题……
看到你的总结,一路主多路从,几路脉冲输出对应几个从定时器
141行:TIM_SelectOutputTrigger(TIM4,TIM_TRGOSource_OC1Ref);
可是TRGO信号就一个啊,这样做有什么意义吗?多从都是OC1上升沿计数,得到的不都是一样的个数吗?
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-21
在线时间
18 小时
发表于 2016-3-10 20:22:12 | 显示全部楼层
整鼓猩 发表于 2015-11-5 18:34
回复【21楼】翱翔云端的鸟:
---------------------------------
我提供我的方法给你参考。反正我是照你说的 ...

感谢你提供的方法,让我受益很多,起初不明白你的思路在于TIM2是如何触发TIM1的,看了你的代码理解了。这种方法很巧妙;感谢!
回复

使用道具 举报

1

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
357
金钱
357
注册时间
2015-12-11
在线时间
79 小时
发表于 2016-3-10 22:42:38 | 显示全部楼层
Jerry_9527 发表于 2016-3-10 20:22
感谢你提供的方法,让我受益很多,起初不明白你的思路在于TIM2是如何触发TIM1的,看了你的代码理解了。这 ...

听说还有用DMA的。
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-21
在线时间
18 小时
发表于 2016-3-11 12:29:12 | 显示全部楼层
lff1987 发表于 2016-3-10 22:42
听说还有用DMA的。

DMA的,在意法半导体,设计资源专区就有,我感觉数据量不大,用DMA效果不是很明显.
我用的是一个TIM1输出3路PWM,之后用一个TIM2互为主从,之后切换TIM1的TRGO信号,选择不同的OCxREF作为触发!
回复

使用道具 举报

6

主题

1097

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3571
金钱
3571
注册时间
2014-12-2
在线时间
365 小时
发表于 2016-3-11 12:52:19 | 显示全部楼层
坟贴了,


查了一下,咋没人提到TIM1->RCR?

高级定时器(TIM1、TIM8)有个RCR寄存器,可以完美解决问题。

正常情况下是CNT每溢出一次就产生一次中断,
但是有了RCR之后,是每溢出RCR次才进一次中断,
再配合TIM->CR1[OPM],有奇效,


所以,使用高级定时器,可以和容易解决。

网上也有类似的帖子,控制脉冲数的
坚决不用寄存器,拒绝重复造轮子。
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-21
在线时间
18 小时
发表于 2016-3-15 14:53:03 | 显示全部楼层
整鼓猩 发表于 2015-12-29 11:08
我的方法一次最多是65535个

突然发现没法搞一个脉冲, 因为定时器的ARR不能输入0, 真是蛋疼啊,呵呵~
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-21
在线时间
18 小时
发表于 2016-3-15 15:00:48 | 显示全部楼层

重复计数器,是可以实现,但是有局限性啊,那个重复计数器才8位,
如果配置定时器环, STM32F4的话, TIM1作为TIM2的预分频, 可以实现
单次2^32 + 2^16个脉冲个数, 2^16是TIM2的prescaler.
TIM2是32位计数器!
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-12-29
在线时间
12 小时
发表于 2016-3-29 17:10:46 | 显示全部楼层
Jerry_9527 发表于 2016-3-11 12:29
DMA的,在意法半导体,设计资源专区就有,我感觉数据量不大,用DMA效果不是很明显.
我用的是一个TIM1输出3路 ...

有个局限性,如果要两路不同频率的PWM信号同时发出不同个数呢?
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-21
在线时间
18 小时
发表于 2016-3-29 19:42:08 | 显示全部楼层
网布 发表于 2016-3-29 17:10
有个局限性,如果要两路不同频率的PWM信号同时发出不同个数呢?

这个的确是存在的, 如果要频率不同需要在加一路定时器,实际应用的时候有那么特殊吗?
这种情况,之前也考虑过,后来觉得没那个必要。一个控制电机,相同的速度能达到效果,何必自己找罪受!
回复

使用道具 举报

2

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
53
金钱
53
注册时间
2015-12-29
在线时间
12 小时
发表于 2016-3-30 16:43:38 | 显示全部楼层
Jerry_9527 发表于 2016-3-29 19:42
这个的确是存在的, 如果要频率不同需要在加一路定时器,实际应用的时候有那么特殊吗?
这种情况,之前 ...

还有个问题请教下,用这种方法怎么实现加减速比较好?
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-21
在线时间
18 小时
发表于 2016-3-30 19:08:27 | 显示全部楼层
网布 发表于 2016-3-30 16:43
还有个问题请教下,用这种方法怎么实现加减速比较好?

这个应该再简单不过了,改变PWM主控制的ARR,不就改变输出频率了吗;占空比50%即可!
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
15
金钱
15
注册时间
2016-7-20
在线时间
2 小时
发表于 2016-7-20 16:33:29 | 显示全部楼层
翱翔云端的鸟 发表于 2015-11-5 14:40
[mw_shl_code=c,true]void TIM4_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

楼主,您好!我看您的程序Tim4是主定时器,负责两路PWM输出,TIM2和TIM3为从模式定时器用来计数输出固定PWM波个数,对吧?但是我看程序中有个数组XBUF[],不是特别理解。XBUF[0]是指TIM4的定时周期;程序中的XBUF[1]和XBUF[3]是设置从定时器的定时周期,XBUF[1]和XBUF[3]是不是就是设置输出波的个数~期待您的回答!谢谢~
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
9
金钱
9
注册时间
2016-8-5
在线时间
0 小时
发表于 2016-8-5 11:42:56 | 显示全部楼层
Faraday 发表于 2015-12-4 21:22
感谢楼主,我是用pwm控制步进滑台做机床的&nbsp;&nbsp;&nbsp;试了好多种方法,脉冲个数不准&nbsp;,误差大 ...

你好,请问您的问题解决了吗?我现在也碰到此问题,需要用PWM产生两路精准控制频率和脉冲个数的PWM
回复

使用道具 举报

0

主题

1

帖子

0

精华

新手入门

积分
30
金钱
30
注册时间
2016-8-30
在线时间
6 小时
发表于 2016-8-30 11:08:53 | 显示全部楼层
本帖最后由 拂晓光明· 于 2016-8-30 11:09 编辑
整鼓猩 发表于 2015-11-5 18:36
回复【21楼】翱翔云端的鸟:
---------------------------------
#define        PrescalerValue         57

已验证23楼代码,效果拔群,感谢分享
回复

使用道具 举报

1

主题

8

帖子

0

精华

新手上路

积分
41
金钱
41
注册时间
2016-8-12
在线时间
9 小时
发表于 2016-10-17 23:37:01 | 显示全部楼层
记号学习了
回复

使用道具 举报

44

主题

298

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2016-9-9
在线时间
84 小时
发表于 2016-10-18 09:03:25 | 显示全部楼层
正点原子 发表于 2014-12-16 16:12
PWM溢出中断计数,是个不错的解决办法。

用定时器能做脉冲个数驱动电机吗?
回复

使用道具 举报

44

主题

298

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
209
金钱
209
注册时间
2016-9-9
在线时间
84 小时
发表于 2016-10-18 09:04:54 | 显示全部楼层
qq942266575 发表于 2015-11-5 09:33
原子说得都对,使用pwm溢出中断。

PWM溢出中断和定时器中断不是一个吧? 用定时器是不是也能计算脉冲个数
回复

使用道具 举报

0

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2015-10-15
在线时间
39 小时
发表于 2016-12-7 01:50:08 来自手机 | 显示全部楼层
Jerry_9527 发表于 2016-3-29 19:42
这个的确是存在的, 如果要频率不同需要在加一路定时器,实际应用的时候有那么特殊吗?
这种情况,之前 ...

我现在想要输出三路不同频率且各自输出精确的脉冲个数。这个如果用主从模式输出可控个数最少需要几个定时器呢
回复

使用道具 举报

0

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2015-10-15
在线时间
39 小时
发表于 2016-12-7 03:15:59 来自手机 | 显示全部楼层
本帖最后由 jpaekeo 于 2016-12-7 03:23 编辑

请问楼主你的程序是不是只是用time1的cc1产生频率独立且脉冲个数独立的方波呢?用哪路timer作为pwm输出就只需设置哪路gpio
回复

使用道具 举报

0

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
180
金钱
180
注册时间
2016-1-21
在线时间
18 小时
发表于 2016-12-22 10:06:03 | 显示全部楼层
本帖最后由 Jerry_9527 于 2016-12-22 10:11 编辑
jpaekeo 发表于 2016-12-7 01:50
我现在想要输出三路不同频率且各自输出精确的脉冲个数。这个如果用主从模式输出可控个数最少需要几个定时 ...

你先把相同频率,脉冲个数;弄明白,之后自然有取舍。如果需要不同频率,理论需要4个定时器就可以了。但如果脉冲数也同时不同,那就得需要6个定时器;而且不是所有定时器都能胜任~
回复

使用道具 举报

0

主题

56

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
254
金钱
254
注册时间
2015-10-15
在线时间
39 小时
发表于 2017-1-1 15:21:21 | 显示全部楼层
Jerry_9527 发表于 2016-12-22 10:06
你先把相同频率,脉冲个数;弄明白,之后自然有取舍。如果需要不同频率,理论需要4个定时器就可以了。但 ...

突然感觉这么做没什么意义了,控制脉冲的数量的话如果还用PWM波输出感觉傻傻的
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-20 22:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表