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

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

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

CKS32F4xx系列產(chǎn)品Timer的基本使用方法-比較輸出

jf_pJlTbmA9 ? 來源:中科芯MCU ? 作者:中科芯MCU ? 2023-11-09 17:39 ? 次閱讀

比較輸出簡介

比較輸出可以通過比較CNT與CCR寄存器值的關(guān)系,來對輸出電平進(jìn)行置1、置0或翻轉(zhuǎn)的操作,用于輸出一定頻率和占空比的PWM波形,簡稱脈寬調(diào)制,這也是利用微處理器的數(shù)字輸出來對模擬電路進(jìn)行控制的一種非常有效的技術(shù)。簡單一點(diǎn),就是對脈沖寬度的控制,PWM原理如下圖所示:

wKgaomUDxhGAJEC7AAELqU4EPN8177.jpg

圖中,我們假定定時器工作在向上計(jì)數(shù)PWM模式,且當(dāng)CNT時,輸出0,當(dāng)CNT>=CCRx時輸出1。那么就可以得到如上的 PWM,示意圖:當(dāng)CNT值小于CCRx的時候,IO輸出低電平(0),當(dāng)CNT值大于等于CCRx的時候,IO輸出高電平(1),當(dāng)CNT達(dá)到ARR值的時候,重新歸零,然后重新向上計(jì)數(shù),依次循環(huán)。改變CCRx的值,就可以改變PWM輸出的占空比,改變ARR的值,就可以改變PWM輸出的頻率,這就是 PWM輸出的原理。

CKS32F4的定時器除了TIM6和7。其他的定時器都可以用來產(chǎn)生PWM輸出。其中高級定時器TIM1和TIM8可以同時產(chǎn)生多達(dá)7路的PWM輸出。而通用定時器也能同時產(chǎn)生多達(dá)4路的PWM輸出。這里僅使用TIM14的CH1產(chǎn)生一路PWM輸出。要使CKS32F4的通用定時器TIMx 產(chǎn)生PWM輸出,除了上一章介紹的寄存器外,我們還會用到3個寄存器,來控制PWM的。這三個寄存器分別是:

捕獲/比較模式寄存器(TIMx_CCMR1/2)、捕獲/比較使能寄存器(TIMx_CCER)、捕獲/比較寄存器(TIMx_CCR1~4)。對于捕獲/比較模式寄存器(TIMx_CCMR1/2),該寄存器一般有2個:TIMx _CCMR1和TIMx _CCMR2,不過TIM14只有一個。TIMx_CCMR1控制CH1和2,而TIMx_CCMR2控制CH3和4。以下我們將以TIM14為例進(jìn)行介紹。TIM14_CCMR1寄存器各位描述如下圖所示:

wKgZomUDxhOAGkumAABi1CxeMXs081.png

該寄存器的有些位在不同模式下,功能不一樣,所以在圖中,我們把寄存器分了2層,上面一層對應(yīng)輸出而下面的則對應(yīng)輸入。關(guān)于該寄存器的詳細(xì)說明,請參考《CKS32F4xx

中文參考手冊》這里我們需要說明的是模式設(shè)置位 OC1M,此部分由3位組成??偣部梢耘渲贸?種模式,我們使用的是PWM模式,所以這3位必須設(shè)置為110/111。

這兩種PWM模式的區(qū)別就是輸出電平的極性相反。另外CC1S用于設(shè)置通道的方向(輸入/輸 出)默認(rèn)設(shè)置為0,就是設(shè)置通道作為輸出使用。注意:這里是因?yàn)槲覀兊腡IM14只有1個通道,所以才只有第八位有效,高八位無效,其他有多個通道的定時器,高八位也是有效的,具體請參考《CKS32F4xvx 中文參考手冊》對應(yīng)定時器的寄存器描述。

接下來,我們介紹TIM14的捕獲/比較使能寄存器(TIM14_CCER),該寄存器控制著各個輸入輸出通道的開關(guān)。該寄存器的各位描述如下圖所示:

wKgaomUDxhSAPgmCAAA3tzqmR3Q277.png

該寄存器比較簡單,我們這里只用到了CC1E位,該位是輸入/捕獲1輸出使能位,要想PWM從IO口輸出,這個位必須設(shè)置為1,所以我們需要設(shè)置該位為1。因?yàn)門IM14只有1個通道,所以才只有低四位有效,如果是其他定時器,該寄存器的其他位也可能有效。

最后,我們介紹一下捕獲/比較寄存器(TIMx_CCR1~4),該寄存器總共有4個,對應(yīng)4 個通道CH1~4。不過TIM14只有一個,即:TIM14_CCR1,該寄存器的各位描述如下圖所示:

wKgaomUDxhaAUgHOAAJ4UVzVKjM916.png

在輸出模式下,該寄存器的值與CNT的值比較,根據(jù)比較結(jié)果產(chǎn)生相應(yīng)動作。利用這點(diǎn),我們通過修改這個寄存器的值,就可以控制 PWM 的輸出脈寬了。

如果是通用定時器,則配置以上三個寄存器就夠了,但是如果是高級定時器,則還需要配置:剎車和死區(qū)寄存器(TIMx_BDTR),該寄存器各位描述如下圖所示:

wKgZomUDxhiAJ24VAAHOScs8rPw049.png

該寄存器,我們只需要關(guān)注最高位:MOE位,要想高級定時器的PWM正常輸出,則必須設(shè)置MOE位為1,否則不會有輸出。注意:通用定時器不需要配置這個。其他位我們這里就不詳細(xì)介紹了。

PWM實(shí)際跟上一章節(jié)一樣使用的是定時器的功能,所以相關(guān)的函數(shù)設(shè)置同樣在庫函數(shù)文件 CKS32f4xx_tim.h和CKS32f4xx_tim.c文件中。

1)開啟TIM14和GPIO時鐘,配置PF9選擇復(fù)用功能AF9(TIM14)輸出

要使用TIM14,我們必須先開啟TIM14的時鐘,這點(diǎn)相信大家看了這么多代碼,應(yīng)該明白了。這里我們還要配置PF9為復(fù)用(AF9)輸出,才可以實(shí)現(xiàn)TIM14_CH1的PWM經(jīng)過PF9輸出。庫函數(shù)使能 TIM14時鐘的方法是:

wKgaomUDxhmAHMeCAAAuzCxvmy0469.png

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);//>>TIM14時鐘使能

這在前面章節(jié)已經(jīng)提到過。當(dāng)然,這里我們還要使能GPIOF的時鐘。然后我們要配置PF9引腳映射至AF9,復(fù)用為定時器14,調(diào)用的函數(shù)為:

GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);//>>GPIOF9復(fù)用為定時器14

這個方法跟我們串口實(shí)驗(yàn)講解一樣,調(diào)用的同一個函數(shù),最后設(shè)置PF9為復(fù)用功能輸出這里我們只列出GPIO初始化為復(fù)用功能的一行代碼:

GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//>>復(fù)用功能

這里還需要說明一下,對于定時器通道的引腳關(guān)系,大家可以查看CKS32F4對應(yīng)的數(shù)據(jù)手冊,比如我們PWM實(shí)驗(yàn),我們使用的是定時器14的通道1,對應(yīng)的引腳PF9可以從數(shù)據(jù)手冊表中查看:

2)初始化TIM14,設(shè)置TIM14的ARR和PSC等參數(shù)

在開啟了TIM14的時鐘之后,我們要設(shè)置ARR和 PSC兩個寄存器的值來控制輸出PWM的周期。這在庫函數(shù)是通過TIM_TimeBaseInit函數(shù)實(shí)現(xiàn)的,在上一節(jié)定時器中斷章節(jié)我們已經(jīng)有講解,這里就不詳細(xì)講解,調(diào)用的格式為:

TIM_TimeBaseStructure.TIM_Period=arr;//設(shè)置自動重裝載值
TIM_TimeBaseStructure.TIM_Prescaler=psc;//設(shè)置預(yù)分頻值
TIM_TimeBaseStructure.TIM_ClockDivision=0;//設(shè)置時鐘分割:TDTS=Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上計(jì)數(shù)模式
TIM_TimeBaseInit(TIM3, TIM_TimeBaseStructure);//根據(jù)指定的參數(shù)初始化TIMx

