当前位置: 首页 > news >正文

STM32高级定时器-输出比较模式

一.输出比较原理

在这里插入图片描述

1.输出比较

通过定时器的外部引脚对外输出控制信号,将通道X(x=1,2,3,4)通常设置为PWM1、PWM2模式。

2.比较寄存器

当计数器CNT和比较寄存器CCR的值相等时,输出参考信号OCxREF的信号的极性发生改变,其中OCxREF=1(高电平)称为有效电平,OCxREF=0(低电平)称为无效电平,并且产生比较中断CCxI,相应的标志位CCxIF会置位。
OCxREF再经过一系列的控制之后成为真正的输出信号OCx/OCxN

3.输出引脚

输出比较的输出信号最终通过定时器的外部IO输出,分别为CH1/2/3/4,以及互补输出通道CH1/2/3N

二.PWM输出模式

1.PWM输出

对外输出脉宽(即占空比)可调的方波信号。

2.信号频率

自动重装载寄存器ARR的值决定,PWM频率 = TIM_CLK/{(PSC+1)(ARR+1)}

3.占空比

比较寄存器CCR的值决定,占空比=CCR/(ARR+1)

4.常用的值

TIM_CLK:72MHZ;ARR:自动装载寄存器的值 ;CCR: 比较寄存器; PSC:计数器时钟分频因子。

5.PWM边沿对齐模式

在这里插入图片描述
在递增计数模式下,计数器从0计数到自动装载寄存器的值(ARR),然后重新从0开始计数并生成计数器上溢事件。
上图中,ARR=8,CCR=4,CNT从0开始计数,使用递增模式。
CNT<CCR时,OCxREF为有效的高电平。
CCR=<CCR<=ARR时,OCxREF为无效的低电平。
之后,CNT从0开始计数并生成计数器上溢事件,以此循环往复。

二.输出比较初始化结构体

typedef struct {uint16_t TIM_OCMode; // 比较输出模式uint16_t TIM_OutputState; // 比较输出使能uint16_t TIM_OutputNState; // 比较互补输出使能uint32_t TIM_Pulse; // 脉冲宽度uint16_t TIM_OCPolarity; // 输出极性uint16_t TIM_OCNPolarity; // 互补输出极性uint16_t TIM_OCIdleState; // 空闲状态下比较输出状态uint16_t TIM_OCNIdleState; // 空闲状态下比较互补输出状态
} TIM_OCInitTypeDef;;

(1)IM_OCMode:比较输出模式选择,总共有八种,常用的为 PWM1/PWM2,即TIM_OCMode_PWM1/TIM_OCMode_PWM2。
(2)TIM_OutputState:比较输出使能,决定最终的输出比较信号 OCx 是否通过外部引脚输出,即TIM_OutputState_Enable。
(3)TIM_OutputNState: 比较互补输出使能,决定 OCx 的互补信号 OCxN 是否通过外部引脚输出。
(4)TIM_Pulse:比较输出脉冲宽度,实际设定比较寄存器 CCR的值,决定脉冲宽度。可设置范围为 0 至 65535。
(5)TIM_OCPolarity:比较输出极性,可选 OCx 为高电平有效或低电平有效,它决定着定时器通道有效电平。即:TIM_OCPolarity_High/TIM_OCPolarity_LOW
HIGH:CNT< CCR(比较寄存器) 时,定时器通道CH输出高电平;
LOW:CNT< CCR(比较寄存器) 时, 定时器通道CH输出低电平。
(6)TIM_OCNPolarity:比较互补输出极性,可选 OCxN 为高电平有效或低电平有效。
(7)TIM_OCIdleState:空闲状态时通道输出电平设置,可选输出 1 或输出 0。
(8)TIM_OCNIdleState:空闲状态时互补通道输出电平设置,可选输出 1 或输出 0

三.源代码

1.bsp_generalpwm.h

#ifndef BSP_GENERAL_PWM_H
#define BSP_GENERAL_PWM_H#include "stm32f10x.h"void INIT_GENERAL_GPIO_CONFIG();
void INIT_GENERAL_PWM_CONFIG();#endif

2.bsp_generalpwm.c

