【江科大】STM32:(超级详细)定时器输出比较

文章目录

      • 输出比较单元
      • 特点
    • 高级定时器:均有4个通道
  • PWM简介
    • PWM(Pulse Width Modulation)脉冲宽度调制
    • 输出比较通道
      • PWM基本结构
      • 基本定时器
  • 参数计算
      • 捕获/比较通道的输出部分
      • 详细介绍如下:
    • 舵机介绍
      • 硬件电路
  • 直流电机介绍:
      • 直流电机驱动代码
  • 输出比较(库函数)

输出比较单元

  • 名词解释
    IC input capture 输入捕获
    OC outpucompare 输出比较
    CC capture compare 输入捕获和输出比较的单元
    OC(Output Compare)输出比较 :用来输出PWM波形

特点

  • 输出比较可以通过比较CNT(计数器)与CCR(捕获/比较)寄存器值的关系,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波形。

  • 每个高级定时器和通用定时器都拥有4个输出比较通道

  • 高级定时器的前3个通道额外拥有死区生成和互补输出的功能(用于驱动三相无刷电机)
    通用定时器:均有4个通道

在这里插入图片描述

高级定时器:均有4个通道

在这里插入图片描述

PWM简介

PWM(Pulse Width Modulation)脉冲宽度调制

  • 必须是在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域
    PWM参数:
    频率 = 1 / TS
    占空比 = TON / TS
    分辨率 = 占空比变化步距
    (PWM的频率在几千到几十KHZ就已经很快了)(分辨率 表示占空比的精细程度)
  1. TON:高电平的时间
  2. TS:一个周期的时间
    (频率 = 1 / TS 可以看出周期越大,那么频率就越小,就越平稳。
    占空比 = TON / TS)
    TON/TS:高电平相对整个周期的比例
    如果TON = 20% 那么低电平就是80%,占空比越大,等效的模拟电压就越接近于高电平。

(PWM调光,通过高频点亮熄灭,点亮熄灭来实现对灯光强弱的控制,只要闪的够快就发现不了是正常的还是没有的)

原因:LED熄灭时,由于人眼的余辉和视觉暂留现象,LED不会立刻熄灭,过一小段才会熄灭,电机也是因为惯性过一会才会停下来
在这里插入图片描述
在这里插入图片描述

输出比较通道

极性选择:就是选择要不要把高低电平反转一下
在这里插入图片描述
在这里插入图片描述

PWM基本结构

在这里插入图片描述
占空比和CCR值有关
在这里插入图片描述

基本定时器

在这里插入图片描述

参数计算

在这里插入图片描述

  1. PWM输出的通道口时CH1
    在这里插入图片描述
  2. 根据引脚定义表,得出GPIO口时PA0 在这里插入图片描述
  3. 输出模式选用复用推挽输出,原因是采用定时器来进行输出控制
  4. CCR的值
    根据PWM频率
    Freq = CK_PSC / (PSC + 1) / (ARR + 1) :
    72MHZ/(PSC+1)/(ARR+1) = 1000
    PSC+1 =72000000/1000000=720HZ
    PWM占空比:
    Duty = CCR / (ARR + 1) CCR/(ARR+1) = 50% --》 CCR = 50
    PWM分辨率:
    Reso = 1 / (ARR + 1) 1/(ARR+1) = 1% --》ARR+1 = 100
    分辨率是自己给的

捕获/比较通道的输出部分

在这里插入图片描述
对于普通的推挽输出:引脚的控制权来自于输出数据寄存器,来进行输出控制
在这里插入图片描述
而想要定时器来控制引脚就需要使用复用开漏推挽输出。(定时器属于片上外设)
在这里插入图片描述

  • 重复次数计数器:
    实现每隔几个周期再更新一次。之前是,每个周期都更新,对更新信号再分频
  • DTG:死区生成电路,防止电流直通
  • RK刹车输入功能:给电机驱动提供安全保证。如内部时钟失效,控制电路会自动切断电路
  • AFIO:端口重映射
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

