基于STM32的PWM驱动LED呼吸灯

  • Post author:
  • Post category:其他


一,PWM基本原理

所谓PWM,就是脉冲宽度调制技术,其具有两个很重要的参数:频率和占空比。频率,就是周期的倒数;占空比,就是高电平在一个周期内所占的比例。如当周期T=T1+T2;T1为高电平时间,T2为低电平时间,此时频率F的值为1/(T1+T2),占空比D的值为T1/(T1+T2)。通过改变单位时间内脉冲的个数可以实现调频;通过改变占空比可以实现调压。占空比越大,所得到的平均电压也就越大,幅值也就越大;占空比越小,所得到的平均电压也就越小,幅值也就越小,如动图演示所示。PWM方波的示意图如下图所示:

二,PWM基本结构及配置PWM步骤

第1步,RCC开启时钟,把我们要用的TlM外设和GPIO外设的时钟打开。

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

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);

第2步,配置时基单元,包括时钟源选择

TIM_InternalClockConfig(TIM2);//这里选用内部时钟

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//配置参数

TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;

TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;

TIM_TimeBaseInitStructure.TIM_Period = 100 – 1;

TIM_TimeBaseInitStructure.TIM_Prescaler = 720 – 1;

TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;

TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

第3步,配置输出比较单元

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

OC就是Output Compare(输出比较)OC1,OC2,OC3,OC4,一个函数配置一个单元(输出比较通道),上面这四个函数用于设置输出PWM时用到的参数,包括选择PWM输出模式,选择输出极性,设置比较值。注意:设置输出时是按输出通道分的库函数。即需要初始化哪个通道,就调用哪个函数。不同的通道对应的GPIO口也是不一样的。

TIM_OCInitTypeDef  TIM_OCInitStructure;配置参数                      TIM_OCStructInit(&TIM_OCInitStructure);//用来给输出比较结构体成员赋一个默认值的,下面        就可以再更改你想改的值就行了。可以避免结构体成员没有配置完整。

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OCInitStructure.TIM_Pulse = 0;

TIM_OC1Init(TIM2, &TIM_OCInitStructure);

第4步,配置GPIO

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;    //GPIO_Pin_15;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

第五步,运行控制,启动计数器,这样就能输出PWM了。

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);

void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);

void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);

void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);

这四个函数是用来单独更改CCR寄存器值的函数,可以运行的时候,更改占空比。TIM_Cmd(TIM2, ENABLE);

TIM_SetCompare1(TIM2, Compare1);

第6步,主程序

while(1)

{


for (uint8_t i = 0; i < 100; i ++)

{


PWM_SetCompare1(i);

delay_ms(10);

}

for (uint8_t i = 0; i < 100; i ++)

{


PWM_SetCompare1(100 – i);

delay_ms(10);

}

delay_ms(500);

}



版权声明:本文为qq_52449680原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。