[STM32] 定时器应用之输出比较 (五)

文章目录

      • 1.输出比较
      • 2.PWM 介绍
      • 3.配置PWM

1.输出比较

OC: 输出比较。

  1. 输出比较可以通过比较CNT与CCR寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形。
  2. 每个高级定时器和通用定时器都拥有4个输出比较通道
  3. 高级定时器的前3个通道额外拥有死区生成和互补输出的功能

通用定时器图例:

在这里插入图片描述

高级定时器图例:

在这里插入图片描述

高级定时器还具有死区生成和互补输出的功能, 主要用于驱动三项无刷电机的。

通用定时器的捕获/比较通道的输出部分:

在这里插入图片描述

工作流程:

  1. 最左边是寄存器CNT和CCR1的捕获比较寄存器,CNT≥CCR1时(需提前配置好CCR1中的值,使用结构体变量配置CCR1,也可函数单独配置)
  2. 给输出模式控制器传递信号,控制器再给OC1ref(reference即参考信号)传递高低电平
  3. REF主要走下路,通过极性选择后(写0,走上路保持原电平;写1,走下路电平取反;故配置OC模式时,需选择极性,使用结构体变量配置极性)
  4. 输出使能电路选择是否输出(CC1E给输出使能电路写值;故配置OC模式时,需使能OC电路,使用结构体变量使能电路)
  5. 最后到达OC1引脚,到达GPIO口

输出模式寄存器:

在这里插入图片描述

  • 冻结:CNT和CCR无效,REF保持原状态。
  • 匹配时置有效电平和无效电平,分别是指高低电平。(信号是一次性的,不适合输出连续变化的波形;如置配置时置有效电平模式,满足条件后,信号一直保持有效电平)
  • 配置时电平翻转:可以形成一个50占空比的PWM波形。
  • 强制为无效或有效电平,和冻结模式类似,只是指定了冻结后的高低电平,如果想暂停输出波形,并且在暂停期间置高低电平,可以选择此模式。
  • PWM1和PWM2,一般使用向上计数,二者只是极性不同,通常使用PWM1。
    输出模式和选择极性都可以配置信号极性,非常灵活。(即PWM模式选择改变极性;结构体配置选择极性时,也可改变)

2.PWM 介绍

  1. 脉冲宽度调制(PWM), 简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。 ​

  2. PWM 的频率: 是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期)。也就是说一秒钟PWM有多少个周期。单位是HZ。

  3. PWM 的周期: T=1/f, 50HZ=20ms, 如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期。

  4. 占空比: 是一个脉冲周期内,高电平的时间与整个周期时间的比例。脉宽时间占周期的比例。脉宽时间就是高电平的时间。

  5. 周期的时间是10ms,脉宽时间是8ms 那么低电平时间就是2ms 总的占空比 8/(8+2)= 80%。

PWM的参数:

  1. 频率: 1/Ts
  2. 占空比: TON/Ts
  3. 分辨率: 占空比变化步距

在这里插入图片描述

在这里插入图片描述

红线为CCR值,黄线为ARR,蓝线为CNT。
以PWM1为例,当CNT< ARR时为高电平,CNT > ARR时,为低电平。

在这里插入图片描述

3.配置PWM

第一步:RCC开启时钟,打开我们要用的TIM,GPIO外设的时钟打开。
第二步:配置时基单元。
第三步:配置输出比较单元,包括CCR的值,输出比较模式,极性选择,输出使能这些参数
第四步:配置GPIO位复用推挽输出。
第五步:运行控制。启动计数器。

初始化TIM输出比较功能:

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);//重要 参数1:选择定时器;参数2:结构体配置具体功能
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_ForcedOC1Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC2Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC3Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);
void TIM_ForcedOC4Config(TIM_TypeDef* TIMx, uint16_t TIM_ForcedAction);

配置CCR寄存器的预装功能:

void TIM_OC1PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
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);

外部事件时清除REF信号:

void TIM_ClearOC1Ref(TIM_TypeDef* TIMx, uint16_t TIM_OCClear);
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);

单独设置输出比较极性的(N是指高级定时器的互补通道,结构体初始化也可以设置极性,一般来说结构体里的参数都可以用函数来单独修改的)。

void TIM_OC1PolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPolarity);
void TIM_OC1NPolarityConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCNPolarity);
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);//

修改CCR的值:

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
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);

TIM:

#include "stm32f10x.h"               void Timer_Init(void)
{RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);TIM_InternalClockConfig(TIM2);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period=10000;//ARRTIM_TimeBaseInitStruct.TIM_Prescaler=7200-1;//PSCTIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);//以上为配置时基单元的部分,详看上节TIM_OCInitTypeDef TIM_OCInitStructure;//结构体赋初值,下面再更改我们需要用的值,结构体变量中有很多高级定时器的功能,我们暂不需要,调用函数设默认值即可TIM_OCStructInit(&TIM_OCInitStructure);TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//配置为PWM模式1TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//极性选择TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//配置使能TIM_OCInitStructure.TIM_Pulse=;//配置CCR的值(可提前配置,PWM则保持一个固定的占空比;也可后续调用函数更改,改变PWM的占空比)TIM_OC1Init(TIM2, &TIM_OCInitStructure);//将TIM2中OC1配置为上述模式TIM_Cmd(TIM2,ENABLE );//打开定时器2
}

