STM32-(25):PWM实验

上一篇:STM32-(24):PWM基础 下一篇:STM32-(26):RCC内部结构与原理分析

实验:通过控制PWM控制LED的亮度,配置PA1为TIM2的PWM输出。
得到PWM波形的占空比的两种方法:
①:通过示波器观察波形
②:通过一个实际的执行机构来观察执行效果(这里就用LED灯)

标题1
标题2
STM32-(25):PWM实验_第1张图片 STM32-(25):PWM实验_第2张图片

代码

main.c

/********************************************************************
* 描述 :用定时器来输出PWM脉冲宽度调制
* 说明 :使用PWM来调节LED的亮度
********************************************************************/
/* Includes ------------------------------------------------------------------*/
#include "stm32f10x_lib.h"	  //包含了所有的头文件 它是唯一一个用户需要包括在自己应用中的文件,起到应用和库之间界面的作用。
#include 

void Delay_Ms(u16 time);
void RCC_Configuration(void);
void  NVIC_Configuration(void);

extern void GPIO_Configuration(void);
extern void TIM_Configuration(void);

/* Private functions ---------------------------------------------------------*/ 
/*******************************************************************************
* Function Name  : main
* Description    : Main program.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{
	#ifdef DEBUG
  	debug();
	#endif

  	RCC_Configuration();    //使能外设时钟
  	GPIO_Configuration();   //初始化GPIO管脚
	NVIC_Configuration();
	TIM_Configuration();

  	while (1)
  	{
		;
  	}
}

/*******************************************************************************
* Function Name  : Delay_Ms
* Description    : delay 1 ms.
* Input          : time (ms)
* Output         : None
* Return         : None
*******************************************************************************/
void Delay_Ms(u16 time)  //延时函数
{ 
	u16 i,j;
	for(i=0;i0;j--);
}

/*******************************************************************************
* Function Name  : RCC_Configuration
* Description    : Configures the different system clocks.
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
void RCC_Configuration(void) 
{
	//=============================== 使用内部RC晶振 ===================================
    /*   
	RCC_HSICmd(ENABLE);//使能内部高速晶振 ;
 	RCC_SYSCLKConfig(RCC_SYSCLKSource_HSI);//选择内部高速时钟作为系统时钟SYSCLOCK=8MHZ	
	RCC_HCLKConfig(RCC_SYSCLK_Div1);//选择HCLK时钟源为系统时钟SYYSCLOCK
  	RCC_PCLK1Config(RCC_HCLK_Div4);//APB1时钟为2M 
  	RCC_PCLK2Config(RCC_HCLK_Div4);//APB2时钟为2M
  	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB , ENABLE);//使能APB2外设GPIOB时钟
	*/

	//==========================使用外部RC晶振========================================
  	RCC_DeInit();				//初始化为缺省状态
  	RCC_HSEConfig(RCC_HSE_ON);  //高速时钟使能
  	while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);  //等待高速时钟使能就绪

    FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);	//Enable Prefetch Buffer 
    FLASH_SetLatency(FLASH_Latency_2);	  					// Flash 2 wait state 
    RCC_HCLKConfig(RCC_SYSCLK_Div1); 						// HCLK = SYSCLK 
    RCC_PCLK2Config(RCC_HCLK_Div1);							// PCLK2 = HCLK 
    RCC_PCLK1Config(RCC_HCLK_Div2);	  						// PCLK1 = HCLK/2 
    RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);	// PLLCLK = 8MHz * 9 = 72 MHz  
    RCC_PLLCmd(ENABLE);	  									// Enable PLL 
    while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);		// Wait till PLL is ready 

    RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);	  			// Select PLL as system clock source 
    while(RCC_GetSYSCLKSource() != 0x08);					// Wait till PLL is used as system clock source 

	//====================================================================================
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);	// 使能APB2外设GPIOC时钟
  	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);		// Enable TIM2, TIM3 and TIM4 clocks ,可删掉
}

void NVIC_Configuration(void)  
{
   
#ifdef  VECT_TAB_RAM  
  	NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0);  // 拷贝向量表
#else
  	NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
#endif

}

pwm.c

/********************************************************************
* 描述 :用定时器来输出PWM脉冲宽度调制
* 说明 :使用PWM来调节LED的亮度
********************************************************************/
#include"stm32f10x_lib.h"
/**************************************************************
 		用TIM3的第三通道作为PWM的输出(PB0)
**************************************************************/
void GPIO_Configuration(void)
{
	//将PA1配置成TIM2的PWM输出	
	
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	//		Test Code (这里只是测试这个管脚)
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD; //输出
	GPIO_Init(GPIOA,&GPIO_InitStructure);	
}

void TIM_Configuration(void)
{
	 TIM_TimeBaseInitTypeDef	TIM_TimeBaseStructure;
	 TIM_OCInitTypeDef	TIM_OCInitStructure;
	
	TIM_DeInit(TIM2); 
	TIM_TimeBaseStructure.TIM_Prescaler = 0 ; 	//72M	(预分频不分频,让72M直接进来)
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up ;  	//计数向上
	TIM_TimeBaseStructure.TIM_Period = 0xff;						   //分频值
	TIM_TimeBaseStructure.TIM_ClockDivision = 0x0;						//分割
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseStructure);  //将以上这些配置保存到 TIM2中去
	
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;  // //PWM1模式(边沿对齐模式)
  	TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable; //CH2通道有效
  	TIM_OCInitStructure.TIM_Pulse = 0x3F;
  	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性控制
  	TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
	TIM_OC2Init(TIM2, &TIM_OCInitStructure);

//	TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);			//使能预装载
	TIM_Cmd(TIM2,ENABLE);
		
}
上一篇:STM32-(24):PWM基础 下一篇:STM32-(26):RCC内部结构与原理分析

你可能感兴趣的:(STM32,PWM,脉冲宽度调制)