【STM32 定时器(二)TIM 输入捕获PWM 总结】

news2024/12/25 10:31:12

STM32定时器之输入捕获总结

  • OC介绍
  • PWM介绍
  • PWM初始化代码部分
    • 开启时钟配置
    • 时基单元配置
    • CCR配置
    • GPIO配置
      • 复用和重定义功能
    • 开启定时器
    • 代码实现 :实现呼吸灯

OC介绍

在这里插入图片描述

PWM介绍

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

PWM参数计算
在这里插入图片描述
分辨率越细,分的分量越精细,越稳定,假如它为1%,则它可使得风扇以1为单位的等级调速。可以从1调到100档位,假如它为50%,那么只有两个档位。50和 100。

计算 :如果我现在想要生成一个 PWM频率为1KHZ,占空比可以为任意,PWM分辨率为1%,则PSC(分频器系数),ARR(重装值)应改为多少呢?

Reso分辨率=1%=1/100 ,又因为Reso=1/ARR+1 故而ARR=100-1=99。

PWM频率=1k=1000 = CK_PSC / (PSC+1)* (ARR + 1)

``由于CK_PSC在上篇文章中已经介绍,为72MHz。 故而

式子 CK_PSC / (PSC+1)* (ARR + 1)=PWM频率
变为 72000000 / (PSC + 1) *(99 + 1)=1000,故而PSC=720 -1

PWM初始化代码部分

挨个配置 打通这条路即可
在这里插入图片描述

开启时钟配置

	//通用定时器TIM2时钟开启
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	//开启GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//内部时钟配置(方便)
	TIM_InternalClockConfig(TIM2);

时基单元配置

	//配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数的模式
	TIM_TimeBaseInitStructure.TIM_Period=100 -1;//重装值ARR,根据上面公式计算
	TIM_TimeBaseInitStructure.TIM_Prescaler=720 -1;//psc 根据上面公式计算
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);

CCR配置

	//配置CCR
	TIM_OCInitTypeDef TIM_OCInitStructure;
	TIM_OCStructInit(&TIM_OCInitStructure);//给所有成员变量先赋个初值
	//下面单独修改通用定时器才用到的成员变量
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1 ;//PWM1模式,参考pptP68,PWM1模式和PWM2模式的区别
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//CNT<CCR时,REF置有效电平,参考pptP69
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//输出使能
	TIM_OCInitStructure.TIM_Pulse= 50;//设置CCR 即输出比较的值  这里随便给个测试,占空比50%
	TIM_OC1Init(TIM2,& TIM_OCInitStructure);

注意,上面用到了TIM_OCStructInit(&TIM_OCInitStructure);给所有成员变量赋值,这是为什么呢?
原因如下:
TIM_OCInitStructure.TIM_OCIdleState和TIM_OCInitStructure.TIM_OutputNState: Idle和里面含有N的一般都是高级定时器才用的
我们用到的都是通用定时器,但TIM_OCInitStructure成员里面有我们用不到的,例如刚才的TIM_OCInitStructure.TIM_OCIdleState
//那如果我们不给未用到的成员赋初值,那么后续就会有各种问题。
//这里可以使用TIM_OCStructInit()函数给所有成员给个默认值,然后单独再修改通用定时器模块的成员变量的值。

GPIO配置

	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//观察引脚图可知,引脚定义,ppt11页可知GPIO_PA0有引脚复用的CH1
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);

这里解释下为何复用推挽,因为下图,来自片上外设一般使用复用功能输出
在这里插入图片描述

在这里插入图片描述

复用和重定义功能

引脚复用(Pin Multiplexing)是指单个物理引脚可以根据需要被不同的功能模块使用。在许多现代的微控制器中,物理引脚的功能并不是固定的,而是可以通过软件配置进行更改,这样可以使同一个引脚实现多种功能,这就是引脚复用。这种设计可以有效地节省物理引脚,提高了系统的灵活性。

