STM32 TIM输出比较

简介

输出比较简介

OC(Output Compare)输出比较【IC(Input Compare)输入捕获;CC(Capture Compare)输入捕获和输出比较的单元】

输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1或0或翻转的操作,用于输出一定频率和占空比的波形。

PWM简介

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

在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,使被调对象不断地变化,LED灯亮灭,亮灭;电机转停,转停来实现LED亮度调节或者速度调节

PWM参数:

频率=1/Ts  占空比=Ton /Ts(高电平比上总时间)  分辨率=占空比变化步距

输出比较通道

输出比较通道(通用)

通道的打通线路:输出模式控制器会改变OC1ref(reference 参考信号)信号的高低电平,然后信号的主要去向是前往极性选择TIMx_CCER,给其写0时,则信号走上面一路,信号不翻转;写1时,信号走下面,通过一个非门取反。

控制输出模式寄存器的寄存器配置图:

有效电平可以理解为高电平,无效电平可以理解为低电平

PWM模式2即为PWM模式1的取反

图例是PWM模式1的寄存器配置

相关函数

*用结构体初始化输出比较单元(Output Compare)

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC2Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC3Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
void TIM_OC4Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

给输出比较函数赋一个初始值(在配置结构体函数时,要给其成员赋初始值,防止因未配初始值,而使其成员被系统随机赋值,后续程序运行出现问题。(例如在配置通用定时器时,定义的结构体里有高级定时器的成员,有些是用不到的,频繁配置比较麻烦,所以选择只列出来需要用到的,这时其他的成员就需要一个初始值))

void TIM_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);
 

配置强制输出模式(了解即可,因为强制输出高电平即占空比100%,低电平同理)

void TIM_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);

配置CRR寄存器预装功能(即影子寄存器,写入的值不会立即生效,在更新事件才会生效)

void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC3PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
void TIM_OC4PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);

单独更改输出极性

void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC2PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC2NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC3PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC3NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
void TIM_OC4PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);

*单独更改CCR寄存器值的函数

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);
void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);
void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);

#在使用高级定时器时需要配置此函数

void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState)
使得输出使能

#配置引脚时,要将引脚配置成复用推挽输出。将引脚控制权交给片上外设。

引脚重映射

以配置以下三个函数为例

   * RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE ); //重映射的时钟开启
   * GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2 , ENABLE); //重映射引脚
   *GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable , ENABLE); //解除调试端口

如果想要相关引脚当做GPIO使用,则用一、三句,先打开AFIO时钟,再用AFIO将JTAG复用解除;如果想要重映射定时器又或者其他外设的复用引脚,用一、二句,先打开AFIO时钟,在用AFIO重映射外设复用的引脚;若重映射的引脚正好是调试端口,则三句都用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值