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

(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.mzph.cn/news/854402.shtml

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

相关文章

Windows CSC服务特权提升漏洞(CVE-2024-26229)

文章目录 前言声明一、漏洞描述二、漏洞成因三、影响版本四、漏洞复现五、CVE-2024-26229 BOF六、修复方案 前言 Windows CSC服务特权提升漏洞。 当程序向缓冲区写入的数据超出其处理能力时&#xff0c;就会发生基于堆的缓冲区溢出&#xff0c;从而导致多余的数据溢出到相邻的…

QT 的文件

QT 和C、linux 一样&#xff0c;也有自带的文件系统. 它的操作和C、c差不多&#xff0c;不过也需要我们来了解一下。 输入输出设备类 QObject 有一个子类&#xff0c;名为 QIODevice 类&#xff0c;如其名字&#xff0c;该类是管理所有输入输出设备的类。 比如文件、网络套…

【ic-tool】timegen使用

一、前言 TimeGen是一个用于时序波形编辑的CAD工具&#xff0c;它允许数字设计工程师快速有效地绘制数字时序图。TimeGen时序图可以很容易地导出到其他窗口程序&#xff0c;如microsoftword&#xff0c;用于编写设计规范。可直接从官网下载TimeGEN软件&#xff1a;TimeGen Pro…

vue音乐播放条

先看效果 再看代码 <template><div class"footer-player z-30 flex items-center p-2"><div v-if"isShow" class"h-12 w-60 overflow-hidden"><div :style"activeStyle" class"open-detail-control-wrap&…

有什么可以创建ai聊天的软件?5个软件帮助你快速创建ai聊天

有什么可以创建ai聊天的软件&#xff1f;5个软件帮助你快速创建ai聊天 AI聊天软件是一种利用人工智能技术构建的聊天机器人系统&#xff0c;它能够模拟人类的对话方式&#xff0c;回答用户提出的问题或者进行对话。这类软件在各个领域都有广泛的应用&#xff0c;可以用于客户服…

【产品经理】订单处理5-可售库存管理

可售库存即销售库存&#xff0c;本文讲解订单处理过程中的可售库存的管理。 本次讲解订单处理过程中的可售库存的管理。 可售库存即销售库存&#xff0c;电商ERP中的可售库存共分三种&#xff1a;商品的可售现货库存、商品的预售库存以及赠品的可售库存。 一、商品的可售现货…

Python基础用法 之 转义字符

将两个字符进⾏转义 表示⼀个特殊的字符 \n ---> 换⾏&#xff0c;回⻋ \t ---> 制表符, tab键 注意&#xff1a; print( end\n)&#xff1a; print() 函数中默认有⼀个 end\n, 所以,每个 print 结束之后, 都会输出⼀ 个换行。 未完待续。

HTML中的资源提示关键词

渲染阻塞问题 之前在学习浏览器的渲染原理的时候我们就知道&#xff1a;因为浏览器一次只能开启一个渲染主线程&#xff0c;所以当浏览器解析到script标签时会停止DOM树的构建&#xff0c;转而去执行script&#xff0c;如果script中引用的是外部脚本&#xff0c;则浏览器会先从…

MySQL Server和Server启动程序(一)

MySQL Server mysqld&#xff0c;也称为MySQL Server&#xff0c;是一个单线程多任务的程序&#xff0c;它在MySQL安装中执行大部分工作。它不会生成额外的进程。MySQL Server管理对包含数据库和表的MySQL数据目录的访问。数据目录也是其他信息&#xff08;如日志文件和状态文…

目标检测:NMS代码

非极大值抑制NMS是目标检测常用的后处理算法&#xff0c;用于剔除冗余检测框 总体概要&#xff1a; 对NMS进行分类&#xff0c;大致可分为以下六种&#xff0c;这里是依据它们在各自论文中的核心论点进行分类&#xff0c;这些算法可以同时属于多种类别。 分类优先&#xff1a;…

专业学习|博弈论-课程沿革

学习来源&#xff1a;北京大学刘霖《博弈论》MOOC公开课 备注&#xff1a;仅做学习分享&#xff0c;请勿转载&#xff0c;转载必究&#xff01; &#xff08;一&#xff09;博弈论的预备知识 基本的微积分的知识和概率论的知识。简单的说会求导数&#xff0c;会求简单的积分&am…

消息队列-Rabbit运行机制

Producer(生产者) 和 Consumer(消费者) Producer(生产者) :生产消息的一方&#xff08;邮件投递者&#xff09;Consumer(消费者) :消费消息的一方&#xff08;邮件收件人&#xff09; 消息一般由 2 部分组成&#xff1a;消息头&#xff08;或者说是标签 Label&#xff09;和 …

【已解决】chrome视频无法自动播放的问题

问题&#xff1a; 在用datav开发大屏的时候&#xff0c;放了一个视频组件&#xff0c;但是发现视频组件即使设置了自动播放&#xff0c;仍然无法自动播放 原因&#xff1a; 76 以上版本的谷歌浏览器只能在系统静音下自动播放 解决&#xff1a; 音频自动播放浏览器白名单设置&…

kafka在windows上的启动

启动zookeeper 解压kafka安装包到对应目录下&#xff0c;找到对应config目录下的zookeeper.properties文件 新建一个data文件夹&#xff0c;随便放哪 打开该文件&#xff0c;找到 dataDir/tmp/zookeeper 属性 将原来的属性值&#xff0c;修改为新建data文件夹地址&#xff0c;…

如何修改倍福CX7000PLC IP地址

我们可以通过登录网页修改PLC的IP地址,这个需要我们知道PLC的初始IP地址 1、浏览器直接输入PLC 的IP地址 2、点击修改按钮(就是那个旋转) 修改IP地址前DHCP要先disable关闭 。 3、DHCP关闭 4、点击保存 5、在CAT3里搜索 在SYSTEM双击,之后点击搜索,具体过程可以参考下…

【html】如何利用id选择器实现主题切换

今天给大家介绍一种方法来实现主题切换的效果 效果图&#xff1a; 源码&#xff1a; <!DOCTYPE html> <html lang"zh"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initia…

充电学习—5、healthed 电池服务

1、healthed服务监听接收内核kernel的电池事件&#xff0c;然后上传数据给framware层的batterysevice&#xff0c;BatteryService计算电池的电量&#xff0c;显示&#xff0c;绘制动画等 android电池系统框架&#xff1a; 2、healthd服务入口&#xff1a;android/system/cor…

2024年设计、数字化技术与新闻传播国际学术会议(ICDDTJ 2024)

2024年设计、数字化技术与新闻传播国际学术会议(ICDDTJ 2024) 2024 International Conference on Design, Digital Technology and Journalism 会议地点&#xff1a;哈尔滨&#xff0c;中国 网址&#xff1a;www.icddtj.com 邮箱: icddtjsub-conf.com 投稿主题请注明:ICDD…

python之Bible快速检索器

内容将会持续更新&#xff0c;有错误的地方欢迎指正&#xff0c;谢谢! python之Bible快速检索器 TechX 坚持将创新的科技带给世界&#xff01; 拥有更好的学习体验 —— 不断努力&#xff0c;不断进步&#xff0c;不断探索 TechX —— 心探索、心进取&#xff01; 助力快…

CSS入门基础2

目录 1.标签类型 2.块元素 3.行内元素 4.行内块元素 5.标签行内转换 6.背景样式 1.标签类型 标签以什么方式进行显示&#xff0c;比如div 自己占一行&#xff0c; 比如span 一行可以放很多个HTML标签一般分为块标签和行内标签两种类型&#xff1a; 块元素行内元素。 2.块…