ImageVerifierCode 换一换
格式:DOCX , 页数:12 ,大小:273.72KB ,
资源ID:29508781      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/29508781.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(stm32的定时器输入捕获与输出比较.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

stm32的定时器输入捕获与输出比较.docx

1、stm32的定时器输入捕获与输出比较定时器1的输出比较模式怎么用。利用这个功能输出一个1KHZ,占空比为10%的程序怎么写啊?求高人指点1、陪定时器1的功能为特殊功能,不是普通IO在PERCFG这里2、P1SEL引脚选择3、P1DIR设为输出4、T3CC0设置周期5、T3CC1设置占空比6、T3CCTL0 设置通道07、T3CCTL1 设置通道18、T3CTL设为模模式9、用T3CTL打开即可*以下是用定时器做频率源,用定时器测量该频率的应用程序!*调 试STM32的定时器好几天了,也算是对STM32的定时器有了点清楚的认识了。我需要测量4路信号的频率然后通过DMA将信号的频率传输到存储器区域

2、, 手册说的很明白每个定时器有4个独立通道。然后我就想能不能将这4路信号都连接到一个定时器的4个通道上去。理论上应该是行的通的。刚开始俺使用的是 TIM2的123通道,TIM4的2通道来进行频率的测量。由于没有频率发生器,所以我用tim3作为信号源,用TIM2,TIM4来进行测量就ok了 (刚好4个通道了)。请看一开始的程序,以TIM2的1,3通道为例子(2通道设置方法一样):TIM_ICInitStructure.TIM_ICMode =TIM_ICMode_ICAP;/配置为输入捕获模式TIM_ICInitStructure.TIM_Channel =TIM_Channel_1;/选择通道

3、1TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising;/输入上升沿捕获TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI;/通道方向选择TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1;/每次检测到捕获输入就触发一次捕获TIM_ICInitStructure.TIM_ICFilter =0x0;/滤波TIM_ICInit(TIM2, &TIM_ICInitStructure);/TIM2通道1配置完毕TIM

4、_ICInitStructure.TIM_ICMode = TIM_ICMode_ICAP;/配置为输入捕获模式TIM_ICInitStructure.TIM_Channel =TIM_Channel_3;/选择通道3TIM_ICInitStructure.TIM_ICPolarity =TIM_ICPolarity_Rising;/输入上升沿捕获TIM_ICInitStructure.TIM_ICSelection =TIM_ICSelection_DirectTI;/TIM_ICInitStructure.TIM_ICPrescaler =TIM_ICPSC_DIV1;/每次检测到捕获输入

5、就触发一次捕获TIM_ICInitStructure.TIM_ICFilter = 0x0;/滤波TIM_ICInit(TIM2, &TIM_ICInitStructure);/TIM2通道3配置完毕以上是输入捕获配置还需要做的工作就是(参考stm32参考手册的TIM的结构框图):TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1);/参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);/复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一

6、个更新线号TIM_SelectMasterSlaveMode(TIM2,TIM_MasterSlaveMode_Enable);/主从模式选择这样我们就可以很轻松的就得到了连接在TIM2的通道1上的信号的频率,但是3通道的频率的值永远都是跳动的不准,测试了半天也没有找到根本原因,请看TIM的结构框图的一部分 红色箭头所指,这才找到原因,触发的信号源只有这四种,而通道3上的计数器的值不可能在接受到信号的上升沿时候,有复位这个动作,找到原因了。这就是3 通道上的数据不停跳动的原因,要想得到信号的频率也是有办法的,可以取连续两次捕捉的值之差,这个值就是信号的周期,自己根据实际情况去算频率吧。有以上可

7、以得到:stm32的TIM2的四个通道可以同时配置成输入捕捉模式,但是计算CH3,CH4信号的频率步骤有点繁琐(取前后捕捉的差值),但是他的CH1,和CH2可以轻松得到:通道1TIM_SelectInputTrigger(TIM2,TIM_TS_TI1FP1);/参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);/复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号TIMx-CRR1的值即为信号的周期通道2:TIM_SelectInputTrigger(TIM

8、2,TIM_TS_TI2FP2);/参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位TIM_SelectSlaveMode(TIM2,TIM_SlaveMode_Reset);/复位模式-选中的触发输入(TRGI)的上升沿初始化计数器,并且产生一个更新线号TIMx-CRR2的值即为信号的周期STM32的定时器外设功能强大得超出了想像力,STM32一共有8个都为16位的定时器。其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器。这些定时器使STM32具有定时、信号的频率测量、信号的PWM测量、PWM输出、三相

9、6步电机控制及编码器接口等功能,都是专门为工控领域量身订做的。基本定时器:具备最基本的定时功能,下面是它的结构:我们来看看它的启动代码:void TIM2_Configuration(void)基本定时器TIM2的定时配置的结构体(包含定时器配置的所有元素例如:TIM_Period= 计数值)TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;设置TIM2_CLK为72MHZ(即TIM2外设挂在APB1上,把它的时钟打开。)RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 ,ENABLE);设置计数值位1000TIM_T

