PWM发脉冲,怎么精确控制发脉冲的个数呢_第1页
PWM发脉冲,怎么精确控制发脉冲的个数呢_第2页
PWM发脉冲,怎么精确控制发脉冲的个数呢_第3页
PWM发脉冲,怎么精确控制发脉冲的个数呢_第4页
PWM发脉冲,怎么精确控制发脉冲的个数呢_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、STM32的PWM发送脉冲,周期和脉宽都可调了,但是现在不知道如何精确的控制所发的脉冲个数。具体要求就是在一段时间内大概50ms内发送5000-1W个脉冲  个数要很精确,误差2个以内可以接受该怎么控制呢?1.接上一个外部中断口,在中断中计数2.用一个定时器 对发脉冲的时间进行控制各位大侠还有什么好的办法吗?求解啊!PWM溢出中断计数,是个不错的解决办法。如果一个上升沿算一个脉冲的话,控制周期(频率)不就行了开启PWM输出的溢出中断,进入一次中断,就是一个波原子哥  是这里吗? 设置这个寄存器或者只是简单的定时器溢出中断 oid TIM3_IRQHandler(v

2、oid)   if(TIM3->SR&0X0001)/溢出中断         .     /计数      TIM3->SR&=(1<<0);/清除中断标志位 看我们开发板:定时器中断例程。你好  原子哥    中断计数的话  那怎么停止呢    还有停止了

3、还想让他循环发送呢     有没有实现好的源程序呢   我是STM32F103控制输出方波的脉冲数和周期好多人遇到这个问题,额!现在我用了两种方法实现,感觉都不好! 方案1:定时器翻转IO,到达指定个数关闭TIM方案2:PWM,开启比较捕获中断,到达指定个数关闭TIM感觉都是频繁进中断,占用大量CPU资源。不能做其他事了 void TIM4_GPIO_Config(void)   GPIO_InitTypeDef GPIO_InitStructure;   

4、0; /* 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, E

5、NABLE);    /*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;           / 复用

6、推挽输出  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;  

7、;  TIM_DeInit(TIM2);    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);    NVIC_Configuration(8);        TIM_TimeBaseStructure.TIM_Period= XBUF1 - 1;     TIM_TimeBaseStructure.TIM_Presc

8、aler= 0;         /时钟预分频数    TIM_TimeBaseStructure.TIM_ClockDivision=0;  /采样分频    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/向上溢出    TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure

9、);     TIM_SelectInputTrigger(TIM2,TIM_TS_ITR3);/选择TIM2的输入触发源  内部触发3  TIM4    TIM_InternalClockConfig(TIM2);    TIM2->SMCR |=  0x0007;/设定从模式控制寄存器,外部时钟模式1 上升沿驱动计数         /T

10、IM_UpdateDisableConfig(TIM4,ENABLE);    TIM_ARRPreloadConfig(TIM2, ENABLE);    TIM_ClearFlag(TIM2,TIM_FLAG_Update);    /清除溢出中断标志    TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);    TIM_Cmd(TIM2,ENABLE);/是否开启时钟(

11、开启后每发送一个脉冲,定时器加一)   void Tim3_Slave_Init(void)    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;    TIM_DeInit(TIM3);    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);    NVIC_Configuration(9);

12、     TIM_TimeBaseStructure.TIM_Period= XBUF3 - 1;     TIM_TimeBaseStructure.TIM_Prescaler= 0;         /时钟预分频数    TIM_TimeBaseStructure.TIM_ClockDivision=0;  /采样分频    TIM_

13、TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/向上溢出    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);     TIM_SelectInputTrigger(TIM3,TIM_TS_ITR3);/选择TIM2的输入触发源  内部触发3  TIM4    TIM_InternalClockConfig(TIM3); &

14、#160;  TIM3->SMCR |=  0x0007;/设定从模式控制寄存器,外部时钟模式1 上升沿驱动计数         /TIM_UpdateDisableConfig(TIM4,ENABLE);    TIM_ARRPreloadConfig(TIM3, ENABLE);    TIM_ClearFlag(TIM3,TIM_FLAG_Update);  

15、60; /清除溢出中断标志    TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE);    TIM_Cmd(TIM3,ENABLE);/是否开启时钟(开启后每发送一个脉冲,定时器加一)    /* * 函数名:TIM4_Mode_Config * 描述  :配置TIM4输出的PWM信号的模式,如周期、极性、占空比 * 输入  :无 * 输出  :无 * 调用 

16、; :内部调用 */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;  

