18. 利用TIM3产生PWM输出实验

发布者:BlissfulSunrise最新更新时间:2017-11-09 来源: eefocus关键字:TIM3  PWM  STM32 手机看文章 扫描二维码
随时随地手机看文章

一。 PWM简介

     脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。

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

     这里我们仅利用 TIM3的 CH2 产生一路 PWM 输出。

18. <wbr>利用TIM3产生PWM输出实验
18. <wbr>利用TIM3产生PWM输出实验

对于每个通道都有一个捕获比较寄存器CCRx,CCRx中的值与计数器TIMx_CNT中的值进行比较。

PWM信号的周期由Arr的值以及计数器的频率决定,占空比由CCRx中的值决定。

二。PWM模式

18. <wbr>利用TIM3产生PWM输出实验
输出模式控制器由CCMR1控制(以通道1为例)。

      

脉冲宽度调制模式可以产生一个由TIMx_ARR寄存器确定频率、由TIMx_CCRx寄存器确定占空比的信号。

18. <wbr>利用TIM3产生PWM输出实验

PWM模式1:

    不管向上计数还是向下计数,只要计数值CNTCC1P位决定的,设置为0是高电平有效,设置为1是电平有效。 

       在TIMx_CCMRx寄存器中的OCxM位写入’110’(PWM模式1)或’111’(PWM模式2),能够独立地设置每个OCx输出通道产生一路PWM。必须设置TIMx_CCMRx寄存器OCxPE位以使能相应的预装载寄存器,最后还要设置TIMx_CR1寄存器的ARPE位,(在向上计数或中心对称模式中)使能自动重装载的预装载寄存器。

     向上计数配置

     当TIMx_CR1寄存器中的DIR位为低的时候执行向上计数。

     下面是一个PWM模式1的例子。TIMx_CCRx寄存器的值与计数器寄存器TIMx_CNT的值进行比较。

     

18. <wbr>利用TIM3产生PWM输出实验

三。三个寄存器

1. 捕获 / 比较模式寄存器(TIMx_CCMR1/2)

18. <wbr>利用TIM3产生PWM输出实验

寄存器分了 2层,上面一层对应输出而下面的则对应输入。这里我们用PWM的输出。

每个通用定时器有4个PWM通道,通道1和通道2用CCMR1配置,通道3和通道4用CCMR2配置,这里我们用的是CH2,所以用CCMR1配置。

OC1M[2:0]:输出比较1模式

110:PWM模式1- 不管向上计数还是向下计数,一旦TIMx_CNT

111:PWM模式2- 在向上计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电平。

2. 捕获/比较使能寄存器(TIMx_CCER)

该寄存器控制着各个输入输出通道的开关。

18. <wbr>利用TIM3产生PWM输出实验

这里只用到了 CC2E 位,该位是输入/捕获 2  输出使能位,要想PWM 从 IO 口输出,这个位必须设置为 1。

3. 捕获/比较寄存器(TIMx_CCR1~4)

该寄存器总共有 4 个,对应 4 个输通道 CH1~4。该寄存器中存储着捕获比较值CCRx。

在输出模式下,该寄存器的值与 CNT 的值比较,根据比较结果产生相应动作。利用这点,我们通过修改这个寄存器的值,就可以控制 PWM 的输出脉宽了。

四。STM32的重映射

由于开发板上的LED灯是挂在PB5上,所以需要用部分重映射使PWM输出在PB5上。

STM32 的重映射控制是由复用重映射和调试 IO 配置寄存器(AFIO_MAPR)控制的。

18. <wbr>利用TIM3产生PWM输出实验

这里用到的是 TIM3 的重映射,从上图可以看出, TIM3_REMAP 是由[11:10]这 2 个位控制的。TIM3_REMAP[1:0]重映射控制表如表所示:

18. <wbr>利用TIM3产生PWM输出实验

默认条件下,TIM3_REMAP[1:0]为 00,是没有重映射的,所以 TIM3_CH1~TIM3_CH4 分别是接在 PA6、PA7、PB0 和 PB1 上的,而我们想让 TIM3_CH2 映射到 PB5 上,则需要设置TIM3_REMAP[1:0]=10,即部分重映射,这里需要注意,此时 TIM3_CH1 也被映射到 PB4 上了。

