[STM32 标准库]定时器输出PWM配置流程 PWM模式解析

前言:

本文内容基本来自江协,整理起来方便日后开发使用。MCU:STM32F103C8T6。

一、配置流程

1、开启GPIO,TIM的时钟

javascript 复制代码
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);			//开启TIM2的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟

2、GPIO初始化,模式为复用推挽输出

javascript 复制代码
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		//GPIO_Pin_15;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);							//将PA0引脚初始化为复用推挽输出	
																	//受外设控制的引脚,均需要配置为复用模式	

3、TIM时基单元初始化

javascript 复制代码
	/*配置时钟源*/
	TIM_InternalClockConfig(TIM2);		//选择TIM2为内部时钟,若不调用此函数,TIM默认也为内部时钟
	/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定义结构体变量
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;					//计数周期,即ARR的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;				//预分频器,即PSC的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;            //重复计数器,高级定时器才会用到
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);             //将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元

4、输出比较初始化

javascript 复制代码
	/*输出比较初始化*/
	TIM_OCInitTypeDef TIM_OCInitStructure;							//定义结构体变量
	TIM_OCStructInit(&TIM_OCInitStructure);							//结构体初始化,若结构体没有完整赋值
																	//则最好执行此函数,给结构体所有成员都赋一个默认值
																	//避免结构体初值不确定的问题
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;				//输出比较模式,选择PWM模式1
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;		//输出极性,选择为高,若选择极性为低,则输出高低电平取反
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	//输出使能
	TIM_OCInitStructure.TIM_Pulse = 0;								//初始的CCR值
	TIM_OC1Init(TIM2, &TIM_OCInitStructure);						//将结构体变量交给TIM_OC1Init,配置TIM2的输出比较通道1

5、使能TIM

javascript 复制代码
	/*TIM使能*/
	TIM_Cmd(TIM2, ENABLE);			//使能TIM2,定时器开始运行

6、编写设置占空比的函数

javascript 复制代码
void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2, Compare);		//设置CCR1的值
}

二、框图(二次开发或计算用)

1、PWM基本结构

2、参数计算

3、PWM模式

PWM模式1:CNT < CCR时,输出有效电平;CNT ≥ CCR时,输出无效电平;
PWM模式2:CNT < CCR时,输出无效电平;CNT ≥ CCR时,输出有效电平;

占空比的定义:脉冲信号中高电平持续时间与整个周期时间的比率

TIM_OCInitStructure的TIM_OCMode用来配置PWM模式,TIM_OCPolarity用来配置输出极性(即有效电平)。

对于PWM模式1和PWM模式2,输出极性的高低,我做了一下四组实验,其中设置了CNT为100,CCR为40:

  • PWM模式1、输出极性高:占空比40%;(最常用的)
  • PWM模式1、输出极性低:占空比60%;
  • PWM模式2、输出极性高:占空比60%;
  • PWM模式2、输出极性低:占空比40%;

得出以下结论

对于PWM模式1:蓝色线段的下半段输出有效电平,上半段输出无效电平;

对于PWM模式2:蓝色线段的上半段输出无效电平,下半段输出有效电平;

相关推荐
曲径海盗3 天前
【Python 学习第 41 天】for 循环
python·学习笔记·编程入门
曲径海盗4 天前
【Python 学习第 38 天】for 循环
python·学习笔记·编程入门
曲径海盗4 天前
【Python 学习第 40 天】for 循环
python·学习笔记·编程入门
曲径海盗5 天前
【Python 学习第 37 天】for 循环
python·学习笔记·编程入门
曲径海盗5 天前
【Python 学习第 39 天】for 循环
python·学习笔记·编程入门
Sakura_j_h_7 天前
STM32F103 定时器的三种用法:PWM 输出、输入捕获与编码器接口
stm32·嵌入式·输入捕获·定时器·pwm·编码器·1024程序员节
曲径海盗12 天前
【Python 学习第 34 天】条件判断 if/else
python·学习笔记·编程入门
泡泡糖的中文规格书12 天前
HDLbits 1.2 学习笔记
fpga开发·学习笔记·verilog
曲径海盗14 天前
【Python 学习第 33 天】条件判断 if/else
python·学习笔记·编程入门
曲径海盗15 天前
【Python 学习第 31 天】复习:变量与数据类型 等 3 题
python·学习笔记·编程入门