通用定时器(中断功能和PWM输出)

发布者:静心悠然最新更新时间:2018-05-13 来源: eefocus关键字:通用定时器  中断功能  PWM输出 手机看文章 扫描二维码
随时随地手机看文章

目录:

1:概述

2:常用中断功能

3:PWM输出 


1:概述

在开发中,定时器的应用很广泛,简单总结为三个方面:

1.1:中断功能的应用,常用的是利用定时器中断,实现定时、记时、延时、超时判断,前面博文中有总结过内核定时器的各种使用的方法;

1.2:比较输出,常用应用就是PWM输出,用脉宽调制来实现led、电机等的控制;

1.3:输入捕获,可以抓取输入的方波信号,统计波形周期和占空比,最常见利用就是门控,将外部模拟量转化为数字量(定时器的计数值);


2:常用中断功能

定时器的初始化详细参考手册,主要的一点是确定定时器的溢出周期,利用公式:Tout = (arr+1)*(psc+1)/Tclk,可计算出定时器的溢出频率;

如下代码实现:在中断函数中实现led翻转,翻转频率1HZ,既led闪烁频率1HZ;

timer_driver.c


  1. #include "timer_driver.h"  

  2. #include "led_driver.h"  

  3.   

  4. void TIM3_Init(unsigned int arr,unsigned int psc)  

  5. {  

  6.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  

  7.     NVIC_InitTypeDef NVIC_InitStructure;  

  8.     TIM_OCInitTypeDef TIM_OCInitStruct;  

  9.       

  10.     GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //将TIM3的CH2映射到PB5上  

  11.       

  12.     //定时器TIM3初始化  

  13.     TIM_TimeBaseStructure.TIM_Period = arr;   

  14.     TIM_TimeBaseStructure.TIM_Prescaler =psc;  

  15.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  

  16.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   

  17.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  

  18.       

  19.     TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断  

  20.   

  21.     //中断优先级NVIC设置  

  22.     NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断  

  23.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 3;  //先占优先级0级  

  24.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;  //从优先级3级  

  25.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能  

  26.     NVIC_Init(&NVIC_InitStructure);  //初始化NVIC寄存器  

  27.   

  28.     TIM_Cmd(TIM3, ENABLE);  //使能TIMx          

  29. }  

  30.   

  31. unsigned char flag = 0;  

  32. void TIM3_IRQHandler(void)   

  33. {  

  34.         flag = !flag;  

  35.         if(flag == 0)  

  36.         {  

  37.             LED1_ON;  

  38.             LED2_ON;  

  39.             LED3_ON;  

  40.         }  

  41.         else  

  42.         {  

  43.             LED1_OFF;  

  44.             LED2_OFF;  

  45.             LED3_OFF;  

  46.         }  

  47.         TIM_ClearITPendingBit(TIM3,TIM_IT_Update);  

  48. }  


main.c


  1. #include "stm32f10x.h"  

  2. #include "timer_driver.h"  

  3. #include "led_driver.h"  

  4. #include "systick_driver.h"  

  5. #include "key_board.h"  

  6.   

  7. unsigned int led_pwm_ctr_cnt = 0;  

  8. unsigned int led_pwm = 0;  

  9.   

  10. /*外设时钟初始化*/  

  11. void RCC_PeriphClock_Config(void)  

  12. {  

  13.     /*GPIO口时钟初始化*/  

  14.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOD, ENABLE);  

  15.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  

  16. }  

  17.   

  18. int main()  

  19. {  

  20.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //设置中断优先级分组  

  21.     SysTick_Init(INT_10MS,SysTick_CLKSource_HCLK_Div8);    //内核滴答定时器配置,用于led任务轮循   

  22.     RCC_PeriphClock_Config();  

  23.     Led_Init();                                            //led灯初始化   

  24.     TIM3_Init(9999,7199);                                  //定时器3初始化,溢出频率为1hz  

  25.       

  26.     while(1)  

  27.     {  

  28.         ;  

  29.     }  

  30. }  


3:PWM输出


pwm输出需确定两点:PWM输出波形的周期,PWM输出波形的占空比,具体需要设置PWM波形的有效电平和PWM输出模式;

如下代码实现1khz的pwm波形输出,通过安检可以改变pwm波的占空比;

