当前位置:首页 >> 信息与通信 >>

STM32学习笔记(5):通用定时器PWM输出


STM32 学习笔记(5):通用定时器 PWM 输出 学习笔记( ): ):通用定时器
1. TIMER 输出 PWM 基本概念

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

电机的速度等等。 STM32 的定时器除了 TIM6 和 TIM7 之外,其他的定时器都可以用来产生 PWM 输出,其中高级定时器 TIM1 和 TIM8 可以同时产生 7 路的 PWM 输出,而通用 定时器也能同时产生 4 路的 PWM 输出。

1.1 PWM 输出模式 STM32 的 PWM 输出有两种模式,模式 1 和模式 2,由 TIMx_CCMRx 寄存器中 的 OCxM 位确定的(“110”为模式 1,“111”为模式 2)。模式 1 和模式 2 的 区别如下: 110:PWM 模式 1-在向上计数时,一旦 TIMx_CNT<TIMx_CCR1 时通道 1 为 有效电平,否则为无效电平;在向下计数时,一旦 TIMx_CNT>TIMx_CCR1 时 通道 1 为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。 111:PWM 模式 2-在向上计数时,一旦 TIMx_CNT<TIMx_CCR1 时通道 1 为 无效电平,否则为有效电平;在向下计数时,一旦 TIMx_CNT>TIMx_CCR1 时 通道 1 为有效电平,否则为无效电平。 由此看来,模式 1 和模式 2 正好互补,互为相反,所以在运用起来差别也并不太 大。 而从计数模式上来看,PWM 也和 TIMx 在作定时器时一样,也有向上计数模式、 向下计数模式和中心对齐模式,关于 3 种模式的具体资料,可以查看《STM32 参考手册》的“14.3.9 PWM 模式”一节,在此就不详细赘述了。

1.2 PWM 输出管脚 PWM 的输出管脚是确定好的,具体的引脚功能可以查看《STM32 参考手册》的 “8.3.7 定时器复用功能重映射”一节。在此需要强调的是,不同的 TIMx 有分

配不同的引脚,但是考虑到管脚复用功能,STM32 提出了一个重映像的概念, 就是说通过设置某一些相关的寄存器, 来使得在其他非原始指定的管脚上也能输 出 PWM。但是这些重映像的管脚也是由参考手册给出的。比如说 TIM3 的第 2 个通道,在没有重映像的时候,指定的管脚是 PA.7,如果设置部分重映像之后, TIM3_CH2 的输出就被映射到 PB.5 上了,如果设置了完全重映像的话, TIM3_CH2 的输出就被映射到 PC.7 上了。

1.3 PWM 输出信号 PWM 输出的是一个方波信号,信号的频率是由 TIMx 的时钟频率和 TIMx_ARR 预分频器所决定的,具体设置方法在前面一个学习笔记中有详细的交代。而输出 信号的占空比则是由 TIMx_CRRx 寄存器确定的。其公式为“占空比 =(TIMx_CRRx/TIMx_ARR)*100%”,因此,可以通过向 CRR 中填入适当的数来 输出自己所需的频率和占空比的方波信号。

2. TIMER 输出 PWM 实现步骤
1. 2. 3. 4. 设置 RCC 时钟; 设置 GPIO 时钟; 设置 TIMx 定时器的相关寄存器; 设置 TIMx 定时器的 PWM 相关寄存器。

第 1 步设置 RCC 时钟已经在前文中给出了详细的代码, 在此就不再多说了。 需要注意的是通用定时器 TIMx 是由 APB1 提供时钟,而 GPIO 则是由 APB2 提 供时钟。注意,如果需要对 PWM 的输出进行重映像的话,还需要开启引脚复用 时钟 AFIO。 第 2 步设置 GPIO 时钟时,GPIO 模式应该设置为复用推挽输出 GPIO_Mode_AF_PP,如果需要引脚重映像的话,则需要用 GPIO_PinRemapConfig()函数进行设置。 第 3 步设置 TIMx 定时器的相关寄存器时,和前一篇学习笔记一样,设置好 相关的 TIMx 的时钟和技术模式等等。具体设置参看“TIMER 基本定时功能” 的学习笔记。

第 4 步设置 PWM 相关寄存器,首先要设置 PWM 模式(默认情况下 PWM 是冻结的),然后设置占空比(根据前面所述公式进行计算),再设置输出比较 极性:当设置为 High 时,输出信号不反相,当设置为 Low 时,输出信号反相之 最重要是是要使能 TIMx 的输出状态和使能 TIMx 的 PWM 输出使能。 后再输出。 相关设置完成之后,就可以通过 TIM_Cmd()来打开 TIMx 定时器,从而得到 PWM 输出了。

3. TIMER 输出 PWM 源代码
由于我现在手上的奋斗开发板是将 PB.5 接到 LED 上,因此需要使用 TIM3 的 CH2 通道,并且要进行引脚重映像。打开 TIM3 之后,PWM 输出,使得 LED 点亮,通过改变 PWM_cfg()中的占空比可以调节 LED 的亮度。

#include "stm32f10x_lib.h"

void RCC_cfg(); void GPIO_cfg(); void TIMER_cfg(); void PWM_cfg(); //占空比,取值范围为 0-100 int dutyfactor = 50;

int main() { int Temp; RCC_cfg(); GPIO_cfg();

TIMER_cfg(); PWM_cfg();

//使能 TIM3 计时器,开始输出 PWM TIM_Cmd(TIM3, ENABLE);

while(1); }

