STM32的TIM1之PWM互补输出_死区时间和刹车配置

STM32的TIM1之PWM互补输出_死区时间和刹车配置

1、定时器1的PWM输出通道

STM32高级定时器TIM1在用作PWM互补输出时,共有4个输出通道,其中有3个是互补输出通道,如下:

通道1:TIM1_CH1对应PA8引脚,TIM1_CH1N对应PB13引脚;

通道2:TIM1_CH2对应PA9引脚,TIM1_CH2N对应PB14引脚;

通道3:TIM1_CH3对应PA10引脚,TIM1_CH3N对应PB15引脚;

通道4:TIM1_CH4对应PA11引脚;

STM32高级定时器TIM1的PWM刹车引脚TIM1_BKIN对应PB12引脚;

2、PWM互补输出的意义

在使用互补输出时,通常需要考虑死区时间,防止互补引脚控制的功率管同时而导通引起烧坏。见下图:

如果死区Deadtime>0,则在TIM1_CH1和TIM1_CH1N输出波形中插入“死区时间”,可防止TIM1_CH1和TIM1_CH1N控制的功率管同时导通。

3、互补输出

如果死区Deadtime=0,则TIM1_CH1N的输出波形是TIM1_CH1的反相;当死区时间为0,且没有收到刹车信号时,如果TIM1_CH1输出高电平,则TIM1_CH1N一定会输出低电平,我们称之为互补输出。

4、PWM刹车

PWM刹车,就是停止PWM输出波形。

5、PWM的“有效电平”和“无效电平”定义:

在PWM模式1中

1)、在向上计数时,一旦TIMx_CNT<TIMx_CCR1时,通道1引脚输出“有效电平”,否则输出“无效电平”;

2)、在向下计数时,一旦TIMx_CNT>TIMx_CCR1时,通道1引脚输出“无效电平”(OC1REF=0),否则输出“有效电平”(OC1REF=1)。

在PWM模式2中

1)、在向上计数时,一旦TIMx_CNT<TIMx_CCR1时,通道1引脚输出“无效电平”,否则输出“有效电平”;

2)、在向下计数时,一旦TIMx_CNT>TIMx_CCR1时,通道1引脚输出“有效电平”,否则输出“无效电平”。

6、PWM在死区期间输出的电平

1)、若配置了死区时间,则在死区期间,通道1引脚输出的电平和其“无效电平”保持一致。

2)、将“死区期间和无效电平期间”的TIM1_CH1和TIM1_CH1N配置输出为低电平:

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

//TIM1_CH1引脚输出有效电平为高电平,则在死区期间和无效电平期间均为低电平

TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;

// TIM1_CH1N引脚输出有效电平为高电平,则在死区期间和无效电平期间均为低电平

3)、死区时间

  TIM_BDTRInitStructure.TIM_DeadTime = 11;

  //输出比较信号死区时间配置,具体如何计算可参考 BDTR:DTG[7:0]的描述

  //DTG[7:5]=0xx => DT=DTG[7:0]*tdtg,这里的tdtg=tDTS.

  //DTG[7:5]=10x => DT=(64+DTG[5:0])*tdtg,这里的Tdtg=2*tDTS.

  //DTG[7:5]=110 => DT=(32+DTG[4:0])*tdtg,这里的Tdtg=8*tDTS.

  //DTG[7:5]=111 => DT=(32+DTG[4:0])*tdtg,这里的Tdtg=16*tDTS.

  //tDTS=tCKINT=1/72000000=13.8ns,11*13.8=152.7ns

  //这里配置的死区时间为152ns

7、PWM空闲电平极性配置和PWM刹车的关系

TIM1_CH1和TIM1_CH1N引脚的“空闲电平极性”指的是在“刹车”时TIM1_CH1和TIM1_CH1N引脚输出的极性。

刹车输出配置:

1)、TIM1_CH1和TIM1_CH1N输出配置为互异电平,可能会导致无法刹车;

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

2)、TIM1_CH1和TIM1_CH1N输出同时配置为低电平,当刹车信号到来时,会执行有效刹车;

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;

TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

3)、TIM1_CH1和TIM1_CH1N输出同时配置为高电平,当刹车信号到来时,会执行有效刹车;

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;

8、TIM1之PWM程序举例:

void TIM1_GPIO_Config(void)