timer_driver.c


  1. #include "timer_driver.h"  

  2. #include "led_driver.h"  

  3.   

  4. void TIM3_Init(unsigned int arr,unsigned int psc)  

  5. {  

  6.   TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  

  7.     TIM_OCInitTypeDef TIM_OCInitStruct;  

  8.       

  9.     GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //将TIM3的CH2映射到PB5上  

  10.       

  11.     //定时器TIM3初始化  

  12.     TIM_TimeBaseStructure.TIM_Period = arr;   

  13.     TIM_TimeBaseStructure.TIM_Prescaler =psc;  

  14.     TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;  

  15.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;   

  16.     TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);  

  17.       

  18.     //PWM CH2输出初始化  

  19.     TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;                /*开发板高电平led灯亮,因为设置向上计数方式,并且设置OC1有效电平为高电平,根据手册,设置为PWM模式2*/  

  20.     TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;    /*设置OC2输出使能*/  

  21.     TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;         /*设置OC2有效电平为低电平*/  

  22.     TIM_OC2Init(TIM3, &TIM_OCInitStruct);  

  23.       

  24. //  //PWM CH1输出初始化  

  25. //  TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM2;                /*开发板高电平led灯亮,因为设置向上计数方式,并且设置OC1有效电平为高电平,根据手册,设置为PWM模式2*/  

  26. //  TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;    /*设置OC1输出使能*/  

  27. //  TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_Low;         /*设置OC1有效电平为低电平*/  

  28. //  TIM_OC1Init(TIM3, &TIM_OCInitStruct);  

  29.   

  30.     TIM_Cmd(TIM3, ENABLE);  //使能TIMx          

  31.   

  32.     TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); /*开启输出比较2的预装载功能*/   

  33.     //TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable); /*开启输出比较2的预装载功能*/   

  34.       

  35.     TIM_SetCompare2(TIM3, 500);  

  36.     //TIM_SetCompare1(TIM3, 500);  

  37. }  

main.c


  1. #include "stm32f10x.h"  

  2. #include "timer_driver.h"  

  3. #include "led_driver.h"  

  4. #include "systick_driver.h"  

  5. #include "key_board.h"  

  6.   

  7. unsigned int led_pwm_ctr_cnt = 0;  

  8. unsigned int led_pwm = 500;  

  9.   

  10. /*外设时钟初始化*/  

  11. void RCC_PeriphClock_Config(void)  

  12. {  

  13.     /*GPIO口时钟初始化*/  

  14.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB | RCC_APB2Periph_GPIOC | RCC_APB2Periph_AFIO, ENABLE);  

  15.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  

  16. }  

  17.   

  18. int main()  

  19. {  

  20.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        //设置中断优先级分组  

  21.     SysTick_Init(INT_10MS,SysTick_CLKSource_HCLK_Div8);    //内核滴答定时器配置,用于led任务轮循   

  22.     RCC_PeriphClock_Config();  

  23.     Led_Init();                                            //led灯初始化   

  24.     Key_Init();  

  25.     TIM3_Init(999,71);                                     //定时器3初始化,pwm周期为1KHZ  

  26.       

  27.     while(1)  

  28.     {  

  29.         if(led_pwm_ctr_cnt >= 1)    //500ms轮询一次  

  30.         {  

  31.             led_pwm_ctr_cnt = 0;  

  32.             if(K1 == 0)                //k1按键被按下  

  33.             {  

  34.                 if(led_pwm < 1000)  

  35.                     led_pwm++;  

  36.                 TIM_SetCompare2(TIM3, led_pwm);  

  37.                 TIM_SetCompare1(TIM3, led_pwm);  

  38.             }  

  39.             else  

  40.             if(K2 == 0)  

  41.             {  

  42.                 if(led_pwm > 0)  

  43.                     led_pwm--;  

  44.                 TIM_SetCompare2(TIM3, led_pwm);  

  45.                 TIM_SetCompare1(TIM3, led_pwm);  

  46.             }  

  47.         }  

  48.     }  

  49. }  


如下为逻辑分析仪抓取的pwm输出波形:



关键字:通用定时器  中断功能  PWM输出 引用地址:通用定时器(中断功能和PWM输出)

上一篇:89C51与ad0832 输出正弦波,三角波,矩形波,锯齿波
下一篇:51单片机定时器中断程序

推荐阅读最新更新时间:2024-03-16 16:02