#include "bsp_generalpwm.h"//使用TIM3的 输出比较通道1,2,3,4 对应的GPIO初始化
void INIT_GENERAL_GPIO_CONFIG()
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6;//PA6 PA7GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;//推免输出模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;GPIO_Init(GPIOA,&GPIO_InitStructure);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PB0 PB1GPIO_Init(GPIOB,&GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;GPIO_Init(GPIOB,&GPIO_InitStructure);
}/* ----------------   PWM信号 周期和占空比的计算--------------- */
// ARR :自动重装载寄存器的值
// CLK_cnt:计数器的时钟,等于 Fck_int / (psc+1) = 72M/(psc+1)
// PWM 信号的周期 T = ARR * (1/CLK_cnt) = ARR*(PSC+1) / 72M
// 占空比P=CCR/(ARR+1)void INIT_GENERAL_PWM_CONFIG()
{//初始化 TIM_TimeBaseInitTypeDef//开启定时器时钟,即内部时钟CK_INT=72MRCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;TIM_TimeBaseInitStructure.TIM_Prescaler = 72-1;//72MHZ/((72-1)+1) = 1MHZ  分频因子TIM_TimeBaseInitStructure.TIM_Period = 9-1;//重载寄存器的值TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;//向上计数TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);//占空比设置uint8_t OC1_VALUE = 8;uint8_t OC2_VALUE = 5;uint8_t OC3_VALUE = 4;uint8_t OC4_VALUE = 2;//初始化 TIM_OCInitTypeDefTIM_OCInitTypeDef TIM_OCInitStructure;TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;//使用PWM1模式TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//输出通道电平极性 高电平有效;CNT<  CCR(比较寄存器) 时,定时器通道CH输出高电平;TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;//输出使能TIM_OCInitStructure.TIM_Pulse = OC1_VALUE;//占空比:TIM_Pulse/(Period +1)TIM_OC1Init(TIM3,&TIM_OCInitStructure);TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);TIM_OCInitStructure.TIM_Pulse = OC2_VALUE;TIM_OC2Init(TIM3,&TIM_OCInitStructure);TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);TIM_OCInitStructure.TIM_Pulse = OC3_VALUE;TIM_OC3Init(TIM3,&TIM_OCInitStructure);TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);TIM_OCInitStructure.TIM_Pulse = OC4_VALUE;TIM_OC3Init(TIM3,&TIM_OCInitStructure);TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);//使能计数器TIM_Cmd(TIM3,ENABLE);
}

3.man.c

#include "bsp_generalpwm.h"int main(void)
{	INIT_GENERAL_GPIO_CONFIG();INIT_GENERAL_PWM_CONFIG();while(1){}
}
http://www.dtcms.com/a/350279.html

相关文章:

  • 基于周期因子的资金流入流出预测
  • 区间和使用前缀和方法得到的时间复杂度
  • 2025 高教社杯全国大学生数学建模竞赛A题B题C题D题E题思路+模型+代码+论文(9.4开赛后第一时间更新)
  • AD画PCB时不小心移除的焊盘如何恢复
  • 玩转ChatGPT:Kimi深度研究功能
  • 模拟IC设计基础系列10-virtuoso常用快捷键整理(基础操作)
  • 驱动清理工具Driver Store Explorer(驱动程序资源管理器) 中文便携版
  • 重学前端010 --- 响应式网页设计 中级CSS
  • 【C++ 11 新特性】function 函数包装器的使用
  • Java程序员如何快速就业或跳槽?
  • Flask 之请求钩子详解:掌控请求生命周期
  • 基于Flask和AI的智能简历分析系统开发全流程
  • 护照阅读器应用
  • java18学习笔记
  • 【大模型本地运行与部署框架】Ollama的API交互
  • Vue Flow 设计大模型工作流
  • 深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第六章知识点问答(22题)
  • 连锁零售排班难?自动排班系统来解决
  • DDR3入门系列(二)------DDR3硬件电路及Xilinx MIG IP核介绍
  • 基于LZO的无损数据压缩IP,高性能压缩速率32Gbps,压缩率50%,适用FPGAASIC
  • TDengine IDMP 应用场景:IT 系统监控
  • HIVE创建UDF函数全流程
  • 【URP】Unity 插入自定义RenderPass
  • 【学习记录】CSS: clamp、@scope
  • C++ extern 关键字面试深度解析
  • 大模型的思考方式
  • 引脚电平异常?以下或许是原因
  • Java 高可用实现方式
  • 基于MATLAB长时间序列遥感数据处理及在全球变化、物候提取、植被变绿与固碳分析等领域中的实践技术应用
  • 面试常考算法题汇总