STM32-PWM输出相关配置介绍

本文详细介绍如何使用STM32的高级定时器实现PWM输出,并通过改变占空比来制作呼吸灯效果。从配置GPIO到定时器初始化,再到实现呼吸灯的软件控制,一步步带领读者掌握STM32 PWM的应用。

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

2018/4/21

STM32

1.相关关键词注释:

1.PWM(脉冲宽度调制):通过数字输出对模拟量进行控制

2.TIM_x:定时器,在STM32中存在8个

3.TIM_OC:实现输出比较功能

4.pwmval:占空比

2.具体配置流程

1,介绍:作为PWM除了基本定时器没有通道,通用寄存器有4道,高级寄存器有7道

2.步骤

//高级定时器的PWM输出功能
//实现PWM输出步骤
//1.使能定时器3和相关IO口时钟
//2.初始化IO口为复用输出
//3.重映射PB5
//4.实现初始化定时器arr psc
//5.初始化比较参数
//6.使能预装载定时器
//7.使能定时器
//8.改变CCRX实现占空比的效果

3.具体实现

1.相关结构体的配置和时钟使能(准备工作)

//结构体初始化
	GPIO_InitTypeDef  GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStructure;//设置定时器的初始化
 	TIM_OCInitTypeDef TIM_OCInitStructure;//实现对输出比较功能的配置
	//配置GPIO口
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);//使能TIM1
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB| RCC_APB2Periph_AFIO,ENABLE);//使能GPIOB和AFIO的复用时钟
	

2.初始化GPIO

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;				 //LED0-->PA.8 端口配置
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;			//设置复用推挽 输出		 /
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 //IO口速度为50MHz
	GPIO_Init(GPIOA, &GPIO_InitStructure);		

3.配置定时器1(高级定时器)

        TIM_TimeBaseInitStructure.TIM_Period=arr;//自动重载寄存器周期
	TIM_TimeBaseInitStructure.TIM_Prescaler=psc;//时钟频率的预分频系数
	TIM_TimeBaseInitStructure.TIM_ClockDivision=0;//设置时钟分割,滤波器的频率和定时器的频率是一样的
	//这2位定义在定时器时钟(CK_INT)频率、死区时间和由死区发生器与数字滤波器(ETR,TIx)所用 
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数模式
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);//进行定时器3的初始化
	//TIM_ITConfig(TIM1,TIM_IT_Update,ENABLE); //允许更新中断

4.配置比较功能(TIMx_OC)

//配置PWM通道
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
	//设置为模式2,模式2代表着如果所在值(TIMx_CNT)小于捕获值(TIM_xCCR)有效(高低电平可调)
	//设置为模式1,模式1代表着如果所在值(TIMx_CNT)大于捕获值(TIM_xCCR)有效(高低电平可调)
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//输出极性高
	TIM_OC1Init(TIM1, &TIM_OCInitStructure);
	//使能高级寄存器的刹车和死区寄存器
	TIM_CtrlPWMOutputs(TIM1,ENABLE); //⑤MOE 主输出使能
	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //CH1 预装载使能
	TIM_ARRPreloadConfig(TIM1, ENABLE); //使能 TIMx 在 ARR 上的预装载寄存器
	
	
	TIM_Cmd(TIM1,ENABLE);//使能TIM1
	
}

5.主函数(这里是为了实现呼吸灯)


#include"sys.h"
#include"delay.h"
#include"led.h"
#include"time.h"


int main()
{
	u16 led0pwmval=0;//设置占空比
	u8 dir=1;//设置状态值
	delay_init(); //延时函数初始化
	LED_Init(); //初始化与 LED 连接的硬件接口
	TIM1_PWM_Init(899,0);//PWM的重载系数值为900 f=80khz
	while(1)
	{
		delay_ms(10);
		if(dir)
		{
			led0pwmval++;//占空比增加
		}
		else
		{
			led0pwmval--;//占空比减少
		}
		if(led0pwmval>300)
			dir=0;
		if(led0pwmval==0)
			dir=1;
		TIM_SetCompare1(TIM1,led0pwmval);//修改占空比
	}
	

	
}

注:TIM_SetCompare1(TIM1,led0pwmval)的介绍

        1.实现在占空比周围实现电平的转变,从而实现呼吸灯的亮灭变化

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值