STM32的TIM1之PWM互補輸出_死區時間和剎車配置

STM32的TIM1之PWM互補輸出_死區時間和剎車配置

1、定時器1的PWM輸出通道

STM32高級定時器TIM1在用作PWM互補輸出時,共有4個輸出通道,其中有3個是互補輸出通道,如下:

通道1:TIM1_CH1對應PA8引腳,TIM1_CH1N對應PB13引腳;

通道2:TIM1_CH2對應PA9引腳,TIM1_CH2N對應PB14引腳;

通道3:TIM1_CH3對應PA10引腳,TIM1_CH3N對應PB15引腳;

通道4:TIM1_CH4對應PA11引腳;

STM32高級定時器TIM1的PWM剎車引腳TIM1_BKIN對應PB12引腳;

2、PWM互補輸出的意義

在使用互補輸出時,通常需要考慮死區時間,防止互補引腳控制的功率管同時而導通引起燒壞。見下圖:

如果死區Deadtime>0,則在TIM1_CH1和TIM1_CH1N輸出波形中插入“死區時間”,可防止TIM1_CH1和TIM1_CH1N控制的功率管同時導通。

3、互補輸出

如果死區Deadtime=0,則TIM1_CH1N的輸出波形是TIM1_CH1的反相;當死區時間為0,且沒有收到剎車信號時,如果TIM1_CH1輸出高電平,則TIM1_CH1N一定會輸出低電平,我們稱之為互補輸出。

4、PWM剎車

PWM剎車,就是停止PWM輸出波形。

5、PWM的“有效電平”和“無效電平”定義:

在PWM模式1中

1)、在向上計數時,一旦TIMx_CNT<TIMx_CCR1時,通道1引腳輸出“有效電平”,否則輸出“無效電平”;

2)、在向下計數時,一旦TIMx_CNT>TIMx_CCR1時,通道1引腳輸出“無效電平”(OC1REF=0),否則輸出“有效電平”(OC1REF=1)。

在PWM模式2中

1)、在向上計數時,一旦TIMx_CNT<TIMx_CCR1時,通道1引腳輸出“無效電平”,否則輸出“有效電平”;

2)、在向下計數時,一旦TIMx_CNT>TIMx_CCR1時,通道1引腳輸出“有效電平”,否則輸出“無效電平”。

6、PWM在死區期間輸出的電平

1)、若配置了死區時間,則在死區期間,通道1引腳輸出的電平和其“無效電平”保持一致。

2)、將“死區期間和無效電平期間”的TIM1_CH1和TIM1_CH1N配置輸出為低電平:

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

//TIM1_CH1引腳輸出有效電平為高電平,則在死區期間和無效電平期間均為低電平

TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;

// TIM1_CH1N引腳輸出有效電平為高電平,則在死區期間和無效電平期間均為低電平

3)、死區時間

? TIM_BDTRInitStructure.TIM_DeadTime = 11;

? //輸出比較信號死區時間配置,具體如何計算可參考 BDTR:DTG[7:0]的描述

? //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=tCKINT=1/72000000=13.8ns,11*13.8=152.7ns

? //這里配置的死區時間為152ns

7、PWM空閑電平極性配置和PWM剎車的關系

TIM1_CH1和TIM1_CH1N引腳的“空閑電平極性”指的是在“剎車”時TIM1_CH1和TIM1_CH1N引腳輸出的極性。

剎車輸出配置:

1)、TIM1_CH1和TIM1_CH1N輸出配置為互異電平,可能會導致無法剎車;

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

2)、TIM1_CH1和TIM1_CH1N輸出同時配置為低電平,當剎車信號到來時,會執行有效剎車;

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;

TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

3)、TIM1_CH1和TIM1_CH1N輸出同時配置為高電平,當剎車信號到來時,會執行有效剎車;

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;

8、TIM1之PWM程序舉例:

void TIM1_GPIO_Config(void)

