久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 11769|回復: 1
打印 上一主題 下一主題
收起左側

STM32F103VET6的TIM1輸出帶延時的互補PWM

[復制鏈接]
跳轉到指定樓層
樓主
ID:76127 發(fā)表于 2015-4-4 19:21 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
要求得到下列波形,死區(qū)時間1us,CH1和CH1之間的相位差事3us,頻率50HZ。



1,To get TIM1 counter clock at 72MHz,the prescaler is computer as follows:
          Prescaler = (TIM1CLK / TIM1 counter clock) - 1
     To objective is to genterate PWM signal at 50KHz:
          -TIM1_Priod = (SystemCoreClock / 50000) - 1
     To get TIM1 output clock at 50KHz , the period (ARR) is computed as follows :
          ARR = (TIM1 counter clock / TIM1 output clock) - 1
     The Two Duty cycles are computed as the following description :  
            TIM1 Channel1 duty cycle = (TIM1_CCR1 / TIM1_ARR)*100 = 50%
            TIM1 Channel2 duty cycle = (TIM1_CCR1 / TIM1_ARR)*100 = 50%
     The Timer pulse is calculated as follows :
            TIM1_CCRx = (DutyCycle * TIM1_ARR) / 100
2,死區(qū)時間deadtime的計算方法
      UTG[7:0]:死區(qū)發(fā)生器裝置,這些位定義了插入互補輸出之間的死區(qū)持續(xù)時間,假設DT標示其持續(xù)時 間:
      DTG[7:0] = 0xx      =>      DT = DTG[7:0]× Tdtg , Tdtg = TDTS ;
      DTG[7:0] = 10x      =>      DT = (64 +  DTG[5:0])× Tdtg , Tdtg = 2×TDTS ;
      DTG[7:0] = 110      =>      DT = (32 +  DTG[4:0])× Tdtg , Tdtg = 8×TDTS ;
      DTG[7:0] = 111      =>      DT = (32 +  DTG[4:0])× Tdtg , Tdtg = 16×TDTS ;      例子:若TDTS =  13.89ns(72MHz),可能的死區(qū)時間位:
      0到1764ns,若步長13.89ns;
      1777.9ns到3528.88ns;
      3555.84ns到7000.56ns;
      7111.68ns到14001.12ns;
如果 deadtime=1us,落在區(qū)間0到1764ns,所以公式選擇& amp;nbsp;DTG[7:0] = 0xx      =>      DT = DTG[7:0]× Tdtg , Tdtg = TDTS ;
     1us = x 13.89ns,x=72,DTG[7:0]=0x72。假設是用第二個公式得到的30則DTG[5:0]=0b11110,加上DTG的前兩位就是 DTG[7:          0]=0b1011110=0x5E;
