6_3使用PWM驱动LED呼吸灯

该文详细介绍了如何在STM32F10x微控制器上初始化并配置PWM功能。首先,通过RCC开启TIM2和GPIOA的时钟,然后设置GPIOA的PIN0为复用推挽输出模式,接着配置TIM2的时基单元和输出比较单元,包括计数器模式、预分频器、自动重装值等参数。最后,通过TIM_OCInitStructure结构体设置PWM的占空比和频率,并在主函数中动态调整PWM占空比以实现周期性的变化。
摘要由CSDN通过智能技术生成

 

 代码思路

 1.打开RCC时钟,把要用的TIM外设和GPIO外设的时钟打开
2.配置时基单元,
3.配置输出比较单元包括(CCR的值,输出比较模式,极性选择模式,输出使能模式)使用结构体
4.配置GPIO , 把PWM对应的GPIO,初始化为复用推挽输出的设置
5.运行控制,启动计数器

PWM.c代码

#include "stm32f10x.h"                  // Device header

void PWM_Init(void)
{
	//开启GPIO外设
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
		
	//初始化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(GPIOA, &GPIO_InitStructure);
		
	
	//开启TIM2时钟外设
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	
	//选择时基单元的时钟
	TIM_InternalClockConfig(TIM2);
	
	//配置时基单元
	
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//结构体类型名
	
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;//指定时钟分频
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//计数器模式,向上计数
	
	//关键计数器的值(决定定时时间)
	/*CK_CNT_OV = CK_CNT / (ARR + 1) = CK_PSC / (PSC + 1) / (ARR + 1)
		例如1s = 1HZ
		所以CK_CNT_OV = 1HZ =  CK_PSC(72MHZ)/ (PSC + 1) / (ARR + 1)
		最后保证PSC和ARR取值在0~65535
	*/			      

	//ARR多,PSC少 即高频率记比较多的数,反之亦然;
	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_OCInitTypeDef TIM_OCInitStructure;
	
	//给结构体赋初始值
	TIM_OCStructInit(&TIM_OCInitStructure);
	
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;	//输出比较的极性
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;   //输出比较的模式
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;	//设置输出比较使能
	
	
	/*
	PWM频率:	Freq = CK_PSC / (PSC + 1) / (ARR + 1)
	PWM占空比:	Duty = CCR / (ARR + 1)
	PWM分辨率:	Reso = 1 / (ARR + 1)
*/
	TIM_OCInitStructure.TIM_Pulse = 0;	//设置CCR,占空比
	
	TIM_OC1Init(TIM2,&TIM_OCInitStructure);
	
	//启动定时器
	
	TIM_Cmd(TIM2,ENABLE);
	
	
}


//在运行过程中更改CCR
void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2,Compare);	//单独更改CCR的值
}

主函数

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include  "PWM.h" 

uint16_t i;

int main(void)
{
	
	OLED_Init();
	
	PWM_Init();
	
	while (1)
	{
		for(i = 0;i<100;i++)
		{
			PWM_SetCompare1(i);
			Delay_ms(10);
		}
		
		for(i = 0;i<100;i++)
		{
			PWM_SetCompare1(100-i);
			Delay_ms(10);
		}
	}
}
	

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值