热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

本文基于野火例程进行解说实验内容

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

实验内容

本次实验输出一对互补的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


推荐阅读
  • 海马s5近光灯能否直接更换为H7?
    本文主要介绍了海马s5车型的近光灯是否可以直接更换为H7灯泡,并提供了完整的教程下载地址。此外,还详细讲解了DSP功能函数中的数据拷贝、数据填充和浮点数转换为定点数的相关内容。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Nginx使用(server参数配置)
    本文介绍了Nginx的使用,重点讲解了server参数配置,包括端口号、主机名、根目录等内容。同时,还介绍了Nginx的反向代理功能。 ... [详细]
  • 本文介绍了C++中省略号类型和参数个数不确定函数参数的使用方法,并提供了一个范例。通过宏定义的方式,可以方便地处理不定参数的情况。文章中给出了具体的代码实现,并对代码进行了解释和说明。这对于需要处理不定参数的情况的程序员来说,是一个很有用的参考资料。 ... [详细]
  • Metasploit攻击渗透实践
    本文介绍了Metasploit攻击渗透实践的内容和要求,包括主动攻击、针对浏览器和客户端的攻击,以及成功应用辅助模块的实践过程。其中涉及使用Hydra在不知道密码的情况下攻击metsploit2靶机获取密码,以及攻击浏览器中的tomcat服务的具体步骤。同时还讲解了爆破密码的方法和设置攻击目标主机的相关参数。 ... [详细]
  • Firefox火狐浏览器关闭到http://detectportal.firefox.com的流量问题解决办法
    本文介绍了使用Firefox火狐浏览器时出现关闭到http://detectportal.firefox.com的流量问题,并提供了解决办法。问题的本质是因为火狐默认开启了Captive portal技术,当连接需要认证的WiFi时,火狐会跳出认证界面。通过修改about:config中的network.captive-portal-service.en的值为false,可以解决该问题。 ... [详细]
  • 本文介绍了Oracle数据库中tnsnames.ora文件的作用和配置方法。tnsnames.ora文件在数据库启动过程中会被读取,用于解析LOCAL_LISTENER,并且与侦听无关。文章还提供了配置LOCAL_LISTENER和1522端口的示例,并展示了listener.ora文件的内容。 ... [详细]
  • http:my.oschina.netleejun2005blog136820刚看到群里又有同学在说HTTP协议下的Get请求参数长度是有大小限制的,最大不能超过XX ... [详细]
  • 本文介绍了在Linux下安装Perl的步骤,并提供了一个简单的Perl程序示例。同时,还展示了运行该程序的结果。 ... [详细]
  • 本文介绍了Web学习历程记录中关于Tomcat的基本概念和配置。首先解释了Web静态Web资源和动态Web资源的概念,以及C/S架构和B/S架构的区别。然后介绍了常见的Web服务器,包括Weblogic、WebSphere和Tomcat。接着详细讲解了Tomcat的虚拟主机、web应用和虚拟路径映射的概念和配置过程。最后简要介绍了http协议的作用。本文内容详实,适合初学者了解Tomcat的基础知识。 ... [详细]
  • 成功安装Sabayon Linux在thinkpad X60上的经验分享
    本文分享了作者在国庆期间在thinkpad X60上成功安装Sabayon Linux的经验。通过修改CHOST和执行emerge命令,作者顺利完成了安装过程。Sabayon Linux是一个基于Gentoo Linux的发行版,可以将电脑快速转变为一个功能强大的系统。除了作为一个live DVD使用外,Sabayon Linux还可以被安装在硬盘上,方便用户使用。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • 本文介绍了如何清除Eclipse中SVN用户的设置。首先需要查看使用的SVN接口,然后根据接口类型找到相应的目录并删除相关文件。最后使用SVN更新或提交来应用更改。 ... [详细]
  • 网络请求模块选择——axios框架的基本使用和封装
    本文介绍了选择网络请求模块axios的原因,以及axios框架的基本使用和封装方法。包括发送并发请求的演示,全局配置的设置,创建axios实例的方法,拦截器的使用,以及如何封装和请求响应劫持等内容。 ... [详细]
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
author-avatar
福田汽车-唐山万联
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有