{

    GPIO_InitTypeDef GPIO_InitStructure;

/// TIM1_CH1引脚初始化///

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

    //使能PA口时钟

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8;

  //PA8为TIM1_CH1通道,TIM1输出比较通道

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  //设置引脚为复用推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  //设置引脚的最高输出速率为50MHz

  GPIO_Init(GPIOA, &GPIO_InitStructure);

 /// TIM1_CH1N引脚初始化///

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13;

  //PB13为TIM1_CH1N通道,TIM1输出比较通道的互补通道

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

  //设置引脚为复用推挽输出

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  //设置引脚的最高输出速率为50MHz

  GPIO_Init(GPIOB, &GPIO_InitStructure);

  //TIM1_BKIN刹车引脚初始化/

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12;

   //PB12对应TIM1_BKIN,为PWM刹车引脚

  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

   //设置引脚为浮空输入 

  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  //设置引脚的最高输出速率为50MHz

  GPIO_Init(GPIOB, &GPIO_InitStructure);

}

void TIM1_Mode_Config(void)

{

    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure; //时基结构体

    TIM_OCInitTypeDef  TIM_OCInitStructure;         //输出比较结构体

    TIM_BDTRInitTypeDef TIM_BDTRInitStructure;      //刹车结构体

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

    //使能TIM1时钟,即内部时钟CK_INT=72M

/*--------------------时基结构体初始化-------------------------*/

    TIM_TimeBaseStructure.TIM_Period=(8-1);//周期ARR

//自动重装载寄存器的值,累计(TIM_Period+1)个"分频时钟"后产生一个更新或者中断

    TIM_TimeBaseStructure.TIM_Prescaler= (9-1);

    //TIM1时钟分频因子PSC

    TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

    //时钟分频因子 = 1,tDTS=tCKINT

    //PWM 信号的频率 F = TIM_CLK/{(ARR+1)*(PSC+1)}

    //72000000/(8*9)=1000000Hz=1MHz

    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

    //计数器计数模式,设置为向上计数

    TIM_TimeBaseStructure.TIM_RepetitionCounter=0;

    //重复计数器的值,没用到不用管

    TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);//初始化定时器

    /*--------------------输出比较结构体初始化-------------------*/

    TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

    //配置为PWM模式1

    TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

    //PWM输出使能

    TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;

    //互补输出使能

  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

  //TIM1_CH1引脚输出有效电平为高电平,则在死区期间和无效期间均为低电平

  TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;

  //TIM1_CH1N引脚输出有效电平为高电平,则在死区期间和无效空闲期间均为低电平

//TIM1_CH1和TIM1_CH1N输出配置为互异电平,导致会无法刹车,死区期间的输出电平这个设置无关/

//  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

//刹车时,TIM1_CH1引脚为高电平

//  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

//刹车时,互补输出TIM1_CH1N引脚为低电平

//TIM1_CH1和TIM1_CH1N输出同时配置为低电平,当刹车信号到来时,会执行有效刹车/

    TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;

    //刹车时,TIM1_CH1引脚为低电平

    TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

    //刹车时,互补输出TIM1_CH1N引脚为低电平

//TIM1_CH1和TIM1_CH1N输出同时配置为高电平,当刹车信号到来时,会执行有效刹车/

//  TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

//刹车时,TIM1_CH1引脚为高电平

//  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;

//刹车时,TIM1_CH1N引脚为高电平

    TIM_OCInitStructure.TIM_Pulse = (5-1); //占空比 = 4 / 8 = 50%

    TIM_OC1Init(TIM1, &TIM_OCInitStructure);//初始化PWM输出通道1

    TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

    //开启通道1预装载,在更新时间后才会重新装载数值

    /*-------------------刹车和死区结构体初始化-------------------*/

    // 有关刹车和死区结构体的成员具体可参考BDTR寄存器的描述

  TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;

  //运行模式下“关闭模式”选择 = 1

  TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;

  //空闲模式下“关闭模式”选择 = 1

  TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;

  //锁定级别1,见参考手册

  TIM_BDTRInitStructure.TIM_DeadTime = 11;

    //输出比较信号死区时间配置,具体如何计算可参考 BDTR:DTG[7:0]的描述

  //DTG[7:5]=0xx => DT=DTG[7:0]*tdtg,这里的tdtg=tDTS.

  //DTG[7:5]=10x => DT=(64+DTG[5:0])*tdtg,这里的Tdtg=2*tDTS.

  //DTG[7:5]=110 => DT=(32+DTG[4:0])*tdtg,这里的Tdtg=8*tDTS.

  //DTG[7:5]=111 => DT=(32+DTG[4:0])*tdtg,这里的Tdtg=16*tDTS.

    //tDTS=tCKINT=1/72000000=13.8ns,11*13.8=152.7ns

    //这里配置的死区时间为152ns

  TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;//开启刹车功能

  TIM_BDTRInitStructure.TIM_BreakPolarity =TIM_BreakPolarity_Low;

  //PWM刹车时,输入低电平有效,则不会产生任何PWM输出波形

  TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

  //开启自动输出

  TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

    TIM_Cmd(TIM1, ENABLE);//使能定时器,计数器开始计数  

    TIM_CtrlPWMOutputs(TIM1, ENABLE);

    //主输出使能,当使用的是通用定时器时,这句不需要

}

