STM32学习笔记(五)--TIM输出比较PWM详解

news2024/12/30 2:22:32

(1)配置步骤
1.配置RCC外设时钟 开启GPIO以及TIM外设
2.配置时基单元的时钟 包含时钟源选择配置初始化时基单元
3.配置输出比较单元 包含CCR的值 输出比较模式 极性选择 输出使能等
4.配置GPIO口 初始化为复用式推挽输出的配置
5.运行控制 启动计数器 输出PWM

(2)代码示例
案例1(TIM_2CH1(PA0)通道输出PWM驱动LED呼吸灯)

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;		
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
	
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 = 72 - 1;		//PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);

TIM_OCInitTypeDef TIM_OCInitStructure;
//下面的是初始化结构体的函数,因为高级定时器跟普通定时器共用一个结构体
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
TIM_OC1Init(TIM2, &TIM_OCInitStructure);
	
TIM_Cmd(TIM2, ENABLE);

//呼吸灯逻辑函数
for (i = 0; i <= 100; i++){
TIM_SetCompare1(TIM2,i);
Delay_ms(10);
}
for (i = 0; i <= 100; i++){
TIM_SetCompare1(TIM2,100-i);
Delay_ms(10);
}

案例2(TIM_2CH2(PA1)通道输出PWM驱动舵机)

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
	
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 = 20000 - 1;		//ARR
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1;		//PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
//已知以上数据的来源是由于舵机需要信号脉冲宽度为周期20MS	
//其次舵机分别在0.5ms 驱动舵机-90度
//舵机分别在0.5ms 驱动舵机-45度
//舵机分别在1.5ms 驱动舵机0度
//舵机分别在2ms 驱动舵机+45度
//舵机分别在2.5ms 驱动舵机+90度

//频率也就是1/0.02s=50HZ  CK_PSC时钟频率 PSC预分配 ARR自动重装值
//公式已知 PWM频率;  Freq=CK_PSC/(PSC+1)/(ARR+1)
//         PWM占空比;Duty=CRR/(ARR+1)
//         PWM分辨率;Reso=1/(ARR+1)
//则Freq=72MHZ/(PSC+1)/(ARR+1)=50HZ -> 72000 000HZ/(PSC+1)/(ARR+1)=50
//设PSC预分配为71 则原式72000 000/(71+1)/(ARR+1)=50  ARR=20000-1
//以上是根据自身自行设定的 最好可以多试试PSC*10的值 找到合适的
 
//所以算好了20MS周期的值 由于PSC固定 所以可以直接用来比值
//20MS / 20 000=0,5MS / x  20x=10 000 因为我们只需要比值X=500
//则舵机分别在0.5ms 驱动舵机-90度 CRR等于500
//舵机分别在0.5ms 驱动舵机-45度   CRR等于1000
//舵机分别在1.5ms 驱动舵机0度    CRR等于1500
//舵机分别在2ms 驱动舵机+45度    CRR等于2000
//舵机分别在2.5ms 驱动舵机+90度  CRR等于2500
TIM_OCInitTypeDef TIM_OCInitStructure;
//下面的是初始化结构体的函数,因为高级定时器跟普通定时器共用一个结构体
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
	
TIM_Cmd(TIM2, ENABLE);
//以上为配置的某些环节 具体函数位于程序中 本文档没有直接提供

案例3(TIM_2CH3(PA2)通道输出PWM驱动直流电机)

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
	
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 = 36 - 1;		//PSC
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);
//维持在20HZ-20KHZ(上述为20000HZ)人耳听不到电机声音 这样好点
TIM_OCInitTypeDef TIM_OCInitStructure;
//下面的是初始化结构体的函数,因为高级定时器跟普通定时器共用一个结构体
TIM_OCStructInit(&TIM_OCInitStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 0;		//CCR
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
	
TIM_Cmd(TIM2, ENABLE);
//以上为配置的某些环节 具体函数位于程序中 本文档没有直接提供

(3)函数分析
函数1:void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct)(stm32f10x_tim.h)
该函数不同的GPIO口对应的通道不同函数名也不同,对于TIM_OCInitTypeDef的使用; 通用定时器选择参数如下。

序号

名称

参数解释

示例

参数1

TIM_OCMode

设置输出比较的模式

TIM_OCMode_PWM1

参数2

TIM_OCPolarity

设置输出比较的极性

TIM_OCPolarity_High