如果要重定义某个端口:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//给AFIO使能
GPIO_PinRemapConfig(GPIO_PartialRemap1_TIM2,ENABLE);  //重映射 把CH1的PA0换到PA15
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable ,ENABLE);//关闭PA15的调试端口的功能

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

详细介绍如下:

  1. RCC 把GPIO,TIM外设的时钟打开
  2. 配置时基单元
  3. 配置输出比较单元,时钟源选择
  4. 配置输出比较单元,CCR的值,输出比较模式,极性选择,输出使能
  5. 配置GPIO ,配置为复用推免
  6. 运行控制,启动计数器
 	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//给TIM2使能RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//给GPIO使能GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode =  GPIO_Mode_AF_PP;  //由于定时器属于片上外设,所以采用复用推挽输出,GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;   //根据引脚表的出CH_1所在引脚时PA0GPIO_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;  //每一个时钟后面都会加一个滤波器,//作用就是为是信号更加稳定,使用的采样的方式,//在输入的脉冲中采样,按照n/f,因此采样系数越大,延迟越大TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up; //计数方式,递增TIM_TimeBaseInitStruct.TIM_Period = 100-1;  //ARR =100 TIM_TimeBaseInitStruct.TIM_Prescaler = 720-1;  // psc = 720//预分频器,72MHZ进行7200分频 ,//72000/7200 = 10KHZ    1ms = 1KHZ  //10KHZ下记10000个数   10000/10000HZ = 1S//  f = 1/t TIM_TimeBaseInitStruct.TIM_RepetitionCounter = 0;  //重复计数器(高级定时器才有)TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStruct);//配置比较输出模块TIM_OCInitTypeDef TIM_OCInitStruct;TIM_OCStructInit(&TIM_OCInitStruct);//给结构体赋初始值TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;//输出比较模式//TIM_OCInitStruct.TIM_OCNIdleState = ;  //带N的都是高级定时器才用的//TIM_OCInitStruct.TIM_OCNPolarity = ;TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;  //输出比较极性//TIM_OCInitStruct.TIM_OutputNState = ;TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable; //使能输出状态TIM_OCInitStruct.TIM_Pulse = 50;//CCR的值TIM_OC1Init(TIM2,&TIM_OCInitStruct);  //运行控制,所有的模块配置完毕,启动时基单元TIM_Cmd(TIM2,ENABLE);//如果要使用高级定时器,就需要把TIM2改为TIM1,那么结构原来用不到的成员。就需要用到,这些成员又没有赋值,//这个时候就会出现奇怪的问题,如果把初始化函数放在的程序第一行没有问题,初始化函数前面出现了其他的代码,那么4路PWM就会有3路不能输出。这竟然和初始化函数在那一行有关。//原因是,没有给结构体配置完整,也没有给结构体赋初始值。所以要用到structInit()函数,给结构体赋初始值。

舵机介绍

舵机是一种根据输入PWM信号占空比来控制输出角度的装置
输入PWM(可当作一种输出协议)信号要求:周期为20ms,高电平宽度为0.5ms~2.5ms
在这里插入图片描述
在这里插入图片描述

  • PWM输入到控制板,给控制板一个指定的目标角度,然后这个电位器检测当前的输出角度,如果大于目标角度,电机就会反转

硬件电路

在这里插入图片描述

void Servo_Init(void)
{PWM_Init();
}void Servo_SetAngle(float Angle)
{//0  500   //180  2500       度数     PWM_SetCompare2(Angle / 180 * 2000 + 500);
}

PWM驱动舵机
在这里插入图片描述
在这里插入图片描述

直流电机介绍:

在这里插入图片描述

在这里插入图片描述

直流电机驱动代码

1.RCC使能GPIO
2.选择时钟,给定时器单元使能
3.配置时基单元(也就是计数模块)
4.配置输出比较模块
5.启动时基单元
6.逻辑函数

选用的是通用定时器TIM2,
由于直流电机上的PWMA连接的是PA2口,根据引脚定义表。PA2对应的时钟通道是TIM2_CH3.
所以在选择输出比较通道时,选择初始化3通道。TIM_OC3Init(TIM2,&TIM_OCInitStruct);

