历史上的今天
返回首页

历史上的今天

今天是:2024年09月15日(星期日)

2020年09月15日 | pwm互补输出 死区设置

2020-09-15 来源:eefocus

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刹车寄存器的设置:刹车源既可以是刹车输入引脚又可以是一个时钟失败事件。时钟失败事件由复位时钟控制器中的时钟安全系统产生 。通过这段话我理解是刹车是出于安全考虑,才使用。
因为我只需要死区,并不考虑刹车,也就是我不需要刹车功能,所以我要禁止刹车输入。

位12BKE: 刹车功能使能 (Break enable)
0:禁止刹车输入(BRK及CCS时钟失效事件);
1:开启刹车输入(BRK及CCS时钟失效事件)。

也因为我没有使用刹车,所以刹车极性我也没有必要设置。

位13BKP: 刹车输入极性 (Break polarity)
0:刹车输入低电平有效;
1:刹车输入高电平有效。

因为我是通过软件给MOE置1,所以AOE我也没有必要设置,就默认0就好

位14AOE: 自动输出使能 (Automatic output enable)
0: MOE只能被软件置’1’;
1: MOE能被软件置’1’或在下一个更新事件被自动置’1’(如果刹车输入无效)。
位15MOE: 主输出使能 (Main output enable)
一旦刹车输入有效,该位被硬件异步清’0’。根据AOE位的设置值,该位可以由软件清’0’或被自
动置1。它仅对配置为输出的通道有效。
0:禁止OC和OCN输出或强制为空闲状态;
1:如果设置了相应的使能位(TIMx_CCER寄存器的CCxE、 CCxNE位),则开启OC和OCN输
出。


因为我没有使用刹车,所以我的MOE应该不会变成0,所以上面的表75中,OSSI我没有必要设置。

TIMx_CR2 寄存器中:

位9OIS1N:输出空闲状态1(OC1N输出) (Output Idle state 1)
0:当MOE=0时,死区后OC1N=0;
1:当MOE=0时,死区后OC1N=1。
注:已经设置了LOCK(TIMx_BKR寄存器)级别1、 2或3后,该位不能被修改。
位8OIS1:输出空闲状态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.

位2CC1NE:输入/捕获1互补输出使能 (Capture/Compare 1 complementary output enable)
0:关闭- OC1N禁止输出,因此OC1N的电平依赖于MOE、 OSSI、 OSSR、 OIS1、 OIS1N和
CC1E位的值。
1:开启- OC1N信号输出到对应的输出引脚,其输出电平依赖于MOE、 OSSI、 OSSR、
OIS1、 OIS1N和CC1E位的值。


 

