1、通用定时器的PWM功能

  STM32F103ZET6有4个通用定时器,分别是TIM2、TIM3、TIM4、TIM5。

  通用定时器由一个可编程预分频器驱动的16位自动装载计数器构成。

  通用定时器的很多功能与基本定时器是一样的,但是每个通用定时器都有4个IO口,可以用来测量输入信号的脉冲长度(输入捕获)或产生输出波形(输出比较和PWM)。

  通用定时器可以用来输出PWM信号,每个通用定时器可以输出4路PWM信号。

2、通用定时器的输入/输出脚

  每个通用定时器都具有4个输入/输出通道,即4个IO口,它们的对应关系如下图:

3、通用定时器的计数方式

  通用定时器的框图如下:

  图中TIMx_CH1、TIMx_CH2、TIMx_CH3、TIMx_CH4就是用来输出PWM的脚位,对应定时器的4个通道。

  通用定时器的功能是在基本定时器功能上的扩展,定时部分跟基本定时器是差不多的,只是基本定时器只能是向上计数,而通用定时器既可以设置成向上计数、也可以设置成向下计数、或是设置成向上/向下计数。

  通用定时器的向上计数模式跟基本定时器是一样的。

  通用定时器的向下计数模式:

  在向下计数模式中,计数器先从TIMx_ARR自动装载寄存器中获取计数初值,然后开始向下计数,当计数到0时产生中断并重新从TIMx_ARR自动装载寄存器中获取初值。

通用定时器的向上/向下计数模式:  

  在向上/向下计数模式中,计数器从0开始计数到TIMx_ARR-1的值后产生中断,然后向下计数到1并产生中断;然后再从0开始重新计数。

  在向上/向下计数模式中,不能对TIMx_CR1寄存器中的DIR位赋值,DIR位由硬件更新,可以通过读取DIR位来确认当前是向上计数还是向下计数。

    在向上/向下计数模式中,如果内部时钟分频因子为1,TIMx_ARR自动装载寄存器的值为0x06,那么定时器的的时序图如下:

  从图中可以看到,计数器向上计数到0x05的时候产生了溢出中断,计数器向下计数到1的时候产生了溢出中断。

  通用定时器通过TIMx_CR1控制寄存器的CMS[1:0]位和DIR位来控制定时器的计数方向。

