版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、stm32的定时器输入捕获与输出比较(2015-09-28 09:26:24)转载标签: 分类: stm32it明确一点对比 AD的构造,stm32有3个AD,每个AD有很多通道,使用哪个通道就配置成哪个通道,这里定时器也如此,有很多定时器TIMx,每个定时器有很多CHx(通道),可以配置为输入捕捉测量频率用,也可以配置为输出比较 输出PWM使用输入捕捉:可以用来捕获外部事件,并为其赋予时间标记以说明此事件的发生时刻。外部事件发生的触发信号由单片机中对应的引脚输入(具体可以参考单片机的datasheet),也可以通过模拟比较器单元来实现。时间标记可用来计算频率,占空比及信号的其他特征, 以及为
2、事件创建日志, 主要是用来测量外部信号的频率。输出比较:定时器中计数寄存器在初始化完后会自动的计数。从bottom 计数到top。并且 有不同的工作模式。另外还有个比较寄存器。一旦计数寄存器在从bottom 到top计数过程中与比较寄存器匹配则会产生比较中断(比较中断使能的情况下)。然后根据不同的工作模式计数寄存器将清零或者计数到top 值。1、朋友,可以解释一下输入捕获的工作原理不?很简单,当你设置的捕获开始的时候,cpu会将计数寄存器的值复制到捕获比较寄存器 中并开始计数,当再次捕捉到电平变化时,这是计数寄存器中的值减去刚才复制的值就是这 段电平的持续时间,你可以设置上升沿捕获、下降沿捕获
3、、或者上升沿下降沿都捕获。它没 多大用处,最常用来测频率。计数寄存器的初值,是自己写进去的吗?是的,不过默认不要写入我如果捕获上升沿,两个值相减,代表的时两个上升沿中间那段电平的时间。对不? 是的timerl有五个通道(对应五个10引脚),在同一时刻,只能捕获一个引脚的值,对不? 那是肯定的,通道很像ADC通道,是可以进行切换的。那输出比较的原理你可以帮我介绍一下不?这里有两个单元:一个计数器单元和一个比较单元,比较单元就是个双缓冲寄存器,比 较单元的值是可以根据不同的模式设置的, 与此同时,计数器在不停的计数,并不停的与比 较寄存器中的值进行比较,当计数器的值与比较寄存器的值相等的时候一个比
4、较匹配就发生 了,根据自己的设置,匹配了是io电平取反、变低、还是变高,就会产生不同的波形了。比较单元的值是人为设进去的吧?是的,但是他要根据你的控制寄存器的配置,来初始化你的比较匹配寄存器S3CMP2tOj000四逬D比较僅貨选Sb当定时番的血館于在T1CC0+的比软tli址撐九r0001在土牧设蹩输由时压切灣谓输出111014 ittt m换邀岀Olh仙1:比越的1瓏Hi在附100音甸上比穀耐篆建出coaxLOhfifrats1 IO.sa科恢用1 H1列廟t输出9IW> Cmp(2或即弘上面这个总看不懂,好像不不止你说的那几种情况:“匹配了是io电平取反、变低、还是变高,就会产生不
5、同的波形了”就是比较匹配了你要10电平怎么办?是清0还是置1 ?还是怎么样?这样才能产生波 形啊 要不然你要比较单元有什么用呢?设置输出就是置1,清除输出就是置 0,切换输出就是将原来的电平取反,对不?是的你理解的很快011 :计数器向上计数达到最大值时将引脚置1,达到0时,引脚电平置0,,对不?序怎么写啊?求高人指点1、陪定时器1的功能为特殊功能,不是普通10在PERCFG这里2、P1SEL引脚选择3、P1DIR设为输出4、T3CC0设置周期5、T3CC1设置占空比6、T3CCTL0设置通道07、T3CCTL1设置通道18、T3CTL设为模模式9、用T3CTL打开即可*以下是用定时器做频率源
6、,用定时器测量该频率的应用程序! !*调试STM32的定时器好几天了,也算是对STM32的定时器有了点清楚的认识了。我需要测量4路信号的频率然后通过 DMA将信号的频率传输到存储器区域,手册说的很明白每个定时器有 4个独立通道。然后我就想能不能将这 4路信号都连接到一个定时器的4个通道上去。理论上应该是行的通的。刚开始俺使用的是TIM2的123通道,TIM4的2通道来进行频率的测量。由于没有频率发生器, 所以我用tim3作为信号源,用TIM2,TIM4来进行测量就ok 了 (刚好4个通道了)。请看一开始的程序,以 TIM2的1,3通道为例子(2通道设置方法一样)TIMClni tStructu
7、re.TIMCMode =TIMCMode ICAP;/配置为输入捕获模式TIMClni tStructure.TIMCPolarity =TIMCPolarity Ris in g;/输入上升沿捕获TIMCI nitStructure.TIMCSelection =TIMCSelection DirectTI; /通道方向选择TIMCln itStructure.TIMCPrescaler =TIM ICPSC DIV1;/每次检测到捕获输入就触发一次捕获TIMCln itStructure.TIMCFilter =0x0;/滤波TIMClni t(TIM2, &TIMCln itS
8、tructure); /TIM2通道1配置完毕TIMCI nitStructure.TIMCMode = TIMCMode ICAP; /配置为输入捕获模式TIMClnitStructure.TIM Channel =TIM Channel 3;/选择通道 3TIMClni tStructure.TIMCPolarity =TIMCPolarity Ris in g;/输入上升沿捕获TIMCln itStructure.TIMCSelection =TIMCSelection DirectTI; /TIMCln itStructure.TIMCPrescaler =TIM ICPSC DIV1
9、;/每次检测到捕获输入就触发一次捕获TIMCln itStructure.TIMCFilter = 0x0;/滤波以上是输入捕获配置还需要做的工作就是(参考stm32参考手册的TIM的结构框图)TIM SelectInputTrigger(TIM2,TIM TS TI1FP1);/参考 TIM 结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位TIM SelectSlaveMode(TIM2,TIM SlaveMode Reset);/复位模式-选中的触发输入(TRGI )的上升沿初始化计数器,并且产生一个更新线号TIM SelectMasterSlaveMode(TIM2,TIM M
10、asterSlaveMode E nable);/主从模式选择这样我们就可以很轻松的就得到了连接在TIM2的通道1上的信号的频率,但是3通道的频率的值永远都是跳动的不准,测试了半天也没有找到根本原因,请看TIM的结构框图的一部分红色箭头所指,这才找到原因,触发的信号源只有这四种,而通道3上的计数器的值不可能在接受到信号的上升沿时候,有复位这个动作,找到原因了。这就是3通道上的数据不停跳动的原因,要想得到信号的频率也是有办法的,可以取连续两次捕捉的值之差,这个值就是信号的周期,自己根据实际情况去算频率吧。有以上可以得到:stm32的TIM2的四个通道可以同时配置成输入捕捉模式,但是计算CH3,C
11、H4言号的频率步骤有点繁琐(取前后捕捉的差值),但是他的CH1,和CH2可以轻松得到通道1TIM Selectl nputTrigger(TIM2,TIM TS TI1FP1);/参考TIM结构图选择滤波后的TI1输入作为触发源,触发下面程序的复位TIM SelectSlaveMode(TIM2,TIM SlaveMode Reset);/复位模式-选中的触发输入(TRGI )的上升沿初始化计数器,并且产生一个更新线号TIMx->CRR1的值即为信号的周期通道2 :TIM SelectlnputTrigger(TIM2,TIM TS TI2FP2);/参考 TIM 结构图选择滤波后的TI
12、1输入作为触发源,触发下面程序的复位TIM SelectSlaveMode(TIM2,TIM SlaveMode Reset);/复位模式-选中的触发输入(TRGI )的上升沿初始化计数器,并且产生一个更新线号TIMx->CRR2 的值即为信号的周期STM32的定时器外设功能强大得超出了想像力,STM32 一共有8个都为16位的定时器。其中TIM6、TIM7是基本定时器;TIM2、TIM3、TIM4、TIM5是通用定时器;TIM1和TIM8是高级定时器。这些定时器使STM32具有定时、信号的频率测量、信号的PWM测量、PWM输出、三相6步电机控制及编码器接口等功能,都是专门为工控领域量身
13、订做的基本定时器:具备最基本的定时功能,下面是它的结构:IL權擱控剖应叮览迟1!1住口爭佯貯传毘恨翌豉奇,誌竺实町奇誰7于件3.147JQhf 中肪相MA输岀我们来看看它的启动代码:void TIM2 C on figuratio n( void)基本定时器TIM2的定时配置的结构体(包含定时器配置的所有元素例如:TIM_Period=计数值)TIM TimeBasel ni tTypeDef TIM TimeBaseStructure;设置TIM2 CLK为72MHZ (即TIM2外设挂在 APB1上,把它的时钟打开。)RCC APB1PeriphClockCmd(RCC APB1Perip
14、h TIM2 ENABLE);设置计数值位1000TIM TimeBaseStructure.TIM Period=1000;将TIM2 CLK为72MHZ 除以72 = 1MHZ 为定时器的计数频率TIM TimeBaseStructure.TIM Prescaler= 71;这个TIM ClockDivision是设置时钟分割,这里不分割还是1MHZ的计数频率TIM_TimeBaseStructure.TIM_ClockDivisio n=TIM_CKD_DIV1;设置为向上计数模式;(计数模式有向上,向下,中央对齐1,中央对齐2,中央对齐3)TIM_TimeBaseStructure.T
15、IM_Cou nterMode=TIM_Cou nterMode_Up;将配置好的设置放进 stm32f10x-tim.c的库文件中TIM TimeBase In it(TIM2, &TIM TimeBaseStructure);清除标志位TIM ClearFlag(TIM2,TIM FLAG Update);使能TIM2中断TIM ITCo nfig(TIM2,TIM I T Update,ENABLE);使能TIM2外设TIM Cmd(TIM2,ENABLE);通用定时器:就比基本定时器复杂得多了。除了基本的定时,它主要用在测量输入脉冲的频率、脉冲宽与 输出PWM脉冲的场合,还具有
16、编码器的接口。我们来详细讲解:如何生成PWM脉冲 通用定时器可以利用GPIO引脚进行脉冲输出,在配置为比较输出、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会与
17、比较寄存器 TIMx_CCR预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄 存器TIMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)如此循环,得到的输出脉冲周期就为重载寄存器 TIMx_ARR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A乘以触发脉冲的时钟周期,即输出PWM的占空比为A/(N+1)如果不想看的可以直接看我标注的红色字体,就大体可以理解。F面我们来编写具体代码和讲解: void TIM3 GPIO Co nfig(void)配置TI
18、M3复用输出PWM的10GPIO I ni tTypeDefGPIOnitStructure;打开TIM3的时钟RCC APB1PeriphClockCmd(RCC APB1Periph TIM3,ENABLE);打开GPIOA和GPIOB的时钟RCC APB2PeriphClockCmd(RCC APB2Periph GPIOA| RCC APB2Periph GPI0B,ENABLE);配置PA6.PA7的工作模式GPIO I ni tStructure.GPIO Pi n= GPIO Pin 6 |GPIO P in 7;GPIO I ni tStructure.GPIO Mode =G
19、PIO Mode AF PP;配置PB0.PB1的工作模式GPIO_I ni tStructure.GPIO_Pi n= GPIO_Pin_0 |GPI0_Pin_1;GPIO I nit(GPIOB,&GPIO I nitStructure);void TIM3 Mode Co nfig(void)TIM TimeBaselnitTypeDef TIM TimeBaseStructure;/ 初始化 TIM3 的时间基数单TIM OCInitTypeDef TIM OCInitStructure;/ 初始化 TIM3 的外设u16 CCR1 Val= 500;u16 CCR2 Val
20、= 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 Cou nterMode= TIM Cou nterMode Up;TIM3的外设的设置TIM_OCI ni tStructure.TIM_OCMode= T
21、IM_OCMode_PWM1;/TIM 脉冲宽度调制 模式1TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable;/ 这个暂时不知 道,stm32固件库里没有搜到。应该是定时器输出声明使能的意思TIM OCInitStructure.TIM Pulse =CCR1 Val;/设置了待装入捕获比较寄存器的脉冲TIM_OCI ni tStructure.TIM_OCPolarity= TIM_OCPolarity_High;/TIM 输出比较极性高TIM OC1I nit(TIM3, &TIM OCI ni tStructure);TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);/ 使能或者失能 TIMx 在CCR1上的预装载寄存器F面3路PWM输出和上面的一样不再解说TIM OCI ni tStructure.TIM OutputState= TIM OutputState E nable;TIM OCI ni tStructure.TIM Pulse =CCR2 Val;TIM OC2I nit(TIM3,& TIM OCI
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 商业综合体开发桥涵施工合同
- 天津市医疗用房买卖合同
- 2025版股权转让合同:某创业公司股东之间关于股权转让及股权激励的具体条款协议2篇
- 机电安装工程项目合作协议
- 水土保持生态公益林管理措施
- 城市供水人工打水井施工合同
- 养鸡场租赁合同:环保可持续发展
- 碳排放权交易法律援助合同
- 2025年度数字货币交易与结算平台开发合同3篇
- 2025版劳动工伤赔偿协议范本及赔偿范围界定详解3篇
- word 公章 模板
- T∕ZSQX 008-2020 建设工程全过程质量行为导则
- ISO-IEC17025-2017实验室管理体系全套程序文件
- 业务员手册内容
- pH值的测定方法
- 输出轴的机械加工工艺规程及夹具设计
- 元旦文艺汇演校长致辞
- 国家开放大学电大本科《管理案例分析》2023-2024期末试题及答案试卷编号:1304
- 离合器接合叉机械工艺说明书
- PWM脉宽直流调速系统设计及 matlab仿真验证
- 蜂窝煤成型机设计方案.doc
评论
0/150
提交评论