10、imeBaseStructure.TIM_Period=1000;将TIM2_CLK为72MHZ除以72 = 1MHZ为定时器的计数频率TIM_TimeBaseStructure.TIM_Prescaler= 71;这个TIM_ClockDivision是设置时钟分割,这里不分割还是1MHZ的计数频率TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;设置为向上计数模式;(计数模式有向上,向下,中央对齐1,中央对齐2,中央对齐3)TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up

11、;将配置好的设置放进stm32f10x-tim.c的库文件中TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);清除标志位TIM_ClearFlag(TIM2,TIM_FLAG_Update);使能TIM2中断TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);使能TIM2外设TIM_Cmd(TIM2,ENABLE);通用定时器:就比基本定时器复杂得多了。除了基本的定时,它主要用在测量输入脉冲的频率、脉冲宽与输出PWM脉冲的场合,还具有编码器的接口。我们来详细讲解:如何生成PWM脉冲通用定时器可以利用GPIO引脚进行脉冲输出,

12、在配置为比较输出、PWM输出功能时,捕获/比较寄存器TIMx_CCR被用作比较功能,下面把它简称为比较寄存器。这里直接举例说明定时器的PWM输出工作过程:若配置脉冲计数器TIMx_CNT为向上计数,而重载寄存器TIMx_ARR(相当于库函数写法的TIM_Period的值N)被配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄存器

13、TIMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)。如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A乘以触发脉冲的时钟周期,即输出PWM的占空比为A/(N+1)。如果不想看的可以直接看我标注的红色字体,就大体可以理解。下面我们来编写具体代码和讲解:void TIM3_GPIO_Config(void)配置TIM3复用输出PWM的IOGPIO_InitTypeDefGPIO_InitStructure;打开TIM3的时

14、钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);打开GPIOA和GPIOB的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA| RCC_APB2Periph_GPIOB, ENABLE);配置PA6.PA7的工作模式GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6 |GPIO_Pin_7;GPIO_InitStructure.GPIO_Mode =GPIO_Mode_AF_PP;GPIO_InitStructure.GPIO_Speed =GPIO_Speed_50MH

15、z;GPIO_Init(GPIOA,&GPIO_InitStructure);配置PB0.PB1的工作模式GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0 |GPIO_Pin_1;GPIO_Init(GPIOB,&GPIO_InitStructure);void TIM3_Mode_Config(void)TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;/初始化TIM3的时间基数单位TIM_OCInitTypeDefTIM_OCInitStructure;/初始化TIM3的外设u16 CCR1_Val= 500;u16 CC

16、R2_Val= 375;u16 CCR3_Val= 250;u16 CCR4_Val= 125;/PWM信号电平跳变值(即计数到这个数值以后都是低电平之前都是高电平)TIM3的时间基数单位设置(如计数终止值:999,从0开始;计数方式:向上计数)TIM_TimeBaseStructure.TIM_Period= 999;TIM_TimeBaseStructure.TIM_Prescaler= 0;TIM_TimeBaseStructure.TIM_ClockDivision= TIM_CKD_DIV1 ;TIM_TimeBaseStructure.TIM_CounterMode= TIM_Co

17、unterMode_Up;TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);TIM3的外设的设置TIM_OCInitStructure.TIM_OCMode= TIM_OCMode_PWM1;/TIM脉冲宽度调制模式1TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable;/这个暂时不知道,stm32固件库里没有搜到。应该是定时器输出声明使能的意思TIM_OCInitStructure.TIM_Pulse =CCR1_Val;/设置了待装入捕获比较寄存器的脉冲值TIM_OCInitStru

18、cture.TIM_OCPolarity= TIM_OCPolarity_High;/TIM输出比较极性高TIM_OC1Init(TIM3,&TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);/使能或者失能TIMx在CCR1上的预装载寄存器下面3路PWM输出和上面的一样不再解说TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse =CCR2_Val;TIM_OC2Init(TIM3,

19、&TIM_OCInitStructure);TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable;TIM_OCInitStructure.TIM_Pulse =CCR3_Val;TIM_OC3Init(TIM3,&TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);TIM_OCInitStructure.TIM_OutputState= TIM_Ou

20、tputState_Enable;TIM_OCInitStructure.TIM_Pulse =CCR4_Val;TIM_OC4Init(TIM3,&TIM_OCInitStructure);TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);TIM_ARRPreloadConfig(TIM3,ENABLE);/使能TIM3重载寄存器ARRTIM_Cmd(TIM3,ENABLE);/使能TIM3太累了边看边写都这个点了2014年7月27日0:24:13在自己床上写的。下面是看看我们程序达到的4路PWM的效果:可以看到明显占空比不同的4路pwm波。这一节终于讲完,个人觉得敲一遍代码学起来还是蛮容易懂的。希望看到的人也能搞懂。最后补充一点pwm具体能干什么?特别是对广大电子DIY爱好者的应用:智能小车的电机控制:我们可以利用pwm来控制我们的智能小车的车速;机器人:给“机器人关节”舵机周期一定(我以前玩过具体多少毫秒忘记了)pwm波就可以控制舵机的转动角度了;呼吸灯:输入不同的pwm波就可以达到明暗渐明渐暗的

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1