位0CC1E: 输入/捕获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:8LOOK[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:0UTG[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
   
}


推荐阅读

史海拾趣

DeLorme公司的发展小趣事

进入21世纪后,DeLorme公司凭借其在GPS技术领域的深厚积累,不断推出具有创新性的产品。其中,一款集成了GPS、电子罗盘和高度计等多功能的户外导航设备在市场上引起了广泛关注。这款产品不仅具有高精度、高可靠性的特点,还具备了用户友好的界面设计和人性化的操作体验。通过这款产品,DeLorme公司进一步巩固了其在户外导航领域的领先地位。

富瀚(Fullhan)公司的发展小趣事
确认测试用的负载设备是否工作正常,无异常波动或故障。
Flamar公司的发展小趣事

面对电子行业供应链日益复杂的挑战,Flamar公司高度重视供应链管理和优化工作。公司通过引入先进的供应链管理系统,实现了对原材料采购、生产制造、物流配送等各个环节的精准控制。同时,公司还积极与上下游企业建立长期稳定的合作关系,共同构建高效的供应链生态体系。这些措施有效降低了公司的运营成本,提高了生产效率和产品质量,进一步增强了公司的市场竞争力。

EMC Technology RF Labs公司的发展小趣事

在追求经济效益的同时,RF Labs也注重可持续发展和环保责任。他们积极采用环保材料和绿色生产工艺,降低生产过程中的能耗和排放。同时,RF Labs还积极参与环保公益活动,推动电子行业的绿色发展。这些举措不仅体现了RF Labs的社会责任感,也为公司的长期发展奠定了坚实的基础。

DESIGNERSYSTEMS公司的发展小趣事

DESIGNERSYSTEMS公司意识到,要在电子行业持续发展,必须不断拓展市场。他们积极寻求跨界合作的机会,与汽车、医疗、航空航天等多个行业的领军企业建立了合作关系。通过跨界合作,DESIGNERSYSTEMS不仅将自身的技术优势应用于更广泛的领域,还从合作伙伴那里学到了更多行业知识和经验,进一步提升了自身的综合实力。

聚辰(Giantec)公司的发展小趣事

面对电子行业的快速变革和市场需求的不断变化,港源公司始终保持敏锐的市场洞察力和持续的创新精神。公司不断加大研发投入,推动产业升级和产品结构优化。通过技术创新和高效智造系统构建,港源公司实现了产品自动化制造的高覆盖率,并在精密小型化的塑胶五金零部件领域取得了突破性技术优势。这些努力不仅使港源公司在市场竞争中保持领先地位,还为公司未来的发展奠定了坚实的基础。

问答坊 | AI 解惑

基于状态机和流水线技术的3DES加密算法及其FPGA设计

摘要: 介绍了3DES加密算法的原理并详尽描述了该算法的FPGA设计实现。采用了状态机和流水线技术,使得在面积和速度上达到最佳优化;添加了输入和输出接口的设计以增强该算法应用的灵活性。各模块均用硬件描述语言实现,最终下载到FPGA芯片Stratix E ...…

查看全部问答>

微机原理试卷及答案

为了对付考试,自己把试卷好好的做了一下,弄成电子版,希望对大家有帮助!应该是没有什么错误答案!…

查看全部问答>

急急急!求wince下能浏览GIF动态图片的软件

在wince平台下怎么浏览gif格式图片啊,我试了好多软件怎么都解决不了呀?大家帮帮我啊 。…

查看全部问答>

正弦波的驱动能力

我用MCU和DA芯片,生成了一个100Hz 0~5V的正弦波,然后通过运放调整为-2.5~+2.5V的正弦波。 再用这个波形去驱动一个6Ω的自感式传感器。   问题: 当连接上这个线圈后,正常输出的正弦波变了,变成100Hz,-120mv~+120mv的类似于方波的波 ...…

查看全部问答>

MSP430F169如何与ADS931(一款AD芯片)连接

本人欲采用外部的AD模块进行模数转换,ADC芯片是TI的ADS931——我的办法是数据口与430的IO直接连,这样连接是否有问题?第二个问题是ADS931的CLK引脚和430该如何连接?谢谢 [ 本帖最后由 周星星在哈工程 于 2011-8-23 14:58 编辑 ]…

查看全部问答>

STM32-IAP-can谁有资料,例程里只有USART的的啊

YJYYT777@126.COM谁有资料发我下,谢谢了!…

查看全部问答>

四川赛区L题现场测试5.5V 时电压输出降低的同学请进

本帖最后由 paulhyde 于 2014-9-15 02:59 编辑 我们的作品在家测试一切正常,用现场的恒压源测试,高于7V都没有问题,到5.5V测试时,输出电压一下降至2.7V,用万用表测量作品输入电压仅4.6V,而恒压源显示为5.5V,有遇到这种情况的同学进来讨论。获 ...…

查看全部问答>

BBB突然就没办法启动了

BBB突然就没办法启动了,现在插上电源,电源指示灯闪一下就灭了,我检查了下也没有短路,怎么会这样哇.正常电压如图所示,我现在的电压情况是:离GND最近的,也就是GND上面的那个是5V(图中显示正常值是5V),右侧的三个电容中中间那个是1.1v(图中显示 ...…

查看全部问答>

请问谁写有MSP-EXP430G2的TCA6416A.h、LCD_128.h、HT1621.h、I2.h文件

如题请问谁写有MSP-EXP430G2的TCA6416A.h、LCD_128.h、HT1621.h、I2.h文件…

查看全部问答>