PWM输出学习笔记

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。调整PWM的周期、PWM的占空比而达到控制充电电流的目的.

老规矩,先让我们来看pwm.c中的源码:

#include "pwm.h"

#include "led.h"

 

 

//PWM输出初始化

//arr:自动重装值

//psc:时钟预分频数

void TIM1_PWM_Init(u16 arr,u16 psc)

{  

          GPIO_InitTypeDef GPIO_InitStructure;

         TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;

         TIM_OCInitTypeDef  TIM_OCInitStructure;

 

         RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);  //使能GPIO外设时钟使能

                                                                               
   //设置该引脚为复用输出功能,输出TIM,CH1的PWM脉冲波形

         GPIO_InitStructure.GPIO_Pin= GPIO_Pin_8; //TIM_CH1

         GPIO_InitStructure.GPIO_Mode= GPIO_Mode_AF_PP;  //复用推挽输出

         GPIO_InitStructure.GPIO_Speed= GPIO_Speed_50MHz;

         GPIO_Init(GPIOA,&GPIO_InitStructure);      

         TIM_TimeBaseStructure.TIM_Period=arr;//设置在下一个更新事件装入活动的自动重装载寄存器周期的值         80K

         TIM_TimeBaseStructure.TIM_Prescaler=psc;//设置用来作为TIMx时钟频率除数的预分频值   不分频

         TIM_TimeBaseStructure.TIM_ClockDivision= 0; //设置时钟分割:TDTS = Tck_tim

         TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;  //TIM向上计数模式

         TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);//根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

 

 

         TIM_OCInitStructure.TIM_OCMode= TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2

         TIM_OCInitStructure.TIM_OutputState= TIM_OutputState_Enable; //比较输出使能

         TIM_OCInitStructure.TIM_Pulse= 0; //设置待装入捕获比较寄存器的脉冲值

         TIM_OCInitStructure.TIM_OCPolarity= TIM_OCPolarity_High; //输出极性:TIM输出比较极性高

         TIM_OC1Init(TIM1,&TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx


         TIM_CtrlPWMOutputs(TIM1,ENABLE);     //MOE 主输出使能
         TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);  //CH1预装载使能 
         TIM_ARRPreloadConfig(TIM1,ENABLE); //使能TIMx在ARR上的预装载寄存器
         TIM_Cmd(TIM1,ENABLE);  //使能TIM1

}

这里我们要配置PA8为复用输出,这是因为TIM1_CH1通道将使用PA8的复用功能作为输出。

首先,我要介绍一下占空比:

占空比是PWM的最重要的参数

8位的PWM是0-255(2^8),比如用PWM控制一个电源正极的开关当PWM频率足够高的时候,开关后的电压是 = 电压占空比比如你用5V电源,用一个MOS管控制电源输出的话给MOS管30%的占空比,那么就是输出5V30%的电压

然后再说说怎么实现这个占空比。8位的定时器,如果做PWM,要输出30%的占空比,那么定时器从0~255*30%的计数值内(也就是76内)要输出高电平。然后比较当前的计数值跟76,计数值小于76就输出高电平,大于76的时候就输出低电平。

再让我们来看一下TIM_TimeBaseStructure这个结构体的各个成员

typedef struct

{

uint16_t TIM_OCMode;

uint16_tTIM_OutputState;  

uint16_t TIM_OutputNState;*/

uint16_tTIM_Pulse;         

uint16_tTIM_OCPolarity;    

uint16_tTIM_OCNPolarity;   

uint16_tTIM_OCIdleState;  

uint16_tTIM_OCNIdleState;  

}TIM_OCInitTypeDef;

参数TIM_OCMode设置模式是PWM还是输出比较,这里我们是PWM模式。(PWM有两种模式,一种是向上计数,一种是向下计数)

参数TIM_OutputState用来设置比较输出使能,也就是使能PWM输出到端口。(用计数值和用占空比计算得到的数进行比较,这里用上面提到的76举例,就是比较计数值与76的大小,根据下面TIM_OCPolarity定义的值判断,大于76时输出高电平还是小于76时输出低电平,所以使能输出比较结果,就是允许输出PWM)

参数TIM_OCPolarity用来设置极性是高还是低。(取值为TIM_OCPolarity_High时,计数值比76小时定义为高电平,比76大时定义为低电平,取值为TIM1_OCPolarity_Low时相反)

其他参数 TIM_OutputNState ,TIM_OCNPolarity , TIM_OCIdleState 和 TIM_OCNIdleState 是高级定时器TIM1和TIM8才用到的。

这里我们只要使用通用定时器的功能,所以没有必要初始化这些成员。

配置好了之后用TIM_OC1Init(TIM1,&OCInitStructure)函数初始化TIM1 OC1;

如果是高级定时器,则还需要配置:刹车和死区寄存器(TIMx_BDTR),该寄存器,我们只需要关注最高位:MOE位,要想高级定时器的PWM正常输出,则必须设置MOE位为1,否则不会有输出。注意:通用定时器不需要配置这个。其他位我们这里就不多说。

接下来的三个使能还是要看定时器结构的

1.jpg

如上图,这里我就不多说了。

最后我要解释一下关于为什么LED是渐变的,虽然TIM1计数器中的计数值要与76比较,但是这一个周期的时间十分短暂,导致低电平时间过短,达到人眼无法分辨的频率,所以我们觉得LED一直是亮着的,这个时候决定LED变化的只有主函数中最后一段代码中的函数TIM_SetCompare1(TIM1,led0pwmval)中的led0pwmval这个参数决定的占空比,从而影响电压进而影响电流大小,最后导致了LED的亮度的改变。

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

推荐阅读更多精彩内容

  • STM32F103一共有11个定时器,其中: 2个高级定时器 4个普通定时器 2个基本定时器 2个看门狗定时器 1...
    追梦Y少年阅读 891评论 0 1
  • 脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器...
    X_xxieRiemann阅读 6,466评论 1 13
  • 姓名:周崇杰 学号:16040120059 专业:机械设计制造及其自动化 转载自:http://blog.csd...
    CJbaby阅读 1,039评论 0 0
  • 时间它一直向前走,没有尽头只有路口。 2016的最后一天,去看了《摆渡人》,虽然豆瓣很多差评,电影里面的嘻哈风以及...
    五月成长笔记阅读 275评论 0 1
  • 曾经我爱你,你嫌弃我的漏洞百出;现在我成了滴水不漏的女子,可你拿什么来爱我。 --by 夏倾城。 直到现在,这徽城...
    余布茧阅读 375评论 0 0