stm32關於PWM死區(Dead Zone)


=============================================================== 1 ====================================================================

PWM輸出時的Dead Zone(死區)作用是在電平翻轉時插入一個時間間隔,避免關閉前一個設備和打開后一個設備時因為開關速度的問題出現同時開啟狀態而增加負荷的情況(在沒有徹底關閉前打開了后一個設備),尤其是電流過大時容易造成短路等損壞設備,如:互補PWM波輸出在逆變器(直流轉交流)中的應用。

 

    PWM(Pulse Width Modulation),即脈寬調制,簡單來說就是一些矩形脈沖波形,PWM波形最重要的參數是頻率和占空比。PWM是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術,廣泛應用在測量、通信、功率控制與信號變換的許多領域中。

    更具體的理解是,通常大功率電機、變頻器等,末端都是由大功率管、IGBT等元件組成的H橋或3相橋。每個橋的上半橋和下半橋是絕對不能同時導通的,但高速的PWM驅動信號在達到功率元件的控制端時,往往會由於各種各樣的原因產生延遲的效果,造成某個半橋元件在應該關斷時沒有關斷,造成功率元件燒毀。

PWM死區(Dead <wbr>Zone)的作用和意義

PWM死區(Dead <wbr>Zone)的作用和意義
 

    當比較單元的比較操作被使能,就會產生波形PHx。PHx經過死區單元,就會輸出兩路互補的帶有死區的PWM波形DTPHx和DTPHx_。PHx、DTPHx、DTPHx_之間的關系如上圖,如果沒有死區,那么DTPHx和DTPHx_應該是完全互補的。DTPHx的導通時刻是在PHx的基礎上延時了1個死區時間,而關閉時刻未變。DTPHx_是在PHx取反的基礎上,也將導通時間延遲了1個死區時間,而關斷的時間沒有發生改變。


    對於比較先進的處理一般都帶有Dead Zone的配置,比如s5pv210處理器就可以配置成帶有Dead Zone互補的PWM波輸出,如下圖所示:

PWM死區(Dead <wbr>Zone)的作用和意義

 

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

不讓同邊導通 為死區。

=============================================================== 2 ====================================================================

 

死區,簡單解釋:
       通常,大功率電機、變頻器等,末端都是由大功率管、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()這兩個函數就可以了。

 

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

參考文章:

  https://blog.csdn.net/zwl1584671413/article/details/83305715

  https://blog.csdn.net/gtkknd/article/details/52840629

 

 

=======================================================  PWM的剎車輸出  ===================================================================

 

當觸發剎車事件時立即停止PWM的輸出,即緊急剎車。其參考說明圖如下:

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM