色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

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

3天內不再提示

CKS32F4xx系列產品Timer定時器的基本使用方法-比較輸出

中科芯MCU ? 來源:中科芯MCU ? 2023-05-26 14:07 ? 次閱讀

比較輸出簡介

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

a81ed24e-fb82-11ed-90ce-dac502259ad0.jpg

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

CKS32F4的定時器除了TIM6和7。其他的定時器都可以用來產生PWM輸出。其中高級定時器TIM1和TIM8可以同時產生多達7路的PWM輸出。而通用定時器也能同時產生多達4路的PWM輸出。這里僅使用TIM14的CH1產生一路PWM輸出。要使CKS32F4的通用定時器TIMx 產生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為例進行介紹。TIM14_CCMR1寄存器各位描述如下圖所示:

a83c5fa8-fb82-11ed-90ce-dac502259ad0.png

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

中文參考手冊》這里我們需要說明的是模式設置位 OC1M,此部分由3位組成。總共可以配置成7種模式,我們使用的是PWM模式,所以這3位必須設置為110/111。

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

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

a8547c1e-fb82-11ed-90ce-dac502259ad0.png

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

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

a86ae814-fb82-11ed-90ce-dac502259ad0.png

在輸出模式下,該寄存器的值與CNT的值比較,根據比較結果產生相應動作。利用這點,我們通過修改這個寄存器的值,就可以控制 PWM 的輸出脈寬了。

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

a888befc-fb82-11ed-90ce-dac502259ad0.png

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

PWM實際跟上一章節一樣使用的是定時器的功能,所以相關的函數設置同樣在庫函數文件 CKS32f4xx_tim.h和CKS32f4xx_tim.c文件中。

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

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

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

這在前面章節已經提到過。當然,這里我們還要使能GPIOF的時鐘。然后我們要配置PF9引腳映射至AF9,復用為定時器14,調用的函數為:

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

這個方法跟我們串口實驗講解一樣,調用的同一個函數,最后設置PF9為復用功能輸出這里我們只列出GPIO初始化為復用功能的一行代碼:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //>>復用功能

這里還需要說明一下,對于定時器通道的引腳關系,大家可以查看CKS32F4對應的數據手冊,比如我們PWM實驗,我們使用的是定時器14的通道1,對應的引腳PF9可以從數據手冊表中查看:

a89fc0a2-fb82-11ed-90ce-dac502259ad0.png

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

在開啟了TIM14的時鐘之后,我們要設置ARR和 PSC兩個寄存器的值來控制輸出PWM的周期。這在庫函數是通過TIM_TimeBaseInit函數實現的,在上一節定時器中斷章節我們已經有講解,這里就不詳細講解,調用的格式為:

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

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

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

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

這種初始化格式大家學到這里應該也熟悉了,所以我們直接來看看結構體TIM_OCInitTypeDef的定義:

TIM_TimeBaseStructure.TIM_Period = arr; //設置自動重裝載值 
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;

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

參數TIM_OutputState用來設置比較輸出使能,也就是使能PWM輸出到端口

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

TIM_OCInitTypeDef TIM_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); //>>根據指定的參數初始化外設TIM1 4OC1

4)使能TIM14

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

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

5)修改TIM14_CCR1來控制占空比

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

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare2);

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

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

void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState)

代碼示例

TIM3時鐘來自于APB1域,我們通過APB1總線下的時鐘使能函數來使能TIM3的時鐘。調用的函數是:

//>>TIM14 PWM 部分初始化 
//>>PWM 輸出初始化 
//>>arr:自動重裝值 psc:時鐘預分頻數 
void TIM14_PWM_Init(u32 arr,u32 psc) 
{ 
GPIO_InitTypeDef GPIO_InitStructure; 
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; 
TIM_OCInitTypeDef TIM_OCInitStructure; 
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);//TIM14 時鐘使能 
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能 PORTF 時鐘 
GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GF9 復用為 TIM14 
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOF9 
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //復用功能 
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; 
//速度 50MHz 
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽復用輸出 
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; //向上計數模式 
TIM_TimeBaseStructure.TIM_Period=arr; //自動重裝載值 
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; 
TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定時器 14 
//初始化 TIM14 Channel1 PWM 模式 
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM 調制模式 1 
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能 
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //輸出極性低 
TIM_OC1Init(TIM14, &TIM_OCInitStructure); //初始化外設 TIM1 4OC1 
TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //使能預裝載寄存器 
TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE 使能 
TIM_Cmd(TIM14, ENABLE); //使能 TIM14 
TIM_SetCompare1(TIM14,300); //>>設置pwm的占空比為300/500 = 60%
}

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

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

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

審核編輯:湯梓紅

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • mcu
    mcu
    +關注

    關注

    146

    文章

    17123

    瀏覽量

    350994
  • 寄存器
    +關注

    關注

    31

    文章

    5336

    瀏覽量

    120232
  • 微處理器
    +關注

    關注

    11

    文章

    2258

    瀏覽量

    82405
  • 定時器
    +關注

    關注

    23

    文章

    3246

    瀏覽量

    114721
  • Timer
    +關注

    關注

    1

    文章

    64

    瀏覽量

    12784

原文標題:MCU微課堂|CKS32F4xx系列產品Timer的基本使用方法-比較輸出

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