参数3

TIM_OutputState

设置输出的使能

TIM_OutputState_Enable

参数4

TIM_Pulse

设置CCR的参数

0

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)

在引脚定义图里面去找对应的通道是多少,例如TIM_2CH1就是通道1,也可以去STM32CubeMX里面去看。

函数2:void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1) (stm32f10x_tim.h) 该函数不同的GPIO口对应的通道不同函数名也不同。

序号

名称

参数解释

示例

参数1

TIM_TypeDef* TIMx

定时器选择

TIM2

参数2

Compare1

通道选择

1、2、3、4

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_2CH1就是通道1,也可以去STM32CubeMX里面去看。

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

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

相关文章

Java基础-案例练习-全是干货

目录 案例&#xff1a;卖飞机票 案例&#xff1a;找质数&#xff1a; 案例&#xff1a;开发验证码 案例&#xff1a;评委打分 案例&#xff1a;卖飞机票 package anlixunlian;import java.util.Scanner;/*机票价格按照淡季旺季、头等舱和经济舱收费、 输入机票原价、月份和…

Python进阶二: NumPy基础:数组和矢量计算

二、NumPy基础&#xff1a;数组和矢量计算 本文源自微博客(www.microblog.store),且以获得授权 NumPy&#xff08;Numerical Python的简称&#xff09;是Python数值计算最重要的基础包。大多数提供科学计算的包都是用NumPy的数组作为构建基础。 NumPy的部分功能如下&#xf…

SuiNS更新命名标准,增强用户体验

SuiNS将其面向用户的命名标准从 xxx.sui 更新为 xxx&#xff0c;让用户能够以一种适用于Web2和Web3世界的方式来代表自己。通过此更新&#xff0c;用户可以在其选择的名称前使用 &#xff0c;而不是在名称后添加 .sui。 Sui命名服务于去年推出&#xff0c;旨在使Sui上的地址更…

docker-compose harbor 2.11

harbor 前言 “Harbor” 是一个用于管理容器镜像的开源仓库项目。由 VMware 开发和维护,Harbor 提供一个企业级的 Docker 镜像仓库,具有丰富的功能,包括: 镜像管理:提供存储和分发 Docker 镜像的能力。安全性:支持镜像签名和漏洞扫描,确保镜像的安全性。身份认证:集成…

python-开学?

[题目描述] 小执&#xff1a;终于可以开学啦&#xff01;好开心啊&#xff01; 小理&#xff1a;你没看新闻吗&#xff0c;开学日期又延后了。 小执&#xff1a;&#x1d441;&#x1d442;&#x1d442;&#x1d442;&#x1d442;&#x1d442;&#x1d442;&#x1d442;&am…

一文梳理ChatTTS的进阶用法,手把手带你实现个性化配音,音色、语速、停顿,口语,全搞定

前几天和大家分享了如何从0到1搭建一套语音交互系统。 其中&#xff0c;语音合成&#xff08;TTS&#xff09;是提升用户体验的关键所在。于是&#xff0c;上一篇接着和大家聊了聊&#xff1a;全网爆火的AI语音合成工具-ChatTTS&#xff0c;有人已经拿它赚到了第一桶金&#x…

代理配置SQUID

目录 SQUID代理服务器配置 监听浏览器访问记录 拒绝访问配置 SQUID代理服务器配置 实验系统 windows 10 xxxxx Roucky_linux9.4 192.168.226.22 监听浏览器访问记录 1. 安装squid yum install squid -y 2. 编辑squid配置文件 vim /etc/squid…

等保一体机:多种防护机制,让等保合规简单高效!

自1994年国务院颁布《中华人民共和国计算机信息系统安全保护条例》规定计算机信息系统实行安全等级保护以来&#xff0c;等级保护工作经过了近25年的发展历程&#xff0c;成为了我国网络安全保护的重要举措之一。 2019年12月1日等保2.0正式开始实施&#xff0c;我国网络安全行业…

【大分享05】动态容差归档,打通不动产登记管理“最后一公里”

关注我们 - 数字罗塞塔计划 - 本篇是参加由电子文件管理推进联盟联合数字罗塞塔计划发起的“大分享”活动投稿文章&#xff0c;来自上海涵妍档案信息技术有限责任公司&#xff0c;作者&#xff1a;陈雪。 一、政策背景 在“互联网政务服务”的浪潮下&#xff0c;各级政府机构…

