通用定时器---输出比较功能

目录

一、概念

二、输出比较的8种模式

三、输出比较输出PWM波形的基本结构

配置步骤

四、示例代码


一、概念

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

        虽然手册中他的名字是输出比较,但是我更喜欢称他为比较输出,因为他是用CNT和CCR的值进行比较,然后再输出高低电平/翻转电平的。

        每一个高级定时器和通用寄存器都拥有4个输出比较通道:这意味着同一时刻,可以有4路IO口进行独立的输出比较操作,即每一路比较都可以根据CNT(计数器)与CCR(捕获比较寄存器)的值进行,从而控制对应的输出电平。如果每一路的CCR寄存器中写的值都不一样,那么这4路与CNT比较后,会有多种不一样的效果。

通用定时器框图

高级定时器框图

二、输出比较的8种模式

        

        上图是4个输出比较通道的其中一个:可以看到本质就是开启TIM定时器,让TIM定时器不断++,其当前的数值是暂时存储在CNT寄存器中,然后我们对CCR寄存器设置一个初始值,随着TIM不断运行,CCR寄存器和CNT寄存器里面的值会不断比较,一旦符合了条件,就会向外部输出高/低/翻转电平。

三、输出比较输出PWM波形的基本结构

        PWM的基本结构就是由之前的内部时钟中断,去掉了后面的中断部分,然后替换称为了输出比较部分。

配置步骤

  1. 初始化系统时钟。(图左边部分)
  2. 配置GPIO:将定时器输出引脚配置为复用推挽输出模式。(因为我们要输出PWM波形,肯定要有一个GPIO口作为输出比较的出口)。复用推挽模式和普通推挽模式有什么区别呢?普通推挽模式的GPIO口的电平状态完全由CPU来控制,而复用推挽模式的GPIO口电平是由外设来控制,在这里是输出比较模块来控制(相当于CPU放弃对GPIO口电平状态的控制,由外设全权负责)
  3. 配置定时器:(图右边部分)
    • 定时器时钟源。
    • 预分频器。
    • 自动重装载寄存器(ARR)。
    • 输出比较模式(PWM模式)。
    • 捕获/比较寄存器(CCR)。

下图是STM32的TIM2的输出比较通道连接的GPIO口PA0的查看

四、示例代码

// 使能GPIOA和TIM2的时钟(一个用来定时,一个用来输出)
void RCC_Configuration(void)
{
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
    
    /*配置时钟源TIM2为内部时钟源*/
	TIM_InternalClockConfig(TIM2);
}

// 配置PA0 (TIM2_CH1) 为复用推挽输出模式
void GPIO_Configuration(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);
}

//配置TIM2为输出比较,用来输出PWM波形
void TIM2_PWM_Config(void)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    
    // 配置TIM2的时间基单元
    TIM_TimeBaseStructure.TIM_Period = 1000-1; // 设置PWM周期 (ARR寄存器的值)
    TIM_TimeBaseStructure.TIM_Prescaler = 72-1; // 设置预分频器 (PSC寄存器的值)
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 时钟分频
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
    TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
    
    
    // 配置TIM2的输出比较通道1 (PWM模式1)
    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // PWM模式1
    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 使能输出
    TIM_OCInitStructure.TIM_Pulse = 499; // 设置PWM占空比 (CCR寄存器的值)
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 设置输出极性为高
    TIM_OC1Init(TIM2, &TIM_OCInitStructure);
    
    // 使能TIM2的预装载寄存器
    TIM_ARRPreloadConfig(TIM2, ENABLE);
    //使能TIM2,定时器开始运行
    TIM_Cmd(TIM2, ENABLE);			
}

void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2, Compare);		//设置CCR1的值
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/916815.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CSS盒子的定位> (下篇)#固定定位#笔记

一、固定定位 1.概念 固定定位其实是绝对定位的子类别,一个设置了position:fixed的元素是相对于视窗固定的,就算页面文档发生了滚动,它也会一直待在相同的地方。 2.代码属性 CSS代码添加 position:fixed 水平方…

leetcode100:相同的树

给你两棵二叉树的根节点 p 和 q ,编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同,并且节点具有相同的值,则认为它们是相同的。 示例 1: 输入:p [1,2,3], q [1,2,3] 输出:true示例 2&…

我谈二值形态学基本运算——腐蚀、膨胀、开运算、闭运算