收藏 人收藏

    評論

    相關推薦

    MCU微課堂|CKS32F4xx系列產品時鐘配置

    ,并且高時鐘頻率將導致功耗增加、抗電磁干擾能力變弱,因此,CKS32F4xx系列產品內部具備多個時鐘源。本文將對CKS32F4xx系列產品時鐘組成進行分析,并講解該系統單片機的時鐘的配
    發表于 12-12 10:17 ?831次閱讀

    基于CKS32F4xx系列的MCU互補PWM方案

    互補輸出實際跟比較輸出章節一樣使用的是定時器的功能,所以相關的函數設置同樣在庫函數文件CKS32f4xx_tim.h和
    發表于 12-02 10:13 ?635次閱讀
    基于<b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>的MCU互補PWM方案

    CKS32F4xx系列MCU SysTick定時器的原理及使用方法

    本課將為大家講解CKS32F4xx系列產品的SysTick定時器原理及使用方法。SysTick定時器也叫SysTick滴答
    的頭像 發表于 12-18 09:21 ?1334次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>MCU SysTick<b class='flag-5'>定時器</b>的原理及<b class='flag-5'>使用方法</b>

    CKS32F4xx系列產品NVIC中斷優先級管理單元講解

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

    CKS32F4xx系列產品串口DMA傳輸

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

    CKS32F4xx系列產品定時器使用-基本特征和定時操作

    這一課我們將介紹CKS32F4XX系列產品定時器使用,CKS32F4XX定時器功能十分強大,包含2個高級控制
    的頭像 發表于 05-19 09:18 ?893次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列產品</b>的<b class='flag-5'>定時器</b>使用-基本特征和<b class='flag-5'>定時</b>操作

    CKS32F4xx系列產品Timer的基本使用方法-定時器脈沖計數

    上一章我們介紹了CKS32F4的通用定時器定時操作的使用方法,這一章我們將向大家介紹通用定時器作為定時器
    的頭像 發表于 06-05 09:39 ?1022次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列產品</b><b class='flag-5'>Timer</b>的基本<b class='flag-5'>使用方法</b>-<b class='flag-5'>定時器</b>脈沖計數

    CKS32F4xx系列RNG功能設置

    ? MCU 微課堂 CKS32F4xx 系 列RNG功能 隨機數發生簡介 ? ? CKS32F4xx系列自帶了硬件隨機數發生(RNG),
    的頭像 發表于 09-08 10:01 ?603次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>RNG功能設置

    CKS32F4xx系列DAC功能

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

    CKS32F4xx系列產品Timer的基本使用方法-定時器脈沖計數

    CKS32F4xx系列產品Timer的基本使用方法-定時器脈沖計數
    的頭像 發表于 11-09 17:38 ?1067次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列產品</b><b class='flag-5'>Timer</b>的基本<b class='flag-5'>使用方法</b>-<b class='flag-5'>定時器</b>脈沖計數

    CKS32F4xx系列產品Timer的基本使用方法-比較輸出

    CKS32F4xx系列產品Timer的基本使用方法-比較輸出
    的頭像 發表于 11-09 17:39 ?848次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列產品</b><b class='flag-5'>Timer</b>的基本<b class='flag-5'>使用方法</b>-<b class='flag-5'>比較</b><b class='flag-5'>輸出</b>

    CKS32F4xx系列產品Timer的基本使用方法-定時操作

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

    MCU微課堂 | CKS32F4xx系列產品SPI通信

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

    MCU微課堂 | CKS32F4xx系列產品GPIO口配置

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

    CKS32F4xx系列FSMC功能簡介

    本課講為大家講解CKS32F4xx系列產品的FSMC應用實例,FSMC全稱是Flexible Static Memory Controller,讀作靈活的靜態存儲控制,顧名思義,MCU可以通過FSMC擴展靜態內存
    的頭像 發表于 04-14 15:06 ?934次閱讀
    <b class='flag-5'>CKS32F4xx</b><b class='flag-5'>系列</b>FSMC功能簡介
    主站蜘蛛池模板: YELLOW视频在线观看大全| FREE性丰满白嫩白嫩的HD| av亚洲色天堂2017| 国产精品无码久久av| 久久re亚洲在线视频| 日本大尺码喷液过程视频| 亚洲蜜芽在线观看精品一区| 99re6在线视频国产精品欧美| 国产成人免费在线| 蕾丝边娱乐网| 羲义嫁密着中出交尾gvg794| 67194线在线精品观看| 国产精品96久久久久久AV网址| 久久综合色超碰人人| 玩弄朋友娇妻呻吟交换电影| 67194成在线观看免费| 国产在线成人一区二区三区| 女人高潮特级毛片| 亚洲人美女肛交真人全程| 被室友C哭调教双性| 久久久无码精品一区二区三区| 台湾18成人影院| 99九九精品国产高清自在线| 国产在线AV一区二区香蕉| 日本黄色www| 69日本xxⅹxxxxx18| 国产在线精品亚洲另类| 日本wwwxx| 最近日本字幕MV免费观看在线| 国产精品女主播主要上线| 欧美精品华人在线| 影音先锋av丝袜天堂| 国产偷啪自怕网| 日韩精品一区VR观看| 97免费视频观看| 久久99re66热这里只有精品| 我与旗袍老师疯狂床震| SM脚奴调教丨踩踏贱奴| 快播dvd吧| 伊人亚洲综合青草青草久热| 国产小视频免费在线观看|