




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 通信网络建设完工后的用户服务措施
- 语言学习中的心理调适心得体会
- 内镜护士职业发展培训计划
- 企业员工道德培训发展计划
- 2025新员工岗前安全培训考试试题附完整答案(夺冠)
- 2025企业安全培训考试试题答案高清
- 2025年企业员工岗前安全培训考试试题(黄金题型)
- 2025厂级员工安全培训考试试题及答案4A
- 2025企业负责人安全培训考试试题及完整答案(考点梳理)
- 2024-2025工厂车间安全培训考试试题附参考答案【综合卷】
- 辽宁协作校2024-2025学年度下学期高三第二次模拟考试语文试卷(含答案解析)
- 2025-2030汽车扬声器市场发展现状分析及行业投资战略研究报告
- 期中考试考后分析总结主题班会《全员出动寻找消失的分数》
- 2025年广东省广州市广大附中等校联考中考语文模拟试卷(4月份)
- 成都树德中学2025年高三第四次联考物理试题文试卷
- 民法典课程大纲
- 2025-2030中国数据安全服务行业市场深度分析及前景趋势与投资研究报告
- 医疗AI辅助康复管理
- 山东省天一大联考·齐鲁名校教研体2024-2025学年(下)高三年级第六次联考(物理试题及答案)
- 房地产市场报告 -2025年第一季度青岛写字楼和零售物业市场概况报告
- 2025年03月人力资源社会保障部所属单位笔试历年典型考题(历年真题考点)解题思路附带答案详解
评论
0/150
提交评论