6-3PWM驱动LED呼吸灯

本文详细描述了如何在STM32F103VET6微控制器上使用TIM3定时器和GPIOPB0实现PWM信号的生成,包括时钟配置、TIM初始化、输出比较单元设置和GPIO配置,以及创建PWM_SetCompare3函数来动态调整输出频率。
摘要由CSDN通过智能技术生成

本次是基于STM32F103VET6野火指南者,选用的是外设是TIM3和PB0绿灯,因为根据引脚定义表查得PB0对应的是TIM3_CH3,也就是通道3的TIM3,PB0的通道3

/*
PWM初始化
* 第一步:RCC开启时钟,把要用的TIM外设和GPIO外设的时钟打开

* 第二步:配置时基单元,包括时钟源选择和PSC预分频器,CNT计数器,ARR自动重装器

* 第三步:配置输出比较单元,包括:CCR的值,输出比较模式,极性选择,输出使能
*第四步:配置GPIO,把PWM对应的GPIO口,初始化为复用推免输出的配置
*第五步:运行控制,启动计数器,这样就能输出PWM

*/

PWM.c

#include "PWM.h"                  // Device header

void PWM_Init(void)
{
	/*
	*		PWM初始化
	*		第一步:RCC开启时钟,把要用的TIM外设和GPIO外设的时钟打开
	*		第二步:配置时基单元,包括时钟源选择和PSC预分频器,CNT计数器,ARR自动重装器
	*		第三步:配置输出比较单元,包括:CCR的值,输出比较模式,极性选择,输出使能
	*		第四步:配置GPIO,把PWM对应的GPIO口,初始化为复用推免输出的配置
	*		第五步:运行控制,启动计数器,这样就能输出PWM
	*/
	
	//第一步:RCC开启时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
	//第四步
	/*第一步:使用RCC开启GPIO时钟*/
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	/*第二步:使用GPIO_Init函数初始化GPIO*/
	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(GPIOB,&GPIO_InitStructure);
	
	//一开始全是关闭状态
	//GPIO_SetBits(GPIOB,GPIO_Pin_5 | GPIO_Pin_1);
	
	//第二步:选择时基单元的时钟源,内部时钟
	TIM_InternalClockConfig(TIM3);
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;	//计数器模式--向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;//APR自动重装器
	TIM_TimeBaseInitStructure.TIM_Prescaler = 720 - 1;//PSC预分频器
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;//重复计数器的值
	TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);
	
	//第三步:配置输出比较单元,包括:CCR的值,输出比较模式,极性选择,输出使能
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//输出比较模式
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出比较极性
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出比较使能
	TIM_OCInitStructure.TIM_Pulse = 0;//CCR   实现呼吸灯,就是要不断更改CCR值
	//要使用的是PB0端口,所以选TIM3的OC3也就是TIM3_CH3
	TIM_OC3Init(TIM3,&TIM_OCInitStructure);
	
	//第六步:启动定时器
	TIM_Cmd(TIM3,ENABLE);
	
}

/*
*		TIM_SetCompare3这个函数是用来单独更改通道3的CCR的值,通过引脚定义表查看得到
*		用下面函数封装一下
*/
void PWM_SetCompare3(uint16_t Compare)
{
		TIM_SetCompare3(TIM3,Compare);
}

PWM.h

#ifndef __PWM_H
#define __PWM_H

#include "stm32f10x.h"                  // Device header
void PWM_Init(void);
void PWM_SetCompare3(uint16_t Compare);

#endif

main.c

#include "stm32f10x.h"                  // Device header
#include "LED.h"
#include "OLED.h"
#include "PWM.h" 
#include "./delay.h"

uint8_t i;

int main(void){
	
	
	OLED_Init();
	PWM_Init();
	delay_init();
	
	while(1)
	{
		/*只需要在主循环里,不断调用PWM_SetCompare3这个函数,
		 *更改CCR的值,就可以完成LED呼吸灯的效果
		 */
		for(i=0;i<=100;i++)
		{
				PWM_SetCompare3(i);
				delay_ms(10);
		}
		for(i=0;i<=100;i++)
		{
				PWM_SetCompare3(100-i);
				delay_ms(10);
		}
	}
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值