zoukankan      html  css  js  c++  java
  • 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通道配置为输出:
    0OC1高电平有效;
    1OC1低电平有效。
    CC1NP:输入/捕获1互补输出极性 (Capture/Compare 1 complementary output polarity)
    0OC1N高电平有效;
    1OC1N低电平有效。


    关于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:禁止刹车输入(BRKCCS时钟失效事件)
    1:开启刹车输入(BRKCCS时钟失效事件)

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

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

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

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


    因为我没有使用刹车,所以我的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寄存器)级别123后,该位不能被修改。
    8 OIS1:输出空闲状态1(OC1输出) (Output Idle state 1)
    0:当MOE=0时,如果实现了OC1N,则死区后OC1=0
    1:当MOE=0时,如果实现了OC1N,则死区后OC1=1
    注:已经设置了LOCK(TIMx_BKR寄存器)级别123后,该位不能被修改。

    这些类似的地方我也没有必要设置。

    为什么我要把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的电平依赖于MOEOSSIOSSROIS1OIS1N
    CC1E位的值。
    1:开启- OC1N信号输出到对应的输出引脚,其输出电平依赖于MOEOSSIOSSR
    OIS1OIS1NCC1E位的值。


    0 CC1E: 输入/捕获1输出使能 (Capture/Compare 1 output enable)
    CC1通道配置为输出:
    0: 关闭- OC1禁止输出,因此OC1的输出电平依赖于MOEOSSIOSSROIS1OIS1N
    CC1NE位的值。
    1: 开启- OC1信号输出到对应的输出引脚,其输出电平依赖于MOEOSSIOSSR
    OIS1OIS1NCC1NE位的值。


    至于锁定嘛,看下面表格就知道了。

    9:8 LOOK[1:0]: 锁定设置 (Lock configuration)
    该位为防止软件错误而提供写保护。
    00:锁定关闭,寄存器无写保护;
    01:锁定级别1,不能写入TIMx_BDTR寄存器的DTGBKEBKPAOE位和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] × TdtgTdtg = TDTS
    DTG[7:5]=10x => DT=(64+DTG[5:0]) × TdtgTdtg = 2 × TDTS
    DTG[7:5]=110 => DT=(32+DTG[4:0]) × TdtgTdtg = 8 × TDTS
    DTG[7:5]=111 => DT=(32+DTG[4:0])× TdtgTdtg = 16 × TDTS
    例:若TDTS = 125ns(8MHZ),可能的死区时间为:
    015875ns,若步长时间为125ns
    16us31750ns,若步长时间为250ns
    32us63us,若步长时间为1us
    64us126us,若步长时间为2us
    注:一旦LOCK级别(TIMx_BDTR寄存器中的LOCK)设为123,则不能修改这些位。


    举例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
       
    }

  • 相关阅读:
    尝试搭建springcloud项目(二)客户端client
    IDEA不识别yml
    尝试搭建springcloud项目(一)服务注册中心 Eureka
    curl与XPath
    curl发起网络请求
    Laravel Redis分布式锁的使用
    php 获取excel表格里面的数据
    php+redis实现简单秒杀抢购功能
    微信公众号模板消息推送
    永中,文档预览和转换的第三方平台
  • 原文地址:https://www.cnblogs.com/caiya/p/9341914.html
Copyright © 2011-2022 走看看