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

前言:

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

一、配置流程

1、开启GPIOTIM的时钟

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_OCInitStructureTIM_OCMode用来配置PWM模式,TIM_OCPolarity用来配置输出极性(即有效电平)。

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

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

得出以下结论

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

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

相关推荐
floret. 小花2 天前
Vue3 知识点总结 · 2026-03-27
前端·面试·electron·学习笔记·vue3
somi72 天前
ARM-07-i.MX6ULL-EPIT定时器和GPT
arm开发·单片机·嵌入式硬件·gpt·定时器·自用·时钟配置
四谎真好看2 天前
Redis学习笔记(实战篇4)
redis·笔记·学习·学习笔记
刘莫语6 天前
3.Langchain 1.2.0 学习 --- LCEL和Runnable
学习笔记
Ronin3056 天前
【Qt系统相关】Qt系统相关
网络·qt·音视频·多线程·定时器·事件·qt文件
551只玄猫7 天前
新编大学德语1第三版笔记 第5课Essen und Trinken
笔记·学习笔记·德语·外语·德语a1·自学德语·新编大学德语
嵌入小生0077 天前
硬件 --- GPIO/中断/定时器/蜂鸣器
单片机·嵌入式硬件·定时器·pwm·gpio·蜂鸣器·中断
m0_488633327 天前
C语言学习笔记:探索简洁灵活且具多种特性的编程语言
c语言·学习笔记·编程语言·简洁性·灵活性
551只玄猫7 天前
【基于python的金融分析和风险管理 学习笔记】中阶篇 第6章 分析利率和汇率
笔记·python·学习·金融·学习笔记·汇率·利率