五。使用库函数配置PWM输出的步骤

18. <wbr>利用TIM3产生PWM输出实验

1)开启 TIM3 时钟以及复用功能时钟,配置 PB5 为复用推挽输出。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  //使能定时器 3 时钟

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);   //复用时钟使能

设置 PB5 为复用功能输出的方法在前面的几个实验都有类似的讲解,相信大家很明白,这里简单列出 GPIO 初始化的一行代码即可:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出

18. <wbr>利用TIM3产生PWM输出实验

2)设置 TIM3_CH2 重映射到 PB5 上。

void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);

TIM3 部分重映射的库函数实现方法是:

GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); 

3)初始化 TIM3,设置 TIM3 的 ARR 和 PSC。

在开启了 TIM3 的时钟之后,我们要设置 ARR 和 PSC 两个寄存器的值来控制输出 PWM 的周期。当 PWM 周期太慢(低于 50Hz)的时候,我们就会明显感觉到闪烁了。因此,PWM 周期在这里不宜设置的太小。

4)设置 TIM3_CH2 的 PWM 模式,使能 TIM3 的 CH2 输出。

18. <wbr>利用TIM3产生PWM输出实验
设置PWM输出只需要设置红色的部分。

在库函数中,PWM 通道设置是通过函数 TIM_OC1Init()~TIM_OC4Init()来设置的, 不同的通道的设置函数不一样, 这里我们使用的是通道 2,所以使用的函数是 TIM_OC2Init()。

void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

TIM_OCInitTypeDef   TIM_OCInitStructure; 

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高

TIM_OC2Init(TIM3, &TIM_OCInitStructure);   //初始化 TIM3 OC2

5)使能 TIM3。

先要使能TIM3在CCR2上的预装载寄存器

TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

TIM_Cmd(TIM3, ENABLE);   //使能 TIM3

6)修改 TIM3_CCR2 来控制占空比。

实际上就是修改CCRx寄存器的值。通过修改 TIM3_CCR2 则可以控制 CH2 的输出占空比。继而控制 DS0 的亮度。

修改 TIM3_CCR2 占空比的函数是:

void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);


关键字:TIM3  PWM  STM32 引用地址:18. 利用TIM3产生PWM输出实验

上一篇:17.所有中断函数的定义
下一篇:19. 输入捕获实验

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

stm32按键的检测(EXTI和Polling两种方式)
XTI Mode时,只要别漏下面这两行基本是没问题了. RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); /* 复用时钟使能 */ GPIO_EXTILineConfig(GPIO_PortSourceGPIOB,GPIO_PinSource1); /* 选择GPIO管脚用作外部中断线路 */ #include #include #define EXTI_Trigger_Mode #define KEY_RCC RCC_APB2Periph_GPIOB #define KEY_GPIO GPIOB #define KEY_PIN (GPIO_Pi
[单片机]
STM8输出PWM变频时波形断开解决方法
  在使用STM8单片机的PWM功能时,一直没出现过问题。但是在一个项目中需要在PWM波输出的过程中变频,这时候问题来了。在PWM输出过程中,输出的波形是不是的就会有一大段空白的地方,好像波形输出被关闭了一样。 输出波形如下图所示:   放大后查看   可以看到波形输出的过程中突然就消失了,而且还不是偶尔的出现一次。是频繁的出现。这就奇怪了?难道是单片机坏了?换了几个单片机测试都是这样的,那么肯定就是软件代码出问题了。那么到底是什么地方有问题了,于是开启找BUG模式,一行一行代码分析。   代码分析了半天也没找不到哪行代码有问题,输出单一频率的PWM波一直很稳定,只是改变频率的时候就会出现波形断开情况,频率改变的越多,
