欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STM32 使用PWM实现呼吸灯

程序员文章站 2022-06-08 19:01:42
...

STM32 PWM实现呼吸灯

使用STM32F103ZET6 定时器4 CH2通道产生PWM波,在GPIOD,GPIO_PIN13引脚LED1产生呼吸灯效果。

实验工具:MDK5,STM32F103ZET6开发板
使用固件库编程

实验效果:LED灯亮——逐渐变暗——全灭——逐渐变亮——亮

相关程序已在最下方给出;

工程

STM32 使用PWM实现呼吸灯

pwm.c文件

#include "pwm.h"

//简单进行定时器初始化,设置 预装载值 和 分频系数
void Tim_Init(u16 arr,u16 psc)  
{
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStruct;  // 初始化结构体

	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);//分配时钟
	
	//相关配置
	TIM_TimeBaseInitStruct.TIM_Prescaler	= psc; 	//a number between 0x0000 and 0xFFFF 
	TIM_TimeBaseInitStruct.TIM_Period		= arr; 	 //a number between 0x0000 and 0xFFFF 
	TIM_TimeBaseInitStruct.TIM_CounterMode	= TIM_CounterMode_Up; //向上计数
	TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1; //分频因子
	TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitStruct);	

 //打开定时器
	TIM_Cmd(TIM4,ENABLE);	
}

//初始化GPIO口
void Tim_GPIO_Init(void)
{
	GPIO_InitTypeDef  	GPIO_InitStruct;   //GPIO初始化结构体
	

	RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//开启AFIO时钟,进行重映射
	
	GPIO_PinRemapConfig(GPIO_Remap_TIM4 ,ENABLE);  //重映射开启
	//初始化GPIOD组时钟
	 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE);
	
	//初始化引脚
	GPIO_InitStruct.GPIO_Pin 	= GPIO_Pin_13;  		//引脚 
	GPIO_InitStruct.GPIO_Mode 	= GPIO_Mode_AF_PP;		//复用推挽
	GPIO_InitStruct.GPIO_Speed	= GPIO_Speed_50MHz; //速度
	GPIO_Init(GPIOD,&GPIO_InitStruct);	
}

//pwm初始化
void Pwm_Init(u16 arr,u16 psc)
{
	TIM_OCInitTypeDef 	TIM_OCInitStruct;   // PWM模式,输出等设置

	//初始化定时器和IO口
	Tim_GPIO_Init();
	Tim_Init(arr,psc);
	
	//初始化PWM模式
	TIM_OCInitStruct.TIM_OCMode		=  TIM_OCMode_PWM1; 	  //PWM1模式
	TIM_OCInitStruct.TIM_OutputState=  TIM_OutputState_Enable;//输出使能
	TIM_OCInitStruct.TIM_OCPolarity =  TIM_OCPolarity_High; 	  //高电平有效
	TIM_OC2Init(TIM4,&TIM_OCInitStruct);  //设置利用通道2输出
	
//这里只初始化通道1,我们可以根据自己需求初始化其它通道
//	TIM_OC2Init(TIM3,&TIM_OCInitstrcuture);
//	TIM_OC3Init(TIM3,&TIM_OCInitstrcuture);
//	TIM_OC4Init(TIM3,&TIM_OCInitstrcuture);

	
	//使能预装载寄存器: 
	TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable); 
	
	//使能自动重装载的预装载寄存器允许位	
	//TIM_ARRPreloadConfig(TIM4,ENABLE);	
}

pwm.h文件

#ifndef __PWM_H_
#define __PWM_H_
#include "stm32f10x.h"

void Pwm_Init(u16 arr,u16 psc);
void Tim_Init(u16 arr,u16 psc);
void Tim_GPIO_Init(void);


#endif
/*重装载时间
Tout = (arr+1)*(psc+1)/Tclk
系统时钟Tclk=72MHz
比如我们设置arr=7199,psc=9999
定时器更新(7199+1)*(1/7200)=1s,也就是1s进入一次更新Update
*/

STM32 使用PWM实现呼吸灯由数据手册可以看出上电后默认功能并非定时器,想要使用定时器4必须对其进行功能复用,如何进行复用请参考
https://blog.csdn.net/qq_34692743/article/details/80495858?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task
在进行重映射时应参考数据手册,根据手册进行相关配置。

其中关于定时器的使用及设置问题请参考
https://blog.csdn.net/private_void_main/article/details/81491015

有关通道CH2,CH1等的选择问题已经在程序中做了说明。

程序链接:链接:https://pan.baidu.com/s/1ekL2o2xJtL32Wod_Gih1EQ
提取码:1fql