void Motor_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitTypeDef GPIO_InitStruct;GPIO_InitStruct.GPIO_Mode = GPIO_Mode_Out_PP;  //推挽输出模式,高低电平均可以亮GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5; 	  //方向控制角GPIO_InitStruct.GPIO_Speed =  GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct); PWM_Init();
}void Motor_SetSpeed(uint8_t speed)
{if(speed >= 0){GPIO_SetBits(GPIOA,GPIO_Pin_4);  //给端口4给高 5给低 正转GPIO_ResetBits(GPIOA,GPIO_Pin_5);PWM_SetCompare3(speed);      //给PWM设置CCR的值 捕获比较值,根据不同CCR的值,得到PWM波也不同,输出的速度自然不同}    else{GPIO_ResetBits(GPIOA,GPIO_Pin_4);   //给端口4给低 5给高 反转GPIO_SetBits(GPIOA,GPIO_Pin_5);PWM_SetCompare3(-speed);}
}

在这里插入图片描述

在这里插入图片描述

输出比较(库函数)

//配置输出比较单元
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_OCStructInit(TIM_OCInitTypeDef* TIM_OCInitStruct);//配置强制输出模式
//如果暂停输出波形并且强制输出高/低电平,强制设置高电平,和设置100%占空比是一样的
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);

请添加图片描述

//用来单独设置输出比较的极性,带N的就是高级定时器,互补通道的配置,OC4没有互补通道,所以没有OC4N的函数。
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);
//这个函数仅再高级定时器使用!!!!!!,在使用高级定时器输出PWM时,需要调用这个函数使能主输出,否则PWM将不再正常输出
void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState); 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CRM的定义、功能,以及国内外CRM系统排名

什么是客户关系管理? CRM是(客户关系管理)的缩写,是一个管理与客户关系的系统。CRM的主要功能是管理基本客户信息和购买历史的客户管理、分析潜在客户和新客户的客户分析、对询问的自动回复的响应以及通过电子邮件通讯和研讨会吸引客户。它是加强和维护与客户和潜…

proxy 代理的接口报错301问题