{

??? GPIO_InitTypeDef GPIO_InitStructure;

/// TIM1_CH1引腳初始化///

??? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

??? //使能PA口時鐘

? GPIO_InitStructure.GPIO_Pin =? GPIO_Pin_8;

? //PA8為TIM1_CH1通道,TIM1輸出比較通道

? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

? //設置引腳為復用推挽輸出

? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

? //設置引腳的最高輸出速率為50MHz

? GPIO_Init(GPIOA, &GPIO_InitStructure);

?/// TIM1_CH1N引腳初始化///

??? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

? GPIO_InitStructure.GPIO_Pin =? GPIO_Pin_13;

? //PB13為TIM1_CH1N通道,TIM1輸出比較通道的互補通道

? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

? //設置引腳為復用推挽輸出

? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

? //設置引腳的最高輸出速率為50MHz

? GPIO_Init(GPIOB, &GPIO_InitStructure);

? //TIM1_BKIN剎車引腳初始化/

??? RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

? GPIO_InitStructure.GPIO_Pin =? GPIO_Pin_12;

?? //PB12對應TIM1_BKIN,為PWM剎車引腳

? GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;

?? //設置引腳為浮空輸入?

? GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

? //設置引腳的最高輸出速率為50MHz

? GPIO_Init(GPIOB, &GPIO_InitStructure);

}

void TIM1_Mode_Config(void)

{

??? TIM_TimeBaseInitTypeDef? TIM_TimeBaseStructure; //時基結構體

??? TIM_OCInitTypeDef? TIM_OCInitStructure;???????? //輸出比較結構體

??? TIM_BDTRInitTypeDef TIM_BDTRInitStructure;????? //剎車結構體

??? RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1,ENABLE);

??? //使能TIM1時鐘,即內部時鐘CK_INT=72M

/*--------------------時基結構體初始化-------------------------*/

??? TIM_TimeBaseStructure.TIM_Period=(8-1);//周期ARR

//自動重裝載寄存器的值,累計(TIM_Period+1)個"分頻時鐘"后產生一個更新或者中斷

??? TIM_TimeBaseStructure.TIM_Prescaler= (9-1);

??? //TIM1時鐘分頻因子PSC

??? TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

?? ?//時鐘分頻因子 = 1,tDTS=tCKINT

??? //PWM 信號的頻率 F = TIM_CLK/{(ARR+1)*(PSC+1)}

??? //72000000/(8*9)=1000000Hz=1MHz

??? TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

??? //計數器計數模式,設置為向上計數

??? TIM_TimeBaseStructure.TIM_RepetitionCounter=0;

??? //重復計數器的值,沒用到不用管

??? TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);//初始化定時器

??? /*--------------------輸出比較結構體初始化-------------------*/

??? TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

??? //配置為PWM模式1

??? TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

??? //PWM輸出使能

??? TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;

??? //互補輸出使能

? TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

? //TIM1_CH1引腳輸出有效電平為高電平,則在死區期間和無效期間均為低電平

? TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;

? //TIM1_CH1N引腳輸出有效電平為高電平,則在死區期間和無效空閑期間均為低電平

//TIM1_CH1和TIM1_CH1N輸出配置為互異電平,導致會無法剎車,死區期間的輸出電平這個設置無關/

//? TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

//剎車時,TIM1_CH1引腳為高電平

//? TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

//剎車時,互補輸出TIM1_CH1N引腳為低電平

//TIM1_CH1和TIM1_CH1N輸出同時配置為低電平,當剎車信號到來時,會執行有效剎車/

??? TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;

?? ?//剎車時,TIM1_CH1引腳為低電平

??? TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

??? //剎車時,互補輸出TIM1_CH1N引腳為低電平

//TIM1_CH1和TIM1_CH1N輸出同時配置為高電平,當剎車信號到來時,會執行有效剎車/

//? TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

//剎車時,TIM1_CH1引腳為高電平

//? TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;

//剎車時,TIM1_CH1N引腳為高電平

??? TIM_OCInitStructure.TIM_Pulse = (5-1); //占空比 = 4 / 8 = 50%

??? TIM_OC1Init(TIM1, &TIM_OCInitStructure);//初始化PWM輸出通道1

??? TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

??? //開啟通道1預裝載,在更新時間后才會重新裝載數值

??? /*-------------------剎車和死區結構體初始化-------------------*/

??? // 有關剎車和死區結構體的成員具體可參考BDTR寄存器的描述

? TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;

? //運行模式下“關閉模式”選擇 = 1

? TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;

? //空閑模式下“關閉模式”選擇 = 1

? TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;

? //鎖定級別1,見參考手冊

? TIM_BDTRInitStructure.TIM_DeadTime = 11;

??? //輸出比較信號死區時間配置,具體如何計算可參考 BDTR:DTG[7:0]的描述

? //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=tCKINT=1/72000000=13.8ns,11*13.8=152.7ns

??? //這里配置的死區時間為152ns

? TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;//開啟剎車功能

? TIM_BDTRInitStructure.TIM_BreakPolarity =TIM_BreakPolarity_Low;