4、通用定时器PWM输出的工作原理

  通用定时器PWM输出的频率由TIMx_ARR自动重装载寄存器和TIMx_PSC预分频器寄存器确定、占空比由TIMx_CCRx捕获/比较寄存器决定。

  通用定时器PWM的工作模式:

  通用定时器的PWM可以设置为两种模式:PWM模式1和PWM模式2,模式的选择是根据TIMx_CCMRx捕获/比较模式寄存器OCxM[2:0](x范围是1~4,表示4个通道)这三个位的设置决定的。

  这里需要特别注意的是每个定时器的PWM输出通道有4个,但是捕获/比较模式寄存器只有2个:TIMx_CCMR1和TIMx_CCMR2,TIMx_CCMR1寄存器的低16位为有效位,低8位用来配置通道1,高8位用来配置通道2;TIMx_CCMR2寄存器也是低16位为有效位,低8位用来配置通道3,高8位用来配置通道4。也就是说每8个位配置一个通道,这8个位的配置参数是一样的,不一样的只是配置的通道不一样。

  PWM模式1:

  当OCxM[2:0] = 110时,PWM处于模式1下。

  当定时器的计数器的值小于捕获/比较寄存器的值时(TIMx_CNT < TIMx_CCRx),输出通道输出有效电平。

  当定时器的计数器的值大于等于捕获/比较寄存器的值时(TIMx_CNT >= TIMx_CCRx),输出通道输出无效电平。

  PWM模式2:

  当OCxM[2:0] = 111时,PWM处于模式2下。

  当定时器的计数器的值小于捕获/比较寄存器的值时(TIMx_CNT < TIMx_CCRx),输出通道输出无效电平。

  当定时器的计数器的值大于等于捕获/比较寄存器的值时(TIMx_CNT >= TIMx_CCRx),输出通道输出有效电平。

    通过对比可以看出,PWM模式1和PWM模式2的输出电平刚好是相反的。

  有效电平和无效电平:

  在PWM模式1和PWM模式2的介绍中可以看到PWM输出通道输出分为有效电平和无效电平两种状态。有效和无效电平是根据TIMx_CCER捕获/比较使能寄存器的bit1位CCxP来决定是什么状态的。

  当CCxP = 0时,输出通道的有效电平为高电平,无效电平为低电平。

  当CCxP = 1时,输出通道的有效电平为低电平,无效电平为高电平。

  当CCxP = 0时,如果PWM处于模式1的状态下,当TIMx_CNT < TIMx_CCRx时,输出通道输出高电平,当TIMx_CNT >= TIMx_CCRx时,输出通道输出低电平;如果PWM处于模式2的状态下,当TIMx_CNT < TIMx_CCRx时,输出通道输出低电平,当TIMx_CNT >= TIMx_CCRx时,输出通道输出高电平。模式1和模式2刚好相反。

  当CCxP = 1时,如果PWM处于模式1的状态下,当TIMx_CNT < TIMx_CCRx时,输出通道输出低电平,当TIMx_CNT >= TIMx_CCRx时,输出通道输出高电平。如果PWM处于模式2的状态下,当TIMx_CNT < TIMx_CCRx时,输出通道输出高电平,当TIMx_CNT >= TIMx_CCRx时,输出通道输出低电平。模式1和模式2刚好相反。

  在PWM模式1或2下,TIMxCNT寄存器和TIMx_CCRx寄存器始终在进行比较(一句计数器的计数方向)以确定是否符合TIMx_CCRx <= TIMx_CNT或者TIMx_CNT <= TIMx_CCRx。         

  当使能定时器后,计数器开始计数,可以将定时器设置为向上计数、向下计数、向上/向上计数。

  在STM3参考手册中,用边沿对齐模式来指示计数器向上计数、计数器向下计数这两种模式,具体是向上还是向下,需要根据TIMx_CR1寄存器的DIR位来设置,当DIR=0时是向上计数模式;当DIR=1时是向下计数模式。用中央对齐模式来指示计数器向上和向下同时计数的模式。

  通过TIMx_CR1控制寄存器的bit6~bit5位CMS[1:0]来选择是边沿对齐模式还是中央对齐模式。

  PWM边沿对齐模式:

  定时器向上计数:

  当TIMx_CR1寄存器的bit4位DIR为0时,定时器向上计数。

  下图是PWM选择为模式1,有效电平为高电平,OCXREF指示输出的电平状态,TIMx_ARR的值为8,也就是计数器TIMx_CNT递增到8后清0从新计数。

  从图中可以看,当CCRx = 4,若TIMx_CNT < 4,则OCXREF输出的是高电平;若TIMx_CNT >= 4,则OCXREF输出的是低电平。

  当CCRx = 8,若TIMx_CNT < 8,则OCXREF输出高电平;若TIMx_CNT >= 8,则OCXREF输出低电平。

  当CCRx > 8,则TIMx_CNT一直小于CCRx,则OCXREF一直保持高电平。

  当CCRx = 0,则TIMx_CNT一直不小于CCRx,则OCXREF一直保持低电平。

  从图中还可以看到,CCxIF中断状态位的变化,CCRx与TIMx_CNT每比较成功一次就会置位CCxIF,当CCRx > TIMx_CNT或CCRx = 0时,在定时器计数器溢出时,CCxIF会被置位。

  定时器向下计数:

  当TIMx_CR1寄存器的bit4位DIR为1时,定时器向下计数。

  这个跟向上计数模式是差不多的,只是计数方向不一样。  

PWM中央对齐模式:

  当TIMx_CR1寄存器中的CMS位不为'00'时,定时器的计数方式为中央对齐模式。

  根据不同的CMS位设置,比较标志可以在计数器向上计数时被置1、在计数器向下计数时被置1、或是在计数器向上和向下计数时被置1。

  当定时器工作在中央对齐模式时,TIMx_CR1寄存器中的计数方向位DIR由硬件更新,DIR变为只读位,不能软件修改。

  如下图是定时器工作在中央对齐模式时的PWM图形:

  进入中央对齐模式时,软件不能同时修改TIMx_CR1寄存器中的DIR位和CMS位。

  使用中央对齐模式最保险的方法,就是在启动计数器之前产生一个软件更新(设置TIMx_EGR寄存器中的UG位),不要在计数器工作的过程中修改计数器的值。

