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

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);
		}
	}

}

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

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

相关文章

洛谷P8972 『GROI-R1』 一切都已过去(树上前缀和+运算符重载)

『GROI-R1』 一切都已过去 题目背景 悦关上窗&#xff0c;拉上帘布。 果然还是想不起来啊。 隐约记得曾和什么人一起做过这样的事。 仰面躺下&#xff0c;手执一只木笺。 「究竟如何&#xff0c;才能拥有“过去”啊……」 她闭上双眼。 「6 岁前的记忆……究竟如何才能…

Python Flask框架 -- url

这里限定了int&#xff0c;所以只能输入数字 完整代码&#xff1a; # 从flask这个包中导入Flask类 from flask import Flask, request# 使用Flask类创建一个app对象 # __name__ 代表当前app.py这个模块 app Flask(__name__)app.route(/blog/path) def hello_world():return H…

ThingsBoard初始化数据库Postgres

视频教程&#xff1a; ThingsBoard初始化数据库postgres_哔哩哔哩_bilibilihingsBoard是一个基于Java的开源物联网平台&#xff0c;旨在实现物联网项目的快速开发、管理和扩展。本课程主要从0到1带你熟悉ThingsBoard&#xff0c;学习优秀的物联网变成思维与思想&#xff0c;主…

C++ 笛卡尔树

目录 一、性质二、构建笛卡尔树三、应用四、源码 一、性质 堆性质&#xff1a; 笛卡尔树是一种满足堆性质的树。每个节点包含两个值&#xff1a;键值&#xff08;key&#xff09;和优先级值&#xff08;priority&#xff09;。在笛卡尔树中&#xff0c;根节点的优先级值最大&am…

【图论】拓补排序 - 邻接表

文章目录 题目&#xff1a;310. 最小高度树题目描述代码与注释 题目&#xff1a;310. 最小高度树 题目描述 代码与注释 func findMinHeightTrees(n int, edges [][]int) (ans []int) {if n 1 {return []int{0}}g : make([][]int, n)degree : make([]int, n) // 记录每个节点…

粤嵌6818开发板触摸屏应用

一、触摸屏应用 1.触摸屏设备的名字 在Linux下&#xff0c;一切皆文件&#xff0c;触摸屏也是一个文件。 触摸屏设备的名字&#xff1a;/dev/input/event0 2.触摸屏的两个专业术语 事件 ->event0 当一些外接控制设备(鼠标、键盘&#xff0c;wifi&#xff0c;触摸屏&am…

【Linux】信号保存{sigset_t/sigpending/sigprocmask/bash脚本/代码演示}

文章目录 1.信号相关常见概念2.管理信号的数据结构3.初识sigset_t4.信号集操作函数4.1sigpending4.2sigprocmask4.2代码测试1.测试12.测试23.测试3 4.3bash 脚本文件 1.信号相关常见概念 信号相关动作&#xff1a;产生 发送 接收 阻塞 递达(处理) 实际执行信号的处理动作称为信…

Spring Boot中application配置文件的生效顺序

Spring Boot的一个重要特性就是它的自动配置&#xff0c;这一特性在很大程度上依赖于名称为application的配置文件。本文将详细介绍在Spring Boot中&#xff0c;这些配置文件的加载顺序以及每份文件的应用范围。 文章目录 配置文件的种类配置文件的加载顺序配置文件的环境切换 …

一起玩儿3D打印机——03 Marlin固件的获取和安装环境的配置

摘要&#xff1a;本文介绍Marlin固件的获取和安装环境的配置 Marlin是一款开源软件&#xff0c;其主页为&#xff1a;https://marlinfw.org/&#xff0c;首页正中就是下载连接&#xff0c;如下图所示&#xff1a; 单击下面的“Download Marlin 2.1.2.2”按钮就会进入下载页面&a…

图形设计软件 CorelDRAW Graphics Suite 2024 v25.0.0.230 中文破解版

CorelDRAW Graphics Suite (简称CDR) 是加拿大Corel公司开发的一款功能强大的专业平面设计软件、矢量设计软件、矢量绘图软件。软件广泛应用于商标设计、标志制作、封面设计、CIS设计、产品包装造型设计、模型绘制、插图描画、时装/服饰设计、印刷制版、排版及分色输出等诸多领…

