PWM互补输出,以及死区时间计算

article/2025/10/14 6:10:14

本文基于野火例程进行解说

实验内容

本次实验输出一对互补的pwm波,且进行死区时间的计算说明。

代码

互补输出对应的定时器初始化代码:
bsp_advance_tim.c

/********************************************************************************* @file    bsp_advance_tim.c* @author  STMicroelectronics* @version V1.0* @date    2015-xx-xx* @brief   高级控制定时器互补输出范例******************************************************************************* @attention** 实验平台:野火  STM32 F407 开发板  * 论坛    :http://www.firebbs.cn* 淘宝    :http://firestm32.taobao.com********************************************************************************/#include "./tim/bsp_advance_tim.h"TIM_HandleTypeDef  TIM_TimeBaseStructure;
TIM_OC_InitTypeDef TIM_OCInitStructure;__IO uint16_t ChannelPulse = 500;/*** @brief  配置TIM复用输出PWM时用到的I/O* @param  无* @retval 无*/
static void TIMx_GPIO_Config(void) 
{/*定义一个GPIO_InitTypeDef类型的结构体*/GPIO_InitTypeDef GPIO_InitStructure;/*开启定时器相关的GPIO外设时钟*/ADVANCE_OCPWM_GPIO_CLK_ENABLE();ADVANCE_OCNPWM_GPIO_CLK_ENABLE();ADVANCE_BKIN_GPIO_CLK_ENABLE(); /* 定时器功能引脚初始化 */															   GPIO_InitStructure.Pin = ADVANCE_OCPWM_PIN;	GPIO_InitStructure.Mode = GPIO_MODE_AF_PP;    GPIO_InitStructure.Pull = GPIO_NOPULL;GPIO_InitStructure.Speed = GPIO_SPEED_HIGH; 	GPIO_InitStructure.Alternate = ADVANCE_OCPWM_AF;HAL_GPIO_Init(ADVANCE_OCPWM_GPIO_PORT, &GPIO_InitStructure);	GPIO_InitStructure.Pin = ADVANCE_OCNPWM_PIN;	GPIO_InitStructure.Alternate = ADVANCE_OCNPWM_AF;	HAL_GPIO_Init(ADVANCE_OCNPWM_GPIO_PORT, &GPIO_InitStructure);GPIO_InitStructure.Pin = ADVANCE_BKIN_PIN;	GPIO_InitStructure.Alternate = ADVANCE_BKIN_AF;	HAL_GPIO_Init(ADVANCE_BKIN_GPIO_PORT, &GPIO_InitStructure);
}/** 注意:TIM_TimeBaseInitTypeDef结构体里面有5个成员,TIM6和TIM7的寄存器里面只有* TIM_Prescaler和TIM_Period,所以使用TIM6和TIM7的时候只需初始化这两个成员即可,* 另外三个成员是通用定时器和高级定时器才有.*-----------------------------------------------------------------------------* TIM_Prescaler         都有* TIM_CounterMode			 TIMx,x[6,7]没有,其他都有(基本定时器)* TIM_Period            都有* TIM_ClockDivision     TIMx,x[6,7]没有,其他都有(基本定时器)* TIM_RepetitionCounter TIMx,x[1,8]才有(高级定时器)*-----------------------------------------------------------------------------*/
static void TIM_Mode_Config(void)
{TIM_BreakDeadTimeConfigTypeDef TIM_BDTRInitStructure;// 开启TIMx_CLK,x[1,8] ADVANCE_TIM_CLK_ENABLE(); /* 定义定时器的句柄即确定定时器寄存器的基地址*/TIM_TimeBaseStructure.Instance = ADVANCE_TIM;/* 累计 TIM_Period个后产生一个更新或者中断*/		//当定时器从0计数到999,即为1000次,为一个定时周期TIM_TimeBaseStructure.Init.Period = 1000-1;// 高级控制定时器时钟源TIMxCLK = HCLK=168MHz // 设定定时器频率为=TIMxCLK/(TIM_Prescaler+1)=1MHzTIM_TimeBaseStructure.Init.Prescaler = 168-1;	// 采样时钟分频TIM_TimeBaseStructure.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;// 计数方式TIM_TimeBaseStructure.Init.CounterMode=TIM_COUNTERMODE_UP;// 重复计数器TIM_TimeBaseStructure.Init.RepetitionCounter=0;	// 初始化定时器TIMx, x[1,8]HAL_TIM_PWM_Init(&TIM_TimeBaseStructure);/*PWM模式配置*///配置为PWM模式1TIM_OCInitStructure.OCMode = TIM_OCMODE_PWM1;TIM_OCInitStructure.Pulse = ChannelPulse;TIM_OCInitStructure.OCPolarity = TIM_OCPOLARITY_HIGH;TIM_OCInitStructure.OCNPolarity = TIM_OCNPOLARITY_HIGH;TIM_OCInitStructure.OCIdleState = TIM_OCIDLESTATE_SET;TIM_OCInitStructure.OCNIdleState = TIM_OCNIDLESTATE_RESET;//初始化通道1输出PWM HAL_TIM_PWM_ConfigChannel(&TIM_TimeBaseStructure,&TIM_OCInitStructure,TIM_CHANNEL_1);/* 自动输出使能,断路、死区时间和锁定配置 */TIM_BDTRInitStructure.OffStateRunMode = TIM_OSSR_ENABLE;TIM_BDTRInitStructure.OffStateIDLEMode = TIM_OSSI_ENABLE;TIM_BDTRInitStructure.LockLevel = TIM_LOCKLEVEL_1;TIM_BDTRInitStructure.DeadTime = 0xff;TIM_BDTRInitStructure.BreakState = TIM_BREAK_ENABLE;TIM_BDTRInitStructure.BreakPolarity = TIM_BREAKPOLARITY_LOW;TIM_BDTRInitStructure.AutomaticOutput = TIM_AUTOMATICOUTPUT_ENABLE;HAL_TIMEx_ConfigBreakDeadTime(&TIM_TimeBaseStructure, &TIM_BDTRInitStructure);/* 定时器通道1输出PWM */HAL_TIM_PWM_Start(&TIM_TimeBaseStructure,TIM_CHANNEL_1);/* 定时器通道1互补输出PWM */HAL_TIMEx_PWMN_Start(&TIM_TimeBaseStructure,TIM_CHANNEL_1);
}/*** @brief  初始化高级控制定时器定时,1s产生一次中断* @param  无* @retval 无*/
void TIMx_Configuration(void)
{TIMx_GPIO_Config();	TIM_Mode_Config();
}/*********************************************END OF FILE**********************/

