1 、TIMx简介

通用定时器是一个通过可编程预分频器驱动的16位自动装载计数器构成。
它适用于多种场合,包括测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)。
使用定时器预分频器和RCC时钟控制器预分频器,脉冲长度和波形周期可以在几个微秒到几个 毫秒间调整。

2 、TIMx主要功能

通用TIMx (TIM2、TIM3、TIM4和TIM5)定时器功能包括: ● 16位向上、向下、向上/向下自动装载计数器 ●
16位可编程(可以实时修改)预分频器,计数器时钟频率的分频系数为1~65536之间的任意 数值 ● 4个独立通道: ─ 输入捕获 ─
输出比较 ─ PWM生成(边缘或中间对齐模式) ─ 单脉冲模式输出 ● 使用外部信号控制定时器和定时器互连的同步电路 ●
如下事件发生时产生中断/DMA: ─ 更新:计数器向上溢出/向下溢出,计数器初始化(通过软件或者内部/外部触发) ─
触发事件(计数器启动、停止、初始化或者由内部/外部触发计数) ─ 输入捕获 ─ 输出比较 ●
支持针对定位的增量(正交)编码器和霍尔传感器电路 ● 触发输入作为外部时钟或者按周期的电流管理

通用定时器框图

3 、TIMx功能描述

3.1、 时基单元

可编程通用定时器的主要部分是一个16位计数器和与其相关的自动装载寄存器。这个计数器可
以向上计数、向下计数或者向上向下双向计数。此计数器时钟由预分频器分频得到。
计数器、自动装载寄存器和预分频器寄存器可以由软件读写,在计数器运行时仍可以读写。 时基单元包含: ● 计数器寄存器(TIMx_CNT) ●
预分频器寄存器 (TIMx_PSC) ● 自动装载寄存器 (TIMx_ARR)
自动装载寄存器是预先装载的,写或读自动重装载寄存器将访问预装载寄存器。根据在
TIMx_CR1寄存器中的自动装载预装载使能位(ARPE)的设置,预装载寄存器的内容被立即或在
每次的更新事件UEV时传送到影子寄存器。当计数器达到溢出条件(向下计数时的下溢条件)并当
TIMx_CR1寄存器中的UDIS位等于’0’时,产生更新事件。更新事件也可以由软件产生。随后会 详细描述每一种配置下更新事件的产生。
254/754 参照2009年12月 RM0008 Reference Manual 英文第10版
本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新版本通用定时器(TIMx) STM32F10xxx参考手册
计数器由预分频器的时钟输出CK_CNT驱动,仅当设置了计数器TIMx_CR1寄存器中的计数器使
能位(CEN)时,CK_CNT才有效。(有关计数器使能的细节,请参见控制器的从模式描述)。
注:真正的计数器使能信号CNT_EN是在CEN的一个时钟周期后被设置。

3.4 捕获/比较通道

每一个捕获/比较通道都是围绕着一个捕获/比较寄存器(包含影子寄存器),包括捕获的输入部分
(数字滤波、多路复用和预分频器),和输出部分(比较器和输出控制)。 下面几张图是一个捕获/比较通道概览。
输入部分对相应的TIx输入信号采样,并产生一个滤波后的信号TIxF。然后,一个带极性选择的
边缘检测器产生一个信号(TIxFPx),它可以作为从模式控制器的输入触发或者作为捕获控制。该 信号通过预分频进入捕获寄存器(ICxPS)。


3.6、输出比较模式

