STM32(五):定时器——输出比较

定时器输出比较功能:输出PWM波形

OC(Output Compare)输出比较

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

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

高级定时器的前3个通道额外拥有死区生成和互补输出的功能(三项电机)。

CCR:捕获比较寄存器。IC(InputCompare):输入捕获 CC:Capture/Compare

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

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

PWM参数:

频率= 1 /TS (频率越快等效的模拟信号越平稳,开销越大)

占空比= TON / TS(占空比越大,等效的模拟电压就越趋向于高电平,占空比越小,等效的模拟电压就越趋向于低电平) 分辨率= 占空比变化步距(例如:1%,2%,3% 这种分辨率是1%)

当调控灯的点亮和熄灭的时间比例时,就能让LED呈现出不同的亮度级别。下1图,++上长下短等效模拟量偏上。上短下长等效模拟模拟量偏上。++

高级定时器前三个输出比较部分电路

通用定时器输出比较部分电路

CNT>=CCR1,输出模式控制器收到信号会改变OC1REF的输出电平。该信号:1.可以前往主模式控制器,把REF信号映射到主模式的TRGO输出上去;2.通过下路到达极性选择。极性选择:给CC1P写0,即不反转,写1,电平翻转。上方的ETRF一般不用。

输出模式控制器(输出比较模式)

**冻结模式:**输出PWM波形时候,想暂停一下, 切换为冻结模式,PWM波形输出停止,高低电平位置暂停时刻的状态,保持不变。

有效电平和无效电平是高级定时器的说法,是和关断、刹车这些功能配和表述。

**匹配时翻转模式:**可以输出一个频率可调,高低电平时间相等,占空比为50%的PWM波形;例如,如CCR为0,那CNT每次更新清0时,就会产生一次CNT=CCR的时间,每更新两次,输出为一个周期。当改变定时器更新频率时,输出波形频率也会随之改变。

**PWM模式1:**可以输出频率和占空比都可调的PWM波形,一般只使用向上计数,由于输出模式里可以设置极性,所以PWM模式1的正极性和PWM模式2的反极性最终的输出是一样的。

输出PWM的基本结构:

ARR为黄色线;CCR为红色线;CCR设置大一点,占空比就大;CCR设置的小一点,占空比就小;

PWM频率: Freq= CK_PSC / (PSC +1) / (ARR +1)

PWM占空比: Duty= CCR / (ARR +1) // 因为30时刻已经变成低电平了,所以不是CCR+1

PWM分辨率: Reso= 1 / (ARR +1)

PWM使用步骤:

第一步RCC开始时钟,把要用的TIM外设和GPIO的外设打开;

第二步 配置时基单元,包括时钟源选择

第三步 配置输出比较单元,包括CCR的值,输出比较模式,极性选择,输出使能这些参数。

第四步 配置GPIO。

第五步 启动计数器。

硬件:

舵机:

舵机是一种根据输入PWM信号占空比来控制输出角度的装置.

输入PWM信号要求:周期为20ms高电平宽度为0.5ms~2.5ms;舵机不是使用PWM等效模拟输入,而是把PWM当成一个通信协议;

直流电机

直流电机是一种将电能转换为机械能的装置,有两个电极,当电极正接时,电机正转,当电极反接时,电机反转

直流电机属于大功率器件,GPIO口无法直接驱动,需要配合电机驱动电路来操作

TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速和方向。

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_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);配置CCR寄存器的预装功能(影子寄存器);

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_OC1FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);用来配置快速使能,(单脉冲模式)

void TIM_OC2FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);

void TIM_OC3FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);

void TIM_OC4FastConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCFast);

void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);外部事件时,清楚ref信号;

void TIM_ClearOC2Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);

void TIM_ClearOC3Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);

void TIM_ClearOC4Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);

void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);用来单独设置输出比较的极性的

void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);N 为互补通道

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);

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);

void TIM_SelectOCxM(TIM_TypeDef* TIMx, uint16_t TIM_Channel, uint16_t TIM_OCMode);用来单独更改输出比较模式的函数

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);用来单独更改CCR寄存器值的函数

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);仅在高级定时器使用,在使用该机定时器输出PWM时,需要调用这个函数,使能主输出,否则PWM将不能输出。

AFIO :配置引脚的重映射;

AF_PP复用推挽输出,只有把GPIO设置成复用推挽输出,才能输出到GPIO端口例如PA0;

相关推荐
The Mr.Nobody1 小时前
STM32MPU开发之旅:从零开始构建嵌入式Linux镜像
linux·stm32·嵌入式硬件
阿川!2 小时前
嵌入式软件--stm32 DAY 3
stm32·单片机·嵌入式硬件
#金毛3 小时前
STM32的定时器输出PWM时,死区时间(DTR)如何计算
stm32·单片机·嵌入式硬件
无脑学c++3 小时前
STM32串口重定向:MDK与GCC重定向需重写的不同函数
stm32·单片机·物联网
Invinciblenuonuo4 小时前
STM32八股【6】-----CortexM3的双堆栈(MSP、PSP)设计
stm32·单片机·嵌入式硬件
2401_888859714 小时前
STM32 TIM编码器接口
stm32·单片机·嵌入式硬件
【0931】4 小时前
51单片机中断
单片机·嵌入式硬件
学习噢学个屁6 小时前
基于51单片机的超声波液位测量与控制系统
c语言·单片机·嵌入式硬件·51单片机
电鱼智能的电小鱼6 小时前
EFISH-SBC-RK3588无人机地面基准站项目
linux·网络·嵌入式硬件·机器人·无人机·边缘计算
电鱼智能的电小鱼6 小时前
基于 EFISH-SBC-RK3588 的无人机环境感知与数据采集方案
linux·网络·嵌入式硬件·数码相机·无人机·边缘计算