void TIM1_PWM_Init(void)

{

    TIM1_GPIO_Config();

    TIM1_Mode_Config();

}

9、测试结果

PWM刹车实验

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/44500.shtml

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

相关文章

LDAPWordlistHarvester:基于LDAP数据的字典生成工具

关于LDAPWordlistHarvester LDAPWordlistHarvester是一款功能强大的字典列表生成工具&#xff0c;该工具可以根据LDAP中的详细信息生成字典列表文件&#xff0c;广大研究人员随后可以利用生成的字典文件测试目标域账号的非随机密码安全性。 工具特征 1、支持根据LDAP中的详细信…

JavaDS —— 栈 Stack 和 队列 Queue

栈的概念 栈是一种先进后出的线性表&#xff0c;只允许在固定的一端进行插入和删除操作。 进行插入和删除操作的一端被称为栈顶&#xff0c;另一端被称为栈底 栈的插入操作叫做进栈/压栈/入栈 栈的删除操作叫做出栈 现实生活中栈的例子&#xff1a; 栈的模拟实现 下面是Jav…

对接企业微信API自建应用配置企业可信IP

前言 为了实现系统调用团队会议功能&#xff0c;组织发起企业微信会议&#xff0c;于是需要和企业微信做API对接。对接过程很难受&#xff0c;文档不清晰、没有SDK、没有技术支持甚至文档报文和实际接口报文都不匹配&#xff0c;只能说企业微信的API是从业以来见过的最难用的AP…

[Spring] Spring Web MVC基础理论

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

QT 多线程 QThread

继承QThread的线程 继承 QThread 是创建线程的一个普通方法。其中创建的线程只有 run() 方法在线程里的。其他类内定义的方法都在主线程内。 通过上面的图我们可以看到&#xff0c;主线程内有很多方法在主线程内&#xff0c;但是子线程&#xff0c;只有 run() 方法是在子线…

SvANet:微小医学目标分割网络,增强早期疾病检测

SvANet&#xff1a;微小医学目标分割网络&#xff0c;增强早期疾病检测 提出背景前人工作医学对象分割微小医学对象分割注意力机制 SvANet 结构图SvANet 解法拆解解法逻辑链 论文&#xff1a;SvANet: A Scale-variant Attention-based Network for Small Medical Object Segmen…

【JAVA poi-tl-ext 富文本转word】

富文本转word 环境使用poi-tl-ext的原因富文本转word代码 环境 jdk 1.8 <dependency><groupId>io.github.draco1023</groupId><artifactId>poi-tl-ext</artifactId><version>0.4.16</version> </dependency>poi-tl-ext已经包…

可灵重大升级!新增Web端上线、首尾帧控制、单次生成视频时长增加至10s!

快手视频生成大模型“可灵”&#xff08;Kling&#xff09;&#xff0c;作为全球首个真正用户可用的视频生成大模型&#xff0c;自面世以来&#xff0c;凭借其无与伦比的视频生成效果&#xff0c;在全球范围内赢得了用户的热烈追捧与高度评价。截至目前&#xff0c;申请体验其内…

修正版头像上传组件

修正版头像上传组件 文章说明核心源码展示运行效果展示源码下载 文章说明 在头像剪切上传一文中&#xff0c;我采用div做裁剪效果&#xff0c;感觉会有一些小问题&#xff0c;在昨天基于canvas绘制的功能中改进了一版&#xff0c;让代码变得更简洁&#xff0c;而且通用性相对高…

【WebGIS】从设计层面设计系统

