PWM发脉冲,怎么精确控制发脉冲的个数呢_第1页
PWM发脉冲,怎么精确控制发脉冲的个数呢_第2页
PWM发脉冲,怎么精确控制发脉冲的个数呢_第3页
PWM发脉冲,怎么精确控制发脉冲的个数呢_第4页
PWM发脉冲,怎么精确控制发脉冲的个数呢_第5页
免费预览已结束,剩余5页可下载查看

付费下载

下载本文档

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

文档简介

1、STM32的PWM发送脉冲,周期和脉宽都可调了,但是现在不知道如何精确的控制所发的脉冲个数。具体要求就是在一段时间内大概50ms内发送5000-1W个脉冲个数要很精确,误差2个以内可以接受该怎么控制呢?1 .接上一个外部中断口,在中断中计数2 .用一个定时器对发脉冲的时间进行控制各位大侠还有什么好的办法吗?求解啊!PWM溢出中断计数,是个不错的解决办法。如果一个上升沿算一个脉冲的话,控制周期(频率)不就行了开启PWM输出的溢出中断,进入一次中断,就是一个波位1CC1G:产生拔脚比较1.事件(Captur旬8mpare1generation)读位由软件置用于产生一力捕获/比较事件p由硬件自动清唱

2、无动彳忸1:在通道CC1上叩生一个插树比较事件:着通道CC1配置为输出1设置CC1IF=1.若开启对应的中断和口MA,则产生相拊的:祈和DMA,若遍道CC1配置为输入1当前的计数器值捕获至TIMk_CCR1寄存器:设置CC1IF=1,若开启对应的中断和口MA,则产生相庾的中断和DMA.若CC1IF己姓为1,则设置CC1OF=1n原子哥是这里吗?设置这个寄存器或者只是简单的定时器溢出中断oidTIM3_IRQHandler(void)(if(TIM3->SR&0X0001)/溢出中断/计数)TIM3->SR&=(1<<0);/清除中断标志位)看我们开发板:

3、定时器中断例程。你好原子哥中断计数的话那怎么停止呢还有停止了还想让他循环发送呢有没有实现好的源程序呢我是STM32F103控制输出方波的脉冲数和周期好多人遇到这个问题,额!现在我用了两种方法实现,感觉都不好!方案1:定时器翻转IO,到达指定个数关闭TIM方案2:PWM开启比较捕获中断,到达指定个数关闭TIM感觉都是频繁进中断,占用大量CP0源。不能做其他事了voidTIM4_GPIO_Config(void)(GPIO_InitTypeDefGPIO_InitStructure;/*TIM4clockenable*/PCLK1经过2倍频后作为TIM4的时钟源等于72MHzRCC_APB1Per

4、iphClockCmd(RCC_APB1Periph_TIM4,ENABLE);NVIC_Configuration(1);/*GPIOBclockenable*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPI|ORBCC_APB2Periph_GPIOC,ENABLE);/*GPIOBConfiguration:TIM4channel1and2asalternatefunctionpush-pull*/GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode

5、=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);voidTim2_Slave_Init(void)一一TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_DeInit(TIM2);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);NVIC

6、_Configuration(8);TIM_TimeBaseStructure.TIM_Period=XBUF1-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_I

7、TR3);/选择TIM2的输入触发源内部襁发3TIM4TIM_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);/是否开启时钟(开启后每发送一个脉

8、冲,定时器加一)voidTim3_Slave_Init(void)TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;TIM_DeInit(TIM3);RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);NVIC_Configuration(9);TIM_TimeBaseStructure.TIM_Period=XBUF3-1;TIM_TimeBaseStructure.TIM_Prescaler=0;/时钟预分频数TIM_TimeBaseStructure.TIM_ClockDivision=0;/采样分

9、频TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;/向上溢出TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);TIM_SelectInputTrigger(TIM3,TIM_TS_ITR3);/选择TIM2的输入触发源内部襁发3TIM4TIM_InternalClockConfig(TIM3);TIM3->SMCR|=0x0007;/设定从模式控制寄存器,外部时钟模式1上升沿驱动计数/TIM_UpdateDisableConfig(TIM4,ENABLE);TIM_ARRP

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

