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ū)別
圖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參考手冊。
圖2 CCMR1寄存器各位描述圖、
互補輸出和死區(qū)插入簡介
接下來將先通過捕獲/比較通道的輸出概覽圖來展現(xiàn)輸出控制過程。
圖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ū)插入的互補輸出圖,相信這樣能大家有個更為直觀的了解。
圖4 帶死區(qū)插入的互不輸出
剎車功能簡介
電路控制電機轉(zhuǎn)動出現(xiàn)異常時,若用軟件來關(guān)閉信號輸出,出于軟件延時的影響,可能帶來不必要的后果。在此工況下,高級定時器中的剎車功能能發(fā)揮特定優(yōu)勢,用戶只要將檢測端連接到TIMx_BKIN引腳,當(dāng)檢測到非正常態(tài),由硬件電路立刻關(guān)閉信號輸出,電機即可停止轉(zhuǎn)動。剎車功能是一種硬件保護保護,用戶需要配置剎車和死區(qū)寄存器BDTR,該寄存器各位描述如下:
圖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左右。
如果將BKIN引腳拉高,可觀測到輸出信號立刻停止,若松開則恢復(fù)默認輸出。
至此,本實驗已介紹完畢。
-
寄存器
+關(guān)注
關(guān)注
31文章
5336瀏覽量
120230 -
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)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論