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

下载本文档

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

文档简介

1、STM32的PWM发送脉冲,周期和脉宽都可调了,但是现在不知道如何精确的控制所发的脉冲个数。具体要求就是在一段时间内大概50ms内发送5000-1W个脉冲 个数要很精确,误差2个以内可以接受该怎么控制呢?1接上一个外部中断口,在中断中计数2.用一个定时器 对发脉冲的时间进行控制各位大侠还有什么好的办法吗?求解啊!曲iWHn冊 LhOWNEfl-111112nxniDDmD mnznmDnc, A 00000009 ChODOMKCU 仙 XWOWfhdMiI ivhl i iriT-E,KT21TBD.QIHKLPWM溢出中断计数,是个不错的解决办法。如果一个上升沿算一个脉冲的话,控制周期(频

2、率)不就行了开启PWM输出的溢出中断,进入一次中断,就是一个波CC1G:产生捕捌上匕絞 1 KfT (Capture/oompare 1 generation) 该淀由软件置丁用于占生一个捕抑比较事件丫由帳件自动;W0 01无动作* 1:在通道CC1上产生一牛捕获丿比较爭件:若aittCCiE*为输出I设置CC1IF=1.若幵启对应的中新和DMA,则产生相应的中断和DMA.若通道CC1配*为输入I当前的计数番值捕获至TIMXCCRI寄存劈*设置CC1 IF=1若开肩对应的中惭和DMA,则产 生相应的中断和口叭若cdilF已经为仁則汝MCC1O仁原子哥 是这里吗? 设置这个寄存器或者只是简单的定

3、时器溢出中断oid TIM3_IRQHa ndler(void)if(TIM3-SR&0X0001)/ 溢出中断/计数TIM3-SR&=(1SMCR |= 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);是否开启

4、时钟(开启后每发送一个脉冲,定 时器加一)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= XBUF3 - 1;TIM_TimeBaseStructure.TIM_Prescaler= 0; / 时 钟预分频数TIM_TimeBaseStructure.T

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

6、bleConfig(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输出的PWMS号的模式,如周期、极性、占空比* 输入:无* 输出:无* 调用:内部调用*/void TIM4_PWM_Init(u16 T)TIM_

7、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 PWMsignals with 4 different dutycycles:TIM1CLK = 36 MHz, Prescaler = 0x0, TIM1 counter cloc

8、k = 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 du

9、ty cycle = (TIM1_CCR4/ TIM1_ARR)* 100 = 50%*/* Time base configuration */TIM_TimeBaseStructure.TIM_Period = T-1;/T usTIM_TimeBaseStructure.TIM_Prescaler = 72-1;TIM_TimeBaseStructure.TIM_ClockDivision = 0;TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM4, &TIM_TimeBase

10、Structure);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;TI

11、M_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_O

12、CPreload_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_Puls

13、e = 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

14、TIM4_PWM_START(void)TIM4_GPIO_Config();Tim2_Slave_Init();Tim3_Slave_Init(); TIM4_PWM_Init(XBUF0);好像还有一种方法, 就是利用定时器内部互联, 一个定时器的给另一个定时器提供时钟, 从模式貌似,成功了!定时器内部互联,一个 PWM 输出脉冲给另一个定时提供时钟,每来一个脉 冲,计数器值 +1,当 +到指定个数后,产生一次中断,然后关闭PWM 输出。发一次 跟发 n 次,每次都是设置的脉冲数! 很精确, 一个不多一个不少, 我测试了下 20us 的周期,发 5000 个,连续发了 7 次,都是准的!上

15、图!不过感觉这种方法还不是我想要的,毕竟两个定时器才控制一路脉冲,要是PWM的4个通道路分别给4个的定时器提供时钟,那就好了!刚看了下手册,这里确实能够选择比较捕获通道TIM IRGOSoiirc)T1M TRGOSource OC3Ref便用OC3REF作为鮭发输出(TRGO)TJM TRGOSuurte OC4Ref使用OC4REF作为飪发输出(TRGO)例:如果是1路脉冲的话,我选择TIM_TRGOSource_Update和TIM_TRGOSource_OC1样的效果, 不同在于后者每次脉冲会少一个。脉冲输出通道1脉冲输出通道2脉冲输出通道3脉冲输出通道4选择 TIM_TRGOSour

16、ce_OC1Ref选择 TIM_TRGOSource_OC2Ref选择 TIM_TRGOSource_OC3Ref选择 TIM_TRGOSource_OC4Ref这样话有个问题,是不是一个主定时器能有多个从定时器,从定时器:TIM2,TIM3TIM_SelectI nputTrigger(TIM2,TIM_TS_ITR3);TIM_SelectI nputTrigger(TIM3,TIM_TS_ITR3);主定时器:TIM4TIM_SelectOutputTrigger(TIM4,TIM_TRGOSource_OC1Ref|TIM_TRGOSource_OC2Ref); 卡到这里了,这个主定时

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

温馨提示

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

评论

0/150

提交评论