OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2525|回复: 0

PWM原理及用其控制led亮度变化

[复制链接]

28

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
116
金钱
116
注册时间
2019-10-16
在线时间
18 小时
发表于 2019-11-22 23:54:48 | 显示全部楼层 |阅读模式
本帖最后由 e芯凌 于 2019-11-22 23:59 编辑

STM32PWM工作过程
PWM工作过程.png



PWM通道一.png
CCR1:捕获比较()寄存器(x=1,2,3,4):设置比较值。
CCMR1: OC1M[2:0]位:
              对于PWM方式下,用于设置PWM模式1110】或者PWM模式2111
CCER:CC1P位:输入/捕获1输出极性。0:高电平有效,1:低电平有效。
CCER:CC1E位:输入/捕获1输出使能。0:关闭,1:打开。


PWM模式1 & PWM模式2
寄存器TIMx_CCMR1OC1M[2:0]位来分析:
PWM模式.png

PWM向上计数器.png

PWM模式2.png

PWM1.png PWM2.png
简单的说,ARPE=1,ARR立即生效。。。APRE=0,ARR下个比较周期生效。

STM32 定时器3输出通道引脚





①使能定时器3和相关IO口时钟。
        使能定时器3时钟:RCC_APB1PeriphClockCmd();
        使能GPIOB时钟:RCC_APB2PeriphClockCmd();
     初始化IO口为复用功能输出。函数:GPIO_Init();
       GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;      
这里我们是要把PB5用作定时器的PWM输出引脚,所以要重映射配置,
      所以需要开启AFIO时钟。同时设置重映射。
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
       GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
    初始化定时器:ARR,PSC等:TIM_TimeBaseInit();
    初始化输出比较参数:TIM_OC2Init();
使能预装载寄存器 TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
   使能定时器。TIM_Cmd();
   不断改变比较值CCRx,达到不同的占空比效果:TIM_SetCompare2();


函数代码:
  1. void TIM3_PWM_Init(u16 arr,u16 psc)
  2. {
  3.         
  4.         GPIO_InitTypeDef GPIO_InitStructure;
  5.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitstruct;
  6.         TIM_OCInitTypeDef TIM_OCInitStructure;
  7.         
  8.         
  9.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
  11.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  12.         
  13.         
  14.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  15.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_5;
  16.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  17.         GPIO_Init(GPIOB,&GPIO_InitStructure);
  18.   GPIO_SetBits(GPIOB,GPIO_Pin_5);
  19.         
  20.         GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);
  21.         

  22.         TIM_TimeBaseInitstruct.TIM_ClockDivision=TIM_CKD_DIV1;
  23.         TIM_TimeBaseInitstruct.TIM_CounterMode=TIM_CounterMode_Up;
  24.         TIM_TimeBaseInitstruct.TIM_Period=arr;
  25.         TIM_TimeBaseInitstruct.TIM_Prescaler=psc;
  26.         TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitstruct);
  27.         

  28.         TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM 模式 2,CNT>CCR1时为有效电平
  29.         TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  30.         TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高,即高电平有效,有效电平置1
  31.         TIM_OC2Init(TIM3, &TIM_OCInitStructure); //初始化 TIM3 OC2
  32.         
  33.         TIM_Cmd(TIM3, ENABLE);
  34.         
  35.         TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

  36. }
复制代码



main.c
  1. #include "stm32f10x.h"
  2. #include "led.h"
  3. #include "delay.h"
  4. #include "time.h"

  5. int main()
  6. {
  7.         u16 led0pwm=0;
  8.         u8 dir=1;
  9.         
  10.         delay_init();
  11.         LED_Init();        
  12.         
  13.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);        
  14.         TIM3_PWM_Init(899,0);//PWM频率为72000000/900=80Khz,也就是溢出时间为900/72us,也即是到达中断的时间
  15.         
  16.         
  17.         while(1)
  18.         {
  19.                 delay_ms(10);
  20.                 if(dir)
  21.                         led0pwm++;
  22.                 else
  23.                         led0pwm--;
  24.                 if(led0pwm>300)
  25.                         dir=0;
  26.                 if(led0pwm==0)
  27.                         dir=1;
  28.                 TIM_SetCompare2(TIM3,led0pwm);//此处led0pwm越大,也就是高电平的占空比小,led越暗
  29.         }        
  30.                
  31. }
复制代码
我们将led0pwmval 这个值设置为 PWM 比较值,也就是通过 led0pwmval 来控制 PWM 的占空比,然后控制 led0pwmval 的值从 0 变到 300,然后又从300 变到 0 如此循环,因此 DS0 的亮度也会跟着从暗变到亮,然后又从亮变到暗。至于这里的值,我们为什么取300,是因为 PWM 的输出占空比达到这个值的时候,我们的 LED 亮度变化就不大了(虽然最大值可以设置到 899),因此设计过大的值在这里是没必要的。



PWM输出通道.png
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-25 10:27

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表