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

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

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

剖析STM32-定時(shí)器3

jf_78858299 ? 來(lái)源:匯極星科技 ? 作者:匯極星科技 ? 2023-04-21 15:14 ? 次閱讀

三、定時(shí)器PWM輸出實(shí)驗(yàn)

1. 通用定時(shí)器PWM概述

PWM,英文名Pulse Width Modulation,是脈沖寬度調(diào)制縮寫,它是通過(guò)對(duì)一系列脈沖的寬度進(jìn)行調(diào)制,等效出所需要的波形(包含形狀以及幅值),對(duì)模擬信號(hào)電平進(jìn)行數(shù)字編碼,也就是說(shuō)通過(guò)調(diào)節(jié)占空比的變化來(lái)調(diào)節(jié)信號(hào)、能量等的變化,占空比就是指在一個(gè)周期內(nèi),信號(hào)處于高電平的時(shí)間占據(jù)整個(gè)信號(hào)周期的百分比,例如方波的占空比就是50%。PWM的功能有很多種,比如控制呼吸燈、控制直流電機(jī)或者舵機(jī)等驅(qū)動(dòng)原件等等,是單片機(jī)的一個(gè)十分重要的功能。

STM32單片機(jī)中,可以使用定時(shí)器的輸出比較功能來(lái)產(chǎn)生PWM波:

即PWM模式可以產(chǎn)生一個(gè)由TIMx_ARR寄存器確定頻率、由TIMx_CCRx寄存器確定占空比的信號(hào)。其框圖如下圖所示:

圖片

可見(jiàn),橫坐標(biāo)是時(shí)間變量,縱坐標(biāo)是CNT計(jì)數(shù)值,CNT計(jì)數(shù)值隨著時(shí)間的推進(jìn)會(huì)不斷經(jīng)歷從0到ARR,清零復(fù)位再到ARR的這一過(guò)程。這之中還有一個(gè)數(shù)值是CCRx即比較值,通過(guò)比較值和輸出配置可以使之輸出高低電平邏輯,這樣就產(chǎn)生了PWM波形。通過(guò)調(diào)節(jié)ARR的值可以調(diào)節(jié)PWM的周期,調(diào)節(jié)CCRx的值大小可以調(diào)節(jié)PWM占空比。

我們以通道1為例,詳細(xì)講解PWM的工作過(guò)程,如下圖所示:

圖片

從最左邊進(jìn)入的是時(shí)鐘源,由內(nèi)部時(shí)鐘(CNT)或者外部觸發(fā)時(shí)鐘(ETRF)輸入,進(jìn)入輸入模式控制器,通過(guò)OCMR1寄存器的OC1M[2:0]位來(lái)配置PWM模式,之后進(jìn)入一個(gè)選擇器,由CCER寄存器的CC1P位來(lái)設(shè)置輸出極性,最后由CCER寄存器的CC1E位來(lái)使能輸出,然后通過(guò)OC1來(lái)輸出PWM波。

CCR1:捕獲比較(值)寄存器(x=1,2,3,4):設(shè)置比較值。

CCMR1: OC1M[2:0]位:對(duì)于PWM方式下,用于設(shè)置PWM模式1【110】或者PWM模式2【111】

CCER:CC1P位:輸入/捕獲1輸出極性。0:高電平有效,1:低電平有效。

CCER:CC1E位:輸入/捕獲1輸出使能。0:關(guān)閉,1:打開(kāi)。

  1. PWM模式

PWM有PWM模式1和模式2兩種模式,它們之間的區(qū)別用寄存器TIMx_CCMR1的OC1M[2:0]位來(lái)分析:

圖片

表中紅色框標(biāo)識(shí)的地方就是PWM模式1和模式2的定義和區(qū)別,可以簡(jiǎn)單理解為:PWM模式1的情況下,當(dāng)前值小于比較值為有效電平;PWM模式2的情況下,當(dāng)前值大于比較值為有效電平。

理解這一點(diǎn)對(duì)之后的PWM配置十分重要。

