MCU微課堂
CKS32F107xx TIM(二)
第四十七期 2024.11.01
PWM模式簡(jiǎn)介
從上節(jié)課的定時(shí)器分類(lèi)圖中我們了解到,互補(bǔ)輸出是高級(jí)定時(shí)器(TIM1、TIM8)所獨(dú)有的,它可以輸出兩路互補(bǔ)信號(hào)。而在本節(jié)課中我們將通過(guò)一個(gè)簡(jiǎn)單的例程去介紹如何配置互補(bǔ)PWM輸出,同時(shí)為了演示在電機(jī)控制領(lǐng)域的入門(mén)應(yīng)用,該例程也增加了剎車(chē)和死區(qū)插入的功能。因此,接下來(lái)我們將先對(duì)PWM模式、互補(bǔ)輸出、死區(qū)插入、剎車(chē)功能這四個(gè)概念作簡(jiǎn)要介紹,然后通過(guò)一個(gè)實(shí)驗(yàn)例程來(lái)演示PWM輸出配置方法。
比較輸出是通過(guò)比較計(jì)數(shù)器CNT和捕獲/比較寄存器CCR的關(guān)系,來(lái)對(duì)輸出電平進(jìn)行置1、置0或翻轉(zhuǎn)的操作,而PWM模式輸出的是一種脈沖寬度可調(diào)的方波信號(hào),同時(shí)也是定時(shí)器(高級(jí)和通用)比較輸出模式中較為常用的一種,我們可以通過(guò)捕獲/比較模式寄存器CCMRx的位OCxM[2:0]來(lái)配置輸出。表1羅列了PWM1和PWM2的區(qū)別,并通過(guò)PWM1邊沿對(duì)齊的波形示例圖來(lái)簡(jiǎn)述下PWM輸出的原理。
表1 PWM1和PWM2模式區(qū)別
圖1 邊沿對(duì)齊的PWM1波形(TIMx_ARR=8)
如上圖所示,當(dāng)CNT < CCR時(shí),參考信號(hào)OCxREF輸出為高,則通道OCx輸出1;當(dāng)CCR <= CNT <= ARR時(shí),參考信號(hào)OCxREF輸出為低,則通道OCx輸出0。并且當(dāng)計(jì)數(shù)器CNT與比較寄存器CCR值匹配時(shí),比較中斷寄存器CCxIF位會(huì)自動(dòng)由硬件置 1;而CNT計(jì)數(shù)達(dá)到ARR的值時(shí),會(huì)產(chǎn)生上溢事件,并且自動(dòng)清零,然后重新向上計(jì)數(shù),如此循環(huán)往復(fù)。因此,我們可以通過(guò)修改ARR和CCR的值來(lái)靈活調(diào)整PWM波形的頻率和占空比。
定時(shí)器產(chǎn)生PWM 輸出,除了上節(jié)課提到的ARR、PSC、CNT,不得不提的還有捕獲/比較模式寄存器CCMR。該寄存器共有兩個(gè),CCMR1(控制輸出通道1和2)和CCMR2(控制輸出通道3和4),且上面一層對(duì)應(yīng)比較輸出,下面一層對(duì)應(yīng)輸入捕獲,輸入捕獲模式將在下節(jié)課中介紹。由于本節(jié)課介紹的是互補(bǔ)PWM輸出,所以模式設(shè)置位OCxM[2:0],必須設(shè)置為110/111,對(duì)應(yīng)PWM1/PWM2,兩者區(qū)別是極性相反。下圖是CCMR1寄存器各位描述圖,具體請(qǐng)參照CKS32F107xx參考手冊(cè)。
圖2 CCMR1寄存器各位描述圖、
互補(bǔ)輸出和死區(qū)插入簡(jiǎn)介
接下來(lái)將先通過(guò)捕獲/比較通道的輸出概覽圖來(lái)展現(xiàn)輸出控制過(guò)程。
圖3 捕獲/比較通道的輸出部分(通道CH1~CH3)
如上圖,紅框中是CNT和CCR比較,輸出參考信號(hào)OCxREF,銜接上文。綠框表明參考信號(hào)OCxREF在經(jīng)過(guò)死區(qū)發(fā)生器之后會(huì)產(chǎn)生兩路帶死區(qū)的互補(bǔ)信號(hào)OCx_DT和OCxN_DT,并且需要特別說(shuō)明下,高級(jí)定時(shí)器(TIM1、TIM8)只有通道CH1~CH3才有互補(bǔ)信號(hào)。藍(lán)框是輸出控制電路,若沒(méi)有死區(qū)控制,則進(jìn)入的信號(hào)即為OCxREF,且進(jìn)入的信號(hào)會(huì)被分成極性相反的兩路,并由寄存器CCER的位CCxP和CCxNP控制極性,由CxE和CCxNP位使能輸出。若增加了剎車(chē)功能,則寄存器BDTR的位MOE、OSSI和OSSR將共同影響輸出信號(hào)。
關(guān)于死區(qū)插入,其中一個(gè)較為典型的應(yīng)用就是半橋驅(qū)動(dòng)電路,比如上個(gè)時(shí)態(tài)MOS管M1導(dǎo)通,MOS管M2截止,下一時(shí)態(tài)需要M1截止,M2導(dǎo)通,由于工藝限制MOS管的關(guān)閉不能忽略不計(jì),這就會(huì)導(dǎo)致M1和M2有同時(shí)導(dǎo)通的時(shí)間,進(jìn)而損壞電路,所以可將M1關(guān)閉后等待一段時(shí)間再打開(kāi)M2,這段時(shí)間可稱為死區(qū)時(shí)間。死區(qū)時(shí)間是通過(guò)寄存器BDTR的位DTG[7:0]來(lái)配置,死區(qū)時(shí)間的大小需要根據(jù)輸出通道相連接的器件特性來(lái)調(diào)整。下圖為帶死區(qū)插入的互補(bǔ)輸出圖,相信這樣能大家有個(gè)更為直觀的了解。
圖4 帶死區(qū)插入的互不輸出
剎車(chē)功能簡(jiǎn)介
電路控制電機(jī)轉(zhuǎn)動(dòng)出現(xiàn)異常時(shí),若用軟件來(lái)關(guān)閉信號(hào)輸出,出于軟件延時(shí)的影響,可能帶來(lái)不必要的后果。在此工況下,高級(jí)定時(shí)器中的剎車(chē)功能能發(fā)揮特定優(yōu)勢(shì),用戶只要將檢測(cè)端連接到TIMx_BKIN引腳,當(dāng)檢測(cè)到非正常態(tài),由硬件電路立刻關(guān)閉信號(hào)輸出,電機(jī)即可停止轉(zhuǎn)動(dòng)。剎車(chē)功能是一種硬件保護(hù)保護(hù),用戶需要配置剎車(chē)和死區(qū)寄存器BDTR,該寄存器各位描述如下:
圖5 BDTR寄存器各位描述圖
互補(bǔ)PWM輸出配置實(shí)驗(yàn)
本實(shí)驗(yàn)以高級(jí)定時(shí)器TIM1為例,并參照CKS32F107xx數(shù)據(jù)手冊(cè)的引腳定義章節(jié),分配了OC1(PA8)、OC1N(PB13)和BKIN(PB12)引腳。若我們?cè)诠こ讨羞x擇BKIN引腳高電平有效,那么當(dāng)BKIN引腳被置高時(shí),兩路互補(bǔ)PWM信號(hào)立刻停止輸出。主要的編程要點(diǎn)如下。
1、開(kāi)啟GPIO時(shí)鐘,配置引腳
要使用GPIOA、GPIOB的相關(guān)引腳,需要開(kāi)啟端口時(shí)鐘,調(diào)用的函數(shù)為:
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
因?yàn)橐獙⑵胀℅PIO復(fù)用到定時(shí)器的相關(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時(shí)基結(jié)構(gòu)體設(shè)置
鑒于前一章節(jié)已詳述過(guò),這里僅做代碼演示,針對(duì)TIM1時(shí)基初始化示例代碼格式如下:
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ù)前文定時(shí)時(shí)間的描述,當(dāng)TIM1工作時(shí)鐘配置為72MHz時(shí),那么示例代碼中配置的中斷次時(shí)間為:(8+1)*(7+1) / 72000000 = 1us,則PWM輸出的頻率為1MHz。
3、TIM1輸出比較結(jié)構(gòu)體設(shè)置
通過(guò)配置TIM1_CCMR1的相關(guān)位來(lái)設(shè)置TIM1_CH1的PWM模式。在庫(kù)函數(shù)中,PWM通道設(shè)置是通過(guò)函數(shù)TIM_OC1Init()~TIM_OC4Init()來(lái)設(shè)置的,不同通道的設(shè)置函數(shù)不一樣,使用時(shí)需要注意區(qū)分,這里我們選用CH1通道和CH1N通道,選用的庫(kù)函數(shù)如下:
void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);
輸出比較結(jié)構(gòu)體在庫(kù)函數(shù)中對(duì)應(yīng)名稱為T(mén)IM_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是用來(lái)設(shè)置比較輸出模式,這里我們選用PWM1模式。
參數(shù)TIM_OutputState和TIM_OutputNState用來(lái)配置OCx和OcxN通道輸出使能。
參數(shù)TIM_Pulse是設(shè)置比較寄存器CCR的值,決定脈沖寬度,對(duì)應(yīng)PWM1的占空比。
參數(shù)OCPolarity和TIM_OCNPolarity是設(shè)置OCx和OcxN通道極性,我們可以選擇高電平或低電平有效。
參數(shù)TIM_OCNIdleState和TIM_OCNIdleState是設(shè)置空閑狀態(tài)時(shí)OCx和OcxN通道輸出的電平。
針對(duì)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è)置
我們?cè)趲?kù)函數(shù)中設(shè)置剎車(chē)和死區(qū)參數(shù)是通過(guò)函數(shù)TIM_BDTRCon?g來(lái)實(shí)現(xiàn)的,其結(jié)構(gòu)體TIM_BDTRInitTypeDef中列出了各個(gè)成員,以下是結(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)體中的成員可以對(duì)照上文BDTR寄存器的各位來(lái)理解,在此不再贅述,本實(shí)驗(yàn)中我們針對(duì)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ū)時(shí)間為11 / 72000000 = 152ns,配置BKIN引腳為高電平有效。
5、使能TIM1和主輸出
因?yàn)楸緦?shí)驗(yàn)是互補(bǔ)PWM輸出,所以除了要開(kāi)啟定時(shí)器,也要對(duì)定時(shí)器主輸出進(jìn)行使能,配置示例如下:
TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
6、修改TIM1_CCR1來(lái)調(diào)整占空比
實(shí)際使用時(shí),用戶需要控制占空比來(lái)調(diào)整電機(jī)的轉(zhuǎn)速,我們能通過(guò)修改TIM1_CCR1則可以控制CH1的輸出占空比。在庫(kù)函數(shù)中,修改TIM1_CCR1占空比的函數(shù)是:
void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);
同樣的,對(duì)于其他三個(gè)通道,也有如下對(duì)應(yīng)函數(shù)供調(diào)用,用戶使用時(shí)注意區(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)用即可,我們示波器的兩個(gè)輸入通道分別接PA8、PB13引腳,可觀測(cè)到兩路互補(bǔ)帶死區(qū)插入的PWM波形,頻率為1MHz,占空比默認(rèn)為50%(用戶可自行調(diào)整),死區(qū)時(shí)間為152ns左右。
如果將BKIN引腳拉高,可觀測(cè)到輸出信號(hào)立刻停止,若松開(kāi)則恢復(fù)默認(rèn)輸出。
至此,本實(shí)驗(yàn)已介紹完畢。
-
寄存器
+關(guān)注
關(guān)注
31文章
5430瀏覽量
123912 -
PWM
+關(guān)注
關(guān)注
116文章
5450瀏覽量
218726 -
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2290瀏覽量
96221 -
定時(shí)器
+關(guān)注
關(guān)注
23文章
3297瀏覽量
117571
原文標(biāo)題:MCU微課堂|CKS32F107xx TIM(二)
文章出處:【微信號(hào):中科芯MCU,微信公眾號(hào):中科芯MCU】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
高級(jí)定時(shí)器PWM輸入模式的配置方法

靈動(dòng)微課堂《MM32 MCU使用分享》入駐智芯課堂
剎車(chē)配置PWM沒(méi)有輸出
STM32產(chǎn)生PWM的配置方法有哪些
STM32產(chǎn)生PWM的配置方法
PWM波形的輸出方法

如何使用MPLAB代碼配置器配置增強(qiáng)型PWM模塊
使用STM32輸出PWM波形

PWM輸出實(shí)驗(yàn)詳細(xì)示例

評(píng)論