? //PWM剎車時,輸入低電平有效,則不會產生任何PWM輸出波形

? TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

? //開啟自動輸出

? TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

??? TIM_Cmd(TIM1, ENABLE);//使能定時器,計數器開始計數??

??? TIM_CtrlPWMOutputs(TIM1, ENABLE);

??? //主輸出使能,當使用的是通用定時器時,這句不需要

}

void TIM1_PWM_Init(void)

{

??? TIM1_GPIO_Config();

??? TIM1_Mode_Config();

}

9、測試結果

PWM剎車實驗

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/44500.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/44500.shtml
英文地址,請注明出處:http://en.pswp.cn/web/44500.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LDAPWordlistHarvester:基于LDAP數據的字典生成工具

關于LDAPWordlistHarvester LDAPWordlistHarvester是一款功能強大的字典列表生成工具&#xff0c;該工具可以根據LDAP中的詳細信息生成字典列表文件&#xff0c;廣大研究人員隨后可以利用生成的字典文件測試目標域賬號的非隨機密碼安全性。 工具特征 1、支持根據LDAP中的詳細信…

STM32F103RC使用HAL庫配置USART進行數據收發

目錄 STM32F103RC使用HAL庫配置USART進行數據收發&#xff08;代碼模塊&#xff09; 一、USART初始化 二、USART使用的GPIO初始化 三、USART的接收中斷配置 四、USART的數據發送 五、補充 STM32F103RC使用HAL庫配置USART進行數據收發&#xff08;代碼模塊&#xff09; 一…

JavaDS —— 棧 Stack 和 隊列 Queue

棧的概念 棧是一種先進后出的線性表&#xff0c;只允許在固定的一端進行插入和刪除操作。 進行插入和刪除操作的一端被稱為棧頂&#xff0c;另一端被稱為棧底 棧的插入操作叫做進棧/壓棧/入棧 棧的刪除操作叫做出棧 現實生活中棧的例子&#xff1a; 棧的模擬實現 下面是Jav…

windows USB 設備驅動程序開發-總線接口查詢

總線接口的查詢 USB 客戶端驅動程序可以獲取對USB總線驅動程序接口的引用&#xff0c;并使用它來訪問總線驅動程序例程&#xff0c;而不是使用 I/O 請求數據包 (IRP) 機制。 使用總線驅動程序接口為客戶端驅動程序提供了幾個優勢&#xff1a; 它可以使用接口的服務&#xff…

對接企業微信API自建應用配置企業可信IP

前言 為了實現系統調用團隊會議功能&#xff0c;組織發起企業微信會議&#xff0c;于是需要和企業微信做API對接。對接過程很難受&#xff0c;文檔不清晰、沒有SDK、沒有技術支持甚至文檔報文和實際接口報文都不匹配&#xff0c;只能說企業微信的API是從業以來見過的最難用的AP…

[Spring] Spring Web MVC基礎理論

&#x1f338;個人主頁:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;?熱門專欄: &#x1f9ca; Java基本語法(97平均質量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection與…

n3.平滑升級和回滾

平滑升級和回滾 1. 平滑升級流程2. 平滑升級和回滾案例 有時候我們需要對Nginx版本進行升級以滿足對其功能的需求&#xff0c;例如添加新模塊&#xff0c;需要新功能&#xff0c;而此時 Nginx又在跑著業務無法停掉&#xff0c;這時我們就可能選擇平滑升級 1. 平滑升級流程 平…

使用ChatGPT來撰寫和潤色學術論文的教程(含最新升級開桶ChatGpt4教程)

現在有了ChatGPT4o更加方便了, 但次數太少了 想要增加次數可以考慮升級開桶ChatGpt4 一、引言 在學術研究中&#xff0c;撰寫高質量的論文是一項重要的技能。本教程將介紹如何利用ChatGPT來輔助完成從論文構思到潤色的全過程。 二、使用ChatGPT寫論文 1. 寫標題 Title/Topic…

【TB作品】51單片機,MSP430單片機,STM32單片機,簡易波形發生器

https://docs.qq.com/sheet/DUEdqZ2lmbmR6UVdU?tabBB08J2二、 簡易波形發生器 &#xff08;限MSP430、STM32單片機&#xff09; 任務要求&#xff1a; 制作一個簡易波形發生器&#xff0c;具有如下功能&#xff1a; 1、能夠產生方波、正弦波&#xff0c;并可通過示波器觀察到&…

QT 多線程 QThread