头文件:
bsp_advance_tim.h

#ifndef __ADVANCE_TIM_H
#define	__ADVANCE_TIM_H#include "stm32f4xx.h"/* 定时器 */
#define ADVANCE_TIM           				    TIM8
#define ADVANCE_TIM_CLK_ENABLE()  			  __TIM8_CLK_ENABLE()/* TIM8通道1输出引脚 */
#define ADVANCE_OCPWM_PIN           		  GPIO_PIN_6              
#define ADVANCE_OCPWM_GPIO_PORT     		  GPIOC                      
#define ADVANCE_OCPWM_GPIO_CLK_ENABLE() 	__GPIOC_CLK_ENABLE()
#define ADVANCE_OCPWM_AF					        GPIO_AF3_TIM8/* TIM8通道1互补输出引脚 */
#define ADVANCE_OCNPWM_PIN            		GPIO_PIN_5              
#define ADVANCE_OCNPWM_GPIO_PORT      		GPIOA                      
#define ADVANCE_OCNPWM_GPIO_CLK_ENABLE()	__GPIOA_CLK_ENABLE()
#define ADVANCE_OCNPWM_AF					        GPIO_AF3_TIM8/* TIM8断路输入引脚 */
#define ADVANCE_BKIN_PIN              		GPIO_PIN_6              
#define ADVANCE_BKIN_GPIO_PORT        		GPIOA                      
#define ADVANCE_BKIN_GPIO_CLK_ENABLE()  	__GPIOA_CLK_ENABLE()
#define ADVANCE_BKIN_AF						        GPIO_AF3_TIM8extern TIM_HandleTypeDef TIM_TimeBaseStructure;void TIMx_Configuration(void);#endif /* __ADVANCE_TIM_H */

代码讲解

断路功能