产生一个频率为1KHZ,占空比50%,分辨率为1%PWM波形:

CCR = 50, PSC = 720, ARR = 100

若两个引脚冲突,可使用重定义功能(引脚重映射),如图中TIM2的CH3,只能重映射到指定位置的引脚。

#include "stm32f10x.h"               void Timer_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出模式,将控制权转交给片上外设。GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);TIM_InternalClockConfig(TIM2);TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period=10000;//ARRTIM_TimeBaseInitStruct.TIM_Prescaler=7200-1;//PSCTIM_TimeBaseInitStruct.TIM_RepetitionCounter=0;TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStruct);//以上为配置时基单元的部分,详看上节TIM_OCInitTypeDef TIM_OCInitStructure;//结构体赋初值,下面再更改我们需要用的值,结构体变量中有很多高级定时器的功能,我们暂不需要,调用函数设默认值即可TIM_OCStructInit(&TIM_OCInitStructure);TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//配置为PWM模式1TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//极性选择TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//配置使能TIM_OCInitStructure.TIM_Pulse=;//配置CCR的值(可提前配置,PWM则保持一个固定的占空比;也可后续调用函数更改,改变PWM的占空比)TIM_OC1Init(TIM2, &TIM_OCInitStructure);//将TIM2中OC1配置为上述模式TIM_Cmd(TIM2,ENABLE );//打开定时器2
}

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

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

相关文章

【计算机毕设】无查重 基于python豆瓣电影评论舆情数据可视化系统(完整系统源码+数据库+开发笔记+详细部署教程)✅

目录 【计算机毕设】无查重 基于python豆瓣电影数据可视化系统&#xff08;完整系统源码数据库开发笔记详细部署教程&#xff09;✅ 一、项目背景 二、项目目标 三、项目功能 四、开发技术介绍 五、数据库设计 六、项目展示 七、开发笔记 八、启动步骤文档 九、权威教…

后台管理系统窗体程序:个人中心

目录 个人中心的功能介绍&#xff1a; 1、进入页面 2、页面内的各种功能设计 &#xff08;1&#xff09;修改按钮 &#xff08;2&#xff09;页面的进入退出操作 一、网页设计 二、html代码 三、css代码 四、js代码 本次项目为后台管理系统&#xff0c;在本系统内的第七…

PLC如何支持GEM300标准?SECS/GEM通讯协议

1. 提供技术服务&#xff0c;保证户使用没问题 2. 支持市场所有的常规PLC 3. 支持常规组态软件&#xff0c;如wincc、组态王、组态屏等 4. 支持各类传感器&#xff0c;私有协议、modbus、web等 5. 无需二次开发&#xff0c;只需配置映射到已有的PLC地址 GEM300协议是为了满…

用 Google Sheets 表格增强 Tableau 数据分析的 3 种玩法

轻松实现文本翻译、网页数据抓取&#xff0c;甚至创建高级日期表来增强 Tableau 可视化效果&#xff01; 作为一款强大的数据可视化工具&#xff0c;Tableau 的可视化能力毋庸置疑。然而&#xff0c;对于跟表格打交道的用户来说&#xff0c;它没有“创建表格”的功能&#xff0…

计算机网络 (3)计算机网络的性能

一、计算机网络性能指标 速率&#xff1a; 速率是计算机网络中最重要的性能指标之一&#xff0c;它指的是数据的传送速率&#xff0c;也称为数据率&#xff08;Data Rate&#xff09;或比特率&#xff08;Bit Rate&#xff09;。速率的单位是比特/秒&#xff08;bit/s&#xff…

CAP与BASE分布式理论

CAP理论 C&#xff1a;Consistency 一致性&#xff1a;指强一致性&#xff0c;分布式系统中的所有节点在同一时刻具有同样的值、都是最新的数据副本&#xff0c;一致性保证了不管向哪台服务器写入数据&#xff0c;其他的服务器能实时同步数据 强一致性&#xff1a;写入数据的时…

【Java基础知识系列】之Java类的初始化顺序