重定义功能(Alternate Function)则是指在引脚复用功能中,每个物理引脚可以被分配多种不同的功能,这些功能通常是由于同一个引脚在不同的模式下所承担的功能不同而产生的。例如,同一个物理引脚在GPIO模式下可以用作普通的数字输入/输出引脚,而在UART模式下可以用作串行通信的引脚。在这种情况下,这个物理引脚就具有了两种不同的重定义功能。

在这里插入图片描述

开启定时器

最后一定要开启定时器

TIM_Cmd(TIM2,ENABLE);//开启定时器

如何更改占空比的值? 即CCR
使用TIM_SetCompare1函数即可

代码实现 :实现呼吸灯

PWM.c


```c
#include "stm32f10x.h"                  // Device header
/**
  * @brief   PWM初始化
  * @param   无
  * @retval  无
  */
void PWM_Init(void)
{
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
	//开启GPIO的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
	//内部时钟配置
	TIM_InternalClockConfig(TIM2);
	//配置时基单元
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
	TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;
	TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数的模式
	TIM_TimeBaseInitStructure.TIM_Period=100 -1;//重装值ARR
	TIM_TimeBaseInitStructure.TIM_Prescaler=7200 -1;//psc
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;
	TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);
	
	//配置CCR
	TIM_OCInitTypeDef TIM_OCInitStructure;
	//TIM_OCInitStructure.TIM_OCIdleState和TIM_OCInitStructure.TIM_OutputNState:  Idle和里面含有N的一般都是高级定时器才用的
	//我们用到的都是通用定时器,但TIM_OCInitStructure成员里面有我们用不到的,例如刚才的TIM_OCInitStructure.TIM_OCIdleState
	//那如果我们不给未用到的成员赋初值,那么后续就会有各种问题。
	//这里可以使用TIM_OCStructInit()函数给所有成员给个默认值,然后单独再修改通用定时器模块的成员变量的值。
	TIM_OCStructInit(&TIM_OCInitStructure);//给所有成员变量先赋个初值
	//下面单独修改通用定时器才用到的成员变量
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1 ;//PWM1模式,参考pptP68,PWM1模式和PWM2模式的区别
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//CNT<CCR时,REF置有效电平,参考pptP69
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//输出使能
	TIM_OCInitStructure.TIM_Pulse= 0;//设置CCR 即输出比较的值  这里随便给个测试,后面通过函数TIM_SetCompare1单独更改
	TIM_OC1Init(TIM2,& TIM_OCInitStructure);
	
	//GPIO配置
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出,为何用复用推挽?因为ppt20页码,
	GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;//观察引脚图可知,引脚定义,ppt11页可知GPIO_PA0有引脚复用的CH1
	GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	TIM_Cmd(TIM2,ENABLE);//开启定时器
	
}
/**
  * @brief   设置占空比 
  * @param   Compare:CCR,比较/捕获 占空比 
  * @retval  无
  */

void PWM_SetCompare1(uint16_t Compare)
{
	TIM_SetCompare1(TIM2,Compare);
}

main .c

#include "stm32f10x.h"                  // Device header
#include "OLED.h"  
#include "PWM.h" 
#include "Delay.h" 
uint8_t i;
int main()
{
    OLED_Init();
	PWM_Init();
	while(1)
	{
		for(i=0;i<=100;i++)//逐渐变亮
		{
			PWM_SetCompare1(i);
			Delay_ms(10);
		}
	    for(i=0;i<=100;i++)
		{
			PWM_SetCompare1(100-i);//逐渐变灭
			Delay_ms(10);
		}
	}

}

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

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

相关文章

HTML5实现一笔画游戏

HTML5实现一笔画游戏 一笔画问题 一笔画是图论科普中一个著名的问题&#xff0c;它起源于柯尼斯堡七桥问题科普。当时的东普鲁士哥尼斯堡城中有一条河&#xff0c;在这条河上有七座桥&#xff1a; 蓝色的代表河&#xff0c;这条河将城市分开成为四个区域&#xff0c;而七个橙…

华为OD机试 - 单词搜索,找到它 - 回溯(Java 2024 C卷 100分)

目录 专栏导读一、题目描述二、输入描述三、输出描述1、输入2、输出3、说明 四、解题思路五、Java算法源码六、效果展示1、输入2、输出3、说明 华为OD机试 2024C卷题库疯狂收录中&#xff0c;刷题点这里 专栏导读 本专栏收录于《华为OD机试&#xff08;JAVA&#xff09;真题&a…

Tiktok/抖音旋转验证码识别代码

一、引言 在数字世界的飞速发展中&#xff0c;安全防护成为了一个不容忽视的课题。Tiktok/抖音&#xff0c;作为全球最大的短视频平台之一&#xff0c;每天都有数以亿计的用户活跃在其平台上。为了保护用户的账号安全&#xff0c;Tiktok/抖音引入了一种名为“旋转验证码”的安…

比TODESK好用的软件

比ToDesk更好用的软件&#xff1a;探索远程桌面的新选择 在远程桌面控制领域&#xff0c;ToDesk无疑是一款广受欢迎的软件。然而&#xff0c;随着技术的不断进步&#xff0c;市场上涌现出许多新的竞争者&#xff0c;它们在功能、性能和使用体验上都可能超越ToDesk。本文将介绍…

C语言向C++过渡的基础知识(三)

目录 auto类型变量&#xff08;C11标准支持&#xff09; auto关键字介绍 auto关键字的使用 auto关键字基本使用 auto关键字配合指针和引用 auto关键字不可以推导的场景 基于范围的for循环&#xff08;C11标准支持&#xff09; 基于范围的for循环基础使用 基于范围的fo…

语音识别:whisper部署服务器(远程访问,语音实时识别文字)

Whisper是OpenAI于2022年发布的一个开源深度学习模型&#xff0c;专门用于语音识别任务。它能够将音频转换成文字&#xff0c;支持多种语言的识别&#xff0c;包括但不限于英语、中文、西班牙语等。Whisper模型的特点是它在多种不同的音频条件下&#xff08;如不同的背景噪声水…

【Linux杂货铺】进程的基本概念

目录 &#x1f308;前言&#x1f308; &#x1f4c1;进程的概念 &#x1f4c2;描述进程-PCB &#x1f4c2; 查看进程 &#x1f4c2; 查看正在运行的程序 &#x1f4c2;杀死进程 &#x1f4c2;通过系统调用获取进程标识符 &#x1f4c2;通过系统调用创建进程 &#x1f…

HCIA——TCP协议详解

目录 1、TCP概念及协议头部格式 1.1TCP特点 1.2TCP协议协议头部格式 1.3字段进行介绍 1.3.1源端口和目的端口 1.3.2序号(seq) 1.3.3确认序号(ack) 1.3.4数据偏移 1.3.5标志位 1.3.6窗口 1.3.7校验和 1.3.8紧急指针 2、TCP的可靠性 2.1 TCP可靠性的保障 2.2排序机…

论文阅读_参数微调_P-tuning_v2

1 P-Tuning PLAINTEXT 1 2 3 4 5 6 7英文名称: GPT Understands, Too 中文名称: GPT也懂 链接: https://arxiv.org/abs/2103.10385 作者: Xiao Liu, Yanan Zheng, Zhengxiao Du, Ming Ding, Yujie Qian, Zhilin Yang, Jie Tang 机构: 清华大学, 麻省理工学院 日期: 2021-03-18…

unityprotobuf自动生成C#

Release Protocol Buffers v3.19.4 protocolbuffers/protobuf GitHub 导入Source code 里面的 csharp/src/Google.Protobuf 进入Unity 拷贝其他版本的 System.Runtime.CompilerServices.Unsafe进入工程 使用protoc-3.19.4-win32 里面的exe去编译proto文件为C# using Sys…

软件测试相关内容第四弹 -- 测试用例与测试分类

写在前&#xff1a;我们已经掌握了关于软件测试的相关内容&#xff0c;知道了基本的测试过程&#xff0c;在做了一段时间的基础测试&#xff0c;熟悉了相关的业务后&#xff0c;测试人员会进行测试用例的编写&#xff0c;在日常测试中&#xff0c;也需要补充测试用例到现有的案…

HCIP —— 交换 (VLAN)

VLAN --- 虚拟局域网 在 HCIA 中 &#xff0c;已经学过交换机的一些基础配置&#xff0c;下面进行回顾一些简单的内容。 1.创建VLAN VLAN ID --- 区别和标识不同的VLAN 使用范围&#xff1a;0-4095 &#xff0c; 由12位二进制构成。 0 和 4095 作为 保留的VLAN。 …

静默安装OGG21.3微服务版本FOR ORACLE版本

静默安装OGG21.3微服务版本FOR ORACLE版本 silent install ogg21.3 for oracle 某度找来找去都没有找到一份可靠的静默安装OGG21.3微服务版本的案例&#xff0c;特别难受&#xff0c;为此将自己静默安装的步骤一步步贴出来分享给大家&#xff0c;请指点&#xff0c;谢谢。 至…

【生态适配】亚信安慧AntDB数据库与龙芯3C5000L完成兼容互认

日前&#xff0c;亚信安慧AntDB数据库系统V6.2在龙芯3C5000L平台上完成兼容性测试&#xff0c;功能与稳定性良好&#xff0c;被授予龙架构兼容互认证书。 图1&#xff1a;产品兼容性证明 随着“互联网”的纵深发展&#xff0c;数字技术创新成果与经济社会各领域深度融合&#…

电玩体验店怎么计时,佳易王ps5计时计费管理控制系统操作教程

电玩体验店怎么计时&#xff0c;佳易王ps5计时计费管理控制系统操作教程 一、前言 以下软件操作教程以 佳易王电玩计时计费管理系统软件V17.9为例说明 件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 1、电玩体验馆管理软件在计时的同时可以设置定时提醒&…

Java两周半速成之路(第十六天)

一、网络编程 1.概述&#xff1a; 就是用来实现网络互连的不同计算机上运行的程序间可以进行数据交换 2.网络模型 3.网络参考模型图 4.网络通信三要素 4.1IP地址 InetAddress类的使用&#xff1a; 注意&#xff1a;通过API查看&#xff0c;此类没有构造方法&#xff0c;如…

Spring Boot Starter: 快速简明地创建Spring应用

Spring Boot Starter是Spring Boot的核心功能之一&#xff0c;它帮助开发人员快速简明地创建、配置和运行Spring应用。在本文中&#xff0c;我们将详细介绍Spring Boot Starter以及如何使用它创建一个Spring Boot应用。 文章目录 什么是Spring Boot Starter?为何使用Spring B…

jetson nano——编译一些包的网址导航,pyside2,qt(持续更新)

目录 1.PySide2下载地址2.tesserocr下载地址3.Qt下载地址4.OpenSSL官网5.latex编译器下载地址5.1MikTex5.2TeX Live 1.PySide2下载地址 https://download.qt.io/official_releases/QtForPython/pyside2/ 如下图&#xff1a; 2.tesserocr下载地址 https://github.com/simonflue…

【送书福利第五期】:ARM汇编与逆向工程

文章目录 &#x1f4d1;前言一、ARM汇编与逆向工程1.1 书封面1.2 内容概括1.3 目录 二、作者简介三、译者介绍&#x1f324;️、粉丝福利 &#x1f4d1;前言 与传统的CISC&#xff08;Complex Instruction Set Computer&#xff0c;复杂指令集计算机&#xff09;架构相比&#…

进入docker容器中安装软件失败解,国外源慢,时间不同步,执行命令权限不够等问题解决办法

进入docker容器中安装软件失败解&#xff0c;时间不同步, 国外源慢&#xff0c;执行命令权限不够 等问题解决办法 首先我进入docker容器中&#xff0c;为了安装一个软件&#xff0c;引出了很多报错问题&#xff0c;报错如下&#xff1a; 1、无法用 ifconfig 或者 ip addr 的方…