//在初始化文件里这几句代码配置了断路功能的模式TIM_OCInitStructure.OCIdleState = TIM_OCIDLESTATE_SET;//当空闲状态下PWM通道置高电平
TIM_OCInitStructure.OCNIdleState = TIM_OCNIDLESTATE_RESET;//当空闲模状态下PWM互补通道置低电平
TIM_BDTRInitStructure.BreakState = TIM_BREAK_ENABLE;//开启断路功能
TIM_BDTRInitStructure.BreakPolarity = TIM_BREAKPOLARITY_LOW;//低电平断路
TIM_BDTRInitStructure.AutomaticOutput=TIM_AUTOMATICOUTPUT_ENABLE;//断路状态消失后,自动恢复输出

以上语句表示当断路功能对应的引脚输入变为低电平时,互补输出的功能就被禁止,此时变为空闲状态,而pwm对应的通道输出高电平,互补对应的通道变为低电平,而当断路功能对应的引脚变为高电平时,互补输出又再次出现。

死区时间计算请添加图片描述

请添加图片描述
通过上面两张图,就可以知道死区时间的计算公式了

下面列举出配置死区时间的代码

TIM_TimeBaseStructure.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1;//设置分频系数,详细看第一张图。TIM_BDTRInitStructure.DeadTime = 0xff;//配置死区时间,具体计算看第二章图

开始计算,假设定时器的频率为165Mhz,且配置语句TIM_BDTRInitStructure.DeadTime = 0xff,则DTG[7:0]被写入11111111,则对应第四个计算方式,TIM_TimeBaseStructure.Init.ClockDivision=TIM_CLOCKDIVISION_DIV1表示对定时器频率1分频,则此时tDTS=1*Tck_int = (1/165000000)s,此时代码计算公式
DT=(32+DTG[4:0])*Tdtg=(32+31)16(1/165000000)*1000000us=6us


http://chatgpt.dhexx.cn/article/VlqK116D.shtml

相关文章

死区补偿---学习笔记

最近调试中发现,死区补偿对电流谐波和电流带宽影响挺大,于是对死区补偿产生浓厚兴趣,找来几篇文章粗读并做一下笔记。 传统做法 无非就是根据电流方向补偿,假如svpwm计算出的A相理论导通实践为T1,死区时间是Td&#…

什么是PWM“死区”?

关注、星标公众号,不错过精彩内容 来源:传感器与检测技术 编辑整理:strongerHuang PWM是脉宽调制,在电力电子中,最常用的就是整流和逆变。这就需要用到整流桥和逆变桥。对三相电来说,就需要三个桥臂。以两电…

死区时间的分析与设置

出现死区的主要原因是因为MOS管的源极和栅极之间的结电容。现在在栅极加上一个门电路。当门电路输出的信号跳变的瞬间,电流是非常大的,会导致MOS管发热,所以需要在门电路后面再串联一个电阻,这个电阻很小,一般在10Ω左…

什么是暂时性死区(TDZ)?

常见js面试题之一: 提示:又是一道常见的前端面试题,什么是暂时性死区? 问题描述: console.log(a);var a 1;日志输出:undefined console.log(a);let a 1;下面我们可以看到这里的日志输出出现了报错&#…

2021-02-04

一、死区初认识: 死区又称不作用区,是指控制系统的传递函数中对应输出为零的输入信号范围。 也就是说,输入信号在这个范围内,输出始终为零。输入没法影响输出,没法发挥作用,所以叫不作用区,或者…

死区4个状态分析,以及死区时间计算

死区时间的作用主要在于两点: 1)通过上下开关的时间差防止了 H 桥直通问题。 2)为开关两端的缓冲电容提供一个充放电时间,来实现开关的零电压开通(ZVS)以降低传输功率过程中的损耗,提高传输效率。 现在注重死区分析的很大一部分原因是现在…

扇入和扇出系数

扇出系数是门电路输出低电平时允许带同类门电路的个数。(输出电流能驱动负载数目)扇入系数是指门电路允许的输入端数目。(最大能承受电流条件下,能允许的输入负载数目)

镂空数学符号空心体数学符号

https://www.zhihu.com/question/297453597 word 或 WPS里,插入 -> 符号 -> 其他符号,在字体里选择 Cambria Math,然后下拉到中部可以看到:

小符号 大影响

项目场景&#xff1a; 用函数实现判断100~200之间的素数 问题描述&#xff1a; 写代码过程成中在if (1 is_prime(i))语句后面加上了;(分号&#xff09; 从而导致代码运行结果出现偏差。 #include<stdio.h> #include<math.h> int is_prime(int i) {int j 0;fo…

