PWM输出控制LED亮灭(通用定时器TIMx)

PWM即脉冲宽度调试,通过对周期内高低点平的所占时间长短(占空比)来调节GPIO的输出。

PWM的输出需要用到定时器。

配置步骤:

1、使能定时器时钟、GPIO时钟、复用时钟(若用到);
RCC_APBxPeriphClockCmd();
2、初始化GPIO
GPIO_Init();
3、映射定时器到复用的GPIO上
GPIO_PinRemapConfig();
4、初始化定时器
TIM_TimeBaseInit();
5、初始化定时器通道
TIM_OCxInit();
6、预加载定时器
TIM_OCxPreloadConfig();
7、使能定时器
TIM_Cmd();
8、不断改变OCRx值以达到更改占空比
TIM_SetComparex();

定时器初始化需要配置重装载值和预分频系数来控制PWM输出的周期

周期计算公式:Tout=(Period+1)(Prescaler+1)/Tclk
定时器初始化时需要配置的结构体成员变量及作用:

typedef struct
{
  uint16_t TIM_Prescaler;          //预分频系数     (主时钟分频)
  uint16_t TIM_CounterMode;              //计数模式   (向上对齐、向下对齐、中间对齐) 
  uint16_t TIM_Period;                         //重装载值     (定时器重新计时的值)         
  uint16_t TIM_ClockDivision;              //时钟分频因子 (定时器时钟的再分频,一般设为TIM_CKD_DIV1)
  uint8_t TIM_RepetitionCounter;         //重复次数   (无需配置)
} TIM_TimeBaseInitTypeDef;
定时器通道初始化时需要配置的结构体成员变量及作用:
typedef struct
{
  uint16_t TIM_OCPolarity;        //输出极性(有效时输出高或者低)
  uint16_t TIM_OCMode;       //定时器通道模式(PWM模式或者Compare模式)
  uint16_t TIM_OutputState;      //是否使能
  //以下PWM输出无需配置
  uint16_t TIM_OutputNState;     //是否使能(仅TIM1 和TIM8有效)
  uint16_t TIM_Pulse;             //直接操作寄存器控制输出波形
  uint16_t TIM_OCNPolarity;      //输出极性(有效时输出高或者低)(仅TIM1 和TIM8有效)
  uint16_t TIM_OCIdleState;      //设置空闲状态时的值(仅TIM1 和TIM8有效)
  uint16_t TIM_OCNIdleState;     //设置空闲状态时的值(仅TIM1 和TIM8有效)
} TIM_OCInitTypeDef;
改变CRR2值来调节占空比大小

TIM_SetComparex(TIMx,val);

参考代码:
int main(void)
 {    
    u8 i=1;        
    u16 led0pwmval;        
              
    GPIO_InitTypeDef     GPIO_InitStrue;
 TIM_OCInitTypeDef        TIM_OCInitStrue;
 TIM_TimeBaseInitTypeDef     TIM_TimeBaseInitStrue;
    
    
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);//使能TIM3和相关GPIO时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);// 使能GPIO复用时钟
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);// 使能GPIOB时钟
    
    GPIO_InitStrue.GPIO_Pin=GPIO_Pin_1;     // TIM_CH4
    GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;    // 复用推挽
    GPIO_InitStrue.GPIO_Speed=GPIO_Speed_10MHz;    //设置输出速度
    GPIO_Init(GPIOB,&GPIO_InitStrue);                //GPIO端口初始化设置
    
    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3,ENABLE);
   
     //溢出时间Tout=(Period+1)(Prescaler+1)/Tclk    500ms
    TIM_TimeBaseInitStrue.TIM_Period=4999;    //设置自动重装载值(改变该值大小试试灯的亮度 ^_^)
    TIM_TimeBaseInitStrue.TIM_Prescaler=7199;        //预分频系数(时钟72MHz)
    TIM_TimeBaseInitStrue.TIM_CounterMode=TIM_CounterMode_Up;    //计数器向上溢出
    TIM_TimeBaseInitStrue.TIM_ClockDivision=TIM_CKD_DIV1;        //时钟的分频因子
    TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStrue);        //TIM3初始化设置(设置PWM的周期)
    
    TIM_OCInitStrue.TIM_OCMode=TIM_OCMode_PWM2;        // PWM模式2:CNT大于CCR时输出有效
    TIM_OCInitStrue.TIM_OCPolarity=TIM_OCPolarity_High; // 设置极性-有效为高电平
    TIM_OCInitStrue.TIM_OutputState=TIM_OutputState_Enable;// 输出使能
    TIM_OC4Init(TIM3,&TIM_OCInitStrue);        //TIM3的通道2PWM 模式设置

    TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);        //使能预装载寄存器
    
    TIM_Cmd(TIM3,ENABLE);        //使能TIM3
   

    while(1)
    {              
  if(i)
   led0pwmval++;        // 由暗变亮
  else
   led0pwmval--;        // 由亮变暗
  if(led0pwmval==0)
   i=1;        // 已达到最亮,开始变暗
        if(led0pwmval>50) // 将50改为其他值试试 ^_^
   i=0;     // 已达到最暗,开始变亮
        
        TIM_SetCompare4(TIM3,led0pwmval);        //改变比较值TIM3->CCR2达到调节占空比的效果      
    }
 }
定时器TIM3重映像关系表(其他定时器映射表自己尝试查查吧TIM3重映像关系表^_^)

TIM3重映像关系表

试试将GPIOB 1 不设置复用模式配置成PWM输出

最终软件仿真出的波形

波形周期500ms

---------------------------------------华丽分割--------------------------------------------

有小伙伴说软件仿真的波形不是500ms经过M君一番操作后发现可能是建立工程时设置的时钟晶振大小不是8MHz。

不妨将这里改一下再仿真看看呦。


时钟8MHz
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容