繼承QThread的線程 繼承 QThread 是創建線程的一個普通方法。其中創建的線程只有 run() 方法在線程里的。其他類內定義的方法都在主線程內。 通過上面的圖我們可以看到&#xff0c;主線程內有很多方法在主線程內&#xff0c;但是子線程&#xff0c;只有 run() 方法是在子線…

基于STM32設計的藥品柜溫濕度監測系統(華為云IOT)(184)

基于STM32設計的藥品柜溫濕度監測系統(華為云IOT)(184) 文章目錄 一、前言1.1 項目介紹【1】項目功能介紹【2】整體需求總結【3】項目硬件模塊組成1.2 設計思路【1】整體設計思路【2】ESP8266工作模式配置【3】華為云IOT手機APP界面開發思路1.3 項目開發背景【1】選題的意義【2…

R語言學習筆記6-數據框

R語言學習筆記6-數據框 數據框(DataFrame)介紹數據框用途創建數據框從矩陣創建數據框索引和切片添加和修改列數據框的預處理數據框的排序數據框的合并與拆分數據框的計算與匯總數據框的篩選處理缺失值應用函數處理數據重塑數據框使用 dplyr 進行數據框的管道操作數據框的時間序…

使用 WebSocket 進行實時數據傳輸

以下是使用 WebSocket 進行實時數據傳輸的一般步驟&#xff1a; 一、前端部分 &#xff08;一&#xff09;創建 WebSocket 連接 const socket new WebSocket(ws://your-server-url); 在上述代碼中&#xff0c;將 ws://your-server-url 替換為您實際的服務器 WebSocket 地…

SvANet:微小醫學目標分割網絡,增強早期疾病檢測

SvANet&#xff1a;微小醫學目標分割網絡&#xff0c;增強早期疾病檢測 提出背景前人工作醫學對象分割微小醫學對象分割注意力機制 SvANet 結構圖SvANet 解法拆解解法邏輯鏈 論文&#xff1a;SvANet: A Scale-variant Attention-based Network for Small Medical Object Segmen…

【JAVA poi-tl-ext 富文本轉word】

富文本轉word 環境使用poi-tl-ext的原因富文本轉word代碼 環境 jdk 1.8 <dependency><groupId>io.github.draco1023</groupId><artifactId>poi-tl-ext</artifactId><version>0.4.16</version> </dependency>poi-tl-ext已經包…

可靈重大升級!新增Web端上線、首尾幀控制、單次生成視頻時長增加至10s!

快手視頻生成大模型“可靈”&#xff08;Kling&#xff09;&#xff0c;作為全球首個真正用戶可用的視頻生成大模型&#xff0c;自面世以來&#xff0c;憑借其無與倫比的視頻生成效果&#xff0c;在全球范圍內贏得了用戶的熱烈追捧與高度評價。截至目前&#xff0c;申請體驗其內…

修正版頭像上傳組件

修正版頭像上傳組件 文章說明核心源碼展示運行效果展示源碼下載 文章說明 在頭像剪切上傳一文中&#xff0c;我采用div做裁剪效果&#xff0c;感覺會有一些小問題&#xff0c;在昨天基于canvas繪制的功能中改進了一版&#xff0c;讓代碼變得更簡潔&#xff0c;而且通用性相對高…

永恒之藍:一場網絡風暴的啟示

引言 在網絡安全的漫長歷史中&#xff0c;“永恒之藍”&#xff08;EternalBlue&#xff09;是一個不可忽視的里程碑事件。它不僅揭示了網絡世界的脆弱性&#xff0c;還促使全球范圍內對網絡安全的重視達到了前所未有的高度。本文將深入探討“永恒之藍”漏洞的起源、影響及其對…

【WebGIS】從設計層面設計系統

本項目在通過現代信息技術手段&#xff0c;對古村古鎮進行多方位、多角度的數字化記錄、展示與傳播&#xff0c;實現文化遺產的數字化保護、活化利用與共享。項目內容主要包括&#xff1a;1&#xff09;古村古鎮數據庫的建立&#xff1a;通過多種渠道收集古村古鎮的各類信息&am…

期貨量化交易客戶端開源教學第八節——TCP通信服務類

private FReciveStr: AnsiString; {接收到的數據} IsConErr: Boolean; {網絡連接是否失敗} FSocket_LB: Integer; {TCP連接類別,0為交易,1為行情,2為查詢} FRetryCount: Integer; {網絡連接重試次數} FLoginErrEvent: TLoginErrEvent; {…