17、0; 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    

18、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%  

19、;  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_TimeBaseSt

20、ructure.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   

21、;/* 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;

22、0;  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 = C

23、CR2_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,

24、 &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_OC4Prelo

25、adConfig(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_Ctr

26、lPWMOutputs(TIM4, ENABLE);  void TIM4_PWM_START(void)     TIM4_GPIO_Config();     Tim2_Slave_Init();    Tim3_Slave_Init();     TIM4_PWM_Init(XBUF0);好像还有一种方法,就是利用定时器内部互联,一个定时器的给另一个定时器提供时钟,主从模式貌似,成

27、功了!定时器内部互联,一个PWM输出脉冲给另一个定时提供时钟,每来一个脉冲,计数器值+1,当+到指定个数后,产生一次中断,然后关闭PWM输出。发一次  跟发n次,每次都是设置的脉冲数!很精确,一个不多一个不少,我测试了下  20us的周期,发5000个,连续发了7次,都是准的!上图!不过感觉这种方法还不是我想要的,毕竟两个定时器才控制一路脉冲,要是PWM的4个通道路分别给4个的定时器提供时钟,那就好了!刚看了下手册,这里确实能够选择比较捕获通道如果是1路脉冲的话,我选择TIM_TRGOSource_Update和TIM_TRGOSource_OC1 一样的效果,不

28、同在于后者每次脉冲会少一个。 脉冲输出通道1:选择TIM_TRGOSource_OC1Ref 脉冲输出通道2:选择TIM_TRGOSource_OC2Ref 脉冲输出通道3:选择TIM_TRGOSource_OC3Ref 脉冲输出通道4:选择TIM_TRGOSource_OC4Ref 这样话有个问题,是不是一个主定时器能有多个从定时器,从定时器:TIM2,TIM3 TIM_SelectInputTrigger(TIM2,TIM_TS_ITR3); TIM_SelectInputTrigger(TIM3,TIM_TS_ITR3); 主定时器:TIM4 TIM_SelectOutputTrigge

29、r(TIM4,TIM_TRGOSource_OC1Ref|TIM_TRGOSource_OC2Ref); 卡到这里了,这个主定时器的触发输入该如何选择啊,上面这样可行吗? 为何每次都有1个脉冲的差距啊,蛋都碎了要是能一对一触发就好了,我还以为是OC1Ref触发TIM2,OC2Ref触发TIM3,想多了, OC1就能触发TIM2和TIM3了,现在正常了,个数也很准了! 但是,中断频繁的问题解决了,还有一个问题 一个定时器的PWM的两个通道的频率是一样的,这就意味着我用TIM4发出去的脉冲  虽然可以控制个数不一样,但是周期还是一样的 这对于先前要求的周期个数分别可控又走远了,看来一个主定时器 只能有一种周期方波产生,可以有多个不同个数相同周期方波产生! 我总结了一下,应用场合如下(个人总结,可能有所偏差或者错误) 周期个数都独立可控 -  几路脉冲输出对应几个主定时器 周期可控不独立个数可控且独立-一路主多路从,几路脉冲输出对应几个从定时器不知道这个算法准不准,楼主帮我测一下吧。void puls(u16 f,u16 count)  unsigned char flag=1;        u16 number,tem

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论