前言 类的初始化顺序 简单场景 代码示例 public class Person {private String name initName();private String initName() {System.out.println("【父类】初始化实例变量name");return "【父类】史蒂夫";}private int age;private static int staticVa…

探索大规模语言模型(LLM)在心理健康护理领域中的应用与潜力

概述 心理健康是公共卫生最重要的领域之一。根据美国国家精神卫生研究所&#xff08;NIMH&#xff09;的数据&#xff0c;到 2021 年&#xff0c;22.8% 的美国成年人将患上某种形式的精神疾病。在全球范围内&#xff0c;精神疾病占非致命性疾病负担的 30%&#xff0c;并被世界…

解决 idea windows 设置maven离线模式之后,maven继续请求远程仓库

在内网开发的时候经常遇到没有办法来链接远程仓库的情况&#xff0c;这个时候需要设置maven的离线模式。 idea windows 设置maven离线模式之后&#xff0c;maven继续请求远程仓库 当设置完离线模式之后&#xff0c;有的时候执行maven的命令会报错&#xff0c;提示请求远程失败…

卷积神经网络 (CNN)

代码功能 网络结构&#xff1a; 卷积层&#xff1a; 两个卷积层&#xff0c;每个卷积层后接 ReLU 激活函数。 最大池化层用于降低维度。 全连接层&#xff1a; 使用一个隐藏层&#xff08;128 个神经元&#xff09;和一个输出层&#xff08;10 类分类任务&#xff09;。 数据集…

等保二级需要哪些安全设备?

在信息化高速发展的今天&#xff0c;服务器的安全性成为了企业乃至国家信息安全的重要基石。等保二级&#xff0c;作为信息安全等级保护制度中的一个关键环节&#xff0c;对服务器的安全防护提出了明确要求。本文将详细阐述服务器等保二级所需的各种安全设备&#xff0c;旨在为…

C++【深入项目-检测键盘】

神马是检测键盘&#xff0c;就是让编辑器可以检测键盘按下了什么按键&#xff0c;我们先科普复习检测键盘 。 检测键盘需要用到一些函数&#xff0c;请见下&#xff1a; ! KEY_DOWN( 80 ) 这个代码是检测按下键盘上P按键。那80是什么&#xff1f;原来是对应按键的&#xff0…

问题An object named ‘ResNetArcFace‘ was already registered in ‘arch‘ registry!

在安装 GFPGAN 的时候&#xff0c;一切都顺利&#xff0c;但是执行的时候出现了错误&#xff0c;哦还有一个问题&#xff0c; 问题一 就是如果basicsr安装不成功可以执行如下命令 pip install -i https://mirrors.aliyun.com/pypi/simple tb-nightly pip install -i https:/…

Leecode刷题C语言之最少翻转次数使二进制矩阵回文①

执行结果:通过 执行用时和内存消耗如下&#xff1a; 题目&#xff1a;最少翻转次数使二进制矩阵回文① 给你一个 m x n 的二进制矩阵 grid 。如果矩阵中一行或者一列从前往后与从后往前读是一样的&#xff0c;那么我们称这一行或者这一列是 回文 的。你可以将 grid 中任意格子…

K8S containerd拉取harbor镜像

前言 接前面的环境 K8S 1.24以后开始启用docker作为CRI&#xff0c;这里用containerd拉取 正文 vim /etc/containerd/config.toml #修改内容如下 #sandbox_image "registry.aliyuncs.com/google_containers/pause:3.10" systemd_cgroup true [plugins."io.…

三、计算机视觉_01图像的基本操作

0 前言 图像的读取和处理是计算机视觉领域中的一个基本任务&#xff0c;在Python中&#xff0c;有几个流行的库可以用来读取和处理图像数据 0.1 Matplotlib介绍 Matplotlib是Python中一个非常流行的绘图库&#xff0c;它通常用于数据可视化&#xff0c;虽然它不是专门的图像…

Liunx-Ubuntu22.04.1系统下配置Anaconda+pycharm+pytorch-gpu环境配置

这里写自定义目录标题 Liunx-Ubuntu22.04.1系统下配置Anacondapycharmpytorch-gpu环境配置一、Anaconda3配置1.Anaconda安装2.Anaconda更新3.Anaconda删除 二、pycharm配置1.pycharm安装 三、pytorch配置 Liunx-Ubuntu22.04.1系统下配置Anacondapycharmpytorch-gpu环境配置 一…

[Mysql] Mysql的多表查询----多表关系(下)

4、操作 方式二&#xff1a;创建表之后设置外键约束 外键约束也可以在修改表时添加&#xff0c;但是添加外键约束的前提是&#xff1a;从表中外键列中的数据必须与主表中主键列中的数据一致或者是没有数据。 语法&#xff1a; alter table <从表名> add constr…

WukongCRM:github高分开源项目,基于微服务架构 +vue ElementUI的前后端分离CRM系统

嗨&#xff0c;大家好&#xff0c;我是小华同学&#xff0c;关注我们获得“最新、最全、最优质”开源项目和高效工作学习方法 WukongCRM 是一款基于 Spring Cloud Alibaba 微服务架构和 Vue ElementUI 前后端分离的 CRM 系统。它在中国开源管理软件行业具有较高的知名度&#x…

【C#】C#编程入门指南:构建你的.NET开发基础

文章目录 前言&#xff1a;1. C# 开发环境 VS的基本熟悉2. 解决方案与项目的关系3. 编辑、编译、链接、运行4. 托管代码和CLR4.1 CLR&#xff1a;4.2 C# 代码第编译过程&#xff08;两次编译的&#xff09; 5. 命名空间6. 类的组成与分析7. C# 的数据类型7.1 值类型7.2 引用类型…