下面是對(duì)PWM模式1以及向上計(jì)數(shù)配置情況的說(shuō)明:

圖片

** 3.相關(guān)寄存器介紹**

  • 捕獲/比較寄存器1(TIMx_CCR1)

圖片

這里以寄存器1舉例,其它的三個(gè)寄存器(CCR2、CCR3、CCR4)都是一樣的

  • 捕獲比較模式寄存器1(TIMx_CCMR1)

圖片

圖片

可以看到,每個(gè)捕獲/比較模式寄存器可以控制兩個(gè)通道,這樣的話每個(gè)定時(shí)器就對(duì)應(yīng)兩個(gè)捕獲/比較模式寄存器。其最常用的位就是0C1M(OC2M)位了,這兩個(gè)位是用來(lái)設(shè)置PWM模式的,有模式1和模式2兩種,這就和前面所講的對(duì)應(yīng)上了。

  • 捕獲/比較使能寄存器(TIMx_CCER)

圖片

可以看到,位0(CC1E)和位1(CC1P)是捕獲比較使能寄存器最常用的兩個(gè)位,分別控制輸出使能和輸出極性,這就也和剛剛講的對(duì)應(yīng)上了。

  • 自動(dòng)重裝載寄存器(TIMx_ARR)

圖片

這個(gè)寄存器不太常用,下面的庫(kù)函數(shù)配置會(huì)講解其庫(kù)函數(shù)用法。

4. 定時(shí)器輸出通道引腳

定時(shí)器輸出PWM和定時(shí)器中斷不同,定時(shí)器中斷只需要開(kāi)啟這一外設(shè)即可工作,定時(shí)器輸出PWM需要在單片機(jī)的引腳上輸出實(shí)實(shí)在在的脈沖信號(hào)。

下面是定時(shí)器3的通道引腳,可以使用部分映射或者完全映射。其它定時(shí)器的引腳可以查看芯片手冊(cè)。

圖片

5.定時(shí)器PWM庫(kù)函數(shù)配置

  • 輸出庫(kù)函數(shù)配置

和定時(shí)器中斷實(shí)驗(yàn)不同,在初始化時(shí)基單元之后,還需要對(duì)輸出通道進(jìn)行初始化:

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

其結(jié)構(gòu)體成員如下:

typedef struct
{
  uint16_t TIM_OCMode;  //PWM模式1或者模式2
  uint16_t TIM_OutputState; //輸出使能 OR失能
  uint16_t TIM_OutputNState;
  uint16_t TIM_Pulse; //比較值,寫CCRx
  uint16_t TIM_OCPolarity; //比較輸出極性
  uint16_t TIM_OCNPolarity; 
  uint16_t TIM_OCIdleState;  
  uint16_t TIM_OCNIdleState; 
} TIM_OCInitTypeDef;

初始化實(shí)例:

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //PWM模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
TIM_OCInitStructure. TIM_Pulse=100;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根據(jù)T指定的參數(shù)初始化外設(shè)TIM3 OC2

設(shè)置比較值函數(shù)

void TIM_SetCompareX(TIM_TypeDef* TIMx, uint16_t Compare2);
  • 使能輸出比較預(yù)裝載
  • void TIM_OC2PreloadConfig(TIM_TypeDef* TIMx, uint16_t TIM_OCPreload);
    
  • 使能自動(dòng)重裝載的預(yù)裝載寄存器允許位
void TIM_ARRPreloadConfig(TIM_TypeDef* TIMx, FunctionalState NewState);

輸出配置步驟

① 使能定時(shí)器3和相關(guān)IO口時(shí)鐘。

使能定時(shí)器3時(shí)鐘:RCC_APB1PeriphClockCmd();

     使能GPIOB時(shí)鐘:RCC_APB2PeriphClockCmd();

② 初始化IO口為復(fù)用功能輸出。函數(shù):GPIO_Init();

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;

③ 這里我們是要把PB5用作定時(shí)器的PWM輸出引腳,所以要重映射配置,

所以需要開(kāi)啟AFIO時(shí)鐘。同時(shí)設(shè)置重映射。

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

    GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE);