11、ture;TIM_OCInitTypeDefTIM_OCInitStructure;u16CCR1_Val=(T+1)/2;u16CCR2_Val=(T+1)/2;u16CCR3_Val=(T+1)/2;u16CCR4_Val=(T+1)/2;/*TIM1Configuration:generate4PWMignalswith4differentdutycycles:TIM1CLK=36MHz,Prescaler=0x0,TIM1counterclock=36MHzTIM1ARRRegister=999=>TIM1Frequency=TIM1counterclock/(ARR+1)TIM

12、1Frequency=36KHz.TIM1Channel1dutycycle=(TIM1_CCR1/TIM1_ARR)*100=50%TIM1Channel2dutycycle=(TIM1_CCR2/TIM1_ARR)*100=50%TIM1Channel3dutycycle=(TIM1_CCR3/TIM1_ARR)*100=50%TIM1Channel4dutycycle=(TIM1_CCR4/TIM1_ARR)*100=50%*/*Timebaseconfiguration*/TIM_TimeBaseStructure.TIM_Period=T-1;/TusTIM_TimeBaseStru

13、cture.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);/UDISenable/*PWM1Modeconfiguration:Channel1*/TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;TIM

14、_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);/*PWM1Modeconfiguration:Channel2*/TIM_OCInitStructure.TIM_O

15、utputState=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_OCInitStru

16、cture);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_SelectOutputTrig

17、ger(TIM4,TIM_TRGOSource_OC1Ref);/*TIM1enablecounter*/TIM_Cmd(TIM4,ENABLE);/*MainOutputEnable*/TIM_CtrlPWMOutputs(TIM4,ENABLE);voidTIM4_PWM_START(void)TIM4_GPIO_Config();Tim2_Slave_Init();Tim3_Slave_Init();TIM4_PWM_Init(XBUF0);好像还有一种方法,就是利用定时器内部互联,一个定时器的给另一个定时器提供时钟,主从模式貌似,成功了!定时器内部互联,一个PWM输出脉冲给另一个定时提

18、供时钟,每来一个脉冲,计数器值+1,当+到指定个数后,产生一次中断,然后关闭PWM输出。发一次跟发n次,每次都是设置的脉冲数!很精确,一个不多一个不少,我测试了下20us的周期,发5000个,连续发了7次,都是准的!上图!不过感觉这种方法还不是我想要的,毕竟两个定时器才控制一路脉冲,要是PWM的4个通道路分别给4个的定时器提供时钟,那就好了!刚看了下手册,这里确实能够选择比较捕获通道Table53%TlM_TRGOSaurce值TIM_IRGOSourC描述TIMTROOScurce.Reset使用寄存器TIM_EGR的UG位作为触发输出(TRGO)IIM_TRGOSuurce_EnabIe使

19、用计数器使能CEN作为触发输出(TRGO)TIM.TRGOScurceUpdate使用更新事件作为触发输出(TRGO)TlM_TRGOSource_OCI一旦捕扰或者比匹配发生,当标志位CC1F被设置时触发输出发送一个肯定.峡祝(TRGO1TIM.TRGOSourceOClRef使用OCIREF作为触发输出TtRG。)TlM_TRGOSource_OC2Ref使用OC2REF作为触发输出(TRCK>)T1M_TRGOSourceOC3Ref使用OC3REF作为触发输对CTRGO)TJM_Tf<GOSuurfe_OC4Ref使用OC4REF作为触发输出(TRGO)例:如果是1路脉冲的

20、话,我选择TIM_TRGOSource_Update和TIM_TRGOSource_OC1一样的效果,不同在于后者每次脉冲会少一个。脉冲输出通道1脉冲输出通道2脉冲输出通道3脉冲输出通道4选择TIM_TRGOSource_OC1Ref选择TIM_TRGOSource_OC2Ref选择TIM_TRGOSource_OC3Ref选择TIM_TRGOSource_OC4Ref这样话有个问题,是不是一个主定时器能有多个从定时器,从定时器:TIM2,TIM3TIM_SelectInputTrigger(TIM2,TIM_TS_ITR3);TIM_SelectInputTrigger(TIM3,TIM_TS_ITR3);主定时器:TIM4TIM_SelectOutputTrigger(TIM4,TIM_TRGOSource_OC1Ref|TIM_TRGOSource_OC2Ref);卡到这里了,这个主定时器的触发输入该如何选择啊,上面这样可行吗?为何每次都有

温馨提示

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

最新文档

评论

0/150

提交评论