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;

相关推荐
blessing。。1 小时前
I2C学习
linux·单片机·嵌入式硬件·嵌入式
嵌新程2 小时前
day03(单片机高级)RTOS
stm32·单片机·嵌入式硬件·freertos·rtos·u575
Lin2012302 小时前
STM32 Keil5 attribute 关键字的用法
stm32·单片机·嵌入式硬件
电工小王(全国可飞)3 小时前
STM32 RAM在Memory Map中被分为3个区域
stm32·单片机·嵌入式硬件
maxiumII3 小时前
Diving into the STM32 HAL-----DAC笔记
笔记·stm32·嵌入式硬件
美式小田5 小时前
单片机学习笔记 9. 8×8LED点阵屏
笔记·单片机·嵌入式硬件·学习
兰_博6 小时前
51单片机-独立按键与数码管联动
单片机·嵌入式硬件·51单片机
时光の尘6 小时前
C语言菜鸟入门·关键字·float以及double的用法
运维·服务器·c语言·开发语言·stm32·单片机·c
嵌入式大圣8 小时前
单片机结合OpenCV
单片机·嵌入式硬件·opencv
日晨难再9 小时前
嵌入式:STM32的启动(Startup)文件解析
stm32·单片机·嵌入式硬件