④ 初始化定時(shí)器:ARR,PSC等:TIM_TimeBaseInit();

⑤ 初始化輸出比較參數(shù):TIM_OC2Init();

⑥ 使能預(yù)裝載寄存器:TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);

⑦ 使能定時(shí)器。TIM_Cmd();

⑧ 不斷改變比較值CCRx,達(dá)到不同的占空比效果:TIM_SetCompare2();

6.實(shí)例

我們使用STM32單片機(jī)的定時(shí)器TIM3的PWM功能,輸出占空比可變的PWM波,用來(lái)驅(qū)動(dòng)LED燈,從而達(dá)到LED亮度由暗變亮,又從亮變暗,如此循環(huán)。代碼如下:

//timer.c源文件


#include "timer.h"
#include "led.h"
#include "usart.h"




//TIM3 PWM部分初始化 
//PWM輸出初始化
//arr:自動(dòng)重裝值
//psc:時(shí)鐘預(yù)分頻數(shù)
void TIM3_PWM_Init(u16 arr,u16 psc)
{  
  GPIO_InitTypeDef GPIO_InitStructure;
  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
  TIM_OCInitTypeDef  TIM_OCInitStructure;




  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);  //使能定時(shí)器3時(shí)鐘
   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB  | RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外設(shè)和AFIO復(fù)用功能模塊時(shí)鐘


  GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH2->PB5    


   //設(shè)置該引腳為復(fù)用輸出功能,輸出TIM3 CH2的PWM脈沖波形  GPIOB.5
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5; //TIM_CH2
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //復(fù)用推挽輸出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO


   //初始化TIM3
  TIM_TimeBaseStructure.TIM_Period = arr; //設(shè)置在下一個(gè)更新事件裝入活動(dòng)的自動(dòng)重裝載寄存器周期的值
  TIM_TimeBaseStructure.TIM_Prescaler =psc; //設(shè)置用來(lái)作為TIMx時(shí)鐘頻率除數(shù)的預(yù)分頻值 
  TIM_TimeBaseStructure.TIM_ClockDivision = 0; //設(shè)置時(shí)鐘分割:TDTS = Tck_tim
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上計(jì)數(shù)模式
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根據(jù)TIM_TimeBaseInitStruct中指定的參數(shù)初始化TIMx的時(shí)間基數(shù)單位


  //初始化TIM3 Channel2 PWM模式   
  TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //選擇定時(shí)器模式:TIM脈沖寬度調(diào)制模式2
   TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比較輸出使能
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //輸出極性:TIM輸出比較極性高
  TIM_OC2Init(TIM3, &TIM_OCInitStructure);  //根據(jù)T指定的參數(shù)初始化外設(shè)TIM3 OC2


  TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);  //使能TIM3在CCR2上的預(yù)裝載寄存器


  TIM_Cmd(TIM3, ENABLE);  //使能TIM3




}
//timer.h頭文件


#ifndef __TIMER_H
#define __TIMER_H
#include "sys.h"




void TIM3_PWM_Init(u16 arr,u16 psc);
#endif
//main.c源文件


#include "led.h"
#include "delay.h"
#include "sys.h"
#include "timer.h"




 int main(void)
{    
   u16 led0pwmval=0;
  u8 dir=1;  
  delay_init();         //延時(shí)函數(shù)初始化    
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);    //設(shè)置NVIC中斷分組2:2位搶占優(yōu)先級(jí),2位響應(yīng)優(yōu)先級(jí)
  uart_init(115200);   //串口初始化為115200
   LED_Init();           //LED端口初始化
   TIM3_PWM_Init(899,0);   //不分頻。PWM頻率=72000000/900=80Khz
     while(1)
  {
     delay_ms(10);   
    if(dir)led0pwmval++;
    else led0pwmval--;


     if(led0pwmval>300)dir=0;
    if(led0pwmval==0)dir=1;                     
    TIM_SetCompare2(TIM3,led0pwmval);       
  }   
 }

總結(jié)

