stm32 死區 剎車 pwm

摘自:http://blog.csdn.net/gtkknd/article/details/52840629


這是電機控制方面的,讓橋臂上的上面兩個管子或下面兩個同時給高電平即爲剎車。

不讓同邊導通 爲死區。

========================================================================

死區,簡單解釋:
       通常,大功率電機、變頻器等,末端都是由大功率管、IGBT等元件組成的H橋或3相橋。
每個橋的上半橋和下半橋是是絕對不能同時導通的,但高速的PWM驅動信號在達到功率元件的控制極時,往往會由於各種各樣的原因產生延遲的效果,造成某個半橋元件在應該關斷時沒有關斷,造成功率元件燒燬。
死區就是在上半橋關斷後,延遲一段時間再打開下半橋或在下半橋關斷後,延遲一段時間再打開上半橋,從而避免功率元件燒燬。這段延遲時間就是死區。(就是上、下半橋的元件都是關斷的)死區時間控制在通常的低端單片機所配備的PWM中是沒有的。


看STM32手冊 高級定時器有這麼一行 一直不理解deadtime什麼意思


16-bit, motor control PWM timer with deadtime generation and emergency stop


死區,簡單解釋:通常,大功率電機、變頻器等,末端都是由大功率管、IGBT等元件組成的H橋或3相橋。每個橋的上半橋和下半橋是是絕對不能同時導通的,但高速的PWM驅動信號在達到功率元件的控制極時,往往會由於各種各樣的原因產生延遲的效果,造成某個半橋元件在應該關斷時沒有關斷,造成功率元件燒燬。死區就是在上半橋關斷後,延遲一段時間再打開下半橋或在下半橋關斷後,延遲一段時間再打開上半橋,從而避免功率元件燒燬。這段延遲時間就是死區。(就是上、下半橋的元件都是關斷的)死區時間控制在通常的低端單片機所配備的PWM中是沒有的。


==============================================================================

PWM的上下橋臂的三極管是不能同時導通的。如果同時導通就會是電源兩端短路。所以,兩路觸發信號要在一段時間內都是使三極管斷開的。這個區域就叫做“死區”優點就不用說了。缺點是使諧波的含量有所增加


附:

H橋驅動電路原理


一、H橋驅動電路
圖4.12中所示爲一個典型的直流電機控制電路。電路得名於“H橋驅動電路”是因爲它的形狀酷似字母H。4個三極管組成H的4條垂直腿,而電機就是H中的橫槓(注意:圖4.12及隨後的兩個圖都只是示意圖,而不是完整的電路圖,其中三極管的驅動電路沒有畫出來)。如圖所示,H橋式電機驅動電路包括 4個三極管和一個電機。要使電機運轉,必須導通對角線上的一對三極管。根據不同三極管對的導通情況,電流可能會從左至右或從右至左流過電機,從而控制電機的轉向。


要使電機運轉,必須使對角線上的一對三極管導通。例如,如圖4.13所示,當Q1管和Q4管導通時,電流就從電源正極經Q1從左至右穿過電機,然後再經 Q4回到電源負極。按圖中電流箭頭所示,該流向的電流將驅動電機順時針轉動。當三極管Q1和Q4導通時,電流將從左至右流過電機,從而驅動電機按特定方向轉動(電機周圍的箭頭指示爲順時針方向)。



圖4.14所示爲另一對三極管Q2和Q3導通的情況,電流將從右至左流過電機。當三極管Q2和Q3導通時,電流將從右至左流過電機,從而驅動電機沿另一方向轉動(電機周圍的箭頭表示爲逆時針方向)。


二、使能控制和方向邏輯
驅動電機時,保證H橋上兩個同側的三極管不會同時導通非常重要。如果三極管Q1和Q2同時導通,那麼電流就會從正極穿過兩個三極管直接回到負極。此時,電路中除了三極管外沒有其他任何負載,因此電路上的電流就可能達到最大值(該電流僅受電源性能限制),甚至燒壞三極管。基於上述原因,在實際驅動電路中通常要用硬件電路方便地控制三極管的開關。