在低侧电流检测中使用单端放大器:误差源和布局技巧

低侧检测的主要优点是可以使用相对简单的配置来放大分流电阻器两端的电压。例如&#xff0c;通用运算放大器的同相配置可能是需要能够在消费市场领域竞争的成本敏感型电机控制应用的有效选择。 基于同相配置的电路图如图1所示。 图1。 然而&#xff0c;这种低成本解决方案可能…

2288. 价格减免

题目 给定一个字符串列表 sentence&#xff0c;表示一个句子&#xff0c;其中每个单词可以包含数字、小写字母和美元符号 $。如果单词的形式为美元符号后跟着一个非负实数&#xff0c;那么这个单词就表示一个价格。我们需要在价格的基础上减免给定的 discount%&#xff0c;并更…

2023数A题——WLAN网络信道接入机制建模

A题——WLAN网络信道接入机制建模 思路&#xff1a;该题主要考察的WLAN下退避机制建模仿真。 资料获取 问题1&#xff1a; 假设AP发送包的载荷长度为1500Bytes&#xff08;1Bytes 8bits&#xff09;&#xff0c;PHY头时长为13.6μs&#xff0c;MAC头为30Bytes&#xff0c;MA…

上海科技博物馆超薄OLED柔性壁纸屏应用方案

产品&#xff1a;2组55寸OLED柔性屏2x1 特点&#xff1a;嵌入墙体&#xff0c;与空间装饰融入一体 用途&#xff1a;播放文物展示 一、项目背景 上海科技博物馆作为展示科技与文化的交汇点&#xff0c;一直致力于为观众提供沉浸式的参观体验。为了提升文物展示的现代化和科技感…

不可忽视的9条网页排版设计规则,你了解吗?

网页设计由95%的排版组成。网页排版设计使图形的放置栩栩如生&#xff0c;让用户保持愉悦&#xff0c;容易被用户视觉感知。在这个过程中&#xff0c;网页排版设计需要考虑很多因素:款式、大小、字体颜色等。此外&#xff0c;设计师通过网页排版&#xff0c;让文字增加设计的美…

Kafka 高性能 7 大秘诀之 Segment 消息存储机制的奥妙

《Kafka 高性能 7 大秘诀》第 4 篇&#xff0c;解密 kafka Segment 日志存储思想哲学以及如何将磁盘的随机读写变成顺序读写&#xff0c;提高磁盘读写速度。 Kafka 使用日志文件存储消息&#xff0c;每个 Partition 的消息被存储在多个 Segment 文件中&#xff0c;避免了单个文…

经典神经网络(11)VQ-VAE模型及其在MNIST数据集上的应用

经典神经网络(11)VQ-VAE模型及其在MNIST数据集上的应用 我们之前已经了解了PixelCNN模型。 经典神经网络(10)PixelCNN模型、Gated PixelCNN模型及其在MNIST数据集上的应用 今天&#xff0c;我们了解下DeepMind在2017年提出的一种基于离散隐变量&#xff08;Discrete Latent va…

OneNote 作为恶意软件分发新渠道持续增长

目前&#xff0c;Office 文件已经默认禁用宏代码&#xff0c;攻击者开始转向利用其他微软的软件产品来进行恶意 Payload 投递。默认情况下&#xff0c;OneNote 应用也包含在 Office 2019 和 Microsoft 365 软件中&#xff0c;所以 OneNote 文件越来越受到攻击者的青睐。如果有人…

调度算法-内存页面置换算法

缺⻚异常&#xff08;缺⻚中断&#xff09; 与⼀般中断的主要区别在于&#xff1a; 缺⻚中断在指令执⾏「期间」产⽣和处理中断信号&#xff0c;⽽⼀般中断在⼀条指令执⾏「完成」后检查和处理中断信号。缺⻚中断返回到该指令的开始重新执⾏「该指令」&#xff0c;⽽⼀般中断返…

如何完美解决 Oracle Database 19c 安装程序 - 第7步(共8步)卡住,半小时都不动

&#x1f680; 如何完美解决 Oracle Database 19c 安装程序 - 第7步&#xff08;共8步&#xff09;卡住&#xff0c;半小时都不动 摘要 在安装 Oracle Database 19c 时&#xff0c;很多用户会在第7步&#xff08;共8步&#xff09;遇到卡住的问题&#xff0c;尤其是安装程序长…