8.定时器实验_第1页
8.定时器实验_第2页
8.定时器实验_第3页
8.定时器实验_第4页
8.定时器实验_第5页
已阅读5页,还剩53页未读 继续免费阅读

下载本文档

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

文档简介

1、嵌入式系统八. TIMX和PWM实验本章内容 1. 定时器简介 2. 通用定时器概述 3. 通用定时器案例 4. PWM概述 5. PWM案例1. 定时器简介1.1 STM32定时器 STM32F10 x系列总共最多有8个定时器:1.2 高级定时器(STM32参考手册 P199)TIM1 和TIM8简介: 高级定时器(TIM1 和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动。 它适合多种用途,包含测量输入信号的脉冲宽度(输入捕获),或者产生输出波形(输出比较、PWM、嵌入死区时间的互补PWM等)。 使用定时器预分频器和RCC时钟控制预分频器,可以实现脉冲宽度和波形周

2、期从几个微秒到几个毫秒的调节。1.2 高级定时器(STM32参考手册 P199)TIM1 和TIM8定时器的功能包括: 16位向上、向下、向上/下自动装载计数器 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1 65535之间的任意数值 多达4个独立通道: 输入捕获 输出比较 PWM生成(边缘或中间对齐模式)1.2 高级定时器(STM32参考手册 P199) 单脉冲模式输出 死区时间可编程的互补输出 使用外部信号控制定时器和定时器互联的同步电路 允许在指定数目的计数器周期之后更新定时器寄存器的重复计数器 刹车输入信号可以将定时器输出信号置于复位状态或者一个已知状态 如下事件发

3、生时产生中断/DMA: 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数)1.2 高级定时器(STM32参考手册 P199) 输入捕获 输出比较 刹车信号输入 支持针对定位的增量(正交)编码器和霍尔传感器电路 触发输入作为外部时钟或者按周期的电流管理1.3 通用定时器(STM32参考手册 P251)TIMx 简介 通用定时器(TIM2、 TIM3、 TIM4和TIM5)是一个通过可编程预分频器驱动的16位自动装载计数器构成。 它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和

4、PWM)。 使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个毫秒间调整。1.3 通用定时器(STM32参考手册 P251)通用TIMx (TIM2、 TIM3、 TIM4和TIM5)定时器功能包括: 16位向上、向下、向上/向下自动装载计数器 16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1 65536之间的任意数值 4个独立通道: 输入捕获 输出比较 PWM生成(边缘或中间对齐模式)1.3 通用定时器(STM32参考手册 P251) 单脉冲模式输出 使用外部信号控制定时器和定时器互连的同步电路 如下事件发生时产生中断/DMA: 更新:计数

5、器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) 触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) 输入捕获 输出比较 支持针对定位的增量(正交)编码器和霍尔传感器电路 触发输入作为外部时钟或者按周期的电流管理1.4 基本定时器(STM32参考手册 P298)TIM6和TIM7简介: 基本定时器TIM6和TIM7各包含一个16位自动装载计数器,由各自的可编程预分频器驱动。 它们可以作为通用定时器提供时间基准,特别地可以为数模转换器(DAC)提供时钟。实际上,它们在芯片内部直接连接到DAC并通过触发输出直接驱动DAC。1.4 基本定时器(STM32参考手册 P298)

6、TIM6和TIM7定时器的主要功能包括: 16位自动重装载累加计数器 16位可编程(可实时修改)预分频器,用于对输入的时钟按系数为1 65536之间的任意数值分频 触发DAC的同步电路 在更新事件(计数器溢出)时产生中断/DMA请求1.5 三种STM32定时器区别2. 通用定时器概述2.1 通用定时器框图(STM32参考手册 P254)2.2 时钟选择(STM32参考手册 P263)计数器时钟可以由下列时钟源提供:内部时钟(CK_INT)外部时钟模式1:外部输入脚(TIx)外部时钟模式2:外部触发输入(ETR)内部触发输入(ITRx):使用一个定时器作为另一个定时器的预分频器,如可以配置一个定

7、时器Timer1而作为另一个定时器Timer2的预分频器2.3 内部时钟选择2.4 时钟计算方法APB1时钟F(CK_PSC)CK_CNTCK_INT除非APB1的分频系数是1,否则通用定时器的时钟等于APB1时钟的2倍。默认调用SystemInit函数情况下:SYSCLK=72MAHB时钟=72MAPB1时钟=36M所以APB1的分频系数=AHB/APB1时钟=2所以,通用定时器时钟CK_INT=2*36M=72M2.5 计数器模式通用定时器可以向上计数、向下计数、向上向下双向计数模式。向上计数模式:计数器从0计数到自动加载值(TIMx_ARR),然后重新从0开始计数并且产生一个计数器溢出事