===========================================================================================================================

一、死區設置位置: 
    決定死區時間設置的位是‘剎車和死區寄存器
    TIM1->BDTR’中的DTG[7:0],設置範圍是0x00~0xff。




例子:這樣當我需要3us的死區持續時間時,則可這麼計算:

3us在第二個公式決定的死區範圍之內。所以選擇第二個公式。

3000/(13.89*2)=108,所以DTG[5:0]=108-64=44,所以DTG=127+44=171=0XabTIM1->BDTR|=0xab;

反過來驗算//72Mhz,死區時間=13.89nsX108*2=3000us

經示波器驗證,完全正確

-----------------------------------------------------------------------------------------------------------------------------------------------

在<stm32參考手冊>全文搜索:Tdts,你可以大概知道Tdts的由來,另外,注意看定時器的框圖,這個很重要.


確定好Tdts,根據提供的公式計算就是了。

================================================================================



================================================================================

學習後發現stm32的定時器功能確實很強大,小總結一下方便以後使用的時候做參考。Stm32定時器一共分爲三種:tim1和tim8是高級定時器,6和7是基本定時器,2—5是通用定時器。從名字就可以看得出來主要功能上的差異。今天我主要是用定時器做pwm輸出,所以總結也主要是針對pwm方面的。


       先大致說下通用和高級定時器的區別。通用的可以輸出四路pwm信號互不影響。高級定時器可以輸出三對互補pwm信號外加ch4通道,也就是一共七路。


所以這樣算下來stm32一共可以生成4*5+7*2=30路pwm信號。接下來還有功能上的區別:通用定時器的pwm信號比較簡單,就是普通的調節佔空比調節頻率(別的不常用到的沒去深究);高級定時器的還帶有互補輸出功能,同時互補信號可以插入死區,也可以使能剎車功能,從這些看來高級定時器的pwm天生就是用來控制電機的。


 


Pwm輸出最基本的調節就是頻率和佔空比。頻率當然又和時鐘信號扯上了關係。高級定時器是掛接到APB2上,而通用定時器是掛接到APB1上的。APB1和APB2的區別就要在於時鐘頻率不同。APB2最高頻率允許72MH,而APB1最高頻率爲36MHZ。這樣是不是通用定時器只最高36MHZ頻率呢,不是的;通用定時器時鐘信號完整的路線應該是下面這樣的:


AHB(72mhz)→APB1分頻器(默認2)→APB1時鐘信號(36mhz)→倍頻器(*2倍)→通用定時器時鐘信號(72mhz)。


在APB1和定時器中間的倍頻器起到了巨大的作用,假如紅色字體的“APB1分頻器”假如不爲1(默認是2),倍頻器會自動將APB1時鐘頻率擴大2倍後作爲定時器信號源,這個它內部自動控制的不用配置。設置這個倍頻器的目的很簡單就是在APB1是36mhz的情況下通用定時器的頻率同樣能達到72mhz。我用的庫函數直接調用函數SystemInit(); 這個函數之後時鐘配置好了:通用定時器和高級定時器的時鐘現在都是72mhz(你也可以自己再配置一下RCC讓他的頻率更低,但是不能再高了)。定時器接下來還有一個分頻寄存器:TIMX_PSC經過他的分頻後,纔是定時器計數的頻率。所以真正的時鐘頻率應該是72mhz/(TIMX_PSC-1),我們設爲tim_frepuency下面還會用到。


stm32的時鐘頻率弄得確實是很饒人的,所以關鍵就是先要把思路理清楚。時鐘的頻率弄好了下面終於可以開說重點PWM了。當然還少不了頻率:pwm主要就是控制頻率和佔空比的:這兩個因素分別通過兩個寄存器控制:TIMX_ARR和TIMX_CCRX。ARR寄存器就是自動重裝寄存器,也就是計數器記到這個數以後清零再開始計,這樣pwm的頻率就是tim_frequency/(TIMX_ARR-1)。在計數時會不停的和CCRX寄存器中的數據進行比較,如果小於的話是高電平或者低電平,計數值大於CCRX值的話電平極性反相。所以這也就控制了佔空比。


 


