IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> STM32 高级定时器周期、频率、占空比、对外输出电压详解 -> 正文阅读

[嵌入式]STM32 高级定时器周期、频率、占空比、对外输出电压详解

STM32 高级定时器 最近在研究电机,对TIM定时器研究了一些,将一些存在疑惑的问题,通过试验和示波器分析,得到以下结论,供大家学习参考

1.介绍输出电压高低判断

输出比较时:OC1对外输出电压为示波器可以读取的电压,也是我们最终使用的电压,在这个电压输出前,有很多的配置,如下图
在这里插入图片描述
在工作状态时,首先是设置模式。
对应这句TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM2;
比较方法满足后,就根据模式的判断输出相对应的参考电平,参考电平的高低是确定死的,相应的值通过你自己设置的比较模式去判断得到参考电平。

然后我们还会配置极性
对应这句 TIM_OCInitStructure.OCPolarity = TIM_OCPOLARITY_HIGH;
极性就是确定参考电平的高低电压来了后,通过我们设置的极性为那种有效,最终决定最终对外输出的电压值值。

TIM_TimeBaseStructure.Init.CounterMode = TIM_COUNTERMODE_UP;这句就是设置计数是递增还是递减、或者中心模式,也会决定参考电平的高低,详细看参考电平模式详解。

2.周期、频率

定时器计数器的频率计算
名称解释:

TIMxCLK(总线的频率F103 高级定时器72Mhz F407为84Mhz)

PSC:分频因子 一般设置10,系统会认为是11,所以设置时为 PSC=【(你期望的值)-1】
为啥是这个样子,系统设定的,详见参考手册

ARR:重装载寄存器,会影响占空比值,会影响定时器频率值,根据测试此值从0开始计算,所以会出现 ARR =【(你期望的值)-1】

/* 累计 TIM_Period个后产生一个更新或者中断*/		
/* 当定时器从0计数到PWM_PERIOD_COUNT,即为PWM_PERIOD_COUNT+1次,为一个定时周期 */
#define PWM_PERIOD_COUNT     1000-1

/* 通用控制定时器时钟源TIMxCLK = HCLK/2=84MHz */
/* 设定定时器频率为=TIMxCLK/(PWM_PRESCALER_COUNT+1) */
#define PWM_PRESCALER_COUNT     1680-1

频率计算公式f=TIMxCLK/ ((PSC+1)*(ARR+1))
按照上面代码的值 假设板卡为F407,定时器频率为84Mhz,定时器计数器计算下来的频率为50Hz,要区分定时器频率,这个是固有的,是通过时钟分配频率得出的,而我们调整的是在这个频率下,定时器计数器的频率值

3.占空比

占空比就是在一个周期内,高电平占整个周期的比例
例如周期为20ms的波(50Hz),占空比为50%,则高电平为10ms时长,至于那一段是高电平,这个是你自己的配置决定。

但在stm32配置的时候,运用的思想是这个,但是实际是一些区别的

我们看下面这段错误的代码

TIM_TimeBaseStructure.Init.CounterMode = TIM_COUNTERMODE_UP;//计数模式向上增长
/*PWM模式配置*/
  TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;      // 配置为PWM模式1
  TIM_OCInitStructure.Pulse = 0.5/20.0*PWM_PERIOD_COUNT;    // 默认占空比
  TIM_OCInitStructure.OCFastMode = TIM_OCFAST_DISABLE;
	/*当定时器计数值小于CCR1_Val时为高电平*/
  TIM_OCInitStructure.OCPolarity = TIM_OCPOLARITY_HIGH;	

TIM_OCInitStructure.Pulse = 0.5/20.0*PWM_PERIOD_COUNT; 设置占空比

PWM_PERIOD_COUNT 我们定义 #define PWM_PERIOD_COUNT (1000-1)就是999

这个TIM_OCInitStructure.Pulse目标就是设置舵机的占空比
舵机周期是20ms,0.5ms-2.5ms之间决定了自己的转的角度,在这个区间内输出高电平, 就得到你要转的角度
高电平只在0.5ms-2.5ms区间内输出高电平,其他周期内都是低电平。

周期通过PSC和ARR已经计算得出,这个周期继续被(ARR+1)划分,假设ARR为999,则计数器计一次的时钟就是20ms/1000
我们设定的Pulse就是决定在这个周期呢,有效电平的计数时长(最终有效电平对外输出高电平还是低电平,要看你的配置)

为什么上面那一段代码是错误的,实际中可能一些情况对比,是可以运行的
但是是错误的

我们假设要在20ms输出50%占空比高电平,需要持续10ms
则TIM_OCInitStructure.Pulse=500;就可以了

占空比=TIM_OCInitStructure.Pulse/(ARR+1)
那一段代码中ARR值是1000-1,所以分母错误,这一点在很多教程中都没有注意。高频率下问题就会体现,在低频率,因为值比较大,少一点体现不出来。

另外这个TIM_OCInitStructure.Pulse只能是整数设置小数会被舍去小数点后面的值

如果我们要占空比37.5%
假设ARR=10-1
TIM_OCInitStructure.Pulse=3.75
占空比=TIM_OCInitStructure.Pulse/(ARR+1)在系统中会被设置为30%

那如何调整到37.5%
增大ARR的值,为了保证频率不变,再降低PSC的值
假设ARR=1000-1
TIM_OCInitStructure.Pulse=375
占空比=TIM_OCInitStructure.Pulse/(ARR+1)在系统中会被设置为37.5%

来张总结图
在这里插入图片描述

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-08-20 15:17:19  更:2021-08-20 15:18:51 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 23:01:40-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码