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 高级定时器周期、频率、占空比、对外输出电压详解相关推荐

  1. stm32高级定时器 基础知识

    stm32高级定时器 高级定时器时基单元: 包含一个16位自动重装载寄存器 ARR 一个16位的计数器CNT,可向上/下计数 一个16位可编程预分频器PSC,预分频器时钟源有多种可选,有内部的时钟.外 ...

  2. STM32———高级定时器的死区时间计算方法

    STM32---高级定时器的死区时间计算方法 1.定时器的时钟分频因子和预分频系数的区别: 1.1 时钟分频因子(Clock division),决定定时器的工作时钟频率. tDTS=fDTS ; t ...

  3. STM32 之三 标准外设版USB驱动库详解(架构+文件+函数+使用说明+示例程序)

    写在前面 目前,ST的USB驱动有两套,一套是早期的独立版USB驱动,官方培训文档中称为Legacy library:一套为针对其Cube 系列的驱动,根据芯片不同可能有区别,具体见对应芯片的Cube ...

  4. c语言 定时器作用,单片机定时器的作用及使用方法详解

    单片机定时器的作用及使用方法详解 单片机定时器在单片机的功能是很重要的,它一般被用作定时功能,来做定时检测.定时响应和定时控制,并且可以产生毫秒宽的脉冲信号来驱动步进电机.计时和计数的最终功能是通过计 ...

  5. vue高级进阶( 二 ) 8种组件通信详解

    猛兽总是独行,牛羊才成群结队. -------鲁迅 vue组件通信的重要性无需多言...但是你肯定没有全部掌握,所以这第二篇文章应运而生 props和$emit props父传子,$emit子传父,看 ...

  6. android 实现毫秒定时器,Android实现定时器的五种方法实例详解

    一.Timer Timer是Android直接启动定时器的类,TimerTask是一个子线程,方便处理一些比较复杂耗时的功能逻辑,经常与handler结合使用. 跟handler自身实现的定时器相比, ...

  7. 基于spark mllib_Spark高级分析指南 | 机器学习和分析流程详解(下)

    - 点击上方"中国统计网"订阅我吧!- 我们在Spark高级分析指南 | 机器学习和分析流程详解(上)快速介绍了一下不同的高级分析应用和用力,从推荐到回归.但这只是实际高级分析过程 ...

  8. vue 生命周期的11中方法详解

    vue 生命周期的十一中方法详解 vue 生命周期的定义 vue实例 从创建到销毁,也就是说从创建 -> 初始化 数据-> 编译模版 -> 挂载Dom -> 渲染 更新 -&g ...

  9. unix环境高级编程之 read与write 函数详解

    学习记录:unix环境高级编程之 read 与write  函数详解 备注:本博文非本人所写,本人觉得此文讲的非常地道通俗易懂,所以摘录在此以方便以后再次查看 read函数从打开的设备或文件中读取数据 ...

最新文章

  1. [ NOIP 2008 ] TG
  2. 快速排序 python菜鸟教程-NumPy 排序、条件刷选函数
  3. svpwm矢量控制电机相电压波形_如何深入理解SVPWM?
  4. html块状元素高度,CSS:如何计算块元素的高度?
  5. 聊聊Top2计算机博士2021年就业选择
  6. Java 算法 陶陶摘苹果2
  7. 学而思网校python助手_学而思网校直播课堂
  8. opencv之在图像上绘制标记---drawMarker
  9. Spark sql读取数据库和ES数据进行处理代码
  10. 格式化代码 Intellij IDEA
  11. FreeRTOS 教程指南 学习笔记 第六章 中断管理(二)
  12. Linux ANSYS FLUENT 在集群上的安装与配置
  13. H5app 调用手机摄像头拍照、录制视频并上传demo
  14. 425_PICkit2烧写PIC18F4580 MCU
  15. 如何制作一个商城小程序?
  16. hibernate 检索策略
  17. 消息队列之kafka在虚拟机安装使用与整合springboot详解教程
  18. 八个典型的大数据应用案例
  19. 无人巴士和无人出租车都能用的L4自动驾驶通用硬件方案
  20. Python倒叙的几种方法

热门文章

  1. 报错https://chat.openai.com/ api/auth/ session 429怎么办
  2. mysql 超卖_mysql 解决超卖问题的锁分析
  3. Git:git-pull 的用法总结
  4. [pyecharts学习笔记]——Pie饼图
  5. 深度学习中常见的损失函数(L1Loss、L2loss)
  6. 最简单理解高内聚低耦合
  7. R语言LR逻辑回归实例
  8. 操作系统内存管理及虚拟内存技术
  9. ICMP协议服务器怎么开启关闭ICMP协议?
  10. 推荐 8 个我私藏的大厂技术大佬公众号 !助你高速成长!