本章從STM32定時(shí)器的原理、寄存器介紹、定時(shí)器配置以及定時(shí)器的幾個(gè)常用的功能(如定時(shí)器中斷、定時(shí)器輸出比較PWM波形)的使用方法來(lái)教大家掌握定時(shí)器這一外設(shè)。希望讀者能夠仔細(xì)學(xué)習(xí),掌握這一重要的外設(shè)。

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

    關(guān)注

    48

    文章

    7555

    瀏覽量

    151429
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3248

    瀏覽量

    114832
  • GPIO
    +關(guān)注

    關(guān)注

    16

    文章

    1204

    瀏覽量

    52106
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    stm32定時(shí)器中斷程序

    STM32定時(shí)器是個(gè)強(qiáng)大的模塊,定時(shí)器使用的頻率也是很高的,定時(shí)器可以做一些基本的定時(shí),還可以做PWM輸出或者輸入捕獲功能。 以下是進(jìn)行
    發(fā)表于 10-12 16:59 ?1.3w次閱讀

    STM32-基本定時(shí)器TIM6-TIM7基本定時(shí)功能

     STM32中一共有11個(gè)定時(shí)器,其中2個(gè)高級(jí)控制定時(shí)器,4個(gè)普通定時(shí)器和2個(gè)基本定時(shí)器,以及2個(gè)看門狗
    發(fā)表于 11-27 18:55 ?1.2w次閱讀
    <b class='flag-5'>STM32-</b>基本<b class='flag-5'>定時(shí)器</b>TIM6-TIM7基本<b class='flag-5'>定時(shí)</b>功能

    STM32-通用定時(shí)器基本定時(shí)功能資料下載

    電子發(fā)燒友網(wǎng)為你提供STM32-通用定時(shí)器基本定時(shí)功能資料下載的電子資料下載,更有其他相關(guān)的電路圖、源代碼、課件教程、中文資料、英文資料、參考設(shè)計(jì)、用戶指南、解決方案等資料,希望可以幫助到廣大的電子工程師們。
    發(fā)表于 04-12 08:44 ?4次下載
    <b class='flag-5'>STM32-</b>通用<b class='flag-5'>定時(shí)器</b>基本<b class='flag-5'>定時(shí)</b>功能資料下載

    [STM32]通用定時(shí)器的使用

    STM32的通用定時(shí)器定時(shí)、輸出PWM功能的使用本次還是使用發(fā)光二極管來(lái)驗(yàn)證定時(shí)器的使用目錄STM32的通用
    發(fā)表于 11-22 19:06 ?24次下載
    [<b class='flag-5'>STM32</b>]通用<b class='flag-5'>定時(shí)器</b>的使用

    STM32定時(shí)器-基本定時(shí)器

    目錄定時(shí)器分類基本定時(shí)器功能框圖講解基本定時(shí)器功能時(shí)鐘源計(jì)數(shù)時(shí)鐘計(jì)數(shù)自動(dòng)重裝載寄存
    發(fā)表于 11-23 18:21 ?31次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>定時(shí)器</b>-基本<b class='flag-5'>定時(shí)器</b>

    STM32 CubeMX學(xué)習(xí):3. 定時(shí)器閃爍LED

    STM32 CubeMX學(xué)習(xí):3. 定時(shí)器閃爍LED 系列文章目錄前期的準(zhǔn)備點(diǎn)亮 LED閃爍 LED定時(shí)器閃爍LED未完待續(xù)…文章目錄STM32
    發(fā)表于 11-25 10:21 ?13次下載
    <b class='flag-5'>STM32</b> CubeMX學(xué)習(xí):<b class='flag-5'>3</b>. <b class='flag-5'>定時(shí)器</b>閃爍LED

    STM32——高級(jí)定時(shí)器、通用定時(shí)器、基本定時(shí)器的區(qū)別

    STM32——高級(jí)定時(shí)器、通用定時(shí)器、基本定時(shí)器的區(qū)別
    發(fā)表于 11-26 15:21 ?110次下載
    <b class='flag-5'>STM32</b>——高級(jí)<b class='flag-5'>定時(shí)器</b>、通用<b class='flag-5'>定時(shí)器</b>、基本<b class='flag-5'>定時(shí)器</b>的區(qū)別

    STM32-通用定時(shí)器-PWM輸出

    1 通用定時(shí)器PWM概述1.1STM32定時(shí)器輸出通道引腳這里以TIM3為例來(lái)講解。STM32的通用定時(shí)
    發(fā)表于 11-26 15:36 ?23次下載
    <b class='flag-5'>STM32-</b>通用<b class='flag-5'>定時(shí)器</b>-PWM輸出

    STM32-通用定時(shí)器-定時(shí)器中斷

    1STM32定時(shí)器STM32F103ZET6一共有8個(gè)定時(shí)器,其中分別為:高級(jí)定時(shí)器(TIM1、TIM8);通用
    發(fā)表于 11-26 15:36 ?16次下載
    <b class='flag-5'>STM32-</b>通用<b class='flag-5'>定時(shí)器</b>-<b class='flag-5'>定時(shí)器</b>中斷

    STM32---定時(shí)器知多少

    14,15,16章節(jié),里面對(duì)定時(shí)器的知識(shí)有詳細(xì)的介紹。STM32F1系列的開(kāi)發(fā)板一共有8個(gè)定時(shí)器,按照功能的不同可以分為:高級(jí)定時(shí)器(TIM1、TIM8)通用
    發(fā)表于 11-30 14:36 ?19次下載
    <b class='flag-5'>STM32</b>---<b class='flag-5'>定時(shí)器</b>知多少

    STM32定時(shí)器學(xué)習(xí)---基本定時(shí)器

    STM32F1系列的產(chǎn)品,除了互聯(lián)網(wǎng)產(chǎn)品外,工作8個(gè),3定時(shí)器,其中一種就是基本定時(shí)器。那么STM32單片機(jī)的基本
    發(fā)表于 12-02 14:06 ?28次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>定時(shí)器</b>學(xué)習(xí)---基本<b class='flag-5'>定時(shí)器</b>

    STM32定時(shí)器US延時(shí)

    定時(shí)器”介紹的SysTick定時(shí)器,該定時(shí)器位于Cortex-M3內(nèi)核中。外設(shè)定時(shí)器由芯片半導(dǎo)體廠商設(shè)計(jì),如
    發(fā)表于 12-05 15:36 ?25次下載
    <b class='flag-5'>STM32</b><b class='flag-5'>定時(shí)器</b>US延時(shí)

    STM32定時(shí)器的分類及中斷原理

    本文主要介紹常規(guī)定時(shí)器中的TIM3,實(shí)現(xiàn)定時(shí)器中斷的功能。STM32定時(shí)器的分類在其中一篇文章中已經(jīng)介紹過(guò),本文主要內(nèi)容主要介紹
    的頭像 發(fā)表于 01-12 17:29 ?7330次閱讀
    <b class='flag-5'>STM32</b><b class='flag-5'>定時(shí)器</b>的分類及中斷原理

    剖析STM32-定時(shí)器1

    定時(shí)器作為微控制不可缺少的外設(shè),在STM32中也是如此。相信不少初學(xué)者學(xué)到定時(shí)器的時(shí)候?qū)?b class='flag-5'>STM32的學(xué)習(xí)熱情就大打折扣甚至想要放棄了,因?yàn)?/div>
    的頭像 發(fā)表于 04-21 15:14 ?1981次閱讀
    <b class='flag-5'>剖析</b><b class='flag-5'>STM32-</b><b class='flag-5'>定時(shí)器</b>1

    剖析STM32-定時(shí)器2

    定時(shí)器作為微控制不可缺少的外設(shè),在STM32中也是如此。相信不少初學(xué)者學(xué)到定時(shí)器的時(shí)候?qū)?b class='flag-5'>STM32的學(xué)習(xí)熱情就大打折扣甚至想要放棄了,因?yàn)?/div>
    的頭像 發(fā)表于 04-21 15:14 ?1393次閱讀