5、通用定时器PWM的配置流程

  1、开启使用到的通用定时器的时钟,配置相应的输出通道的脚位为复用输出,如果脚位需要重映射,还需要根据具体需求进行重映射配置。

  2、通过TIMx_CR1寄存器的bit6~bit5位CMS[1:0]来选择定时器的计数模式,如果设置的是边沿对齐模式,还需要设置TIMx_CR1寄存器的bit4位DIR来选择计数器是向上计数还是向下计数;若选择的是中央对齐模式,则不需要设置DIR位。

  3、通过设置TIMx_ARR寄存器和TIMx_PSC寄存器来决定PWM输出的频率,如果TIMx_ARR寄存器需要使用缓冲功能,还需要将TIMx_CR1的bit7位ARPE位置1。

  4、通过设置TIMx_CCRx捕获/比较寄存器来决定PWM输出的占空比。

  5、通过捕获/比较模式寄存器TIMx_CCMRx配置相应的通道为输出和PWM的模式。这里需要注意的是每个定时器的捕获/比较模式寄存器只有两个,而通道有4个,这是应为TIMx_CCMR1配置的是CH1和CH2;而TIMx_CCMR2配置的CH3和CH4。TIMx_CCMR1寄存器的低8位配置的是CH1,高8位配置的是CH2;而TIMx_CCMR2寄存器的低8位配置的是CH3,高8位配置的是CH4。每8个位配置一个通道,每个通道配置的位都是相同的。通过TIMx_CCMRx寄存器的OCxM[2:0]位选择PWM的工作模式,OCxM[2:0]只有“110”和“111”这两个数值是配置为PWM模式。TIMx_CCMRx寄存器的CCxS[1:0]位用来配置通道是输出还是输入,这里将CCxS[1:0]设置为“00”,将通道配置为输出。

  6、通过捕获/比较使能寄存器TIMx_CCER来配置输出通道的有效电平和使能相应的通道输出PWM。TIMx_CCER寄存器可以配置4个通道,每个通道占的bit位置不同。使用TIMx_CCER寄存器的CCxP位选择输出通道的有效电平的状态。通过置位TIMx_CCER寄存器的CCxE位来开启PWM信号输出到对应的脚位,也可以通过清零CCxE位来禁止PWM输出。

  7、最后置位TIMx_CR1寄存器的bit0位CEN来启动定时器开始计数。

  8、因为这里是配置PWM的输出功能,没有用到中断,所以不需要配置中断。

6、HAL库操作PWM输出

  初始化代码如下:

 TIM_HandleTypeDef TIM5_Handler_Init;
TIM_OC_InitTypeDef PWM_Handler_Init; void PWM_Init(void)
{
GPIO_InitTypeDef GPIO_InitStruct; __HAL_RCC_GPIOA_CLK_ENABLE();
__HAL_RCC_TIM5_CLK_ENABLE(); GPIO_InitStruct.Pin = GPIO_PIN_0;
GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
GPIO_InitStruct.Pull = GPIO_NOPULL;
GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct); 17   HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, GPIO_PIN_SET); TIM5_Handler_Init.Instance = TIM5;
TIM5_Handler_Init.Init.Prescaler = -;
TIM5_Handler_Init.Init.Period = ;
TIM5_Handler_Init.Init.CounterMode = TIM_COUNTERMODE_UP;
HAL_TIM_Base_Init(&TIM5_Handler_Init); PWM_Handler_Init.OCMode = TIM_OCMODE_PWM1;
PWM_Handler_Init.Pulse = ;
PWM_Handler_Init.OCPolarity = TIM_OCPOLARITY_HIGH;
PWM_Handler_Init.OCFastMode = TIM_OCFAST_DISABLE; HAL_TIM_PWM_ConfigChannel(&TIM5_Handler_Init,&PWM_Handler_Init,TIM_CHANNEL_1); HAL_TIM_PWM_Start(&TIM5_Handler_Init,TIM_CHANNEL_1);
}

  这里配置的是通用定时器TIM5的通道1来作为PWM输出,对应的IO为PA0。

  第1、2行定义两个结构体变量,TIM5_Handler_Init用来初始化通用定时器,PWM_Handler_Init用来初始化PWM输出通道。

  第8、9行是开启GPIA和TIM5定时器的时钟。

  第11到17行配置的是PA0口为复用输出功能。

  第19到23行配置的是TIM5定时器的自动重装值和预分频的值,还有TIM5定时器计数模式。

  第25到28行配置的是PWM功能,第25行是选择PWM的工作模式;第26行是设置PWM的占空比;第27行是选择通道的有效电平;

  第30行是对PWM输出通道进行初始化。

  第32行是使能PWM信号输出到对应的脚位和启动TIM5定时器。    

