三.PWM

作者: 想阳 | 来源:发表于2018-05-16 17:23 被阅读0次

PWM原理

TIMx_APR寄存器 确定频率

TIMx_CCRx寄存器 确定占空比的信号

TIMx_ARR寄存器是自动重载值

占空比中占时指高电平持续的时间A,空是指低电平持续的时间B,占空比=A / (A + B)

PWM程序-控制小灯渐亮渐灭渐亮

注:小灯->PB5 以TIM3为计时器

TIM3计时器有四个通道,


图片.png

我们可以看到为了让小灯PB5端口输出PWM的电平,我们需要将TIM3的2通道部分重印象

1.将端口B使能为了小灯,将TIM3定时器使能,将时钟复用端口使能

    SystemInit();//将系统时钟打开
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);//将B端口的时钟打开,方便打开小灯  
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//将TIM3的时钟打开
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//将功能复用时钟打开

2.配置B端口5管脚(小灯),使得其是复用推挽输出

//对小灯的B端口的5管脚进行使能
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//初始B端口的五号引脚
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;//设置时钟是50MHz
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//设置为复用推挽输出,以前LED小灯是推挽输出
GPIO_Init(GPIOB,&GPIO_InitStructure);

3.将定时器TIM3配置进行初始化

//设置定时器
  TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;//百度说特殊场合有用,做一些延迟
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//设置向上计数模式
  TIM_TimeBaseStructure.TIM_Period = 899;//设置多少次循环一次 默认加1
  TIM_TimeBaseStructure.TIM_Prescaler = 0;//预分频,你这个数默认加1 ,现在是72MHZ,这个数会默认加1
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM3,&TIM_TimeBaseStructure);

4.进行部分重映射,将PWM的输出的端口映射到一个具体的端口

//端口映射
GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);

5.将TIM3的通道2来进行初始化,来达到输出PWM的目的

    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//选择PWM的通道1
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;//当比较符合条件,就输出低电位
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//给输出使能
    TIM_OC2Init(TIM3,&TIM_OCInitStructure);//TIM3的2通道初始化,上面已经进行了部分重映射,所以此时PWM输出的是PB5端口

6.开启TIM3的2通道的CCR寄存器预转载功能

TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);//使得在更新TIM3,2通道的CCR寄存器后,可以在下一个更新事件之后生效

7.打开定时器TIM3

    //打开定时器
    TIM_Cmd(TIM3,ENABLE);

配置已经成功,PB5管脚已经可以输出PWM波形,但是如何在主程序中使用?

使用TIM_SetCompare2(TIM3,400);//设置比较信号函数可以来设置比较信号,控制占空比。

//我的main函数,学习视频写的
    u8 led_fx = 1;
    u16 led_dt=0;
    RCC_Configuration();
    GPIO_Configuration();
    //NVIC_Configuration();
    TIM3_Configuration();
    while(1)
    {
        Delay_ms(10);
        if(led_fx == 1)
        {
            led_dt++;
        }
        else{
            led_dt--;
        }
        if(led_dt > 800) led_fx = 0;
        if(led_dt == 0)  led_fx = 1;
        
        TIM_SetCompare2(TIM3,led_dt);//设置比较信号
        
    }

PWM1模式和PWM2模式的区别

[PWM1&PWM2模式;输出极性高低的含义]

110:PWM模式1- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为
无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否
则为有效电平(OC1REF=1)。
111:PWM模式2- 在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为
有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电

输出比较极性的指的是你在比较匹配之后输出口输出的极性。
这个函数就是让你设置有效极性,也就是设置比较输出的有效电平。你可以设置为高电平有效或者低电平有效。
如果设置为高电平有效,那么当定时器比较匹配之后,输出口输出高电平,否则就反一下。

相关文章

网友评论

      本文标题:三.PWM

      本文链接:https://www.haomeiwen.com/subject/fucmdftx.html