你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F103系列实验板实验六---PWM 输出实验

[复制链接]
天使♀的☆宇★翼 发布时间:2015-3-4 20:14
STM32F103系列实验板实验六---PWM 输出实验
向大家介绍如何使用 STM32 的 TIM3 来产生 PWM 输出。我们将利
用 TIM3 的通道 2,把通道 2 重映射到 PB5,产生 PWM 来控制 DS0 的亮度。本章分为如下几
个部分:1 PWM 简介
              2  硬件设计
              3  软件设计
              4  下载验证
1 PWM 简介
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用
微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽
度的控制。
STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定
时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4
路的 PWM 输出,这样,STM32 最多可以同时产生 30 路 PWM 输出!这里我们仅利用 TIM3
的 CH2 产生一路 PWM 输出。如果要产生多路输出,大家可以根据我们的代码稍作修改即可。
同样,我们首先通过对 PWM 相关的寄存器进行讲解,大家了解了定时器 TIM3 的 PWM
原理之后,我们再讲解怎么使用库函数产生 PWM 输出。
要使 STM32 的通用定时器 TIMx 产生 PWM 输出,除了上一章介绍的寄存器外,我们还会
用到 3 个寄存器,来控制 PWM 的。这三个寄存器分别是:捕获 / 比较模式寄存器
(TIMx_CCMR1/2)、捕获/比较使能寄存器(TIMx_CCER)、捕获/比较寄存器(TIMx_CCR1~4)。
接下来我们简单介绍一下这三个寄存器。
首先是捕获/比较模式寄存器(TIMx_CCMR1/2),该寄存器总共有 2 个,TIMx  _CCMR1
和 TIMx _CCMR2。TIMx_CCMR1 控制 CH1 和 2,而 TIMx_CCMR2 控制 CH3 和 4。该寄存器
的各位描述如图所示: 360截图20150304200941528.jpg

该寄存器的有些位在不同模式下,功能不一样,所以在图 14.1.1 中,我们把寄存器分了 2
层,上面一层对应输出而下面的则对应输入。关于该寄存器的详细说明,请参考《STM32 参考
手册》第 288 页,14.4.7 一节。这里我们需要说明的是模式设置位 OCxM,此部分由 3 位组成。
总共可以配置成 7 种模式,我们使用的是 PWM 模式,所以这 3 位必须设置为 110/111。这两种
PWM 模式的区别就是输出电平的极性相反。
接下来,我们介绍捕获/比较使能寄存器(TIMx_CCER),该寄存器控制着各个输入输出通
道的开关。该寄存器的各位描述如图所示: 360截图20150304201038815.jpg

该寄存器比较简单,我们这里只用到了 CC2E 位,该位是输入/捕获 2  输出使能位,要想
PWM 从 IO 口输出,这个位必须设置为 1,所以我们需要设置该位为 1。最后介绍一下捕获/比较寄存器(TIMx_CCR1~4),该寄存器总共有 4 个,对应 4 个
输通道 CH1~4。因为这 4 个寄存器都差不多,在此仅以 TIMx_CCR1 为例介绍,该寄存器的各
位描述如图所示: 360截图20150304201229223.jpg
在输出模式下,该寄存器的值与 CNT 的值比较,根据比较结果产生相应动作。利用这点,
我们通过修改这个寄存器的值,就可以控制 PWM 的输出脉宽了。本章,我们使用的是 TIM3
的通道 2,所以我们需要修改 TIM3_CCR2 以实现脉宽控制 DS0 的亮度。
我们要利用 TIM3 的 CH2 输出 PWM 来控制 DS0 的亮度,但是 TIM3_CH2 默认是接在 PA7
上面的,而我们的 DS0 接在 PB5 上面,如果普通 MCU,可能就只能用飞线把 PA7 飞到 PB5
上来实现了,不过,我们用的是 STM32,它比较高级,可以通过重映射功能,把 TIM3_CH2
映射到 PB5 上。STM32 的重映射控制是由复用重映射和调试 IO 配置寄存器(AFIO_MAPR)控制的,该
寄存器的各位描述如图所示: 360截图20150304201319261.jpg