linux查看top与修改root密码

top perf top -g -p 进程名 使用top命令&#xff0c;同时输入大写的P&#xff0c;会按照cpu使用率从大到小排列 linux修改用户登录密码 输入Ctrlx进入下面的界面 分别输入mount -o remount, rw / 注意rw后面又两个空格 输入passwd root 修改root密码 输入新密码2次 ex…

三、传输层拥塞控制、差错控制

3.1 概述和传输层服务 传输服务和协议&#xff1a; 为运行在不同主机上的应用进程提供逻辑通信&#xff1b; 传输协议运行在端系统-发送方:将应用层的报文分成报文段&#xff0c;然后传递给网络层&#xff1b;接收方&#xff1a;将报文段重组成报文&#xff0c;然后传递给应用…

解决分布式事务,Seata真香!

年IT寒冬&#xff0c;大厂都裁员或者准备裁员&#xff0c;作为开猿节流主要目标之一&#xff0c;我们更应该时刻保持竞争力。为了抱团取暖&#xff0c;林老师开通了《知识星球》&#xff0c;并邀请我阿里、快手、腾讯等的朋友加入&#xff0c;分享八股文、项目经验、管理经验等…

Anaconda安装proplot库

看了一下Anaconda中的环境&#xff0c;现在我有4个&#xff0c;其中gee是一个虚拟环境 因此一般在prompt中装库时要先进入其中一个虚拟环境 conda activate geepip install proplot --no-deps下完了之后&#xff0c;发现版本不对应 conda install matplotlib3.4.3

传输层 | UDP | TCP

目录 一、再谈端口号 (一) 端口号范围划分 (二) 认识知名端口号 (三) netstat (四) pidof 二、UDP协议 (一) UDP协议端格式 (二) UDP的特点 (三) 面向数据报 (四) UDP的缓冲区 (五) UDP使用注意事项 (六) 基于UDP的应用层协议 三、TCP协议 (一) TCP协议的段格式 …

数据结构——lesson8二叉树的实现

&#x1f49e;&#x1f49e; 前言 hello hello~ &#xff0c;这里是大耳朵土土垚~&#x1f496;&#x1f496; &#xff0c;欢迎大家点赞&#x1f973;&#x1f973;关注&#x1f4a5;&#x1f4a5;收藏&#x1f339;&#x1f339;&#x1f339; &#x1f4a5;个人主页&#x…

鸿蒙Harmony应用开发—ArkTS声明式开发(基础手势:Web)中篇

onBeforeUnload onBeforeUnload(callback: (event?: { url: string; message: string; result: JsResult }) > boolean) 刷新或关闭场景下&#xff0c;在即将离开当前页面时触发此回调。刷新或关闭当前页面应先通过点击等方式获取焦点&#xff0c;才会触发此回调。 参数…

Parade Series - Web Streamer Low Latency

Parade Series - FFMPEG (Stable X64) 延时测试秒表计时器 ini/config.ini [system] homeserver storestore\nvr.db versionV20240312001 verbosefalse [monitor] listrtsp00,rtsp01,rtsp02 timeout30000 [rtsp00] typelocal deviceSurface Camera Front schemartsp ip127…

uniapp,导航栏(切换项)有多项,溢出采取左滑右滑的形式展示

一、实现效果 当有多项的导航&#xff0c;或者说切换项&#xff0c;超出页面的宽度&#xff0c;我们采取可滑动的方式比较好一些&#xff01;并且在页面右边加个遮罩&#xff0c;模拟最右边有渐变效果&#xff01; 二、实现代码 html代码&#xff1a; <!-- 头部导航栏 --…

Linux:系统初始化,内核优化,性能优化(3)

优化系统的文件句柄数&#xff08;全局&#xff09; 也就是系统的最大文件数量 查看最大数量 cat /proc/sys/fs/file-max 当我们的服务器有非常大的一个数据并发的时候十几二十万的文件需要去配置&#xff0c;可能这个是远远不够的&#xff0c;我们就要去修改 vim /etc/sy…