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模式1TIM_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%
来张总结图
STM32 高级定时器周期、频率、占空比、对外输出电压详解相关推荐
- stm32高级定时器 基础知识
stm32高级定时器 高级定时器时基单元: 包含一个16位自动重装载寄存器 ARR 一个16位的计数器CNT,可向上/下计数 一个16位可编程预分频器PSC,预分频器时钟源有多种可选,有内部的时钟.外 ...
- STM32———高级定时器的死区时间计算方法
STM32---高级定时器的死区时间计算方法 1.定时器的时钟分频因子和预分频系数的区别: 1.1 时钟分频因子(Clock division),决定定时器的工作时钟频率. tDTS=fDTS ; t ...
- STM32 之三 标准外设版USB驱动库详解(架构+文件+函数+使用说明+示例程序)
写在前面 目前,ST的USB驱动有两套,一套是早期的独立版USB驱动,官方培训文档中称为Legacy library:一套为针对其Cube 系列的驱动,根据芯片不同可能有区别,具体见对应芯片的Cube ...
- c语言 定时器作用,单片机定时器的作用及使用方法详解
单片机定时器的作用及使用方法详解 单片机定时器在单片机的功能是很重要的,它一般被用作定时功能,来做定时检测.定时响应和定时控制,并且可以产生毫秒宽的脉冲信号来驱动步进电机.计时和计数的最终功能是通过计 ...
- vue高级进阶( 二 ) 8种组件通信详解
猛兽总是独行,牛羊才成群结队. -------鲁迅 vue组件通信的重要性无需多言...但是你肯定没有全部掌握,所以这第二篇文章应运而生 props和$emit props父传子,$emit子传父,看 ...
- android 实现毫秒定时器,Android实现定时器的五种方法实例详解
一.Timer Timer是Android直接启动定时器的类,TimerTask是一个子线程,方便处理一些比较复杂耗时的功能逻辑,经常与handler结合使用. 跟handler自身实现的定时器相比, ...
- 基于spark mllib_Spark高级分析指南 | 机器学习和分析流程详解(下)
- 点击上方"中国统计网"订阅我吧!- 我们在Spark高级分析指南 | 机器学习和分析流程详解(上)快速介绍了一下不同的高级分析应用和用力,从推荐到回归.但这只是实际高级分析过程 ...
- vue 生命周期的11中方法详解
vue 生命周期的十一中方法详解 vue 生命周期的定义 vue实例 从创建到销毁,也就是说从创建 -> 初始化 数据-> 编译模版 -> 挂载Dom -> 渲染 更新 -&g ...
- unix环境高级编程之 read与write 函数详解
学习记录:unix环境高级编程之 read 与write 函数详解 备注:本博文非本人所写,本人觉得此文讲的非常地道通俗易懂,所以摘录在此以方便以后再次查看 read函数从打开的设备或文件中读取数据 ...
最新文章
- [ NOIP 2008 ] TG
- 快速排序 python菜鸟教程-NumPy 排序、条件刷选函数
- svpwm矢量控制电机相电压波形_如何深入理解SVPWM?
- html块状元素高度,CSS:如何计算块元素的高度?
- 聊聊Top2计算机博士2021年就业选择
- Java 算法 陶陶摘苹果2
- 学而思网校python助手_学而思网校直播课堂
- opencv之在图像上绘制标记---drawMarker
- Spark sql读取数据库和ES数据进行处理代码
- 格式化代码 Intellij IDEA
- FreeRTOS 教程指南 学习笔记 第六章 中断管理(二)
- Linux ANSYS FLUENT 在集群上的安装与配置
- H5app 调用手机摄像头拍照、录制视频并上传demo
- 425_PICkit2烧写PIC18F4580 MCU
- 如何制作一个商城小程序?
- hibernate 检索策略
- 消息队列之kafka在虚拟机安装使用与整合springboot详解教程
- 八个典型的大数据应用案例
- 无人巴士和无人出租车都能用的L4自动驾驶通用硬件方案
- Python倒叙的几种方法