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

上传人:lx****y 文档编号:143902553 上传时间:2022-08-26 格式:DOC 页数:15 大小:290.50KB
收藏 版权申诉 举报 下载
stm32的定时器输入捕获与输出比较_第1页
第1页 / 共15页
stm32的定时器输入捕获与输出比较_第2页
第2页 / 共15页
stm32的定时器输入捕获与输出比较_第3页
第3页 / 共15页
资源描述:

《stm32的定时器输入捕获与输出比较》由会员分享,可在线阅读,更多相关《stm32的定时器输入捕获与输出比较(15页珍藏版)》请在装配图网上搜索。

1、sm32的定时器输入捕获与输出比较(215-028 09:26:24)转载标签:i分类:stm32明确一点对比A的构造,stm32有个A,每个AD有很多通道,使用哪个通道就配置成哪个通道,这里定时器也如此,有很多定时器TIM,每个定时器有很多CH(通道),可以配置为输入捕捉-测量频率用,也可以配置为输出比较-输出M使用输入捕捉:可以用来捕获外部事件,并为其赋予时间标记以说明此事件的发生时刻。外部事件发生的触发信号由单片机中对应的引脚输入(具体可以参考单片机的datashe),也可以通过模拟比较器单元来实现.时间标记可用来计算频率,占空比及信号的其他特征,以及为事件创建日志,主要是用来测量外部信

2、号的频率.输出比较:定时器中计数寄存器在初始化完后会自动的计数。从otto计数到top。并且有不同的工作模式。另外还有个比较寄存器。一旦计数寄存器在从bot到op计数过程中与比较寄存器匹配则会产生比较中断(比较中断使能的情况下).然后根据不同的工作模式计数寄存器将清零或者计数到top值。、朋友,可以解释一下输入捕获的工作原理不?很简单,当你设置的捕获开始的时候,p会将计数寄存器的值复制到捕获比较寄存器中并开始计数,当再次捕捉到电平变化时,这是计数寄存器中的值减去刚才复制的值就是这段电平的持续时间,你可以设置上升沿捕获、下降沿捕获、或者上升沿下降沿都捕获.它没多大用处,最常用来测频率。计数寄存器

3、的初值,是自己写进去的吗?是的,不过默认不要写入我如果捕获上升沿,两个值相减,代表的时两个上升沿中间那段电平的时间。对不?是的mer1有五个通道(对应五个IO引脚),在同一时刻,只能捕获一个引脚的值,对不?那是肯定的,通道很像ADC通道,是可以进行切换的.那输出比较的原理你可以帮我介绍一下不?这里有两个单元:一个计数器单元和一个比较单元,比较单元就是个双缓冲寄存器,比较单元的值是可以根据不同的模式设置的,与此同时,计数器在不停的计数,并不停的与比较寄存器中的值进行比较,当计数器的值与比较寄存器的值相等的时候一个比较匹配就发生了,根据自己的设置,匹配了是io电平取反、变低、还是变高,就会产生不同

4、的波形了。比较单元的值是人为设进去的吧?是的,但是他要根据你的控制寄存器的配置,来初始化你的比较匹配寄存器。上面这个总看不懂,好像不不止你说的那几种情况:“匹配了是电平取反、变低、还是变高,就会产生不同的波形了”就是比较匹配了你要IO电平怎么办?是清0还是置1?还是怎么样?这样才能产生波形啊 要不然你要比较单元有什么用呢?设置输出就是置1,清除输出就是置0,切换输出就是将原来的电平取反,对不?是的 你理解的很快011:计数器向上计数达到最大值时将引脚置1,达到0时,引脚电平置0,对不?恩定时器1的输出比较模式怎么用。利用这个功能输出一个Z,占空比为1的程序怎么写啊?求高人指点1、陪定时器1的功

5、能为特殊功能,不是普通IO在PRCG这里2、P1SEL引脚选择3、1DIR设为输出4、T3CC设置周期、T3CC设置占空比6、T3CTL0 设置通道7、TCCTL1 设置通道1、T3TL设为模模式9、用T3L打开即可*以下是用定时器做频率源,用定时器测量该频率的应用程序!!*调 试S3的定时器好几天了,也算是对STM32的定时器有了点清楚的认识了。我需要测量路信号的频率然后通过MA将信号的频率传输到存储器区域,手册说的很明白每个定时器有4个独立通道。然后我就想能不能将这路信号都连接到一个定时器的个通道上去.理论上应该是行的通的。刚开始俺使用的是 TM2的2通道,I的2通道来进行频率的测量。由于