默认条件下,TIM3_REMAP[1:0]为 00,是没有重映射的,所以 TIM3_CH1~TIM3_CH4 分
别是接在 PA6、PA7、PB0 和 PB1 上的,而我们想让 TIM3_CH2 映射到 PB5 上,则需要设置
TIM3_REMAP[1:0]=10,即部分重映射,这里需要注意,此时 TIM3_CH1 也被映射到 PB4 上了。
至此,我们把本章要用的几个相关寄存器都介绍完了,本章要实现通过重映射 TIM3_CH2
到 PB5 上,由 TIM3_CH2 输出 PWM 来控制 DS0 的亮度。下面我们介绍通过库函数来配置该
功能的步骤。 首先要提到的是,PWM 相关的函数设置在库函数文件 stm32f10x_tim.h 和 stm32f10x_tim.c
文件中。
1)开启 TIM3 时钟以及复用功能时钟,配置 PB5 为复用输出。
要使用 TIM3,我们必须先开启 TIM3 的时钟,这点相信大家看了这么多代码,应该明白了。
这里我们还要配置 PB5 为复用输出,这是因为 TIM3_CH2 通道将重映射到 PB5 上,此时, PB5
属于复用功能输出。库函数使能 TIM3 时钟的方法是:
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  //使能定时器 3 时钟
这在前面一章已经提到过。库函数设置 AFIO 时钟的方法是:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);   //复用时钟使能
这两行代码很容易组织,这里不做过多重复的讲解。 设置 PB5 为复用功能输出的方法在前面的
几个实验都有类似的讲解,相信大家很明白,这里简单列出 GPIO 初始化的一行代码即可:
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   //复用推挽输出
2)设置 TIM3_CH2 重映射到 PB5 上。
因为 TIM3_CH2 默认是接在 PA7 上的,所以我们需要设置 TIM3_REMAP 为部分重映射(通
过 AFIO_MAPR 配置),让 TIM3_CH2 重映射到 PB5 上面。在库函数函数里面设置重映射的函
数是:
void GPIO_PinRemapConfig(uint32_t GPIO_Remap, FunctionalState NewState);
在前面 STM32 重映射章节 4.4.2 已经讲解过, STM32 重映射只能重映射到特定的端口。 第一个
入口参数可以理解为设置重映射的类型,比如 TIM3 部分重映射入口参数为
GPIO_PartialRemap_TIM3,这点可以顾名思义了。 所以 TIM3 部分重映射的库函数实现方法是:
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
3)初始化 TIM3,设置 TIM3 的 ARR 和 PSC。
在开启了 TIM3 的时钟之后,我们要设置 ARR 和 PSC 两个寄存器的值来控制输出 PWM 的
周期。当 PWM 周期太慢(低于 50Hz)的时候,我们就会明显感觉到闪烁了。因此,PWM 周
期在这里不宜设置的太小。 这在库函数是通过 TIM_TimeBaseInit 函数实现的,在上一节定时器
中断章节我们已经有讲解,这里就不详细讲解,调用的格式为:
TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据指定的参数初始化 TIMx 的
4)设置 TIM3_CH2 的 PWM 模式,使能 TIM3 的 CH2 输出。
接下来,我们要设置 TIM3_CH2 为 PWM 模式(默认是冻结的),因为我们的 DS0 是低电
平亮,而我们希望当 CCR2 的值小的时候,DS0 就暗,CCR2 值大的时候,DS0 就亮,所以我
们要通过配置 TIM3_CCMR1 的相关位来控制 TIM3_CH2 的模式。在库函数中,PWM 通道设
置是通过函数 TIM_OC1Init()~TIM_OC4Init()来设置的, 不同的通道的设置函数不一样, 这里我
们使用的是通道 2,所以使用的函数是 TIM_OC2Init()。
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
这种初始化格式大家应该也熟悉了,所以我们直接来看看结构体 TIM_OCInitTypeDef
的定义:
typedef struct
{
uint16_t TIM_OCMode;   uint16_t TIM_OutputState;  
uint16_t TIM_OutputNState; */
uint16_t TIM_Pulse;         
uint16_t TIM_OCPolarity;   
uint16_t TIM_OCNPolarity;   
uint16_t TIM_OCIdleState;  
uint16_t TIM_OCNIdleState;  
} TIM_OCInitTypeDef;
这里我们讲解一下与我们要求相关的几个成员变量:
参数 TIM_OCMode 设置模式是 PWM 还是输出比较,这里我们是 PWM 模式。
参数 TIM_OutputState 用来设置比较输出使能,也就是使能 PWM 输出到端口。
参数 TIM_OCPolarity 用来设置极性是高还是低。
其他的参数 TIM_OutputNState,TIM_OCNPolarity,TIM_OCIdleState 和 TIM_OCNIdleState 是
高级定时器 TIM1 和 TIM8 才用到的。
要实现我们上面提到的场景,方法是:
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。使能 TIM3 的方法前面已经讲解过:
TIM_Cmd(TIM3, ENABLE);   //使能 TIM3
6)修改 TIM3_CCR2 来控制占空比。
最后,在经过以上设置之后,PWM 其实已经开始输出了,只是其占空比和频率都是固定
的,而我们通过修改 TIM3_CCR2 则可以控制 CH2 的输出占空比。继而控制 DS0 的亮度。
在库函数中,修改 TIM3_CCR2 占空比的函数是:
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
理所当然,对于其他通道,分别有一个函数名字,函数格式为 TIM_SetComparex(x=1,2,3,4)。
通过以上 6 个步骤,我们就可以控制 TIM3 的 CH2 输出 PWM 波了。



收藏 2 评论8 发布时间:2015-3-4 20:14

举报

8个回答
lkl0305 回答时间:2015-3-4 21:17:20
多谢分享!!!
天使♀的☆宇★翼 回答时间:2015-3-4 21:46:12
lkl0305 发表于 2015-3-4 21:17
多谢分享!!!

不用客气啦,以后再学习STM32上面可以相互支持,一起学习
大器所成 回答时间:2015-3-4 21:57:59
:)
天使♀的☆宇★翼 回答时间:2015-3-4 22:01:46

欢迎一起学习讨论,嘿嘿,本人现在正在准备研究生复试,大概四月份就有时间玩板子了
大器所成 回答时间:2015-3-4 22:04:54
天使♀的☆宇★翼 发表于 2015-3-4 22:01
欢迎一起学习讨论,嘿嘿,本人现在正在准备研究生复试,大概四月份就有时间玩板子了 ...

加油啊,好好复习,坚持到底就是胜利
zfz0122 回答时间:2015-3-4 22:07:29
学习了。。粘贴的时候能不能调下格式啊 1.png
天使♀的☆宇★翼 回答时间:2015-3-4 22:07:38
大器所成 发表于 2015-3-4 22:04
加油啊,好好复习,坚持到底就是胜利

好滴,谢谢你了,有时间一起讨论讨论STM32,我以前学的是F103系列
raulgu-332879 回答时间:2015-3-5 10:29:15
好好学习。。。。

所属标签

STM32团队

意法半导体微控制器和微处理器拥有广泛的产品线,包含低成本的8位单片机和基于ARM® Cortex®-M0、M0+、M3、M4、M33、M7及A7内核并具备丰富外设选择的32位微控制器及微处理器


最新内容

相似技术帖

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版