码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • STM32F407高级定时器-死区时间研究-STM32CubeMX


    距离上次写笔记,已经过去好长时间了

    中间也折腾过不少东西,但是都没咋整理,主要是这中间都是在干活儿,不是自己想要研究的,也没想着要写。

    从去年10月份开始想要学习FOC,10月份研究了一个月,到11月初,实现了SVPWM驱动BLDC电机,使用串口实现开环下转速和力矩调节。基本上算是刚刚入门, 但是后来一直去忙别的各种事情了,搁置了一年,最近想重新捡起来,发现去年的代码折腾的已经跑不起来了,于是重新开始看去年收藏夹里的教程——从最基础的高级定时器开始。高级定时器这块儿的知识,比较基础的就不赘述了,我会在文章末尾附上几个我个人认为比较好的文章,供有需要的同学学习。

    之前关于死区时间的设定,一直没搞清楚,CubeMX中DeadTime就一个孤零零的文本框,也没有注释,似乎很不起眼,这次花了点儿时间,研究整理了一下,有理论计算,有上机试验,希望能帮助到有需要的同学吧。

    DTG配置死区发生器详解

    回归正题!下图截自《STM32F4xx中文编程手册》RM0090,DTG寄存器为TIM1 和 TIM8 断路和死区寄存器 (TIMx_BDTR)的低8位,高八位咱们暂时不用关心哈,咱们只关心低8位。DTG寄存器中的值不同,决定了死区时间的计算方法也不同。DTG寄存器的设置方法非常简单,直接通过CubeMX中DeadTime处写入即可。

     根据上图可以知道,设置死区时间的时候,根据输入到DTG的值不同,会被分为4种情况,分别是:

     1.当最高位为0 低7位为任意值,即CubeMX中DeadTime值输入为0-127时,死区时间为

    [0~127]×t_{dtg},t_{dtg}=t_{DTS}

    例如CubeMX中 DeadTime输入100时,理论得到死区时间DT=100×1/72MHz=1.38889us

    CubeMX设置截图如下,使用TIM8高级定时器,使用通道CH1和CH1N输出互补PWM波,预分频值PSC为72-1,自动重装载值ARR为1000-1(图中DeadTime输入的为十六进制0x64,转为为十进制后即为100)

     将程序下载到正点F103ZET6核心板上,使用示波器检测PC5(CH1)与PA7(CH1N)互补方波的死区时间,得到如下截图

     图中两方波的时间差即为死区时间,测量值为1.38us,与计算值1.38889us几乎一致。

    2.当DTG[7:6]为10  而DTG[5:0]为任意值时(10xx xxxx),此时死区时间DT计算公式为

    DT=(64+DTG[5:0])xt_{dtg},t_{dtg}=2t_{DTS}

    DT= (64+[0~63])xt_{dtg}  ,t_{dtg}=2t_{DTS}

     例如CubeMX中 DeadTime输入0xb9(1011 1001)时,理论得到死区时间 

    DT= (64+(0011 1001))xt_{dtg} = (64+57)x 2t_{DTS} = (64+57)x2x1/72MHz=3.61111us

    设置CubeMX中DeadTime值为0xb9

     下载烧录,示波器检测死区时间

     实际检测出死区时间为3.36us,与理论时间3.36111us基本吻合。

    3.和4. 两种情况与2计算方式基本相同,不过就是需要注意,DTG[7:5]三位值已经固定,DTG[4:0]取值范围缩小至【0~31】,在确定DTG[4:0]取值数值之后,将DTG[7:5]与DTG[4:0]进行按位与操作,组成一个字节,最后将该值填入Cube MX中DeadTime处即可;另外t_{dtg}取值分别变为8倍t_{DTS}与16倍t_{DTS}。

    实际3 4两种情况试验我都做过了,3不放了,只把第4种情形,DTG[4:0]取值最大的情况贴图在下面吧。

    设置CubeMX中DeadTime值为0xff (1111 1111)

      DT= (32+(1111 1111))xt_{dtg} = (32+31)x 16t_{DTS} = (32+31)x16x1/72MHz=14.0us

     经过实测,死区时间同样为14us,与计算结果一致。

     非常关键的t_{DTS}的计算方法

    有的同学可能会好奇,  t_{dtg}=N倍t_{DTS},那这个t_{DTS}又是怎么来的呢,其实关于t_{DTS}的取值方法,官方的编程手册中同样提到了,我贴上来供大家参考。

     不做特别设置的时候,t_{DTS}=tCK_INT,即与内部时钟相同。即内部时钟频率,72MHz。

    参考文章推荐

    STM32F407配置STM32CubeMX通过高级定时器TIM8产生PWM互补输出(带死区和刹车)实验_xuechanba的博客-CSDN博客

    STM32CUBEMX配置教程(五)高级定时器输出两路PWM波_怡步晓心l的博客-CSDN博客

    STM32CubeMX的TIM1互补PWM输出,HAL库(2路,带死区)_小李(李宏松)的博客-CSDN博客

    STM32 HAL库PWM回调函数的特性_Wake_Dream_2333的博客-CSDN博客_callback stm32

    STM32CubeIDE 统计及控制PWM产生个数_sudaroot的博客-CSDN博客

  • 相关阅读:
    淘宝/天猫API:brand_cat_top-获取分类推荐品牌列表
    接口测试实战讲解
    openfoam UPstream类探索(二)
    学习笔记:机器学习优化算法之牛顿法、拟牛顿法
    如何在 Xamarin 中快速集成 Android 版认证服务 - 邮箱地址篇
    mysql不是内部或外部命令,也不是可运行的程序或批处理文件解决
    【网络原理】UDP和TCP协议重点知识汇总
    中学校园IP网络广播系统解决方案-校园数字IP广播系统方案设计指南
    如何解决网站服务器响应速度慢的问题
    Facebook改名Meta,“元宇宙”到底是什么?
  • 原文地址:https://blog.csdn.net/qq_19262979/article/details/127991809
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号