6、没有频率发生器,所以我用tim3作为信号源,用IM2,TIM4来进行测量就o了 (刚好个通道了)。 请看一开始的程序,以TI2的1,通道为例子(通道设置方法一样): TIM_ntStrutureTIM_ICd =I_ICMode_IAP;/配置为输入捕获模式TI_ICInitStructe。IM_Chae =TIM_Chanel_1;/选择通道 TIM_ICniSct.TI_ICPolaiy=TIMICPlrity_Rin;/输入上升沿捕获 TIM_ICIitStruct.TM_IClctio =TIMICSeleto_Diret;/通道方向选择ICInitStructure。TIMCPres

7、aler =TIM_CPSC_IV1;/每次检测到捕获输入就触发一次捕获T_ICnitSruture。TI_ICFter =x;/滤波 TM_In(M, TIMCnitStruure);/TI2通道1配置完毕TIMCIiStcture.I_CMode =IM_ICMd_IP;/配置为输入捕获模式 TM_IInittrucure。TIChannel =TIMChael;/选择通道3 MIiStutur。TI_CPolarty =T_ICPolarity_Risn;/输入上升沿捕获 T_ICItStrutre.TIISection TIM_Slcton_irctI;/TIM_ICInitSuctu

8、re。M_IPrescaer =T_IPSC_DI1;/每次检测到捕获输入就触发一次捕获 TI_IIntStucture.M_IFilter= 0;/滤波T_ICnit(TI2, TIMCnitructure);/M通道3配置完毕 以上是输入捕获配置 还需要做的工作就是(参考t32参考手册的TM的结构框图): T_SltnutTrggr(TIM,TTS_1FP1);/参考TIM结构图选择滤波后的TI输入作为触发源,触发下面程序的复位 TMSelctSlavode(IM2,I_avMde_Ree);/复位模式选中的触发输入(RGI)的上升沿初始化计数器,并且产生一个更新线号TIMSelcMast

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

10、式,但是计算C3,CH4信号的频率步骤有点繁琐(取前后捕捉的差值),但是他的H1,和CH可以轻松得到: 通道1 IM_SelctInputTrigr(TIM,IM_TSTI11);/参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位 I_electSlvMe(TIM,IM_SlavModeRese);/复位模式-选中的触发输入(RGI)的上升沿初始化计数器,并且产生一个更新线号 TIMxCRR1的值即为信号的周期 通道: IM_eecnputTrigger(M2,TMTSTI2FP2);/参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位 TIMSelecS

11、lavede(M2,TIM_SlaveMod_Reset);/复位模式选中的触发输入(RG)的上升沿初始化计数器,并且产生一个更新线号 IMx-CR的值即为信号的周期ST32的定时器外设功能强大得超出了想像力,TM32一共有8个都为1位的定时器.其中M6、TIM7是基本定时器;TIM、TIM3、TIM4、TM5是通用定时器;IM1和TIM8是高级定时器.这些定时器使TM3具有定时、信号的频率测量、信号的PWM测量、PWM输出、三相6步电机控制及编码器接口等功能,都是专门为工控领域量身订做的。基本定时器:具备最基本的定时功能,下面是它的结构:我们来看看它的启动代码:oi TIConfiguati

12、on(vod)基本定时器TI2的定时配置的结构体(包含定时器配置的所有元素例如:TIM_Peiod 计数值)TIM_TimBaseInitTyefTIM_TimeStuture;设置TIM_CLK为72MHZ(即TIM2外设挂在PB1上,把它的时钟打开.)RC_APB1eriphClckCmd(RCC_APBPerphIM2,EABE);设置计数值位000TI_TmeaseStrcureTIM_Pero0;将TI2_CL为MHZ除以7= 1MH为定时器的计数频率TIM_imBaseStucture.TI_rescaler= 1;这个TM_lockDiio是设置时钟分割,这里不分割还是1MH的计

13、数频率TI_TimBseStucture。TIM_Clcvisin=TI_CK_DV1;设置为向上计数模式;(计数模式有向上,向下,中央对齐1,中央对齐2,中央对齐3)TIMTieaseStructr.TIM_Counterde=TI_CounterMde_U;将配置好的设置放进tm32f10-ti。c的库文件中IM_TimBaseInit(TIM2,M_TmeBaeStrcre);清除标志位TI_CeaFla(TIM2,TM_FLA_Uda);使能TIM2中断TIMTCnfg(TIM,TIM_TUpdate,ENABE);使能TI2外设IM_Cd(T2,ENABLE);通用定时器:就比基本定

14、时器复杂得多了。除了基本的定时,它主要用在测量输入脉冲的频率、脉冲宽与输出M脉冲的场合,还具有编码器的接口.我们来详细讲解:如何生成PWM脉冲通用定时器可以利用GPO引脚进行脉冲输出,在配置为比较输出、PWM输出功能时,捕获/比较寄存器TI_C被用作比较功能,下面把它简称为比较寄存器。这里直接举例说明定时器的PWM输出工作过程:若配置脉冲计数器TMx_CNT为向上计数,而重载寄存器TIM_RR(相当于库函数写法的TM_Peri的值N)被配置为N,即TIMxCN的当前计数值数值在TIMxCLK时钟源的驱动下不断累加,当Ix_CN的数值大于N时,会重置TIMxNT数值为0重新计数.而在TIxCNT