下面是定時器1的配置代碼:


        GPIO_InitTypeDef GPIO_InitStructure2;


        TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;


        TIM_OCInitTypeDef TIM_OCInitStructure;


        TIM_BDTRInitTypeDef TIM_BDTRInitStructure;


        //第一步:配置時鐘       


        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|


                                                   RCC_APB2Periph_GPIOB|RCC_APB2Periph_TIM1,ENABLE);


        //第二步,配置goio口


/********TIM1_CH1 引腳配置*********/       


        GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_8;


        GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;


        GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_AF_PP;                 //設置爲複用浮空輸出


        GPIO_Init(GPIOA,&GPIO_InitStructure2);


        /*********TIM1_CH1N 引腳配置********/


        GPIO_InitStructure2.GPIO_Pin=GPIO_Pin_13;


        GPIO_InitStructure2.GPIO_Speed=GPIO_Speed_50MHz;


        GPIO_InitStructure2.GPIO_Mode=GPIO_Mode_AF_PP;                 //設置爲複用浮空輸出


        GPIO_Init(GPIOB,&GPIO_InitStructure2);


 


        //第三步,定時器基本配置       


TIM_TimeBaseStructure.TIM_Period=1000-1;             // 自動重裝載寄存器的值


        TIM_TimeBaseStructure.TIM_Prescaler=72-1;            // 時鐘預分頻數


        TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;    // 採樣分頻


        TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上計數


        TIM_TimeBaseStructure.TIM_RepetitionCounter=0;//重複寄存器,用於自動更新pwm佔空比                        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);


       


//第四步pwm輸出配置


        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;                    //設置爲pwm1輸出模式


        TIM_OCInitStructure.TIM_Pulse=500;                                            //設置佔空比時間


        TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;                 //設置輸出極性


        TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;        //使能該通道輸出


        //下面幾個參數是高級定時器纔會用到,通用定時器不用配置


        TIM_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_High;        //設置互補端輸出極性


        TIM_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;//使能互補端輸出


        TIM_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Reset;        //死區後輸出狀態


        TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCNIdleState_Reset;//死區後互補端輸出狀態


        TIM_OC1Init(TIM1,&TIM_OCInitStructure);                                            //按照指定參數初始化


 


 


        //第五步,死區和剎車功能配置,高級定時器纔有的,通用定時器不用配置


        TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Disable;//運行模式下輸出選擇


        TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;//空閒模式下輸出選擇


        TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;         //鎖定設置


        TIM_BDTRInitStructure.TIM_DeadTime = 0x90;                                         //死區時間設置


        TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;                 //剎車功能使能


        TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;//剎車輸入極性


        TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;//自動輸出使能


        TIM_BDTRConfig(TIM1,&TIM_BDTRInitStructure);       


 


 


//第六步,使能端的打開


TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //使能TIMx在CCR1上的預裝載寄存器


        TIM_ARRPreloadConfig(TIM1, ENABLE);                //使能TIMx在ARR上的預裝載寄存器


        TIM_Cmd(TIM1,ENABLE);                                                           //打開TIM2


        //下面這句是高級定時器纔有的,輸出pwm必須打開


        TIM_CtrlPWMOutputs(TIM1, ENABLE);                                   //pwm輸出使能,一定要記得打開


 


TIM_OC1PreloadConfig(),TIM_ARRPreloadConfig();這兩個函數控制的是ccr1和arr的預裝在使能,使能和失能的區別就是:使能的時候這兩個局存期的讀寫需要等待有更新事件發生時才能被改變(比如計數溢出就是更新時間)。失能的時候可以直接進行讀寫而沒有延遲。


另外在運行當中想要改變pwm的頻率和佔空比調用:TIM_SetAutoreload()


TIM_SetCompare1()這兩個函數就可以了。

===========================================================================

http://blog.csdn.net/dazhaozi/article/details/6868414

http://blog.csdn.net/dazhou158/article/details/8806174

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章