8、件。向下计数模式:计数器从自动装入的值(TIMx_ARR)开始向下计数到0,然后从自动装入的值重新开始,并产生一个计数器向下溢出事件。中央对齐模式(向上/向下计数):计数器从0开始计数到自动装入的值-1,产生一个计数器溢出事件,然后向下计数到1并且产生一个计数器溢出事件;然后再从0开始重新计数。2.6 向下计数模式(时钟分频因子=1)2.7 向上计数模式(时钟分频因子=1)2.8 中央对齐计数模式(时钟分频因子=1 ARR=6)2.9 定时器相关寄存器(STM32参考手册 P282)控制寄存器12.9 定时器相关寄存器(STM32参考手册 P285)DMA中断使能寄存器2.9 定时器相关寄存器

9、(STM32参考手册 P293)预分频寄存器PSC自动重装载寄存器ARR2.10 定时器溢出时间通过定时器实现500ms定时:ARR=4999, PSC=7199Tou=(ARR+1)(PSC+1)/Tclk2.11 定时器相关库函数定时器参数初始化:void TIM_TimeBaseInit(TIM_TypeDef* TIMx,TIM_TimeBaseInitTypeDef* TIM_TimeBaseInitStruct);定时器使能函数:void TIM_Cmd(TIM_TypeDef* TIMx, FunctionalState NewState);定时器中断使能函数:void TIM_

10、ITConfig(TIM_TypeDef* TIMx, uint16_t TIM_IT, FunctionalState NewState);2.11 定时器相关库函数状态标志位获取和清除:FlagStatus TIM_GetFlagStatus(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);void TIM_ClearFlag(TIM_TypeDef* TIMx, uint16_t TIM_FLAG);ITStatus TIM_GetITStatus(TIM_TypeDef* TIMx, uint16_t TIM_IT);void TIM_ClearITPend

11、ingBit(TIM_TypeDef* TIMx, uint16_t TIM_IT);2.12 定时器中断实现步骤1. 能定时器时钟。 RCC_APB1PeriphClockCmd();2. 初始化定时器,配置ARR,PSC。 TIM_TimeBaseInit();3. 开启定时器中断,配置NVIC。 void TIM_ITConfig();NVIC_Init();4. 使能定时器。 TIM_Cmd();5. 编写中断服务函数。 TIMx_IRQHandler();3. 通用定时器案例 3.1 通用定时器头文件按新建按钮新建一个文件,然后保存在 HARDWARE-TIMER 文件夹下面,保存为

12、timer.h。在该文件中输入如下代码:#ifndef _TIMER_H#define _TIMER_H#include sys.hvoid TIM3_Int_Init(u16 arr,u16 psc);#endif3.2 通用定时器源文件按新建按钮新建一个文件,然后保存在 HARDWARE-TIMER 文件夹下面,保存为 timer.c。在该文件中输入如下代码:#include timer.h#include led.hvoid TIM3_Int_Init(u16 arr,u16 psc) TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_

13、InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); 3.2 通用定时器源文件TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler =psc;TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_Tim

14、eBaseInit(TIM3, &TIM_TimeBaseStructure); TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; 3.2 通用定时器源文件NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

15、NVIC_Init(&NVIC_InitStructure); TIM_Cmd(TIM3, ENABLE); void TIM3_IRQHandler(void) if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)3.2 通用定时器源文件TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); LED1=!LED1;3.3 通用定时器主程序回到主界面,在 main.c 文件里面编写如下代码:#include led.h#include delay.h#include sys.h#include timer.h i

16、nt main(void) delay_init(); NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); 3.3 通用定时器主程序 LED_Init(); TIM3_Int_Init(4999,7199); while(1)LED0=!LED0;delay_ms(200); 4. PWM概述4.1 PWM工作过程4.1 PWM工作过程(通道1)(STM32参考手册 P267)CCR1:捕获比较(值)寄存器(x=1,2,3,4):设置比较值。CCMR1: OC1M2:0位:对于PWM方式下,用于设置PWM模式1110或者PWM模式2111CCER:C

17、C1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。CCER:CC1E位:输入/捕获1输出使能。0:关闭,1:打开。4.3 PWM模式1 & PWM模式2(STM32参考手册 P288)寄存器TIMx_CCMR1的OC1M2:0位来分析:4.4 PWM 边沿对齐模式(STM32参考手册 P270)向上计数配置下面是一个PWM模式1 的例子。当TIMx_CNTTIMER文件夹下面,保存为 timer.h。在该文件中输入如下代码:#ifndef _TIMER_H#define _TIMER_H#include sys.hvoid TIM3_PWM_Init(u16 arr,u16 ps

18、c);#endif5.2 PWM源文件按新建按钮新建一个文件,然后保存在 HARDWARE-TIMER文件夹下面,保存为 timer.c。在该文件中输入如下代码:#include timer.h#include led.h#include usart.hvoid TIM3_PWM_Init(u16 arr,u16 psc) GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;5.3 使能定时器3和相关IO口时

19、钟RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); 5.4 初始化IO口为复用功能输出。GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure

20、);5.5 开启AFIO时钟,同时设置重映射。RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE); GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); 5.6 初始化定时器ARR,PSC等。TIM_TimeBaseStructure.TIM_Period = arr; TIM_TimeBaseStructure.TIM_Prescaler =psc; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 5.7 初始化输出比较参数。TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; TIM_OCInitStructure.TIM_Ou

温馨提示

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

最新文档

评论

0/150

提交评论