此项功能是用来控制一个输出波形,或者指示一段给定的的时间已经到时。 当计数器与捕获/比较寄存器的内容相同时,输出比较功能做如下操作: ●
将输出比较模式(TIMx_CCMRx寄存器中的OCxM位)和输出极性(TIMx_CCER寄存器中的
CCxP位)定义的值输出到对应的引脚上。在比较匹配时,输出引脚可以保持它的电平
(OCxM=000)、被设置成有效电平(OCxM=001)、被设置成无效电平(OCxM=010)或进行翻 转(OCxM=011)。 ●
设置中断状态寄存器中的标志位(TIMx_SR寄存器中的CCxIF位)。 ●
若设置了相应的中断屏蔽(TIMx_DIER寄存器中的CCxIE位),则产生一个中断。 ●
若设置了相应的使能位(TIMx_DIER寄存器中的CCxDE位,TIMx_CR2寄存器中的CCDS位
选择DMA请求功能),则产生一个DMA请求。 TIMx_CCMRx中的OCxPE位选择TIMx_CCRx寄存器是否需要使用预装载寄存器。
在输出比较模式下,更新事件UEV对OCxREF和OCx输出没有影响。
同步的精度可以达到计数器的一个计数周期。输出比较模式(在单脉冲模式下)也能用来输出一个 单脉冲。 268/754 参照2009年12月
RM0008 Reference Manual 英文第10版
本译文仅供参考,如有翻译错误,请以英文原稿为准。请读者随时注意在ST网站下载更新版本通用定时器(TIMx) STM32F10xxx参考手册
输出比较模式的配置步骤:

  1. 选择计数器时钟(内部,外部,预分频器)
  2. 将相应的数据写入TIMx_ARR和TIMx_CCRx寄存器中
  3. 如果要产生一个中断请求和/或一个DMA请求,设置CCxIE位和/或CCxDE位。
  4. 选择输出模式,例如当计数器CNT与CCRx匹配时翻转OCx的输出引脚,CCRx预装载未 用,开启OCx输出且高电平有效,则必须设置OCxM=’011’、OCxPE=’0’、CCxP=’0’和 CCxE=’1’。
  5. 设置TIMx_CR1寄存器的CEN位启动计数器 TIMx_CCRx寄存器能够在任何时候通过软件进行更新以控制输出波形,条件是未使用预装载寄
    存器(OCxPE=’0’,否则TIMx_CCRx影子寄存器只能在发生下一次更新事件时被更新)。下图给 出了一个例子。

实验通过TIM3 通道1和通道2输出PWM改变电机的转速
通用定时器输出PWM配置流程

1.开GPIOB和AFIO时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO|RCC_APB2Periph_GPIOB,ENABLE);  //开GPIOB和AFIO

2.将PB4释放

  GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);

3.将PB4和PB5配置为复用推挽模式

GPIO_InitTypeDef GPIO_InitStruct;
GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;   //复用推挽
GPIO_InitStruct.GPIO_Pin=GPIO_Pin_4|GPIO_Pin_5;
GPIO_InitStruct.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOB, &GPIO_InitStruct);

//调用初始化函数
4.开启TIM3的时钟

RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM3,ENABLE); //开系统TIM3时钟

5.TIM3部分重映射

GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

6.初始化TIM3的时基单元(PSC = 72-1,

ARR = 1000,向上计数)TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_TimeBaseStructure.TIM_Period = 72-1;   //设置TIM_TimeBaseStructure.TIM_Prescaler = 1000; TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM3, & TIM_TimeBaseStructure);   //调用初始化函数

7.配置通道1和通道2

/* Configures the TIM2 Channel1 in PWM Mode */ TIM_OCInitTypeDef TIM_OCInitStructure; TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM3, & TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC1TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1TIM_OCInitStructure.TIM_Pulse = 0;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM3 OC2

8.使能TIM3

TIM_Cmd(TIM3,ENABLE);

9.改变比较寄存器的值 观察电机转速是否改变,原理是改变引脚高低电平的占空比

TIM_SetCompare1(TIM3,0);
TIM_SetCompare2(TIM3,500);

代码仓库:https://gitee.com/bigtiger_king/stm32f103_pwm/tree/master/

