打印
[应用相关]

基于STM32的PWM驱动LED呼吸灯

[复制链接]
730|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
coshi|  楼主 | 2022-6-21 12:14 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
一,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);
    }


使用特权

评论回复
沙发
kiwis66| | 2022-6-24 20:52 | 只看该作者
这几张图,很能说明问题

使用特权

评论回复
板凳
asmine| | 2022-6-26 12:47 | 只看该作者
老生常谈了,很细致

使用特权

评论回复
地板
稳稳の幸福| | 2022-6-26 18:18 | 只看该作者
用处非常广泛的一个外设。

使用特权

评论回复
5
玛尼玛尼哄| | 2022-7-27 18:35 | 只看该作者
很详细

使用特权

评论回复
6
Uriah| | 2022-10-4 15:22 | 只看该作者

Git 是程序员学习和工作都离不开发工具

使用特权

评论回复
7
Bblythe| | 2022-10-4 18:21 | 只看该作者

If-Else 通常是一个糟糕的选择

使用特权

评论回复
8
eefas| | 2022-10-9 20:51 | 只看该作者
控制LED RGB混色,怎么计算PWM占空比?

使用特权

评论回复
9
biechedan| | 2022-10-9 21:05 | 只看该作者
LED灯用PWM调光有什么缺点呢?

使用特权

评论回复
10
xiaoyaodz| | 2022-10-9 21:25 | 只看该作者
通过GPIO口输出高电平,延时,输出低电平,延时来产生PWM波。

使用特权

评论回复
11
kkzz| | 2022-10-9 21:51 | 只看该作者
利用pwm对大功率led灯调光是出现闪烁是什么原因

使用特权

评论回复
12
yeates333| | 2022-10-9 22:32 | 只看该作者
有pwm信号怎样做一个简单的电路驱动LED

使用特权

评论回复
13
juventus9554| | 2022-10-9 22:43 | 只看该作者
A直接通过B声明的函数调用即可

使用特权

评论回复
14
myiclife| | 2022-10-10 20:42 | 只看该作者
为什么PWM波控制LED,会是呼吸灯效果

使用特权

评论回复
15
232321122| | 2022-10-10 21:42 | 只看该作者
带PWM调光输入的LED驱动IC都有哪些

使用特权

评论回复
16
uytyu| | 2022-10-11 21:47 | 只看该作者
PWM调节LED亮度原理是什么?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

95

主题

3301

帖子

4

粉丝