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

news2024/12/29 13:22:57

目录

一、概念

二、输出比较的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的值
}


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Wireshark中的length栏位

注:Ethernet II的最小data length为46,如果小于,会补全到46. 1.指定网卡抓取的,链路为ethernet。 IPv4 Ethernet II 长度为 14 bytes - L1ipv4 header中的length包括header和payload的总长度 - L2wireshark中length表示抓取的pac…

spring boot整合https协议

整体目录 1. 生成SSL证书 首先,使用keytool生成一个自签名证书。打开命令行工具并运行以下命令: keytool -genkeypair -alias myserver -keyalg RSA -keysize 2048 -keystore keystore.jks -validity 365 这将创建一个名为keystore.jks的文件&#xf…

ceph的集群管理

0 环境说明 ip地址主机名额外硬盘是否加入ceph集群10.0.0.141ceph141sdb 300G,sdc 500G是10.0.0.142ceph142sdb 300G,sdc 500G, sdd 1000G否10.0.0.143ceph143sdb 300G,sdc 500G否 在上一篇文章中,已经成功地初始化了一个ceph管…

C++(Qt)软件调试---内存泄漏分析工具MTuner (25)

C(Qt)软件调试—内存泄漏分析工具MTuner (25) 文章目录 C(Qt)软件调试---内存泄漏分析工具MTuner (25)[toc]1、概述🐜2、下载MTuner🪲3、使用MTuner分析qt程序内存泄漏🦧4、相关地址&#x1f41…

CCI3.0-HQ:用于预训练大型语言模型的高质量大规模中文数据集

摘要 我们介绍了 CCI3.0-HQ,它是中文语料库互联网 3.0(CCI3.0)的一个高质量500GB子集,采用新颖的两阶段混合过滤管道开发,显著提高了数据质量。为了评估其有效性,我们在不同数据集的100B tokens上从头开始…

LC12:双指针

文章目录 125. 验证回文串 本专栏记录以后刷题碰到的有关双指针的题目。 125. 验证回文串 题目链接:125. 验证回文串 这是一个简单题目,但条件判断自己写的时候写的过于繁杂。后面参考别人写的代码,首先先将字符串s利用s.toLowerCase()将其…

AI 写作(九)实战项目二:智能新闻报道(9/10)

一、项目概述 在当今信息爆炸的时代,新闻传播行业正面临着前所未有的挑战与机遇。随着科技的飞速发展,人们获取信息的渠道日益多样化,对新闻的时效性、准确性和个性化需求也不断提高。在这样的背景下,AI 写作在智能新闻报道中的重…

星际流浪的大模型

种子世界还在太空漫游,航线上捡到一个铁盒子,那是一块硬盘,古老的东西。 长老就安排歌者,你去研究,查查硬盘的来源坐标。 费好大劲,歌者把硬盘中的程序和数据激活,运行了起来。 很有意思&#x…

HarmonyOs DevEco Studio小技巧31--画布组件Canvas

那天我们用画布实现了文字颜色的渐变,实际上画布还有很多好玩的功能,接下来让我们一起试一下画布怎么玩 Canvas 提供画布组件,用于自定义绘制图形。 接口 Canvas Canvas(context?: CanvasRenderingContext2D | DrawingRenderingContext…

C语言.冒泡排序的练习

题目: 1.用C语言编程,用冒泡排序将一个元素个数为20,的一维数组,由大到小的降序。 分析:1.首先创建一个数组,元素个数为20. 2.其次是按降序排列。 3.最后用冒泡排序。 运行代码: #include&l…

RT-DETR融合GhostModel V3及相关改进思路

RT-DETR使用教程: RT-DETR使用教程 RT-DETR改进汇总贴:RT-DETR更新汇总贴 《GhostNetV3: Exploring the Training Strategies for Compact Models》 一、 模块介绍 论文链接:https://arxiv.org/pdf/2404.11202v1 代码链接:https:…

基于yolov8、yolov5的鸟类分类系统(含UI界面、训练好的模型、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下: 算法模型:     yolov8、yolov8 SE注意力机制 或 yolov5、yolov5 SE注意力机制 , 直接提供最少两个训练好的模型。模型十分重要,因为有些同学的电脑没有 GPU&#xff0…

如何保证MySQL与Redis缓存的数据一致性?

文章目录 一、引言二、场景来源三、高并发解决方案1. 先更新缓存,再更新数据库2. 先更新数据库,再更新缓存3. 先删除缓存,再更新数据库4. 先更新数据库,再删除缓存小结 四、拓展方案1. 分布式锁与分布式事务2. 消息队列3. 监听bin…

Chromium 中sqlite数据库操作演示c++

本文主要演示sqlite数据库 增删改查创建数据库以及数据库表的基本操作,仅供学习参考。 一、sqlite数据库操作类封装: sql\database.h sql\database.cc // Copyright 2012 The Chromium Authors // Use of this source code is governed by a BSD-sty…

pycharm分支提交操作

一、Pycharm拉取Git远程仓库代码 1、点击VCS > Get from Version Control 2、输入git的url,选择自己的项目路径 3、点击Clone,就拉取成功了 默认签出分支为main 选择develop签出即可进行开发工作 二、创建分支(非必要可以不使用&#xf…

河道无人机雷达测流监测系统由哪几部分组成?

在现代水利管理中,河道无人机雷达监测系统正逐渐成为一种重要的工具,为河道的安全和管理提供了强大的技术支持。那么,这个先进的监测系统究竟由哪几部分组成呢? 河道无人机雷达监测系统工作原理 雷达传感器通过发射电磁波或激光束…

使用pycrawlers下载huggingface报错list index out of range问题解决

使用pycrawlers下载huggingface失败 错误:list index out of range 问题描述:当批量下载整个huggingface仓库的时候会报错,并且没有报错提示 分析:应该是哪个链接请求结果不存在数据 结果:当下载仓库存在文件夹下面只…

清华大学提出基于ESKF的松耦合里程计RINO:一种具有非迭代估计的精确、稳健的雷达惯性里程计

Abstract 精确的定位和建图对于实现自动驾驶车辆的自主导航至关重要。然而,当GNSS信号失效或在极端天气条件(例如雾、雨和雪)下,车体运动估计仍然面临重大挑战。近年来,扫描雷达因其较强的穿透能力成为一种有效的解决…

微信小程序之路由跳转传数据及接收

跳转并传id或者对象 1.home/index.wxml <!--点击goto方法 将spu_id传过去--> <view class"item" bind:tap"goto" data-id"{{item.spu_id}}"> 结果: 2.home/index.js goto(event){// 路由跳转页面,并把id传传过去//获取商品idlet i…

tensorflow案例6--基于VGG16的猫狗识别(准确率99.8%+),以及tqdm、train_on_batch的简介

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 本次还是学习API和如何搭建神经网络为主&#xff0c;这一次用VGG16去对猫狗分类&#xff0c;效果还是很好的&#xff0c;达到了99.8% 文章目录 1、tqdm…