STM32 定时器的输出比较电路及PWM的见解

OC(Output Compare)输出比较:

输出比较可以通过比较CNT(计数器)与CCR(捕获/比较寄存器)的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形

每个高级定时器和通用定时器都拥有4个输出比较通道

高级定时器的前3个通道额外拥有死区生成和互补输出的功能

PWM的介绍:

PWM(Pulse Width Modulation)脉冲宽度调制

在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域

PWM参数:

频率 = 1 / TS

占空比 = TON / TS          

分辨率 = 占空比变化步距(是占空比变化的精细程度)

输出比较通道(通用定时器):

REF(reference):参考信号,由CCR和CNT比较得出

CCR(capture compare register): 捕获/比较寄存器

CNT:计数器

极性选择:

  1. 给CC1P这个寄存器写0,信号就往上走,就是信号电平不翻转,输出就是输入原信号。
  2. 给CC1P写1的话,信号就往下走,就是信号通过一个非门取反,输出的信号就是输入信号的高低电平取反的信号。

REF经过比较后具体给什么电平可看下图:

冻结模式:输出暂停,REF保持上一个状态,并且高低电平也维持在暂停时刻的状态,保持不变。

匹配时置有效/无效电平模式 :可以理解为有效电平为高电平,无效电平为低电平。

匹配时电平翻转模式:可以方便地输出一个频率可调的占空比为50%PWM波形。

强制有效/无效电平模式:CNT与CCR无效,强制为高低电平

PWM模式1

向上计数:CNT<CCR时,REF置有效电平,CNT≥CCR时,REF置无效电平

向下计数:CNT>CCR时,REF置无效电平,CNT≤CCR时,REF置有效电平

PWM模式2

向上计数:CNT<CCR时,REF置无效电平,CNT≥CCR时,REF置有效电平

向下计数:CNT>CCR时,REF置有效电平,CNT≤CCR时,REF置无效电平

*PWM的基本结构(重要)

黄线(ARR)

蓝线(CNT)

红线(CCR)

模式:PWM1

PWM的参数计算:

PWM的频率: 就是计数器(CNT)的更新频率(计数器溢出频率)

PWM的占空比: 因为PWM1模式CNT>=CCR就是低电平,所以高电平一共占了0~CCR-1,所以就是CCR(Ton)/ARR+1(Ts

PWM的分辨率:取决于ARR的值,因为当你CCR超过了ARR在PWM1上就一直是有效电平(高电平),这样无意义,所以ARR值越大越好,分辨率就越精细,这样占空比就更细腻。

设置PWM代码过程:

  1. RCC开启时钟,要用到TIM和GPIO外设时钟打开。
  2. 配置时基单元
  3. 配置输出比较单元,包括CCR的值,输出比较模式,极性选择,输出使能这些参数。
  4. 配置GPIO,把PWM对应的GPIO口,初始化为复用推挽输出的配置。
  5. 运行控制。启动计数器,这样就能输出PWM了。

有关PWM和输出比较模块的库函数(重要的函数序号前有*号):

OCOutput Compare)输出比较

*1.配制输出模块(一共有四个OC1~4),参数分别是:1选择定时器,2结构体,输出比较的那些参数了。

void TIM_OC1Init (TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

2.给输出比较结构体赋一共默认值,参数是结构体

voidTIM_OCStructInit(TIM_OCInitTypeDef*TIM_OCInitStruct);

  1. 配制强制输出模式(通用和上面配置输出模块一样OC1~OC4),参数为1选择定时器,2……

void TIM_ForcedOC1Config (TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);

  1. 配置CCR预装功能(影子寄存器:写入的值不会立即生效,而是在更新事件后生效)同样有OC1~OC4

void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

5.配置快速使能(同样有OC1~OC4)

 void TIM_OC1FastConfig (TIM_TypeDef* TIMx, uint16_t TIM_OCFast);

6.外部事件时清除REF信号(同样有OC1~OC4)

void TIM_ClearOC1Ref (TIM_TypeDef* TIMx, uint16_t TIM_OCClear);

7.单独设置输出比较极性(带N的是高级定时器的互补通道配置,同样有OC1~OC4)

void TIM_OC1PolarityConfig (TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

void TIM_OC1NPolarityConfig (TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);

8.用来单独修改输出使能(带N的是高级定时器的互补通道配置)

void TIM_CCxCmd (TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCx);

void TIM_CCxNCmd (TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_CCxN);

9.选择输出比较模式(用来单独更改输出比较模式的函数)

void TIM_SelectOCxM (TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);

*10.用来单独更改CCR寄存器值的函数(同样有OC1~OC4)

在函数运行时需要更改占空比,就得用这个函数。

void  TIM_SetCompare1  (TIM_TypeDef* TIMx, uint16_t Compare1);

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值