[单片机]
STM8输出<font color='red'>PWM</font>变频时波形断开解决方法
关于STM32f1的输入捕捉模式和PWM输入模式
简介:下面是具体的程序,配置TIM2的四个通道为基本输入捕捉模式,定时器的时基频率为1M,用于测量输入信号的高电平时间。 输入捕捉模式和PWM输入模式的区别 Stm32的通用定时器具备基本的输入捕捉功能。所谓输入捕捉功能,是指通用定时器可以通过检测输入信号的跳变沿,检测到跳变沿的同时将计数器的当前值写入相应的寄存器。我们可以利用定制器的输入捕捉模式可以测量输入信号的高电平时间、占空比和频率。 1、输入捕捉模式 Stm32的通用TIM2、3、4、5都具有输入捕捉的功能,每个定时器具有四个通道,并且每一个通道都可以单独配置为输入捕捉模式,主要用于测量输入信号的高电平时间,也可测量信号的频率(可能不太精确,尤其对于频率很高的信号
[单片机]
STM32学习14:EXTI(外部中断事件控制器)
EXTI管理了控制器的23个中断/事件线。每个中断/事件线都对应有一个边沿检测器,可以实现输入信号的上升沿检测和下降沿的检测。EXTI可以实现对每个中断/事件线进行单独配置,可以单独配置为中断或者事件,以及触发事件的属性。 编程思路: 1、配置NVIC。初始化NVIC(实现过程:先初始化NVIC结构体,再写NVICInit()函数)。 2、配置按键中断。在这个函数中,因为我们要使用IO口作为中断输入, 所以第一步我们要使能相应的IO时钟。(因为GPIO 和中断线映射关系是在寄存器 SYSCFG_EXTICR1~ SYSCFG_EXTICR4 中配置的。所以我们要配置外部中断,还需要打开 SYSCFG 时钟
[单片机]
<font color='red'>STM32</font>学习14:EXTI(外部中断事件控制器)
STM32 USART3可以接收无法发送问题
首先这个问题耗费了我比较多的时间来进行调试,比较郁闷; 1. 同时使用相同的函数进行了USART2和USART3的初始化配置, USART2工作正常, 中断服务程序的结构也是相同的, 收发都是正常的,没有发问题; 2. 使用USART3调试LCD时, 发现无法进行通信, 表现是Rx可以正常进行接收, Tx发送数据时一直为高电平, 使用示波器捕获不到任何波形; 3. 关于USART3的寄存器, GPIO的寄存器, USART3/GPIO/AFIO等时钟已经进行了配置, NVIC也进行了配置; 查看与USART2的差异,发现完全相同,没有差别, 但是无法发送. 4. 单独写了一个文件进行串口测试, 查询发送OK!
[单片机]
STM32系统定时器SysTick
1. SysTick系统定时器概述 学习完STM32的中断,下来就要学习STM32的定时器。就像电话最基本的功能是与人通话一样,定时器最基本的功能就是定时(STM32有些定时器的功能强大得超乎想象,当然不是今天要学的SysTick),定时器的使用步骤无非就是设置定时时间,然后等待超时,超时会触发中断或者设置某个标志位:若是触发中断自然要去执行中断处理函数,处理函数和中断源的绑定工作在启动文件的中断向量表已经明确,我们负责实现与之对应的中断处理函数即可;若是查询标志位则轮询访问该标志位,发生改变后再执行其他处理操作。 定时器涉及到中断,那就跟前面学习的EXTI、NVIC以及中断优先级等概念扯上关系了。系统定时器SysTick
[单片机]
<font color='red'>STM32</font>系统定时器SysTick
基于PWM控制的开关电源系统仿真研究
   0 引 言   通过数学的方法,把小功率开关电源系统表示成数学模型和非线性控制模型,建立一种开关电源全系统的仿真模型,提高了仿真速度。Matlab是一个高级的数学分析软件,Simulink是运行在Matlab环境下,用于建模、仿真和分析动态系统的软件包,它支持连续、离散及两者混合的线性及非线性系统。   在Matlab 5.2中推出了电力系统工具箱,该工具箱可以与Simulink配合使用,能够更方便地对电力电子系统进行仿真。随着电源技术的发展,PWM控制的开关电源得到了广泛的研究和应用,如通信电源,机车电源等。这里以220 V高频开关电源为研究对象,建立模型。该电源采用脉宽调制控制方式,实现了减轻重量、缩小体积、提高精度
[电源管理]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

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

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

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