STM8S103定时器1,定时器2多路PWM输出
一、时钟配置 1、STM8S的4种时钟源可用做主时钟: ● 1-24MHz高速外部晶体振荡器(HSE) ● 最大24MHz高速外部时钟信号(HSE user-ext) ● 16MHz高速内部RC振荡器(HSI) ● 128KHz低速内部RC(LSI) STM8默认时钟源为16MHz高速内部RC振荡器(HSI) 对 CLK_CKDIVR设置可以设置时钟为HSI的分频 如 CLK_CKDIVR|= (uint8_t)0x00;/*设置时钟为内部16M高速时钟*/ 2分频为 CLK_CKDIVR=0x08;4分频为 CLK_CKDIVR=0x10;8分频为 CLK_CKDIVR=0x18; 二、定时器1设置
[单片机]
STM8S103<font color='red'>定时器</font>1,<font color='red'>定时器</font>2多路<font color='red'>PWM</font>波<font color='red'>输出</font>
stm32学习笔记(九)PWM输出
#include pwm.h #include led.h ////////////////////////////////////////////////////////////////////////////////// //本程序只供学习使用,未经作者许可,不得用于其它任何用途 //ALIENTEK Mini STM32开发板 //PWM 驱动代码 //正点原子@ALIENTEK //技术论坛:www.openedv.com //修改日期:2010/12/03 //版本:V1.0 //版权所有,盗版必究。 //Copyright(C) 正点原子 2009-2019 //All rights reserved
[单片机]
STM32定时器PWM输出
  脉冲宽度调制PWM(Pulse Width Modulation),调节占空比以控制脉冲宽度。   STM32的定时器除了TIM6和TIM7,其它定时器都可以用来产生PWM信号,高级定时器TIM1和TIM8可同时产生7路PWM输出,通用定时器可同时产生4路PWM输出。   STM32定时器PWM输出设置的几个步骤如下: 1)开启STM32时钟,配置输出I/O为复用输出 2)设置ARR(周期)和PSC(预分频) 3)设置PWM模式(边沿对齐或中央对齐) 4)使能定时器的通道输出,使能定时器 5)修改CCR2来控制占空比   例程:72MHz主频,PB7(TIM4_CH2)输出PWM GPIO_InitStr
[单片机]
TimerCommand.h头文件下载-AVR定时器命令通用头文件
/***************************************************************************** 文件名称:TimerCommand.h 文件标识:_TIMERCOMMAND_H_ 摘 要:AVR定时器命令通用头文件 当前版本:V1.0 *****************************************************************************/ #ifndef _TIMERCOMMAND_H_ #define _TIMERCOMMAND_H_ #define Timer0Config(MODE,
[单片机]
TimerConvert.h头文件下载-AVR定时器参数转换通用头文件
/***************************************************************************** 文件名称:TimerConvert.h 文件标识:_TIMERCONVERT_H_ 摘 要:AVR定时器参数转换通用头文件 当前版本:V1.0 *****************************************************************************/ #ifndef _TIMERCONVERT_H_ #define _TIMERCONVERT_H_ #define WGM0(WGM) (((W
[单片机]
STM32 通用T2、T3、T4、T5定时器详解
定时器初始化配置 1 void TIM3_Configuration(void)//1MS 2 { 3 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 4 5 TIM_DeInit(TIM3);//开一下时钟再关闭 6 /* 设置TIM2CLK 为 72MHZ */ 7 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3 , ENABLE); 8 9 10 /* 自动重装载寄存器周期的值(计数值) */ 11 TIM_TimeBaseStructure.TIM_Period=100
[单片机]
STM32F103ZET6 用定时器级联方式输出特定数目的PWM
STM32F103ZET6里共有8个定时器,其中高级定时器有TIM1-TIM5、TIM8,共6个。 这里需要使用定时器的级联功能,ST的RM0008 REV12的P388和P399页上有说明对于特定的定时器,怎么去选择级联功能,参见表86。 我这里输出PWM的定时器是TIM2,空闲的定时器是TIM3。以TIM2为主定时器,TIM3为从定时器对TIM2的输出脉冲数进行计数。 查表可知,TIM3为从定时器选择TIM2为触发源,需要配置TS=001,即选择ITR1。 实现通过定时器控制输出PWM个数的功能,可以有如下一种配置方式: void TIM2_Master__TIM3_Slave_Configuration(u32 Puls
[单片机]
用FPGA实现多路PWM输出的接口设计与仿真
0 引言 在许多嵌入式系统的实际应用中,需要扩展FP-GA(现场可编程门阵列)模块,将CPU实现有困难或实现效率低的部分用FPGA实现,如数字信号处理、硬件数字滤波器、各种算法等,或者利用FPGA来扩展I/O接口,如实现多路PWM(脉宽调制)输出、实现PCI接口扩展等。通过合理的系统软硬件功能划分,结合优秀高效的FPGA设计,整个嵌入式系统的效率和功能可以得到最大限度的提高。 在电机控制等许多应用场合,需要产生多路频率和脉冲宽度可调的PWM波形。本文用Altera公司FPGA产品开发工具QuartusⅡ,设计了6路PWM输出接口,并下载到FPGA,实现与CPU的协同工作。 1 FPGA概述 PLD(可编程逻辑器件)可分为S
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved