STM32之17.PWM脉冲宽度调制

STM32之17.PWM脉冲宽度调制_第1张图片

 一·LED0脉冲宽度调制在TIM14_CHI,先将LED(PF9)代码配置为AF推挽输出模式,将PF9引脚连接到TIM14,

STM32之17.PWM脉冲宽度调制_第2张图片

 

#include 

static GPIO_InitTypeDef GPIO_InitStruct;

void Led_init(void)
{
	//打开端口F的硬件时钟,就是供电
//打开端口F的硬件时钟,就是供电
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);
	//打开端口E的硬件时钟,就是供电
	RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE,ENABLE);
	
	GPIO_InitStruct.GPIO_Pin   =  GPIO_Pin_9 ; 	//9 号引脚
	GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AF; //GPIO_Mode_AF;//输出模式
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed;//高速,速度越高,响应越快,但是功耗会更高
	GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_NOPULL;//不使能上下拉电阻
	GPIO_Init(GPIOF,&GPIO_InitStruct);
	
		//将PF9引脚连接到TIM14
	GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);
	
	GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_10 ; 	//9 10号引脚
	GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;//输出模式
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed;//高速,速度越高,响应越快,但是功耗会更高
	GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_NOPULL;//不使能上下拉电阻
	GPIO_Init(GPIOF,&GPIO_InitStruct);
	
	GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_13 | GPIO_Pin_14; 	//9 10号引脚
	GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_OUT;//输出模式
	GPIO_InitStruct.GPIO_OType = GPIO_OType_PP;//推挽输出
	GPIO_InitStruct.GPIO_Speed = GPIO_High_Speed;//高速,速度越高,响应越快,但是功耗会更高
	GPIO_InitStruct.GPIO_PuPd  = GPIO_PuPd_NOPULL;//不使能上下拉电阻
	GPIO_Init(GPIOE,&GPIO_InitStruct);


	GPIO_WriteBit(GPIOF,GPIO_Pin_9,Bit_SET);
	GPIO_WriteBit(GPIOF,GPIO_Pin_10,Bit_SET);
	GPIO_WriteBit(GPIOE,GPIO_Pin_13,Bit_SET);
	GPIO_WriteBit(GPIOE,GPIO_Pin_14,Bit_SET);
}

 二·在配置TIM14定时器脉冲宽度

调动比较值1-100内,越小灯越亮

如果PWM信号的频率很高,比如大于80Hz,那么人眼就无法感知到灯的闪烁,而只能感知到灯的亮度。这时候,占空比越大,表示高电平的时间越长,灯就会越亮。

如果PWM信号的频率很低,比如小于50Hz,那么人眼就能感知到灯的闪烁,而不是灯的亮度。这时候,占空比越大,表示高电平的时间越长,灯就会闪烁得更明显。

void TIM14_init(void)
{
	
	TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
	TIM_OCInitTypeDef  TIM_OCInitStructure;

	//使能TIM14的硬件时钟
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);
	//配置TIM14的定时时间
	TIM_TimeBaseStructure.TIM_Period = 100-1;  //自动重载,输出频率为100Hz
	TIM_TimeBaseStructure.TIM_Prescaler = 2100-1;   //预分频值为8400    84000000/8400=10000(1S)
	TIM_TimeBaseStructure.TIM_ClockDivision = 0;
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //从0开始计数,然后计数到TIM_Period这个值就触发中断

	TIM_TimeBaseInit(TIM14, &TIM_TimeBaseStructure);
	
	
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;		//PWM1的工作模式		
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//允许输出脉冲
	TIM_OCInitStructure.TIM_Pulse = 20;	//比较值80
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//有效状态为高电平
	//配置TIM3的中断触发:时间更新
	TIM_OC1Init(TIM14,&TIM_OCInitStructure);
	

	
	//使能TIM14工作
	TIM_Cmd(TIM14, ENABLE);
	
}

你可能感兴趣的:(stm32,嵌入式硬件,单片机)