void RCC_cfg() { //定义错误状态变量 ErrorStatus HSEStartUpStatus;

//将 RCC 寄存器重新设置为默认值 RCC_DeInit();

//打开外部高速时钟晶振 RCC_HSEConfig(RCC_HSE_ON);

//等待外部高速时钟晶振工作 HSEStartUpStatus = RCC_WaitForHSEStartUp(); if(HSEStartUpStatus == SUCCESS) {

//设置 AHB 时钟(HCLK)为系统时钟 RCC_HCLKConfig(RCC_SYSCLK_Div1);

//设置高速 AHB 时钟(APB2)为 HCLK 时钟 RCC_PCLK2Config(RCC_HCLK_Div1);

//设置低速 AHB 时钟(APB1)为 HCLK 的 2 分频 RCC_PCLK1Config(RCC_HCLK_Div2);

//设置 FLASH 代码延时 FLASH_SetLatency(FLASH_Latency_2);

//使能预取指缓存 FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);

//设置 PLL 时钟,为 HSE 的 9 倍频 8MHz * 9 = 72MHz RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);

//使能 PLL RCC_PLLCmd(ENABLE);

//等待 PLL 准备就绪 while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);

//设置 PLL 为系统时钟源 RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);

//判断 PLL 是否是系统时钟 while(RCC_GetSYSCLKSource() != 0x08); }

//开启 TIM3 的时钟 RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //开启 GPIOB 的时钟和复用功能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO,ENABLE);

}

void GPIO_cfg() { GPIO_InitTypeDef GPIO_InitStructure;

//部分映射,将 TIM3_CH2 映射到 PB5 // GPIO_PinRemapConfig(GPIO_FullRemap_TIM3, ENABLE); GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

//选择引脚 5 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //输出频率最大 50MHz GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //复用推挽输出 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOB,&GPIO_InitStructure); }

void TIMER_cfg() { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

//重新将 Timer 设置为缺省值 TIM_DeInit(TIM3); //采用内部时钟给 TIM3 提供时钟源 TIM_InternalClockConfig(TIM3); //预分频系数为 0,即不进行预分频,此时 TIMER 的频率为 72MHz TIM_TimeBaseStructure.TIM_Prescaler = 0; //设置时钟分割 TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置计数器模式为向上计数模式 TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;

//设置计数溢出大小,每计 7200 个数就产生一个更新事件,即 PWM 的输 出频率为 10kHz TIM_TimeBaseStructure.TIM_Period = 7200 - 1; //将配置应用到 TIM3 中 TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure); }

void PWM_cfg() { TIM_OCInitTypeDef TimOCInitStructure; //设置缺省值 TIM_OCStructInit(&TimOCInitStructure); //PWM 模式 1 输出 TimOCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //设置占空比, 占空比=(CCRx/ARR)*100%或(TIM_Pulse/TIM_Period)*100% TimOCInitStructure.TIM_Pulse = dutyfactor * 7200 / 100; //TIM 输出比较极性高 TimOCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //使能输出状态 TimOCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //TIM3 的 CH2 输出 TIM_OC2Init(TIM3, &TimOCInitStructure); //设置 TIM3 的 PWM 输出为使能 TIM_CtrlPWMOutputs(TIM3,ENABLE);

}


相关文章:
STM32通用定时器(TIM2-5)基本用法
STM32通用定时器(TIM2-5)基本用法_电子/电路_工程科技_专业资料。STM32 通用...的频率也是很高的, 定时器可以做一些基本的定时, 还可以做 PWM 输出或者输入...
STM32通用定时器基本定时功能与PWM
Value == 0) { GPIO_SetBits(GPIOB,GPIO_Pin_5); } else { GPIO_ResetBits(GPIOB,GPIO_Pin_5); } } } STM32 学习笔记(5):通用定时器 PWM 输出 1....
STM32学习笔记(4):通用定时器基本定时功能
PWM 互补输出的高级定时器, 常用于三相电机的驱动, 时钟由 APB2 的输出产生。...STM32学习笔记(5):通用... STM32学习笔记(6):LCD的...1/2 相关文档推荐...
STM32 基本定时器 学习笔记
STM32 基本定时器 学习笔记_IT/计算机_专业资料。STM32 基本定时器 学习笔记1...5 TIM6 16 位 TIM7 其中 TIM1 和 TIM8 是能够产生 3 对 PWM 互补输出的...
05_STM32F4通用定时器详细讲解
通用定时器:Timer2~timer5 和 timer9~timer14 ...2 输出波形——PWM 输出和单脉冲输出。 Timer3 有...STM32学习笔记(4):通用... 7页 1下载券 51...
S.D.Lu的STM32学习笔记(8)通用定时器实验
STM32 有 4 个通用定时器(TIM2、TIM3、TIM4、TIM5),它们适用于多种场合,包括 测量输入信号的脉冲长度(输入捕获)或者产生输出波形(输出比较和 PWM)。每个定时...
STM32通用定时器库函数设置心得——新手必看
通用定时器 STM32通用定时器为:TIM2、TIM3、TIM4 和 TIM5 在使用通用定时器时利用库函数直接设置定时器如下: 1. 使能定时器 TIM_X 的时钟:(X=2、3...
第26章 通用定时器
5页 免费 喜欢此文档的还喜欢 STM32系统时钟学习笔记 3页 免费 通用定时器 6...控制输出比较模式; 使能比较事件中断; 选择预定标器的时钟源; 激活或者禁止通用...
STM32F10XX通用定时器应用指南
STM32F10XX通用定时器应用指南_计算机硬件及网络_IT...通用定时器(TIM2~5) 图 1:通用定时器框图 1. ...COM 事件可以用来产生六步 PWM 输出。 9. 运行...
更多相关标签: