pwm互补输出 死区设置
void TIM8_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE);// 使能定时器时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOB , ENABLE); //使能GPIO外设时钟使能
//设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
GPIO_InitStructure.GPIO_Pin =GPIO_Pin_7; //TIM_CH2
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //TIM_CH2, 3 4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 不分频
TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM8, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
**************************************************************************************************************************************************************************************************************
定时器1时钟挂在APB2总线上,时钟为72M 当TIM_ClockDivision = 0时, Tdts = 1/72M = 13.89ns
****************************************************************************************************************************************************************************************************************
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//互补输出使能
TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;//ocx高电平有效
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;//ocxn高电平有效
TIM_OC2Init(TIM8, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
**********************************************************************************************************************************************************************************************************************
CC1P:输入/捕获1输出极性 (Capture/Compare 1 output polarity) CC1通道配置为输出: 0: OC1高电平有效; 1: OC1低电平有效。 |
CC1NP:输入/捕获1互补输出极性 (Capture/Compare 1 complementary output polarity) 0: OC1N高电平有效; 1: OC1N低电平有效。 |
关于pwm模式1,2的区别可以看一看我的另一篇文章,有讲过=》》https://www.cnblogs.com/caiya/articles/9267844.html
我这里两个通道都是高电平有效
**********************************************************************************************************************************************************************************************************************
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1; //锁定级别1 不能写入TIMx_BDTR寄存器的DTG、 BKE、 BKP、 AOE位和TIMx_CR2寄存器的OISx/OISxN位;
TIM_BDTRInitStructure.TIM_DeadTime = 0x2B; //死区时间为600ns
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;//禁止刹车输入(不使能刹车功能)
TIM_BDTRConfig(TIM8,&TIM_BDTRInitStructure);
******************************************************************************************************************************************************************************************************************
关于死区设置,这里我先解释一下在说死区时间计算;
1死区:死区我通过示波器看,我理解是---
高电平有效时:
● OCx输出信号与参考信号相同,只是它的上升沿相对于参考信号的上升沿有一个延迟。
● OCxN输出信号与参考信号相反,只是它的上升沿相对于参考信号的下降沿有一个延迟。
低电平有效时:
● OCx输出信号与参考信号相同,只是它的下降沿相对于参考信号的下降沿有一个延迟。
● OCxN输出信号与参考信号相反,只是它的下降沿相对于参考信号的上升沿有一个延迟。
2刹车寄存器的设置:刹车源既可以是刹车输入引脚又可以是一个时钟失败事件。时钟失败事件由复位时钟控制器中的时钟安全系统产生 。通过这段话我理解是刹车是出于安全考虑,才使用。
因为我只需要死区,并不考虑刹车,也就是我不需要刹车功能,所以我要禁止刹车输入。
位12 | BKE: 刹车功能使能 (Break enable) 0:禁止刹车输入(BRK及CCS时钟失效事件); 1:开启刹车输入(BRK及CCS时钟失效事件)。 |
也因为我没有使用刹车,所以刹车极性我也没有必要设置。
位13 | BKP: 刹车输入极性 (Break polarity) 0:刹车输入低电平有效; 1:刹车输入高电平有效。 |
因为我是通过软件给MOE置1,所以AOE我也没有必要设置,就默认0就好
位14 | AOE: 自动输出使能 (Automatic output enable) 0: MOE只能被软件置’1’; 1: MOE能被软件置’1’或在下一个更新事件被自动置’1’(如果刹车输入无效)。 |
位15 | MOE: 主输出使能 (Main output enable) 一旦刹车输入有效,该位被硬件异步清’0’。根据AOE位的设置值,该位可以由软件清’0’或被自 动置1。它仅对配置为输出的通道有效。 0:禁止OC和OCN输出或强制为空闲状态; 1:如果设置了相应的使能位(TIMx_CCER寄存器的CCxE、 CCxNE位),则开启OC和OCN输 出。 |
因为我没有使用刹车,所以我的MOE应该不会变成0,所以上面的表75中,OSSI我没有必要设置。
TIMx_CR2 寄存器中:
位9 | OIS1N:输出空闲状态1(OC1N输出) (Output Idle state 1) 0:当MOE=0时,死区后OC1N=0; 1:当MOE=0时,死区后OC1N=1。 注:已经设置了LOCK(TIMx_BKR寄存器)级别1、 2或3后,该位不能被修改。 |
位8 | OIS1:输出空闲状态1(OC1输出) (Output Idle state 1) 0:当MOE=0时,如果实现了OC1N,则死区后OC1=0; 1:当MOE=0时,如果实现了OC1N,则死区后OC1=1。 注:已经设置了LOCK(TIMx_BKR寄存器)级别1、 2或3后,该位不能被修改。 |
这些类似的地方我也没有必要设置。
为什么我要把OSSR置1呢?
其实这个程序中我将OSSR给1或者0都是一样的,因为从表75我们可以清楚的知道,ossr=0,则当CCXE,CCXNE=0时,两个通道都将输出0,而ossr=1时,CCXE,CCXNE=0时,两个通道将输出我们上面设置的CCXP/CCXNP的值,而这里我的这两个对应位是0,所以效果一样。但是我考虑到万一我需要失能时输出高电平的时候呢,万一我关闭定时器pwm通道的时候我需要通道输出的是高电平呢?所以我设置了此位为1.
位2 | CC1NE:输入/捕获1互补输出使能 (Capture/Compare 1 complementary output enable) 0:关闭- OC1N禁止输出,因此OC1N的电平依赖于MOE、 OSSI、 OSSR、 OIS1、 OIS1N和 CC1E位的值。 1:开启- OC1N信号输出到对应的输出引脚,其输出电平依赖于MOE、 OSSI、 OSSR、 OIS1、 OIS1N和CC1E位的值。 |
位0 | CC1E: 输入/捕获1输出使能 (Capture/Compare 1 output enable) CC1通道配置为输出: 0: 关闭- OC1禁止输出,因此OC1的输出电平依赖于MOE、 OSSI、 OSSR、 OIS1、 OIS1N 和CC1NE位的值。 1: 开启- OC1信号输出到对应的输出引脚,其输出电平依赖于MOE、 OSSI、 OSSR、 OIS1、 OIS1N和CC1NE位的值。 |
至于锁定嘛,看下面表格就知道了。
位9:8 | LOOK[1:0]: 锁定设置 (Lock configuration) 该位为防止软件错误而提供写保护。 00:锁定关闭,寄存器无写保护; 01:锁定级别1,不能写入TIMx_BDTR寄存器的DTG、 BKE、 BKP、 AOE位和TIMx_CR2寄存 器的OISx/OISxN位; 10:锁定级别2,不能写入锁定级别1中的各位,也不能写入CC极性位(一旦相关通道通过 CCxS位设为输出, CC极性位是TIMx_CCER寄存器的CCxP/CCNxP位)以及OSSR/OSSI位; 11:锁定级别3,不能写入锁定级别2中的各位,也不能写入CC控制位(一旦相关通道通过 CCxS位设为输出, CC控制位是TIMx_CCMRx寄存器的OCxM/OCxPE位); 注:在系统复位后,只能写一次LOCK位,一旦写入TIMx_BDTR寄存器,则其内容冻结直至复 位。 |
我设置的时锁定级别1.
3死区时间计算:
位7:0 | UTG[7:0]: 死区发生器设置 (Dead-time generator setup) 这些位定义了插入互补输出之间的死区持续时间。假设DT表示其持续时间: 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 = 125ns(8MHZ),可能的死区时间为: 0到15875ns,若步长时间为125ns; 16us到31750ns,若步长时间为250ns; 32us到63us,若步长时间为1us; 64us到126us,若步长时间为2us; 注:一旦LOCK级别(TIMx_BDTR寄存器中的LOCK位)设为1、 2或3,则不能修改这些位。 |
举例600ns怎么来的:0x2b=00101011,这明显就是上面说的0xx型,所以时间=0x2b × Tdtg,上面我们设置始终分频因子的时候就已经知道tdtg=13.89ns,所以我们可以算出DT就约等与600ns。
*********************************************************************************************************************************************************************************************************************
TIM_OC2PreloadConfig(TIM8, TIM_OCPreload_Enable); //CH2预装载使能
TIM_ClearFlag(TIM8, TIM_FLAG_Update);//清除中断标志
TIM_ITConfig(TIM8, TIM_IT_CC2/*TIM 输入捕获中断源*/, ENABLE); //使能或者失能指定的TIM中断
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
NVIC_InitStructure.NVIC_IRQChannel = TIM8_CC_IRQn;//TIM8捕捉比较中断
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
TIM_CtrlPWMOutputs(TIM8,ENABLE); //MOE 主输出使能 高级定时器需要这句 这个上面我粘贴了图标的,往上翻一番就知道了
TIM_ARRPreloadConfig(TIM8, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM8, ENABLE); //使能TIM8
}
pwm互补输出 死区设置的更多相关文章
- STM32之PWM波形输出配置总结
一. TIMER分类: STM32中一共有11个定时器,其中TIM6.TIM7是基本定时器:TIM2.TIM3.TIM4.TIM5是通用定时器:TIM1和TIM8是高级定时器,以及2个看门狗定时器 ...
- STM32 TIM 多通道互补PWM波形输出配置快速入门
platform:stm32f10xxx lib:STM32F10x_StdPeriph_Lib_V3.5.0 前言 在做三相逆变的时候,需要软件生成SVPWM波形,具体的算法需要产生三对互补的PWM ...
- STM32学习日志--使用DMA功能自动更新PWM的输出
/******************************************************************************* 编译环境: EWARM V5.30 硬 ...
- STM32 PWM的输出与Keil软件仿真
导读:PWM(Pulse Width Modulation)控制——脉冲宽度调制技术,通过对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值). PWM控制技术在逆变电路中应用最广,应用 ...
- Response输出excel设置文本样式
在网上查了些Response导出excel然后设置样式的方法,发现没有一个可行的于是开始自己研究, 发现可以通过输出样式的方式进行配置,我要设置的是全文本格式在excel样式是这样的mso-numbe ...
- PHP使用echo输出标签设置CSS样式问题
使用php是可以输出HTML标签的,这为页面设计带来很大方便. 在此记录php输出标签设置CSS样式的问题: echo可使用''.""或你不用引号,如果想要输出带CSS样式的HTM ...
- PADS CAM光绘输出文件设置
PADS CAM光绘输出文件设置 在使用PADS完成电路板的设计后,通常还需要在CAM350中经过一些处理生成Gerber文件,交给制板厂商进行电路板的生产,这就要求在PADS中设置生成CAM文件,然 ...
- 张高兴的 .NET Core IoT 入门指南:(五)PWM 信号输出
什么是 PWM 在解释 PWM 之前首先来了解一下电路中信号的概念,其中包括模拟信号和数字信号.模拟信号是一种连续的信号,与连续函数类似,在图形上表现为一条不间断的连续曲线.数字信号为只能取有限个数值 ...
- stm32高级定时器1互补输出 验证代码
GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDe ...
随机推荐
- leetcode101
/** * Definition for a binary tree node. * public class TreeNode { * public int val; * public TreeNo ...
- 源码阅读经验谈-slim,darknet,labelimg,caffe(1)
本文首先谈自己的源码阅读体验,然后给几个案例解读,选的例子都是比较简单.重在说明我琢磨的点线面源码阅读方法.我不是专业架构师,是从一个深度学习算法工程师的角度来谈的,不专业的地方请大家轻拍. 经常看别 ...
- ElasicSearch(1)
ElasticSearch是一个基于Lucene的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口.Elasticsearch是用Java开发的,并作为Apach ...
- ---mingw Linux交叉编译给Window的工具
https://arrayfire.com/cross-compile-to-windows-from-linux/
- Mybatis运行错误:信息: SQLErrorCodes loaded: [DB2, Derby, H2, HDB, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]
Mybatis运行出现错误提示: 五月 23, 2018 12:07:22 上午 org.springframework.jdbc.support.SQLErrorCodesFactory <i ...
- Android Studio2.0 教程从入门到精通Windows版 - 入门篇
http://www.open-open.com/lib/view/open1468121363300.html 本文转自:深度开源(open-open.com)原文标题:Android Studio ...
- MySQL统计信息以及执行计划预估方式初探
数据库中的统计信息在不同(精确)程度上描述了表中数据的分布情况,执行计划通过统计信息获取符合查询条件的数据大小(行数),来指导执行计划的生成.在以Oracle和SQLServer为代表的商业数据库,和 ...
- CSS 表单
输入框前有图片 老板让你实现在输入框前有图片的功能.老板觉得用图片代替文字更有说服力. 要实现这样的功能很简单,它的原理是将图片放在内边距内. 代码 1 2 3 4 5 6 7 8 9 10 11 1 ...
- CDH hue下定时执行hive脚步
今天在看oozie时发现能在hue中执行hive 脚本,主要是hue 和 oozie结合使用,下面介绍下怎么使用的,挺恶心的,哈哈(在这里就不哔哔了) 提交oozie定时作业 1.进入hue界 ...
- Java学习笔记(二十二):打包程序
加入一个程序测试完毕,我们就可以将它打包,就可以放到服务器上运行了 找到左下角的终端 点击 输入命令: mvnw clean package -DskipTests=true clean:清除以前生成 ...