3)設(shè)置TIM14_CH1的PWM模式,使能TIM14的 CH1輸出

設(shè)置TIM14_CH1為PWM模式(默認(rèn)是凍結(jié)的)通過配置TIM14_CCMR1的相關(guān)位來控制TIM14_CH1的模式。在庫函數(shù)中,PWM通道設(shè)置是通過函數(shù) TIM_OC1Init()~TIM_OC4Init()來設(shè)置的,不同的通道的設(shè)置函數(shù)不一樣,這里我們使用的是通道1,所以使用的函數(shù)是TIM_OC1Init()。

voidTIM_OC1Init(TIM_TypeDef*TIMx,TIM_OCInitTypeDef*TIM_OCInitStruct);

這種初始化格式大家學(xué)到這里應(yīng)該也熟悉了,所以我們直接來看看結(jié)構(gòu)體TIM_OCInitTypeDef的定義:

TIM_TimeBaseStructure.TIM_Period=arr;//設(shè)置自動重裝載值
typedefstruct
{
uint16_tTIM_OCMode;
uint16_tTIM_OutputState;
uint16_tTIM_OutputNState;*/
uint16_tTIM_Pulse;
uint16_tTIM_OCPolarity;
uint16_tTIM_OCNPolarity;
uint16_tTIM_OCIdleState;
uint16_tTIM_OCNIdleState;
}TIM_OCInitTypeDef;

這里我們講解一下與我們要求相關(guān)的幾個成員變量:參數(shù)TIM_OCMode設(shè)置模式是PWM還是輸出比較,這里我們是PWM模式。

參數(shù)TIM_OutputState用來設(shè)置比較輸出使能,也就是使能PWM輸出到端口。

參數(shù)TIM_OCPolarity用來設(shè)置極性是高還是低。其他的參數(shù)TIM_OutputNState,TIM_OCNPolarity,TIM_OCIdleState和 TIM_OCNIdleState是高級定時器才用到的。要實(shí)現(xiàn)我們上面提到的場景,方法是:

TIM_OCInitTypeDefTIM_OCInitStructure;
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//>>選擇模式PWM
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//>>比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//>>輸出極性低
TIM_OC1Init(TIM14, TIM_OCInitStructure);//>>根據(jù)指定的參數(shù)初始化外設(shè)TIM14OC1

4)使能TIM14

在完成以上設(shè)置了之后,我們需要使能TIM14。使能TIM14的方法前面已經(jīng)講解過:

TIM_Cmd(TIM14,ENABLE);//>>使能TIM14

5)修改TIM14_CCR1來控制占空比

最后,在經(jīng)過以上設(shè)置之后,PWM其實(shí)已經(jīng)開始輸出了,只是其占空比和頻率都是固定的,而我們通過修改TIM14_CCR1則可以控制 CH1的輸出占空比。在庫函數(shù)中,修改TIM14_CCR1占空比的函數(shù)是:

voidTIM_SetCompare1(TIM_TypeDef*TIMx,uint16_tCompare2);

理所當(dāng)然,對于其他通道,分別有一個函數(shù)名字,函數(shù)格式為TIM_SetComparex(x=1,2,3,4)。

通過以上5個步驟,我們就可以控制TIM14的CH1輸出PWM波了。這里特別提醒一下大家,高級定時器雖然和通用定時器類似,但是高級定時器要想輸出PWM,必須還要設(shè)置一個MOE位(TIMx_BDTR 的第15位),以使能主輸出,否則不會輸出PWM。庫函數(shù)設(shè)置的函數(shù)為:

voidTIM_CtrlPWMOutputs(TIM_TypeDef*TIMx,FunctionalStateNewState)

代碼示例

TIM3時鐘來自于APB1域,我們通過APB1總線下的時鐘使能函數(shù)來使能TIM3的時鐘。調(diào)用的函數(shù)是:

//>>TIM14PWM部分初始化
//>>PWM輸出初始化
//>>arr:自動重裝值psc:時鐘預(yù)分頻數(shù)
voidTIM14_PWM_Init(u32arr,u32psc)
{
GPIO_InitTypeDefGPIO_InitStructure;
TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_OCInitTypeDefTIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);//TIM14時鐘使能
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF,ENABLE);//使能PORTF時鐘
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14);//GF9復(fù)用為TIM14
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;//GPIOF9
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF;//復(fù)用功能
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_100MHz;
//速度50MHz
GPIO_InitStructure.GPIO_OType=GPIO_OType_PP;//推挽復(fù)用輸出
GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOF, GPIO_InitStructure);//初始化PF9
TIM_TimeBaseStructure.TIM_Prescaler=psc;//定時器分頻
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上計(jì)數(shù)模式
TIM_TimeBaseStructure.TIM_Period=arr;//自動重裝載值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM14, TIM_TimeBaseStructure);
//初始化定時器14//初始化TIM14Channel1PWM模式
TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;//PWM調(diào)制模式1
TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//比較輸出使能
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//輸出極性低
TIM_OC1Init(TIM14, TIM_OCInitStructure);//初始化外設(shè)TIM14OC1
TIM_OC1PreloadConfig(TIM14,TIM_OCPreload_Enable);//使能預(yù)裝載寄存器
TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能
TIM_Cmd(TIM14,ENABLE);//使能TIM14
TIM_SetCompare1(TIM14,300);//>>設(shè)置pwm的占空比為300/500=60%
}

此部分代碼包含了上面介紹的PWM輸出設(shè)置的前5個步驟。這里我們關(guān)于TIM14的設(shè)置就不再說了。接下來,我們看看主程序里面的main函數(shù)如下:

intmain(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//>>設(shè)置系統(tǒng)中斷優(yōu)先級分組2
delay_init(168);//>>初始化延時函數(shù)
TIM14_PWM_Init(500-1,84-1);//>>定時器時鐘為84M,分頻系數(shù)為84,所以計(jì)數(shù)頻率
//>>為84M/84=1Mhz,重裝載值500,所以PWM頻率為1M/500=2Khz.
while(1)
{
}
}

這里,我們先設(shè)置好了NVIC終端優(yōu)先級,然后初始化延時函數(shù)和timer,在timer的初始化參數(shù)中我們把PWM的頻率設(shè)置成2K,將占空比設(shè)置成60%,完成PWM輸出設(shè)置。

來源:中科芯MCU

審核編輯:湯梓紅

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

    關(guān)注

    146

    文章

    16885

    瀏覽量

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

    關(guān)注

    23

    文章

    3231

    瀏覽量

    114326
  • Timer
    +關(guān)注

    關(guān)注

    1

    文章

    63

    瀏覽量

    12762
