RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

PWM輸出配置方法

中科芯MCU ? 來源:中科芯MCU ? 2024-11-04 09:44 ? 次閱讀

MCU微課堂

CKS32F107xx TIM(二)

第四十七期 2024.11.01

PWM模式簡介

從上節(jié)課的定時器分類圖中我們了解到,互補輸出是高級定時器(TIM1、TIM8)所獨有的,它可以輸出兩路互補信號。而在本節(jié)課中我們將通過一個簡單的例程去介紹如何配置互補PWM輸出,同時為了演示在電機控制領(lǐng)域的入門應(yīng)用,該例程也增加了剎車和死區(qū)插入的功能。因此,接下來我們將先對PWM模式、互補輸出、死區(qū)插入、剎車功能這四個概念作簡要介紹,然后通過一個實驗例程來演示PWM輸出配置方法。

比較輸出是通過比較計數(shù)器CNT和捕獲/比較寄存器CCR的關(guān)系,來對輸出電平進行置1、置0或翻轉(zhuǎn)的操作,而PWM模式輸出的是一種脈沖寬度可調(diào)的方波信號,同時也是定時器(高級和通用)比較輸出模式中較為常用的一種,我們可以通過捕獲/比較模式寄存器CCMRx的位OCxM[2:0]來配置輸出。表1羅列了PWM1和PWM2的區(qū)別,并通過PWM1邊沿對齊的波形示例圖來簡述下PWM輸出的原理。

表1 PWM1和PWM2模式區(qū)別

fabf8174-98c5-11ef-a511-92fbcf53809c.png

fad83a7a-98c5-11ef-a511-92fbcf53809c.png

圖1 邊沿對齊的PWM1波形(TIMx_ARR=8)

如上圖所示,當(dāng)CNT < CCR時,參考信號OCxREF輸出為高,則通道OCx輸出1;當(dāng)CCR <= CNT <= ARR時,參考信號OCxREF輸出為低,則通道OCx輸出0。并且當(dāng)計數(shù)器CNT與比較寄存器CCR值匹配時,比較中斷寄存器CCxIF位會自動由硬件置 1;而CNT計數(shù)達到ARR的值時,會產(chǎn)生上溢事件,并且自動清零,然后重新向上計數(shù),如此循環(huán)往復(fù)。因此,我們可以通過修改ARR和CCR的值來靈活調(diào)整PWM波形的頻率和占空比。

定時器產(chǎn)生PWM 輸出,除了上節(jié)課提到的ARR、PSC、CNT,不得不提的還有捕獲/比較模式寄存器CCMR。該寄存器共有兩個,CCMR1(控制輸出通道1和2)和CCMR2(控制輸出通道3和4),且上面一層對應(yīng)比較輸出,下面一層對應(yīng)輸入捕獲,輸入捕獲模式將在下節(jié)課中介紹。由于本節(jié)課介紹的是互補PWM輸出,所以模式設(shè)置位OCxM[2:0],必須設(shè)置為110/111,對應(yīng)PWM1/PWM2,兩者區(qū)別是極性相反。下圖是CCMR1寄存器各位描述圖,具體請參照CKS32F107xx參考手冊。

fafa5ae2-98c5-11ef-a511-92fbcf53809c.png

圖2 CCMR1寄存器各位描述圖、

互補輸出和死區(qū)插入簡介

接下來將先通過捕獲/比較通道的輸出概覽圖來展現(xiàn)輸出控制過程。

fb609e42-98c5-11ef-a511-92fbcf53809c.png

圖3 捕獲/比較通道的輸出部分(通道CH1~CH3)

如上圖,紅框中是CNT和CCR比較,輸出參考信號OCxREF,銜接上文。綠框表明參考信號OCxREF在經(jīng)過死區(qū)發(fā)生器之后會產(chǎn)生兩路帶死區(qū)的互補信號OCx_DT和OCxN_DT,并且需要特別說明下,高級定時器(TIM1、TIM8)只有通道CH1~CH3才有互補信號。藍框是輸出控制電路,若沒有死區(qū)控制,則進入的信號即為OCxREF,且進入的信號會被分成極性相反的兩路,并由寄存器CCER的位CCxP和CCxNP控制極性,由CxE和CCxNP位使能輸出。若增加了剎車功能,則寄存器BDTR的位MOE、OSSI和OSSR將共同影響輸出信號。