Gonzalez从集合角度定义膨胀和腐蚀,不易理解。 Through these definitions, you can interpret dilation and erosion as sliding neighborhood operations analogous to convolution (or spatial filtering). 禹晶、肖创柏、廖庆敏《数字图像处理(面向…

【数据结构 | C++】整型关键字的平方探测法散列

整型关键字的平方探测法散列 将给定的无重复正整数序列插入一个散列表,输出每个输入的数字在表中的位置。所用的散列函数是 H(key)key%TSize,其中 TSize 是散列表的表长。要求用平方探测法(只增不减,即H(Key)i^2)解决冲…

24.11.15 Vue3

let newJson new Proxy(myJson,{get(target,prop){console.log(在读取${prop}属性);return target[prop];},set(target,prop,val){console.log(在设置${prop}属性值为${val});if(prop"name"){document.getElementById("myTitle").innerHTML val;}if(prop…

413: Quick Sort

解法&#xff1a; #include <bits/stdc.h> using namespace std; const int N1e55; int a[N]; int n;int main(int argc, char** argv) {cin>>n;for (int i0;i<n;i) cin>>a[i];sort(a,an);for (int i0;i<n;i) cout<<a[i]<<" "…

麒麟kysec安全

一、kysec安全框架管理 开启kysec getstatus Copy security-switch --set default Copy 重启系统 reboot Copy 刷新页面&#xff0c;等待几分钟&#xff0c;即可完成文件的扫描。 查看kysec状态 getstatus Copy 切换到管理员身份&#xff08;密码&#xff1a;devuser…

在qml里如何使用C++ Qt数据模型QAbstractListModel

本篇博客用qml GridView来显示视频矩阵,然后加载本地的视频,需要用到C++ Qt的model, 代码环境Qt6.5.3 qml, 对应的视频讲解:https://edu.csdn.net/learn/40003/653975?spm=3001.4143 先看一下界面效果: 上图是用qml ScrollView和GridView做了一个可以滚动显示的视频矩阵列…

Java项目实战II基于微信小程序的实习记录(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。 一、前言 在当今竞争激烈的就业市场中&#xff0…

【C++笔记】vector使用详解及模拟实现

前言 各位读者朋友们&#xff0c;大家好&#xff01;上期我们讲了string类的模拟实现&#xff0c;这期我们开启vector的讲解。 一.vector的介绍及使用 1.1 vector的介绍 vector的文档 使用STL的三个境界&#xff1a;能用、明理、能扩展&#xff0c;下面学习vector&#xff…

【环境配置】macOS配置jdk与maven

配置jdk与maven 配置jdk与切换java版本命令 maven安装与配置国内镜像源 用到的命令 # 进入 JDK 安装目录 cd /Library/Java/JavaVirtualMachines# 查看文件 ls ➜ jdk-1.8.jdk jdk-11.jdk# 查看路径 pwd ➜ /Library/Java/JavaVirtualMachines# 打开环境变量配置文件 vi &…

借助Excel实现Word表格快速排序

实例需求&#xff1a;Word中的表格如下图所示&#xff0c;为了强化记忆&#xff0c;希望能够将表格内容随机排序&#xff0c;表格第一列仍然按照顺序编号&#xff0c;即编号不跟随表格行内容调整。 乱序之后的效果如下图所示&#xff08;每次运行代码的结果都不一定相同&#x…

Essential Cell Biology--Fifth Edition--Chapter one (6)

1.1.4.4 Internal Membranes Create Intracellular Compartments with Different Functions [细胞膜形成具有不同功能的细胞内隔室] 细胞核、线粒体和叶绿体并不是真核细胞中唯一的膜包围细胞器。细胞质中含有大量的[ a profusion of]其他细胞器&#xff0c;这些细胞器被单层膜…

动态规划29:673. 最长递增子序列的个数

动态规划解题步骤&#xff1a; 1.确定状态表示&#xff1a;dp[i]是什么 2.确定状态转移方程&#xff1a;dp[i]等于什么 3.初始化&#xff1a;确保状态转移方程不越界 4.确定填表顺序&#xff1a;根据状态转移方程即可确定填表顺序 5.确定返回值 题目链接&#xff1a;673.…

M-LAG 技术笔记

M-LAG 简介 M-LAG&#xff08;Multichassis link aggregation&#xff0c;跨设备链路聚合&#xff09;将两台物理设备在聚合层面虚拟成一台设备来实现跨设备链路聚合&#xff0c;从而提供设备级冗余保护和流量负载分担。 M-LAG 基础概念 如 图1-1 所示&#xff0c;Device A …

C语言-指针及变量的概念与使用

1、指针的概念 计算机中所有的数据都必须放在内存中&#xff0c;不同类型的数据占用的字节数不一样&#xff0c;例如 int 占用 4 个字节&#xff0c;char 占 用 1 个字节。为了正确地访问这些数据&#xff0c;必须为每个字节都编上号码&#xff0c;就像门牌号、身份证号一样&a…

tauri开发中,使用node将png图片转成苹果的icns图标格式,解决tauri icon生成的mac图标过大问题

在tauri开发中&#xff0c;我们使用tauri icon生成的图标在windows上是正常的&#xff0c;但是在mac上就显示过大&#xff0c;也可以看tauri的issue&#xff1a;[v2]When using the Tauri Icon to generate icons, it is always larger than other icons in Mac tauri-apps/ta…

【Docker】Mac安装Docker Desktop导致磁盘剩余空间较少问题如何解决?

目录 一、背景描述 二、解决办法 三、清理效果 四、理论参考 解决方法 1. 清理未使用的 Docker 镜像、容器和卷 2. 查看 Docker 使用的磁盘空间 3. 调整 Docker 的存储位置 4. 增加磁盘空间 5. 调整 Docker Desktop 配置 6. 使用 Docker 清理工具&#xff08;例如 D…

微信小程序navigateTo:fail webview count limit exceed

theme: nico 你们好&#xff0c;我是金金金。 场景 uniapp编写微信小程序&#xff0c;使用uni.navigateTo跳转的过程中报错如下&#xff1a; 报错意思也非常明显了&#xff1a;errMsg":"navigateTo:fail webview 数量超出限制 排查 排查之前我先贴一下代码 代码非…

类与对象(2)---类的6个默认成员函数

1.类的6个默认成员函数 任何类在什么都不写时&#xff0c;编译器会自动生成以下6个默认成员函数。 默认成员函数&#xff1a;用户没有显式实现&#xff0c;编译器会生成的成员函数称为默认成员函数。 2.构造函数 2.1构造函数特性 构造函数的主要任务是初始化对象。 它有如下特…