STM32通用定时器输出PWM相关推荐

  1. STM32通用定时器输出PWM控制舵机 —— 重装载值、比较值、当前值

    参考:stm32 定时器输出PWM原理及工作原理+控制舵机 作者:点灯小哥 发布时间: 2021-03-09 23:17:52 网址:https://blog.csdn.net/weixin_4601 ...

  2. STM32学习笔记:通用定时器输出PWM

    脉冲宽度调制,简称PWM(Pulse Width Modulation)是利用微处理器的数字输出 对模拟电路进行控制的一种非常有效的控制技术,常用于控制Led灯的亮度.电机转速等. STM32 的定时 ...

  3. 通用定时器输出PWM波实现呼吸灯

    STM32F1系列含有8个定时器,分为基本定时器,通用定时器和高级定时器.基本定时器 TIM6 和 TIM7 是一个 16 位的只能向上计数的定时器,只能定时,没有外部IO.通用定时器 TIM2/3/ ...

  4. DMA+TIM3通用定时器输出PWM波形驱动TM1814

    项目中用到了TM1814,这是芯片的简单介绍. 可以看出0码1码对于占空比时序有比较严格的要求,0码1码周期均在1.25us-2.5us,低电平时间的典型值分别为360ns和720ns.原先采用输出时 ...

  5. stm32通用定时器的PWM输出

    配置过程:(以TIM3为例,其CH1-CH4为:PA6.PA7.PB0.PB1) 1)开启TIM3时钟,配置4个IO口为复用推挽输出. 2)设置TIM3的ARR和PSC来控制PWM的周期. 3)设置T ...

  6. stm32C8t6 通用定时器输出PWM+定时中断控制板载LED

    stm32f103c8t6只有基本定时器和通用定时器,没有高级定时器 通过定时器3使能中断1s一次控制板载LED 基本步骤 *开启定时器时钟 *定时器初始化结构体配置 *定时器中断开启 *定时器使能 ...

  7. STM32f103C8定时器输出PWM波信号

    利用stm32高级定时器输出PWM,模拟呼吸灯的效果带刹车功能.由于没有示波器查看输出的pwm波形图,所以本次实验使用普通直流电机模拟的. 本文章为学习笔记,其中有些地方解释的不是那么的好,即本笔记可 ...

  8. STM32定时器输出PWM

    STM32定时器输出PWM 我们设置ARR值,就是设置CNT的上限,设置CCRX的值就是设置了一个临界点,CNT是一直随时间变化而变化的,当CNT>CCRX的时候输出 高/低电平 当CNT< ...

  9. stm32 定时器输出PWM原理及工作原理+控制舵机

    1.PWM的工作原理 2.PWM的内部运作机制 3.PWM的模式 模块一  边沿对齐模式 模块二 中央对齐模式 4.自动加载的预加载寄存器 5.定时器输出PWM结构体讲解 6.定时器输出PWM库函数讲 ...

最新文章

  1. spring jpa mysql集群_Spring Boot系列之十四 JPA 连接mycat
  2. 使用pdf.js预览实现读取服务器外部文件
  3. rocks自建存储流程
  4. 1001: [BeiJing2006]狼抓兔子
  5. H.264中的一些易混淆概念
  6. mysql-5.1.73-8.el6_在centos中安装mysql详细步骤说明
  7. 分布式搜索elasticsearch
  8. linux内核长期支持版本,Linux Kernel 3.12长期支持分支迎来第63个维护版本
  9. nodejs通过later实现定时执行任务
  10. 计算机怎么接入外接键盘,联想笔记本怎么外接键盘驱动 笔记本外接键盘驱动方法...
  11. 好用的Redis客户端操作工具
  12. Python大数据分析LOL游戏胜率
  13. 一个EXCEL数组公式的解析
  14. css改变水平线的颜色
  15. HP光影精灵3 TPN-Q193显卡驱动安装不上,鲁大师检测不到显卡
  16. 条码打印软件里如何批量编制69商品条码?
  17. 原生JS 简单购物车网页
  18. 面渣逆袭:RocketMQ二十三问
  19. Centos配置samba文件共享服务器
  20. 【报错解决】matlab报错:缺少动态链接库VCOMP100.DLL

热门文章

  1. Android未发现目标设备,Android设备不会显示为Unity3d调试的目标
  2. STC15W408读取HX711称重数据串口发送
  3. 中移4G模块-ML302-OpenCpu开发-2-MQTT连接阿里云
  4. python判断序列值横穿整个区间的次数
  5. python pandas借助pandas-profiling自动生成EDA
  6. pandas使用dataframe直接绘图时,取消图例(legend)
  7. pandas series 判断是否包含某个值
  8. 服务器文件同步本站,服务器文件同步
  9. 好玩的python代码聊天客户端_python socket实现客户端与服务器端对话
  10. ajax和php没反应,PHP和AJAX没有更新发生