STM32单片机产生PWM信号

STM32单片机产生PWM信号

1、开发环境

目标单片机 : STM32F407VET6芯片,系统时钟高达168Mhz
开发平台:KEIL 5
编写程序借助ST公司的标准函数库,不过现在已经不更新这个写函数库了,大部分开发都STM32CubeMX软件直接生成代码使用。但旧的东西(标准函数库)仍然能够使用。

2、目标

PWM称为脉冲宽度调制,可通过修改占空比来控制LED灯的亮度(呼吸灯)

占空比:指在一个脉冲循环的周期内,通电时间相对于总时间所占的比例

配置单片机寄存器来产生PWM

使PA1引脚产生方波,

3、代码

pwm.c文件代码

//TIM5 PWM部分初始化 
//PWM输出初始化
//@arr:自动重装值    
//@psc:时钟预分频数   单片机168MHz经过系统时钟2分频,PWM外设时钟84MHz/(84-1+1)=1MHz 1us 
//功能:由PA1产生占空比50%的方波
void TIM5_PWM_Init(u32 arr,u32 psc)
{		 					 
	GPIO_InitTypeDef GPIO_InitStructure;
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;
	
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM5,ENABLE);  	//TIM5时钟使能    
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); 	//使能PORTA时钟	
	
	GPIO_PinAFConfig(GPIOA,GPIO_PinSource1,GPIO_AF_TIM5); //GPIOA1复用为定时器5
	
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;           //GPIOA1
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;        //复用功能
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;	//速度100MHz
	GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;      //推挽复用输出
	GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;        //上拉
	GPIO_Init(GPIOA,&GPIO_InitStructure);              //初始化PA1
	  
	TIM_TimeBaseStructure.TIM_Prescaler=psc;  //16bit定时器分频   84Mhz/84 = 1MHz   
	TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 1us * 500= 0.5ms溢出时间
	TIM_TimeBaseStructure.TIM_Period=arr;   //自动重装载值
	TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; //  时钟跳动1/168MHz
	
	TIM_TimeBaseInit(TIM5,&TIM_TimeBaseStructure);//初始化定时器5
	
	//初始化TIM5 Channe2	 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
 	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
	TIM_OC2Init(TIM5, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM5 2OC1

	TIM_OC2PreloadConfig(TIM5, TIM_OCPreload_Enable);  //使能TIM5在CCR1上的预装载寄存器
 
  	TIM_ARRPreloadConfig(TIM5,ENABLE);//ARPE使能 
	
	TIM_Cmd(TIM5, ENABLE);  //使能TIM5
 
	TIM_SetCompare2(TIM5,arr/2);	//修改比较值,修改占空比50%									  
}  

void main(void)
{
	TIM5_PWM_Init(1000-1,84-1);        //arr=200 5KHz arr=1000 1Kh
	while(1)
	{
	/*什么也不做*/
	}
}

你可能感兴趣的:(STM32,stm32)