STM32使用PWM

文章介绍了PWM的概念,包括定义、适用场景和应用。接着详细阐述了频率、占空比及其作用,以及分辨率的定义。在STM32部分,讲解了输出比较OC的工作原理和通用计时器的配置。最后,提供了通过STM32输出50%占空比PWM的步骤、代码示例和检测方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、PWM简介(Pulse width modulation)

1.定义:PWM,就是脉冲宽度调制,也就是占空比可变的脉冲波形。
2.适用条件:PWM所应用的场景必须为惯性系统,像led,当立即变为低电平时,led并不会瞬间熄灭,而是具有惯性,在短时间内为逐渐熄灭。
3.应用:智能车,机器人等项目。呼吸灯、驱动电机等。

二、频率

频率为Ts的倒数,频率越大,则等效模拟信号越平稳。(即输出的方波整体上较为密集)

三、占空比(Duty Ratio)

1.定义:占空比指在一个脉冲循环内,通电时间相对于总时间所占的比例。(或者说在一个周期中,高电平的时间占整个周期的时间
2.计算:D=Ton/Ts(Ton为一个周期内高电平的时间、Ts为高低电平变换周期的时间)
3.作用:频率一定时,可以通过改变占空比来调节电压
例如高电平为5V,低电平为0V时,占空比为80%时,可以看作为4/5处的电压,即4V。
在这里插入图片描述

四、分辨率

1.定义:是指PWM最小能设定到的高电平时间所占周期的比例,即最小占空比
2.在一个时钟下,若降低频率,则周期变大,分辨率增大。

五、STM32使用pwm

1.输出比较OC(Output Compare)

如图
在这里插入图片描述
流程:在进行CNT与CCR比较后,其结果在经过输出比较电路后,通过TIM_CH1输出到GPIO引脚上。

原理:通过进行对CNT计数器CCR捕获比较寄存器的比较,来输出一个电平不断跳变的PWM方波。
每当CNT=RCC时,就会进行一次电平翻转,CNT>CCR且小于ARR(即在一个周期内)时输出高电平。

2.输出比较电路

在这里插入图片描述

原理:当CNT大于或等于CCR时,传输信号至控制器,后改变其输出的电平。

3.通用计时器

通用计时器共有4个RCC寄存器,且他们公用一个CNT计数器。

六、通过STM32输出50%占空比的PWM

1.思路

1.RCC开启时钟(GPIO和TIM)
2.选择时基单元的时钟源(定时中断选择内部时钟源)
3.配置时基单元(预分频器、自动重装器、计数模式)
4.配置CCR的值、输出比较模式、极性选择、输出使能的等参数
5.配置GPIO(PWM对应的GPIO使用复用推挽输出模式)

2.代码(PWM.c)

void PWM_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);
	//GPIO初始化
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启通用定时器TIM2的时钟
	TIM_InternalClockConfig(TIM2);//选择时基单元的时钟(默认使用内部时钟)
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//指定时钟分频,1表示不分频
	//滤波器作用:滤掉信号的抖动干扰
	//滤波器原理:在一个固定的时钟频率f下采样,若连续N个采样点电平一致,表示输入信号稳定,则输出
	//若N个采样点电平不相同,表示信号有抖动,则直接输出低电平或输出上一次的电平
	//采样频率由内部时钟直接来或由内部时钟加时钟分频来
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数器模式(向上/向下/中间3个)
	TIM_TimeBaseInitStructure.TIM_Period=100-1;//周期(10K的频率下计1w个数即为1s)(ARR)
	TIM_TimeBaseInitStructure.TIM_Prescaler=720-1;//预分频器(72M对7200分频,得到10K的计数频率)(PSC)
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器(高级计数器才有)
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//初始化结构体
	TIM_OCInitTypeDef TIM_OCInit_InitStructure;
	TIM_OCStructInit(&TIM_OCInit_InitStructure);//给结构体赋初值,以免对高级定时器等造成干扰
	
	TIM_OCInit_InitStructure.TIM_OCMode=TIM_OCMode_PWM1;//设置输出比较的模式
	//TIM_OCMode_Timing        冻结模式            
	//TIM_OCMode_Active        相等时置有效电平        
	//TIM_OCMode_Inactive      相等时置无效电平
	//TIM_OCMode_Toggle        相等时电平翻转      
	//TIM_OCMode_PWM1          PW1模式         
	//TIM_OCMode_PWM2		   PW2模式
	TIM_OCInit_InitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//设置输出比较的极性
	//TIM_OCPolarity_High      极性不翻转,REF有效是高电平,REF有效时输出高电平
	//TIM_OCPolarity_Low  		REF电平取反,有效电平为低电平
	TIM_OCInit_InitStructure.TIM_OutputState=ENABLE;//设置输出使能
	TIM_OCInit_InitStructure.TIM_Pulse=50;//设置CCR
	TIM_OC1Init(TIM2,&TIM_OCInit_InitStructure);
	//初始化输出比较单元
	TIM_Cmd(TIM2,ENABLE);//启动定时器
}

3.计算

在这里插入图片描述

4.示波器检测

请添加图片描述

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

c语言15天菜鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值