项目系统里仅仅这个接口报错,反向代理错误导致。 默认情况下,不接受运行在HTTPS上,且使用了无效证书的后端服务器。如果你想要接受,修改配置:secure: false(简单意思:如果本地没有进行过https相…

算法第二十二天-最大数

最大数 题目要求 解题思路 今天的题目,让我们将一组数字重新组合,构成一个最大的整数。由于构成的整数非常大,所以返回结果需要字符串格式。 分析一下规律: 为了避免用int型或者long型越界,所以我们需要把数字先转换…

用ChatGPT教学、科研!大学与OpenAI合作

亚利桑那州立大学(简称“ASU”)在官网宣布与OpenAI达成技术合作。从2024年2月份开始,为所有学生提供ChatGPT企业版访问权限,主要用于学习、课程作业和学术研究等。 为了帮助学生更好地学习ChatGPT和大语言模型产品,AS…

计算机视觉工程师就业前景如何?

计算机视觉作为一门快速发展的技术领域,其就业前景非常广阔。以下是对计算机视觉就业前景的分析: 市场规模:计算机视觉行业的市场规模正在持续扩大。根据行业分析报告,预计全球计算机视觉市场规模将在2025年达到530亿美元&#xf…

C#,入门教程(35)——哈希表(Hashtable)的基础知识与用法

上一篇: C#,入门教程(34)——关于函数的参数之引用(ref)的一点知识与源程序https://blog.csdn.net/beijinghorn/article/details/125411351 有一段故事: King Log The frogs in the lake had an easy life doing ex…

k8s-helm

Helm: 什么是helm,在没有这个heml之前,deployment service ingress的作用就是通过打包的方式,把deployment service ingress这些打包在一块,一键式的部署服务,类似于yum 官方提供的一个类似于安全仓库的功能,可以实现…

linux docker-compose安装失败解决

1.去github下载到本地 https://github.com/docker/compose/releases/ 2.上传到linux 服务器 mv dokcer-compose-linux-x86_64 /usr/loacal/bin/docker-compose 3.给权限 chmod x /usr/local/bin/docker-compose 4.查看是否安装成功 docker-compose -version 5.卸载 …

074:vue+mapbox 加载here地图(影像瓦片图 v2版)

第074个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中加载here地图的影像瓦片图 v2软件版本。 直接复制下面的 vue+mapbox源代码,操作2分钟即可运行实现效果 文章目录 示例效果配置方式示例源代码(共77行)相关API参考:专栏目标示例效果

持续集成工具Jenkins的使用之安装篇(一)

Jenkins是一个基于Java开发的开源的一种持续集成工具,主要用于环境部署,监控重复性的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成。要想使用它,你就必须的先安装,接下来我们就介绍下J…

有效的数独[中等]

优质博文:IT-BLOG-CN 一、题目 请你判断一个9 x 9的数独是否有效。只需要根据以下规则,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一…

BGP Local-preferenct 、AS-Path、 Origin 综合选路实验

Local-preference: 本地优先级,公认任意,仅能在 AS 内使用(IBGP内传递),不能在EBGP传递,默认值 100,越大越优。用于离开本 AS ,在 IBGP 的入、出方向都可使用&#xff0c…

C++版QT:电子时钟

digiclock.h #ifndef DIGICLOCK_H #define DIGICLOCK_H ​ #include <QLCDNumber> ​ class DigiClock : public QLCDNumber {Q_OBJECT public:DigiClock(QWidget* parent 0);void mousePressEvent(QMouseEvent*);void mouseMoveEvent(QMouseEvent*); public slots:voi…

微服务Spring Cloud架构详解

"Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具&#xff08;例如配置管理&#xff0c;服务发现&#xff0c;断路器&#xff0c;智能路由&#xff0c;微代理&#xff0c;控制总线&#xff09;。分布式系统的协调导致了样板模式, 使用Spring Cloud开…

在IDEA中使用快捷键让XML注释更加规范

Setting -> Editor -> Code Style -> XML 取消勾选 Line comment at first column 这样我们在使用ctrl / 快速注释时&#xff0c;就可以让注释符号紧贴注释内容&#xff0c;不出现空格。

Fiddler 无法抓包手机 https 报文的解决方案来啦!!

解决手机https无法抓包的问题 当你测试App的时候&#xff0c;想要通过Fiddler/Charles等工具抓包看下https请求的数据情况&#xff0c;发现大部分的App都提示网络异常/无数据等等信息 这时候怎么解决呢&#xff1f; 以软件测试面试提刷题APP为例&#xff1a; Fiddler上的显示…

网络安全基础概念

目录 网络安全背景 网络空间安全 --- Cyberspace 常见的网络安全术语 协议栈自身的脆弱性&#xff1a; 常见安全风险&#xff1a; 物理层--物理攻击 物理设备窃听&#xff1a; 链路层-- MAC洪泛攻击&#xff1a; 链路层--ARP欺骗 网络层--ICMP攻击 传输层--TCP SYN Flood攻击: …

Flutter轮播图Banner

使用插件&#xff1a;flutter_swiper 实现轮播图 pubspec.yaml 增加 &#xff1a;flutter_swiper : ^lastest_version 在项目文件夹下打开命令行执行&#xff1a;flutter packages get 安装插件 home_page.dart中使用swiper 程序运行:先启动虚拟设备后&#xff0c;执行命令f…

基于改进蝙蝠算法的三维航线规划算法

matlab2020a可正常运行 基于改进蝙蝠算法的三维航线规划资源-CSDN文库

SpringBoot - SpringBoot手写模拟SpringBoot启动过程

依赖 建一个工程&#xff0c;两个Module: 1. springboot模块&#xff0c;表示springboot框架的源码实现 2. user包&#xff0c;表示用户业务系统&#xff0c;用来写业务代码来测试我们所模拟出来的SpringBoot 首先&#xff0c;SpringBoot是基于的Spring&#xff0c;所以我…