STM32F103ZET6 PWM输出的更多相关文章

  1. Arduino学习经验(一)之解决舵机库和pwm输出冲突

    一.前言 最近在公司学习Arduino uno ,用它实现小车超声波避障功能.实现的功能很简单,就是在小车前方挂一个超声波模块,当碰到障碍物时,会通过舵机进行摆头,判断两边的距离,进行左右转弯.但是碰 ...

  2. 关于普通定时器与高级定时器的 PWM输出的初始化的区别

    不管是普通定时器还是高级定时器,你用哪个通道,就在程序里用OC多少.比如CH3对应OC3 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  TIM_ ...

  3. (五)转载:通用定时器PWM输出

    1.     TIMER输出PWM基本概念 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有 ...

  4. 16路PWM输出的pca9685模块

    今天要介绍的就是该模块,该模块是16路pwm模块,使用I2C总线可以控制16路舵机(led). 接线OE空着就可以,其他VCC是芯片供电+5,SCL时钟线,SDA信号线,GND地线. 芯片介绍可以看: ...

  5. 关于STM32CubeMX使用LL库设置PWM输出

    HAL和LL库 HAL是ST为了实现代码在ST家族的MCU上的移植性,推出的一个库,称为硬件抽象层,很明显,这样做将会牺牲存储资源,所以项目最后的代码比较冗余,且运行效率大大降低,运行速度受制于fla ...

  6. TIMER门控模式控制PWM输出长度

    TIMER门控模式控制PWM输出长度 参照一些网友代码做了些修改,由TIM4来控制TIM2的PWM输出长度, 采用主从的门控模式,即TIM4输出高时候TIM2使能输出 //TIM2 PWM输出,由TI ...

  7. STM32 PWM输出(映射)

    STM32 的定时器除了 TIM6 和 7.其他的定时器都可以用来产生 PWM 输出.其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出.而通用定时器也能同时产生多达 4 ...

  8. STM32 HAL库学习系列第4篇 定时器TIM----- 开始定时器与PWM输出配置

    基本流程: 1.配置定时器 2.开启定时器 3.动态改变pwm输出,改变值  HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); 函数总结: __HAL_TIM ...

  9. NUCLEO-L053R8 TIM定时器 PWM输出

    TIM2 PWM输出测试 今天给大伙分享一个TIM2 PWM输出小实验. 实验开发板:Nucleo-L053R8,即STM32L053R8T6. 开发环境:MDK5 图1 - 工程界面 本次实验测试的 ...

随机推荐

  1. python笔记28(TCP,UDP,socket协议)

    今日内容 1.TCP协议 协议的特点:三次握手,四次挥手: 2.UDP协议 3.OSI七层模型:每层的物理设备,每一层协议. 4.代码部分: ①介绍socket: ②使用socket完成tcp协议的w ...

  2. HTTPS 笔记

    随着互联网的迅速发展,网络安全问题日益凸显,现在 Chrome 浏览器已经开始阻止非 https 网站的访问了.对于 https 的流程一直不是十分清晰,借着还没有完全复工有时间,大概画了个图总结一下 ...

  3. arm 添加 ftp server 之 bftpd

    本来想装vsftp 结果装上以后执行报错 Segmentation fault , 换到几个 其它的小型ftp server 软件 ,试了 Stupid-FTPd,不能用. bftpd 可以使用,Ti ...

  4. NLP(二十六)限定领域的三元组抽取的一次尝试

      本文将会介绍笔者在2019语言与智能技术竞赛的三元组抽取比赛方面的一次尝试.由于该比赛早已结束,笔者当时也没有参加这个比赛,因此没有测评成绩,我们也只能拿到训练集和验证集.但是,这并不耽误我们在这 ...

  5. redis实现数据库(一)

    转:https://www.cnblogs.com/beiluowuzheng/p/9738159.html 服务器中的数据库 Redis服务器将所有数据库都保存在服务器状态redis.h/redis ...

  6. Docker深入浅出系列 | Swarm多节点实战

    目录 前期准备 Swarm基本概念 什么是Docker Swarm 为什么要用Swarm Swarm的网络模型 Swarm的核心实现机制 服务发现机制 负载均衡机制Routing Mesh Docke ...

  7. 记一次nor flash固件烧录速度优化

    背景 某个方案使用的是spinor作为存储介质,每次烧录新固件都耗时数分钟,为了提高效率,需要对其进行优化. 分析流程 基本流程 当前烧录流程,有一个可选步骤,全盘擦除,这个步骤耗时达数分钟.不过这是 ...

  8. Docker学习-私有仓库docker-registry的使用

    1.从docker官方仓库下载registry 2.将registry放进容器内 3.在官方下载镜像上传本地仓库 4.私有仓库docker-registry使用的常见问题 5.配置阿里云镜像加速器 假 ...

  9. 矩阵快速幂-QuickPow

    矩阵快速幂引入: 1.整数快速幂: 为了引出矩阵的快速幂,以及说明快速幂算法的好处,我们可以先求整数的幂.如果现在要算X^8:则 XXXXXXXX 按照寻常思路,一个一个往上面乘,则乘法运算进行7次. ...

  10. OFD电子证照模版制作工具使用说明

    每一类电子证照都具有相同板式,不同的电子证照之间只是文字.图片的差异.生成电子证照常用的方式就是采用模版批量生成. 本软件可以方便的设计证照模版.服务端根据模版生成电子证照,不同种类的电子证照生成逻辑 ...