關(guān)于死區(qū)插入,其中一個較為典型的應(yīng)用就是半橋驅(qū)動電路,比如上個時態(tài)MOS管M1導(dǎo)通,MOS管M2截止,下一時態(tài)需要M1截止,M2導(dǎo)通,由于工藝限制MOS管的關(guān)閉不能忽略不計,這就會導(dǎo)致M1和M2有同時導(dǎo)通的時間,進而損壞電路,所以可將M1關(guān)閉后等待一段時間再打開M2,這段時間可稱為死區(qū)時間。死區(qū)時間是通過寄存器BDTR的位DTG[7:0]來配置,死區(qū)時間的大小需要根據(jù)輸出通道相連接的器件特性來調(diào)整。下圖為帶死區(qū)插入的互補輸出圖,相信這樣能大家有個更為直觀的了解。

fb77f8f8-98c5-11ef-a511-92fbcf53809c.png

圖4 帶死區(qū)插入的互不輸出

剎車功能簡介

電路控制電機轉(zhuǎn)動出現(xiàn)異常時,若用軟件來關(guān)閉信號輸出,出于軟件延時的影響,可能帶來不必要的后果。在此工況下,高級定時器中的剎車功能能發(fā)揮特定優(yōu)勢,用戶只要將檢測端連接到TIMx_BKIN引腳,當(dāng)檢測到非正常態(tài),由硬件電路立刻關(guān)閉信號輸出,電機即可停止轉(zhuǎn)動。剎車功能是一種硬件保護保護,用戶需要配置剎車和死區(qū)寄存器BDTR,該寄存器各位描述如下:

fbbe1d1a-98c5-11ef-a511-92fbcf53809c.pngfbc7f100-98c5-11ef-a511-92fbcf53809c.png

圖5 BDTR寄存器各位描述圖

互補PWM輸出配置實驗

本實驗以高級定時器TIM1為例,并參照CKS32F107xx數(shù)據(jù)手冊的引腳定義章節(jié),分配了OC1(PA8)、OC1N(PB13)和BKIN(PB12)引腳。若我們在工程中選擇BKIN引腳高電平有效,那么當(dāng)BKIN引腳被置高時,兩路互補PWM信號立刻停止輸出。主要的編程要點如下。

1、開啟GPIO時鐘,配置引腳

要使用GPIOA、GPIOB的相關(guān)引腳,需要開啟端口時鐘,調(diào)用的函數(shù)為:

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

因為要將普通GPIO復(fù)用到定時器的相關(guān)引腳,所以要配置GPIO工作模式,示例代碼如下,以PA8配置為例,PB13和PB12配置雷同:

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

GPIO_Init(GPIOA, &GPIO_InitStructure);

2、TIM1時基結(jié)構(gòu)體設(shè)置

鑒于前一章節(jié)已詳述過,這里僅做代碼演示,針對TIM1時基初始化示例代碼格式如下:

TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;

TIM_TimeBaseStructure.TIM_Prescaler= 8;

TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;

TIM_TimeBaseStructure.TIM_Period=7;

TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;

TIM_TimeBaseStructure.TIM_RepetitionCounter=0;

TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

根據(jù)前文定時時間的描述,當(dāng)TIM1工作時鐘配置為72MHz時,那么示例代碼中配置的中斷次時間為:(8+1)*(7+1) / 72000000 = 1us,則PWM輸出的頻率為1MHz。

3、TIM1輸出比較結(jié)構(gòu)體設(shè)置

通過配置TIM1_CCMR1的相關(guān)位來設(shè)置TIM1_CH1的PWM模式。在庫函數(shù)中,PWM通道設(shè)置是通過函數(shù)TIM_OC1Init()~TIM_OC4Init()來設(shè)置的,不同通道的設(shè)置函數(shù)不一樣,使用時需要注意區(qū)分,這里我們選用CH1通道和CH1N通道,選用的庫函數(shù)如下:

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

輸出比較結(jié)構(gòu)體在庫函數(shù)中對應(yīng)名稱為TIM_OCInitTypeDef,下面是結(jié)構(gòu)體的定義:

typedef struct

{

uint16_t TIM_OCMode;

uint16_t TIM_OutputState;

uint16_t TIM_OutputNState;

uint16_t TIM_Pulse;

uint16_t TIM_OCPolarity;

uint16_t TIM_OCNPolarity;

uint16_t TIM_OCIdleState;

uint16_t TIM_OCNIdleState;

} TIM_OCInitTypeDef;

參數(shù)TIM_OCMode是用來設(shè)置比較輸出模式,這里我們選用PWM1模式。

參數(shù)TIM_OutputState和TIM_OutputNState用來配置OCx和OcxN通道輸出使能。

參數(shù)TIM_Pulse是設(shè)置比較寄存器CCR的值,決定脈沖寬度,對應(yīng)PWM1的占空比。

參數(shù)OCPolarity和TIM_OCNPolarity是設(shè)置OCx和OcxN通道極性,我們可以選擇高電平或低電平有效。

參數(shù)TIM_OCNIdleState和TIM_OCNIdleState是設(shè)置空閑狀態(tài)時OCx和OcxN通道輸出的電平。