3,Configure the break feature,active at High level,and using the automatic output enable feature
4,Use the Locking parameters level1
5,要求這兩個通道的波形不對齊,那么TIM1_CCMR1的OC1M[2:0]必須設定為011,即 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_Toggle;這樣ARR走兩趟才是一個周期。
6,要求PWM輸出頻率為50KHz。所以ARR=(72MHz/100000)-1=719
      因為ARR加1的時間為(1/72MHz)s,則(1/72MHz)X=3us。X=216即CCR1、 CCR2之間相隔216時,PWM的相位差是3us。

      程序如下:< /div>void TIM1_PWM_DeadtimeInit(uint16_t arr,uint16_t psc,uint16_t ccr1,uint16_t ccr2,uint16_t deadtime)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStructure;
    TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
   
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB,ENABLE);
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

    /*************************************************
    *采用寄存器模式  
    *TIM1的互補PWM,沒有使用重映像,CH1-PA8,CH1-PB13< /div>    GPIOA->CRH&=0XFFFFFFF0;   //PA8輸出
    GPIOA->CRH|=0X0000000B;   //復用功能輸出 推挽式   
    GPIOA->ODR|=3<<8;
   
    GPIOB->CRH&=0XFF0FFFFF;   //PB13輸出
    GPIOB->CRH|=0X00B00000;   //復用功能輸出 推挽式   
    GPIOB->ODR|=3<<13;
    ***************************************************/
    /**************************************************/
    /*TIM1的互補PWM,沒有使用重映像,CH1-PA8,CH1-PB13*/< /div>    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8 | GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);
   
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_13 | GPIO_Pin_14;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOB,&GPIO_InitStructure);
    /*************************************************/
    /*************************************************
    *TIM1的互補PWM,使用完全重映射,CH1-PE9,CH1N-PE8*< /div>    GPIO_PinRemapConfig(GPIO_FullRemap_TIM1,ENABLE);//使用 AFIO_MARP的位7:6=11,完全重映像TIM1_CH1到PE9,TIM1_CH1N到PE8
<div& gt;    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9;    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOE,&GPIO_InitStructure);
    *************************************************/
    /**問題是當使用不完全重映射的互補PWM出現(xiàn)問題****< /div>    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM1,ENABLE);//使用 AFIO_MARP的位7:6=01,部分重映像TIM1_CH1到PA8,TIM1_CH1N到PA7
<div& gt;    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_7 | GPIO_Pin_8;    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
    GPIO_Init(GPIOA,&GPIO_InitStructure);   
    ************************************************/
    //TIM1
    TIM_TimeBaseStructure.TIM_Period=arr;
    TIM_TimeBaseStructure.TIM_Prescaler=psc;
    TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
    TIM_TimeBaseStructure.TIM_ClockDivision=0;
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
    TIM_TimeBaseInit(TIM1,&TIM_TimeBaseStructure);
   
    TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_Toggle;//翻轉,當 TIMx_CCR1=TIMx_CNT時,翻轉OC1REF的電平
    TIM_OCInitStructure.TIM_Pulse=ccr1;
    TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High; //CCER的CC1P,輸入/捕獲輸出極性
    TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCPolarity_High;
   
    TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; //CER的CC1N,輸入/捕獲輸出使能
    TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
    TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset; //OIS1位
    TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset; //CR2的OIS1N位,當MOE位0時,輸出空閑狀態(tài)位OIS1N.
    TIM_OC1Init(TIM1,&TIM_OCInitStructure);
     
    TIM_OCInitStructure.TIM_Pulse=ccr2;//316
    TIM_OC2Init(TIM1,&TIM_OCInitStructure);
   
    TIM_BDTRInitStructure.TIM_OSSRState=TIM_OSSRState_Disable; //OSSR:運行模式下“關閉狀態(tài)”選擇(Off-state selection for Run mode)
    TIM_BDTRInitStructure.TIM_OSSIState=TIM_OSSIState_Disable; //OSSI:空閑模式下“關閉狀態(tài)”選擇 (Off-state selection for Idle mode)
    TIM_BDTRInitStructure.TIM_LOCKLevel=TIM_LOCKLevel_1;//鎖定設 置,級別為1,
    TIM_BDTRInitStructure.TIM_DeadTime=deadtime;//死區(qū)延時時間< /div>    TIM_BDTRInitStructure.TIM_Break=TIM_Break_Disable;//禁止剎車輸 入
    TIM_BDTRInitStructure.TIM_BreakPolarity=TIM_BreakPolarity_Low; //剎車輸入極性
    TIM_BDTRInitStructure.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable; //自動輸出使能
    TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);
   
    TIM_CtrlPWMOutputs(TIM1,ENABLE);//BDTR的MOE位< /div>   
    TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);//CCMR1
    TIM_OC2PreloadConfig(TIM1,TIM_OCPreload_Enable);//CCMR1
    TIM_ARRPreloadConfig(TIM1,ENABLE);//CR1
    TIM_Cmd(TIM1,ENABLE);//CR1
}< /div>

主函數(shù)調(diào)用
void main(void)
{
    ......
    TIM1_PWM_DeadtimeInit(719,0,100,316,72)//uint16_t arr,uint16_t psc,uint16_t ccr1,uint16_t ccr2,uint16_t deadtime
}
                                                                                            
                                       





分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發(fā)
ID:196955 發(fā)表于 2017-5-5 15:33 | 只看該作者
你好,你有這個源程序嗎
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲性免费 | 色妞av | 女人毛片a毛片久久人人 | 久久99精品久久久久久 | 亚洲第一网站 | 在线播放中文字幕 | 国产97碰免费视频 | av毛片免费 | 黄色网址av | 欧美精品在线播放 | 国产精品毛片一区二区在线看 | 欧美精品一区在线观看 | 精品国产乱码久久久久久蜜退臀 | 狼色网| 国产一卡二卡三卡 | 天天搞天天搞 | 欧美中文字幕在线观看 | 国产乱码精品一区二区三区中文 | 国产露脸国语对白在线 | 国产一级黄色网 | 日韩欧美中文 | 日韩色视频 | 久久国产精品久久 | 九九热免费在线观看 | 综合天天久久 | 美女视频黄的免费 | 欧美精品一区二区免费 | 精品视频久久久久久 | 亚洲精品久久久久久一区二区 | 亚洲在线| 国产一区二区三区久久久久久久久 | 91在线观看视频 | 亚洲精品久久久久中文字幕欢迎你 | 亚洲精品不卡 | 日本久久精品视频 | 97人人干 | 久久亚洲国产精品 | 亚洲丝袜天堂 | 精品96久久久久久中文字幕无 | 黄色国产视频 | 龙珠z在线观看 |