收藏 人收藏

    評論

    相關(guān)推薦

    MCU微課堂|CKS32F4xx系列產(chǎn)品時鐘配置

    ,并且高時鐘頻率將導(dǎo)致功耗增加、抗電磁干擾能力變?nèi)?,因此?b class='flag-5'>CKS32F4xx系列產(chǎn)品內(nèi)部具備多個時鐘源。本文將對CKS32F4xx系列產(chǎn)品時鐘組成進(jìn)行分析,并講解該系統(tǒng)單片機(jī)的時鐘的配
    發(fā)表于 12-12 10:17 ?796次閱讀

    CKS32F4xx系列產(chǎn)品NVIC中斷優(yōu)先級管理單元講解

    本課將為大家講解CKS32F4xx系列產(chǎn)品的中斷優(yōu)先級管理單元NVIC。CM4內(nèi)核共支持256個中斷,其中包含了16個內(nèi)核中斷和240個外部中斷,具有256級可編程中斷設(shè)置。但CKS32F4x
    的頭像 發(fā)表于 02-06 14:52 ?1098次閱讀

    CKS32F4xx系列產(chǎn)品串口DMA傳輸

    在上一講,我們講過CKS32F4xx系列的6個串口都支持DMA傳輸。因此本節(jié)我們對CKS32F4xx系列的DMA進(jìn)行介紹,同時利用DMA對串口數(shù)據(jù)進(jìn)行傳輸。
    的頭像 發(fā)表于 04-10 11:18 ?996次閱讀

    CKS32F4xx系列產(chǎn)品的定時器使用-基本特征和定時操作

    這一課我們將介紹CKS32F4XX系列產(chǎn)品的定時器使用,CKS32F4XX的定時器功能十分強(qiáng)大,包含2個高級控制定時器,8個普通定時器,2個基礎(chǔ)定時器,以及兩個看門狗定時器和一個系統(tǒng)定時器,總共15個定時器之多。關(guān)于定時器部分內(nèi)
    的頭像 發(fā)表于 05-19 09:18 ?856次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列產(chǎn)品</b>的定時器使用-基本特征和定時操作

    CKS32F4xx系列RNG功能設(shè)置

    ? MCU 微課堂 CKS32F4xx 系 列RNG功能 隨機(jī)數(shù)發(fā)生器簡介 ? ? CKS32F4xx系列自帶了硬件隨機(jī)數(shù)發(fā)生器(RNG),RNG處理器是一個以連續(xù)模擬噪聲為基礎(chǔ)的隨機(jī)數(shù)發(fā)生器,在
    的頭像 發(fā)表于 09-08 10:01 ?556次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>RNG功能設(shè)置

    CKS32F4xx系列DAC功能

    CKS32F4xx系列DAC功能
    的頭像 發(fā)表于 11-06 16:56 ?807次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>DAC功能

    CKS32F4xx系列ADC多通道DMA電壓采集

    CKS32F4xx系列ADC多通道DMA電壓采集
    的頭像 發(fā)表于 11-06 16:53 ?1056次閱讀

    CKS32F4xx系列低功耗模式STANDBY模式

    CKS32F4xx系列低功耗模式STANDBY模式
    的頭像 發(fā)表于 11-06 16:57 ?443次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>低功耗模式STANDBY模式

    CKS32F4xx系列低功耗模式SLEEP模式

    CKS32F4xx系列低功耗模式SLEEP模式
    的頭像 發(fā)表于 11-06 16:59 ?637次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>低功耗模式SLEEP模式

    CKS32F4xx系列低功耗模式STOP模式

    CKS32F4xx系列低功耗模式STOP模式
    的頭像 發(fā)表于 11-06 17:08 ?580次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>低功耗模式STOP模式

    CKS32F4xx系列產(chǎn)品Timer的基本使用方法-定時器脈沖計(jì)數(shù)

    CKS32F4xx系列產(chǎn)品Timer的基本使用方法-定時器脈沖計(jì)數(shù)
    的頭像 發(fā)表于 11-09 17:38 ?995次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列產(chǎn)品</b><b class='flag-5'>Timer</b>的基本<b class='flag-5'>使用方法</b>-定時器脈沖計(jì)數(shù)

    CKS32F4xx系列產(chǎn)品Timer的基本使用方法-定時操作

    CKS32F4xx系列產(chǎn)品Timer的基本使用方法-定時操作
    的頭像 發(fā)表于 11-09 17:41 ?568次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列產(chǎn)品</b><b class='flag-5'>Timer</b>的基本<b class='flag-5'>使用方法</b>-定時操作

    MCU微課堂 | CKS32F4xx系列產(chǎn)品SPI通信

    MCU微課堂 | CKS32F4xx系列產(chǎn)品SPI通信
    的頭像 發(fā)表于 10-24 17:12 ?648次閱讀
    MCU微課堂 | <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列產(chǎn)品</b>SPI通信

    MCU微課堂 | CKS32F4xx系列產(chǎn)品GPIO口配置

    MCU微課堂 | CKS32F4xx系列產(chǎn)品GPIO口配置
    的頭像 發(fā)表于 10-24 15:14 ?732次閱讀
    MCU微課堂 | <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列產(chǎn)品</b>GPIO口配置

    CKS32F4xx系列FSMC功能簡介

    本課講為大家講解CKS32F4xx系列產(chǎn)品的FSMC應(yīng)用實(shí)例,F(xiàn)SMC全稱是Flexible Static Memory Controller,讀作靈活的靜態(tài)存儲控制器,顧名思義,MCU可以通過FSMC擴(kuò)展靜態(tài)內(nèi)存
    的頭像 發(fā)表于 04-14 15:06 ?836次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>FSMC功能簡介