15、计数的同时,TMxCNT的计数值X会与比较寄存器TMx_C预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄存器IMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器的数值大于或等于比较寄存器的值A时,输出低电平(或高电平)。如此循环,得到的输出脉冲周期就为重载寄存器TIMx_AR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值乘以触发脉冲的时钟周期,即输出P的占空比为A/()。如果不想看的可以直接看我标注的红色字体,就大体可以理解.下面我们来编写具体代码和讲解:void TIM3_GIO_Config(oid)配置

16、IM3复用输出W的IOGI_IntTypeDefGPInittrcture;打开TIM3的时钟RCC_PBPeriphClocCmd(CC_P1Peiph_TIM3,ENBLE);打开POA和GPIOB的时钟RCC_AeriphCkmd(RC_APBPiphGPIOARCC_APBPp_GOB, EALE);配置PA6.7的工作模式GIO_Iittructure.GPI_in=GO_Pin_6 GO_Pi_7;O_IniSrucurGP_Mode =GPI_od_AF_PP;GPO_nitStruue.GO_Speed GPIO_Spee_0MHz;PI_Init(PIA,&GPIO_Init

17、Strucue);配置PB0.PB1的工作模式PIO_IitSrctre.GPIO_Pin=IO_Pi_0 |GPIO_1;PIO_i(GPI,&GInitStructr);vdTIM3_Me_onfig(vid)IM_TeasInitypefI_TimeBseStrucue;/初始化TIM3的时间基数单位TI_OCIntypeefI_OCIttuctre;/初始化TIM的外设u16 CR1_Val 500;u16 CC2_Val= 37;u CR_Val 20;16 CCR_l15;/PWM信号电平跳变值(即计数到这个数值以后都是低电平之前都是高电平)TI3的时间基数单位设置(如计数终止值:

18、999,从0开始;计数方式:向上计数)TIM_Timesetuture.T_Period=999;TM_TmeasStructe.TM_Prescale=0;TIM_TmeBaetructureTM_ClocDiiso= TIM_CDI ;IM_TimeaseStructrTIM_ContrMde= TI_CounterMoe_Up;MTimeBIn(TM3,TIM_TimeBasStrctre);TI3的外设的设置MOCnitStcure.TI_Mode=TIM_OCMode_PW1;/TIM脉冲宽度调制模式1T_IniStrctue。TIM_Otte TM_OutState_Enabe;/

19、这个暂时不知道,stm32固件库里没有搜到.应该是定时器输出声明使能的意思IM_InitStrutue。TIM_use =CCR1al;/设置了待装入捕获比较寄存器的脉冲值TI_InitStructre.TIMOlariy= TIM_CPolaritigh;/TM输出比较极性高IM_OC1Ini(TIM,I_OIiStrcture);TIM_OC1lodCnf(M,IM_Cload_nabl);/使能或者失能IM在CCR1上的预装载寄存器下面路PM输出和上面的一样不再解说TIMOCInitStuture.TI_OutpSte= M_OutputState_Enable;TIM_OCInitSt

20、ructre.TI_Puse CC2Val;MOC2(IM,&I_OCInittructur);TIM_OC2reldConfig(TIM3,TM_OPlodEnable);M_OCInitStrctur.TM_OtutStae= TIM_utputState_Enal;TIM_CInitSrutue。IM_Puse =CCR_Val;TIM_OC3nit(TIM,T_CIniSrucure);TIM_C3PreloadConfi(TIM3,TI_OCPreoadEnble);IM_OniStructure。T_uputSat= TM_tutat_Enal;I_OCInitctue。TMPul

21、se=CCR4Vl;TIMOC4Ini(TIM3,&TIMOCIntStuctue);IM_OC4PelaCnig(I,TIM_CrloadEnbl);IM_ARRPreloadConig(TIM3,ENABE);/使能TIM3重载寄存器ARRImd(3,ENBL);/使能TI太累了边看边写都这个点了204年7月2日0:2:13在自己床上写的。下面是看看我们程序达到的4路PM的效果:可以看到明显占空比不同的4路wm波.这一节终于讲完,个人觉得敲一遍代码学起来还是蛮容易懂的。希望看到的人也能搞懂。最后补充一点pm具体能干什么?特别是对广大电子IY爱好者的应用:智能小车的电机控制:我们可以利用p来控制我们的智能小车的车速;机器人:给“机器人关节舵机周期一定(我以前玩过具体多少毫秒忘记了)pw波就可以控制舵机的转动角度了;呼吸灯:输入不同的pm波就可以达到明暗渐明渐暗的不足之处,请您指出来,谢谢!15 / 15

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

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!