針對TIM1輸出比較結(jié)構(gòu)體初始化示例如下:

TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;

TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;

TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;

TIM_OCInitStructure.TIM_Pulse = 4;

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;

TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;

TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;

TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;

TIM_OC1Init(TIM1, &TIM_OCInitStructure);

TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);

在該示例中,設(shè)置了工作模式PWM1,使能了OCx和OcxN通道,配置了脈沖寬度、輸出極性和空閑狀態(tài)下的輸出電平,所以PWM1的占空比為:CCR / (ARR + 1) = 50%。

4、TIM1斷路和死區(qū)結(jié)構(gòu)體設(shè)置

我們在庫函數(shù)中設(shè)置剎車和死區(qū)參數(shù)是通過函數(shù)TIM_BDTRCon?g來實現(xiàn)的,其結(jié)構(gòu)體TIM_BDTRInitTypeDef中列出了各個成員,以下是結(jié)構(gòu)體的定義:

Typedefstruct

{

uint16_tTIM_OSSRState;

uint16_tTIM_OSSIState;

uint16_tTIM_LOCKLevel;

uint16_tTIM_DeadTime;

uint16_tTIM_Break;

uint16_tTIM_BreakPolarity;

uint16_tTIM_AutomaticOutput;

}TIM_BDTRInitTypeDef;

這里結(jié)構(gòu)體中的成員可以對照上文BDTR寄存器的各位來理解,在此不再贅述,本實驗中我們針對TIM1斷路和死區(qū)結(jié)構(gòu)體初始化示例如下:

TIM_BDTRInitTypeDef TIM_BDTRInitStructure;

TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;

TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;

TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;

TIM_BDTRInitStructure.TIM_DeadTime = 11;

TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;

TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;

TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

在該示例中,配置的死區(qū)時間為11 / 72000000 = 152ns,配置BKIN引腳為高電平有效。

5、使能TIM1和主輸出

因為本實驗是互補PWM輸出,所以除了要開啟定時器,也要對定時器主輸出進行使能,配置示例如下:

TIM_Cmd(TIM1, ENABLE);

TIM_CtrlPWMOutputs(TIM1, ENABLE);

6、修改TIM1_CCR1來調(diào)整占空比

實際使用時,用戶需要控制占空比來調(diào)整電機的轉(zhuǎn)速,我們能通過修改TIM1_CCR1則可以控制CH1的輸出占空比。在庫函數(shù)中,修改TIM1_CCR1占空比的函數(shù)是:

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);

同樣的,對于其他三個通道,也有如下對應(yīng)函數(shù)供調(diào)用,用戶使用時注意區(qū)分即可。

void TIM_SetCompare2(TIM_TypeDef* TIMx, uint16_t Compare2);

void TIM_SetCompare3(TIM_TypeDef* TIMx, uint16_t Compare3);

void TIM_SetCompare4(TIM_TypeDef* TIMx, uint16_t Compare4);

只要按照上述配置,用戶在主函數(shù)中調(diào)用即可,我們示波器的兩個輸入通道分別接PA8、PB13引腳,可觀測到兩路互補帶死區(qū)插入的PWM波形,頻率為1MHz,占空比默認為50%(用戶可自行調(diào)整),死區(qū)時間為152ns左右。

fbedbeb2-98c5-11ef-a511-92fbcf53809c.png

如果將BKIN引腳拉高,可觀測到輸出信號立刻停止,若松開則恢復(fù)默認輸出。

fbfcec20-98c5-11ef-a511-92fbcf53809c.png

至此,本實驗已介紹完畢。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 寄存器
    +關(guān)注

    關(guān)注

    31

    文章

    5336

    瀏覽量

    120230
  • PWM
    PWM
    +關(guān)注

    關(guān)注

    114

    文章

    5181

    瀏覽量

    213793
  • 計數(shù)器
    +關(guān)注

    關(guān)注

    32

    文章

    2256

    瀏覽量

    94476
  • 定時器
    +關(guān)注

    關(guān)注

    23

    文章

    3246

    瀏覽量

    114715

原文標(biāo)題:MCU微課堂|CKS32F107xx TIM(二)