本项目在通过现代信息技术手段&#xff0c;对古村古镇进行多方位、多角度的数字化记录、展示与传播&#xff0c;实现文化遗产的数字化保护、活化利用与共享。项目内容主要包括&#xff1a;1&#xff09;古村古镇数据库的建立&#xff1a;通过多种渠道收集古村古镇的各类信息&am…

如何从 PDF 中删除背景

您是否曾经收到过充满分散注意力背景的扫描 PDF 文档&#xff1f;也许是带有繁忙水印的旧收据或背景光线不均匀的扫描文档。虽然这些背景可能看起来没什么大不了的&#xff0c;但它们会使您的工作空间变得混乱&#xff0c;并使您难以专注于重要信息。轻松删除这些不需要的元素并…

短视频SEO矩阵系统:源码开发与部署全攻略

在数字化时代&#xff0c;短视频已成为人们获取信息、娱乐休闲的重要方式。随着短视频平台的兴起&#xff0c;如何让自己的内容在众多视频中脱颖而出&#xff0c;成为每个创作者和内容运营者关注的焦点。本文将为您深入解析短视频SEO矩阵系统的源码开发与部署&#xff0c;助您在…

MT6825磁编码IC在智能双旋机器人中的应用

MT6825磁编码IC在智能双旋机器人中的应用&#xff0c;无疑为这一领域的创新和发展注入了新的活力。作为一款高性能的磁性位置传感器&#xff0c;MT6825以其独特的优势&#xff0c;在智能双旋机器人的运动控制、定位精度以及系统稳定性等方面发挥了关键作用。 www.abitions.com …

Midjourney v6.5 可能会在“7月底”发布,并改进了真实感和皮肤纹理

Midjourney v6.5即将发布&#xff0c;这一更新将大幅提升图像的真实感和皮肤纹理&#xff0c;为用户带来更逼真的视觉体验。首席执行官David Holz在电话会议中宣布&#xff0c;新版本将提高图像清晰度&#xff0c;特别是在手部和皮肤细节上&#xff0c;同时改进Web应用程序和个…

ABAP调用BAPI时COMMIT WORK AND WAIT未按照预期同步提交问题分析

背景&#xff1a; 在做ABAP开发时&#xff0c;经常会有连续调用BAPI的需求&#xff0c;比如先创建销售订单&#xff0c;再依据销售订单创建交货单&#xff0c;再对交货单进行过账等类似的一连串调用&#xff0c;这种类似的场景往往需要前一步操作的数据完全写入数据库才能进行…

编译打包自己的云手机(redroid)镜像

前言 香橙派上跑云手机可以看之前的文章&#xff1a; 香橙派5plus上跑云手机方案一 redroid(带硬件加速)香橙派5plus上跑云手机方案二 waydroid 还有一个cuttlefish方案没说&#xff0c;后面再研究&#xff0c;cuttlefish的优势在于可以自定义内核且selinux是开启的&#xf…

Aop切面编程(2)--代理模式

1、代理模式的理解&#xff1a;不修改A对象的代码的基础上&#xff0c;对A代码块进行拓展。通过创建ProxyA代理对象&#xff0c;拓展A对象并调用A对象的核心功能&#xff1b; 即&#xff1a;不修改对象的源码基础上&#xff0c;创建代理对象&#xff0c;进行功能的附加和增强&…

端到端拥塞控制的本质

昨天整理了一篇 bbr 的微分方程组建模(参见 bbr 建模)&#xff0c;算是 bbr 算法终极意义上的一个总结&#xff0c;最后也顺带了对 aimd 的描述&#xff0c;算是我最近比较满意的一篇分享了。那么接下来的问题&#xff0c;脱离出具体算法&#xff0c;上升到宏观层面&#xff0c…

uniapp微信小程序 TypeError: $refs[ref].push is not a function

我的写法 this.$refs.addPopup.open();报错 打印出来是这样的 解决 参考未整理 原因 在当前页面使用的v-for循环 并且循环体内也有组件使用了ref&#xff08;而我没有把每个ref做区别命名&#xff09; 这样就导致了我有很多同名的ref&#xff0c;然后就报错了 解决办法&a…

AI人工智能作词,为音乐注入未来之力

在当今的音乐世界中&#xff0c;创新的力量不断推动着边界的拓展&#xff0c;而人工智能作词正以其独特的魅力&#xff0c;成为引领音乐走向未来的强大动力。 “妙笔生词智能写歌词软件&#xff08;veve522&#xff09;”无疑是这股浪潮中的璀璨明星。它利用先进的人工智能技术…