STM32学习笔记(五 定时器及应用 3 PWM输出实验 )
一、PWM 简介
脉冲宽度调制(PWM) Pulse Width Modulation (调制)
简单来说就是对脉冲宽度的控制。
高级定时器 TIM1 和 TIM8: 可以同时产生多达 7 路的 PWM 输出。
通用定时器 TIM2~TIM5: 也能同时产生多达 4 路的 PWM 输出
基本定时器TIM6 TIM7: 不能用来产生PWM输出
这样,STM32 最多可以同时产生 30 路 PWM 输出!
PWM工作过程
ARR是最大值,上图是上位
CCRx数值比较来确定高低电平,给IO逻辑赋值1 0
ARR确定周期,CCRx确定占空比。
PWM模式1 和 PWM模式2
PWM模式
TIM3输出通道引脚
PWM输出库函数
二、实验要求
使用定时器3的PWM功能,输出频率可变的PWM波,用来驱动LED灯,使LED亮度由暗变亮,又从亮变暗,如此循环。
三、硬件设计
本实验用到的硬件资源有:
1) 指示灯 DS0
2) 定时器 TIM3
这两个前面都有介绍,但是我们这里用到了 TIM3 的部分重映射功能,把 TIM3_CH2 直接映射到了 PB5 上,而通过前面的学习,我们知道 PB5 和 DS0 是直接连接的,所以电路上并没有任何变化
四、软件设计
PWM输出配置步骤
代码编写
#include "timer.h"
#include "led.h"
#include "usart.h"
void TIM3_Int_Init(u16 arr,u16 psc)
{TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 计数到5000为500msTIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_ITConfig(TIM3,TIM_IT_Update,ENABLE ); //使能指定的TIM3中断,允许更新中断NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //先占优先级0级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //从优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器TIM_Cmd(TIM3, ENABLE); //使能TIMx外设}
//定时器3中断服务程序
void TIM3_IRQHandler(void) //TIM3中断
{if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源 {TIM_ClearITPendingBit(TIM3, TIM_IT_Update ); //清除TIMx的中断待处理位:TIM 中断源 LED1=!LED1;}
}void TIM3_PWM_Init(u16 arr,u16 psc)
{ GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射 TIM3_CH2->PB5 //设置该引脚为复用输出功能,输出TIM3 CH2的PWM脉冲波形 GPIOB.5GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO//初始化TIM3TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位//初始化TIM3 Channel2 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高TIM_OC2Init(TIM3, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM3 OC2TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable); //使能TIM3在CCR2上的预装载寄存器TIM_Cmd(TIM3, ENABLE); //使能TIM3}
#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"void TIM3_Int_Init(u16 arr,u16 psc);
void TIM3_PWM_Init(u16 arr,u16 psc);
#endif
#include "led.h"
#include "delay.h"
#include "key.h"
#include "sys.h"
#include "usart.h"
#include "timer.h"int main(void){ u16 led0pwmval=0;u8 dir=1; delay_init(); //延时函数初始化 NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级uart_init(115200); //串口初始化为115200LED_Init(); //LED端口初始化TIM3_PWM_Init(899,0); //不分频。PWM频率=72000000/900=80Khzwhile(1){delay_ms(10); if(dir)led0pwmval++;else led0pwmval--;if(led0pwmval>300)dir=0;if(led0pwmval==0)dir=1; TIM_SetCompare2(TIM3,led0pwmval); } }
实验结果
DS0亮度逐渐增大后又逐渐变小 往复循环……
STM32学习笔记(五 定时器及应用 3 PWM输出实验 )相关推荐
- STM32学习笔记——通用定时器的PWM介绍及配置
脉冲宽度调制(PWM),是英文"Pulse Width Modulation"的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术.简单一点,就是 ...
- stm32学习笔记-6TIM定时器
6 TIM定时器 文章目录 6 TIM定时器 6.1 TIM定时中断原理 6.2 TIM定时中断相关实验 6.2.1 实验:定时器定时中断-内部时钟 6.2.2 实验:定时器定时中断-外部时钟 6.3 ...
- STM32学习笔记之定时器(2)
文章结构: --> 一.定时器基本介绍 --> 二.普通定时器详细介绍TIM2-TIM5 --> 三.定时器代码实例 一.定时器基本介绍 之前有用过野火的学习板上面讲解很详细,所以 ...
- stm32学习笔记 TIM定时器中断1.定时器基本定时功能(含代码)
TIM定时器分四个部分 目录 一.定时器基本定时功能 二.定时器输出比较功能 三.定时器输入捕获功能 四.定时器编码接口 一.定时器基本定时功能 RCC时钟树 SystmInit函数 外部晶振出问题会 ...
- STM32学习笔记 高级定时器TIM1TIM8 14
高级定时器TIM1&TIM8 TIM1和TIM8简介 高级控制定时器(TIM1和TIM8)由一个16位的自动装载计数器组成,它由一个可编程的预分频器驱动 它适合多种用途,包含测量输入信号的脉冲 ...
- STM32学习笔记 通用定时器TIM3~TIM5 13
通用定时器TIM3~TIM5 TIM3~TIM5简介 通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成. 它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出 ...
- STM32学习笔记(十九)RTC实时时钟实验
STM32F103ZET6之RTC实时时钟实验 文章目录 STM32F103ZET6之RTC实时时钟实验 前言 一.简介 二.相关寄存器及配置过程 三.程序源码 1.rtc.h 2.rtc.c 3.m ...
- STM32 学习笔记 -- 基于stm32f4的看门狗配置和实验代码
基于stm32f4的看门狗配置和实验代码 以下本人对stm32f4xx的独立看门狗和窗口看门狗学习.理解和总结,程序的说明和解释均在注释中,仔细阅读不难理解.我已经过验证,有问题或错误请指出. 版权声 ...
- STM32学习笔记(四)丨TIM定时器及其应用(定时中断、内外时钟源选择)
本篇文章包含的内容 一.TIM 定时器 1.1 TIM 定时器简介 1.2 TIM 定时器类型及其工作原理简介 1.2.1 基本定时器工作原理及其结构 1.2.2 通用定时器工作原理及其结构 1.2. ...
最新文章
- 使用VS 自带的打包工具,制作winform安装项目
- 基于Neutron的Kubernetes SDN实践经验之谈
- POJ 1047 Round and Round We Go
- CentOS 初体验二十二:redis常用命令:Hash
- 零基础如何学Java?拥有编程思想呢?
- java中for循环的简化_Java中for语句的简化写法
- Jmeter参数化 CSV Data Set Config界面说明
- Matlab线性/非线性规划优化算法(7)
- 深入理解ArrayList
- vue项目原理分析-2:路由
- 69期-Java SE-007_面向对象-1-001-002
- 【NOIP2017】宝藏
- java fileutils api_FileUtils API
- 开心网倒闭变卖,创始人程炳皓反思的亲笔信全文
- wps软件打不开共享超链接_wps excel的超链接打不开怎么办?
- java太阳系论文摘要_毕业论文摘要
- python项目打包部署到ios_Python实现iOS自动化打包详解
- cdn刷新api_阿里云cdn刷新api
- [论文阅读]PointRend: Image Segmentation as Rendering
- 人大金仓数据库(KingbaseES)帮助文档