文章出處:【微信號:中科芯MCU,微信公眾號:中科芯MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    高級定時器PWM輸入模式的配置方法

    我們將向大家介紹高級定時器的另一個常見應(yīng)用——PWM輸入模式。在本節(jié)課中,我們將先圍繞輸入捕獲模式展開,并重點描述PWM輸入模式和涉及的寄存器,最后通過一個實驗例程去介紹PWM輸入模式的配置
    的頭像 發(fā)表于 11-08 16:48 ?2036次閱讀
    高級定時器<b class='flag-5'>PWM</b>輸入模式的<b class='flag-5'>配置</b><b class='flag-5'>方法</b>

    靈動微課堂《MM32 MCU使用分享》入駐智芯課堂

    :內(nèi)部溫度傳感器的配置方法11-1:DAC輸出配置方法12-1:TIMER定時器的配置
    發(fā)表于 06-05 15:55

    剎車配置PWM沒有輸出

    配置 TIM 剎車輸入遇到問題 如下是我的配置 和 原理圖這樣配置 PWM沒有輸出 但是如果將剎車極性改成High 就有
    發(fā)表于 01-08 09:35

    PWM輸出是如何配置

    PWM輸出是如何配置的?怎么配置TIM定時器為編碼模式呢?
    發(fā)表于 11-16 06:55

    STM32產(chǎn)生PWM配置方法

    目錄:一、引腳映像與寄存器1、定時器引腳復(fù)用功能映像2、定時器二、定時器PWM產(chǎn)生原理三、STM32產(chǎn)生PWM配置方法--------------------------------
    發(fā)表于 12-06 06:25

    PWM波形的輸出方法

    本篇應(yīng)用說明介紹了以200us 為周期的三個正相、三個反相,共計六相PWM波(三相、鋸齒波調(diào)制、無死區(qū)時間)的輸出方法。 復(fù)位同步PWM輸出波形
    發(fā)表于 09-13 10:14 ?6次下載
    <b class='flag-5'>PWM</b>波形的<b class='flag-5'>輸出方法</b>

    Firefly-RK3288PWM輸出介紹

    Firefly-RK3288 開發(fā)板上有 4 路 PWM 輸出,分別為 PWM0 ~ PWM3, 本章主要描述如何配置
    的頭像 發(fā)表于 11-25 10:31 ?2248次閱讀

    如何使用MPLAB代碼配置配置增強型PWM模塊

    本視頻在之前實驗的基礎(chǔ)上,繼續(xù)向大家介紹如何使用MPLAB代碼配置配置增強型PWM模塊,并使用生成的代碼產(chǎn)生增強型PWM輸出。
    的頭像 發(fā)表于 07-01 10:07 ?3576次閱讀

    使用STM32輸出PWM波形

    本文目的是通過在STM32平臺上采用定時器的方法輸出PWM波形,進而熟悉和掌握PWM的原理和產(chǎn)生。目錄(一)PWM簡介1.關(guān)于
    發(fā)表于 11-30 14:21 ?42次下載
    使用STM32<b class='flag-5'>輸出</b><b class='flag-5'>PWM</b>波形

    PWM輸出實驗詳細示例

    目錄PWM輸出實驗PWM的工作原理(以向上計數(shù)為例)PWM與AFIO引腳重映射綜合實驗庫函數(shù)使用說明PWM
    發(fā)表于 12-20 18:58 ?2次下載
    <b class='flag-5'>PWM</b><b class='flag-5'>輸出</b>實驗詳細示例

    MBD模型設(shè)計的PWM輸出步驟和方法

    本篇筆記主要記錄基于MBD模型設(shè)計的PWM輸出步驟和方法。前期工具箱的安裝不在本文檔討論范圍內(nèi)。
    的頭像 發(fā)表于 01-20 14:48 ?1485次閱讀
    MBD模型設(shè)計的<b class='flag-5'>PWM</b><b class='flag-5'>輸出</b>步驟和<b class='flag-5'>方法</b>

    SMT32的PWM波形輸出配置總結(jié)

    本文分享STM32之PWM波形輸出配置總結(jié)。
    的頭像 發(fā)表于 02-22 15:36 ?1566次閱讀

    基于MBD模型設(shè)計的PWM輸出步驟和方法

    本篇筆記主要記錄基于MBD模型設(shè)計的PWM輸出步驟和方法。前期工具箱的安裝不在本文檔討論范圍內(nèi)。
    的頭像 發(fā)表于 04-20 14:19 ?1045次閱讀
    基于MBD模型設(shè)計的<b class='flag-5'>PWM</b><b class='flag-5'>輸出</b>步驟和<b class='flag-5'>方法</b>

    STM32的PWM波形輸出配置的大神總結(jié)

    STM32的PWM波形輸出配置的大神總結(jié)
    的頭像 發(fā)表于 10-24 16:00 ?3734次閱讀
    STM32的<b class='flag-5'>PWM</b>波形<b class='flag-5'>輸出</b><b class='flag-5'>配置</b>的大神總結(jié)

    STM32無法正常輸出PWM信號的原因及解決方法

    無法正常輸出PWM信號的問題。本文將探討STM32無法正常輸出PWM信號的原因,并提供解決方法。 一、引腳
    的頭像 發(fā)表于 01-02 17:38 ?9888次閱讀
    RM新时代网站-首页