FPGA 扇入扇出

最近在学习有关FPGA方面的知识&#xff0c;在看一些FPGA的datasheet时&#xff0c;看到fan-out和fan-in这样的字眼&#xff0c;乍一看还真不知所云&#xff0c;继续往下看还是云里雾里&#xff0c;于是用Google在线翻译了一下&#xff0c;上面赫然是扇入扇出&#xff0c;不用想…

特殊符号组成的图案

在命令行利用特殊符号变成代码图案 各位博客们大家好啊&#xff0c;初次与大家会面&#xff0c;我就以图案的形式跟大家见面&#xff0c;接下来我会经常更新我个人的博客&#xff0c;提一些经常用到的技术点&#xff0c;也希望能够帮助大家在工作以及学习中有很好的帮助&#…

AD_BGA扇出

Fanout: 将贴片器件的引脚&#xff0c;引出一小段线加入过孔&#xff0c;使得信号线可以通过其他层完成&#xff1b; BGA_Fanout Step 1> 规则设置1.1> 过孔规则1.2> 间距规则1.3> 线宽规则 Step 2> 自动扇出> 外层打孔 Step 1> 规则设置 1.1> 过孔规…

用计算机打出小星星,怎样打出一个小星星和更多的符号?

满意答案 gldi70 2014.06.28 采纳率&#xff1a;54% 等级&#xff1a;11 已帮助&#xff1a;4806人 全在这里了~~自己找把~ ! " # $ % & ( ) * , - . / 0 1 2 3 4 5 6 7 8 9 : ; < > A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ a …

编程的扇入与扇出

大家都知道模块化编程&#xff0c;也就是重复代码尽量提炼成函数&#xff0c;自己可以用&#xff0c;别人也可以用&#xff0c;但是提炼出什么样的函数才算好呢&#xff1f;这就要用到扇入与扇出的概念。 模块的扇出是指本模块的直属下层模块的个数。如图&#xff1a; 模块A的扇…

Altium Designer BGA 扇孔/扇出

1.创建Room 2.设置间距规则 3.设置线宽规则 4.设置过孔 5.扇出 按照需求扇出&#xff0c;如无网络引脚是否扇出&#xff0c;外面2列是否扇出等

关于扇出(Fanout)(二)

原文发布时间&#xff1a;2010-12-30 作者&#xff1a;毛毛虫 在《关于扇出&#xff08;Fanout&#xff09;&#xff08;一&#xff09;》中&#xff0c;提到了设置数据集扇出的相关内容。现在针对这一问题举一个例子。 现在我有一个dwg文件&#xff0c;想使用一个含有多个多…

关于 扇出 Fanout

数字系统中的扇出 在一些数字系统中&#xff0c;必须有一个单一的TTL逻辑门来驱动10个以上的其他门或驱动器。这种情况下&#xff0c;被称为缓冲器的驱动器可以用在TTL逻辑门与它必须驱动的多重驱动器之间。这种类型的缓冲器有25至30个扇出信号。逻辑反向器&#xff08;也被称为…

扇出和扇入

在软件设计中&#xff0c;扇入和扇出的概念是指应用程序模块之间的层次调用情况。 按照结构化设计方法&#xff0c;一个应用程序是由多个功能相对独立的模块所组成。 扇入&#xff1a;是指直接调用该模块的上级模块的个数。扇入大表示模块的复用程序高。 扇出&#xff1a;是指…

扇入和扇出

扇出&#xff08;fan-out&#xff09;是一个定义单个逻辑门能够驱动的数字信号输入最大量的专业术语。大多数的TTL逻辑门能够为10个其他数字门或 驱动器提供信号。所以&#xff0c;一个典型的TTL逻辑门有10个扇出信号。 在一些 数字系统中&#xff0c;必须有一个单一的TTL逻辑门…

扇入扇出的概念

转自&#xff1a;http://langhebw.blog.163.com/blog/static/1132586482011517382379/ 最近在学习有关FPGA方面的知识&#xff0c;在看一些FPGA的datasheet时&#xff0c;看到fan-out和fan-in这样的字眼&#xff0c;乍一看还真不知所云&#xff0c;继续往下看还是云里雾里&…